角色运动学基础#
- 骨骼结构: 角色模型通常由关节 (joint)、骨骼 (bone) 和链 (link) 组成。
- 自由度 (Degrees of Freedom, DoF): 用于描述一个机械系统状态的独立参数个数。
- 铰链关节 (Hinge/Revolute joint): 例如膝盖和手肘,拥有 1 DoF,其旋转范围通常受限 (θmin≤θ≤θmax)。
- 万向节 (Universal joint): 拥有 2 DoF。
- 球窝关节 (Ball-and-socket joint): 例如髋关节和肩部,拥有 3 DoF,旋转同样受限。

正向运动学#
正向运动学是指在已知所有关节的旋转参数 Ri 的情况下,计算末端执行器 (End Effector) 在全局坐标系下的位置 x。
公式推导#
在机器人学或计算机图形学的链式结构中,通常涉及两种描述姿态的方式:
- Ri (Local Rotation / Relative Rotation): 第 i 个关节相对于前一个关节的局部旋转。
- Qi (Global Orientation): 第 i 个关节相对于世界坐标系(全局)的绝对朝向。
通过逐级累乘局部旋转矩阵,可以得到每一级的全局朝向。
-
推导过程
-
Q0=R0 (基座/起始点的朝向)
-
Q1=R0R1=Q0R1
-
Q2=R0R1R2=Q1R2
-
Q3=R0R1R2R3=Q2R3
-
Q4=R0R1R2R3R4=Q3R4
-
通项公式
Qi=Qi−1Ri
如果我们已知各级的全局朝向,可以反求出局部旋转矩阵:
利用旋转矩阵的正交性(QT=Q−1),从 Qi=Qi−1Ri 可以推导出:
Ri=Qi−1TQi
任意两点间的相对旋转#
如果需要计算链条中任意两个非相邻节点(例如节点 1 到节点 4)之间的相对旋转 R41:
R41=Q1TQ4=(R0R1)TR0R1R2R3R4=R2R3R4
层级计算#
Qi=Qi−1Ri
pi+1=pi+Qili
x=pE+QEx0
(其中 pE 为末端关节位置,QE 为其全局旋转,x0 为局部偏移量。)

已知条件: 所有关节的旋转矩阵 Ri 和连杆长度 li。
目标1: 求解末端点 x0 在全局或局部参考系下的坐标 x。
目标2: 求解 x0 相对于局部坐标系 Qk (Local Frame) 的坐标
角色姿态与参考系#
- Posed Character(摆好姿态的角色): 角色最终呈现的动作是由一系列局部旋转矩阵(如 R0,R1,R2,R3)作用于骨骼链的结果。
- 参考姿态 (Reference Poses): 制作模型和动画时的初始默认姿态。
- T-Pose: 双臂平举,形似字母 “T”。
- A-Pose: 双臂自然下垂,角度通常在 45° 左右,形似字母 “A”。
核心矛盾: 同样的动作指令(如“手臂向上旋转 90°”),在不同的参考姿态下,最终得到的全局效果完全不同。

动作重定向#
单物体的重定向#
核心任务: 物体在姿态 A 为初始状态时的旋转为 RA,求在姿态 B 下等效的旋转 RB。
- 定义偏移: 设从姿态 A 到姿态 B 的旋转偏移为 RA→B。
- 计算公式:
RB=RARA→BT
(这里 RA→BT 即 RB→A,用于抵消姿态 B 相对于 A 的初始偏角。)

运动链的重定向#
对于多节点链路,每一级都有其对应的全局朝向偏移 (Global Orientation Offset),记为 QA→B。
最终公式#
根据单物体的结论 QB=QA(QA→B)T,我们可以对父节点和当前节点分别写出转换关系:
- 父节点全局朝向转换:
QpiB=QpiA(QpiA→B)T
- 当前节点全局朝向转换:
QiB=QiA(QiA→B)T
通过代入 QiB=QpiBRiB,最终推导出重定向后的局部旋转矩阵公式:
RiB=QpiA→BRiA(QiA→B)T

逆向运动学#
与 FK 相反,IK 是在已知末端执行器目标位置 x~ 的前提下,反向求出使得系统达到该位置的各关节旋转参数 θ。这是一个典型的非线性问题,可能存在唯一解、多解或无解的情况。
启发式方法#
优化方法#
将 IK 视为一个最优化问题,目标是寻找最优的参数 θ 来最小化误差函数:
F(θ)=21∥f(θ)−x~∥22
-
雅可比矩阵 (Jacobian Matrix):
雅可比矩阵反映了末端执行器位置对各参数的偏导数:
J=∂θ∂f=[∂θ0∂f∂θ1∂f⋯∂θn∂f]
(对于铰链关节,可以使用几何法直接计算:∂θi∂f=ai×ri。)
-
梯度下降 / 雅可比转置法 (Jacobian Transpose):
θi+1=θi−αJTΔ
其中 Δ=f(θi)−x 为误差向量
这是一阶方法,不需要计算矩阵的逆,但收敛速度可能较慢。
-
假设所有关节均为 铰链关节 (Hinge joint / Revolute joint)。
- ai: 第 i 个关节的旋转轴向量。
- ri: 从第 i 个关节指向末端执行器 x 的位移向量。
当第 i 个关节旋转一个微小角度 δθi 时,末端点从 x 移动到 x′,其位移向量由罗德里格斯公式给出:
x′−x=(sinδθi)ai×ri+(1−cosδθi)ai×(ai×ri)
为了得到雅可比矩阵中的第 i 列,对角度取极限:
∂θi∂f=δθi→0limδθix′−x
利用泰勒级数展开(当 δθi→0 时,sinδθi≈δθi 且 1−cosδθi≈0):
∂θi∂f=ai×ri

- 对于球关节,个球关节会在雅可比矩阵中占用连续的三列。
设 f 为末端执行器的位置函数,θi=(θix,θiy,θiz)T 为球关节的三个旋转角。该关节对雅可比矩阵的贡献为:
∂θi∂f=[∂θix∂f∂θiy∂f∂θiz∂f]
根据铰链关节的导数公式 ∂θ∂f=a×r,球关节的三列具体为:
- 第一列: aix×ri (绕 X 轴旋转产生的瞬时位移)
- 第二列: aiy×ri (绕 Y 轴旋转产生的瞬时位移)
- 第三列: aiz×ri (绕 Z 轴旋转产生的瞬时位移)
其中:
aix,aiy,aiz:分别为当前坐标系下三个正交的旋转轴向量。
ri:从球关节中心指向末端执行器 x 的位移矢量。
在将球关节拆解为三个铰链关节(绕 x,y,z 轴)时,由于旋转是相继发生的,后面的旋转轴会受到前面旋转的影响。
为了计算雅可比矩阵,我们需要在全局坐标系下确定这三个轴向量:
- 第一轴(X轴)
aix=Qi−1ex
直接取前一级关节的全局朝向 Qi−1 作用于标准 X 轴单位向量 ex。
- 第二轴(Y轴):
aiy=Qi−1Rixey
该轴不仅受前一级朝向影响,还受本关节已经发生的 X 轴旋转 Rix 的带动。
- 第三轴(Z轴):
aiz=Qi−1RixRiyez
该轴受前一级朝向以及本关节已发生的 X 轴和 Y 轴旋转的双重带动。
-
高斯-牛顿法 / 雅可比求逆法 (Gauss-Newton / Jacobian Inverse):
逆运动学的本质是寻找一组关节角 θ,使得末端位置 f(θ) 与目标位置 x 的误差最小。通常定义最小二乘代价函数:
F(θ)=21∥f(θ)−x∥22
-
高斯-牛顿法 (Gauss-Newton Method)
通过对非线性函数 f(θ) 进行一阶泰勒展开,将非线性优化转化为线性子问题:
- 一阶近似: f(θ)≈f(θ0)+J(θ−θ0)
- 代价函数近似: F(θ)≈21∥f(θ0)+J(θ−θ0)−x∥22
- 一阶最优条件 (KKT/正规方程):
JTJ(θ−θ0)=−JTΔ
其中 Δ=f(θ0)−x 是当前的误差向量。
局限性:如果 JTJ 是不可逆的(通常发生在雅可比矩阵 J 为宽矩阵时,即自由度大于目标空间维度),则无法直接解出 θ。
-
雅可比逆方法 (Jacobian Inverse Method)在机器人学中,我们通常面临冗余自由度问题,此时 J 是扁平的。虽然 JTJ 不可逆,但 JJT 往往是可逆的。
上式两边同乘 J ,并消去 JJT :
J(θ−θ0)=−Δ
最终更新公式:
θ=θ0−J+Δ
其中 J+ 称为 Moore-Penrose 伪逆 (Pseudoinverse):
J+=JT(JJT)−1
-
当我们要最小化误差函数 F(θ)=21∥f(θ)−x∥22 时,最常用的迭代更新步长公式为:
θ=θ0−αJ+Δ
- α:步长(Learning Rate)。
- Δ:当前误差向量 (f(θ0)−x)。
- J+:雅可比矩阵的伪逆。
-
J+ 的分类讨论:矩阵形态决定
-
问题: 当矩阵接近奇异时(例如手臂完全伸直的奇异位形),会导致计算不稳定。
-
阻尼雅可比求逆法 (Damped Jacobian Inverse):
在标准的伪逆法中,当机器人接近奇异位姿时,雅可比矩阵的逆(或伪逆)会变得趋于无穷大,导致关节跳变。
阻尼法通过在目标函数中引入一个“惩罚项”,限制关节旋转幅度,从而确保数值计算的稳定性。
修改后的目标函数不再仅仅追求末端误差最小,同时要求关节的变化量也要小:
F(θ)=21∥f(θ)−x∥22+2λ(θ−θi)TW(θ−θi)
- 第一项: 末端位置误差。
- 第二项 (阻尼项/正则项): 限制 θ 偏离当前值 θi 的程度。
- λ (Damping parameter): 阻尼系数。λ 越大,动作越平稳但收敛慢;λ 越小,越接近标准伪逆法。
- W (Weight matrix): 权重矩阵(通常是对角阵),用于为不同关节分配不同的重要性。
根据矩阵形状的不同,计算公式中加入了阻尼项 λI(或 λW):
J∗=JT(JJT+λI)−1
J∗=(JTJ+λI)−1JT
效果: 通过加上 λI,原本可能由于奇异而导致行列式为 0 的矩阵 (JJT) 变得强制可逆,从而避免了数值爆炸。
在接近极限位置时,机器人会表现得更加“保守”,宁愿保留一点点位置误差,也不愿让关节发生疯狂的瞬间甩动。