🧭 运动学基础:正逆运动学与 DH 参数

用数学精确描述"关节转了多少度 → 手和脚在哪儿"。本页从位置、旋转、齐次变换讲起,到 DH 参数、正运动学、逆运动学和雅可比矩阵,读完你就能自己推导一个 2 连杆臂、看懂 URDF 里那串旋转和平移参数。
运动学 DH参数 正逆运动学 雅可比矩阵 四元数
🎯 本页学习目标
1. 能说出描述刚体位姿的四种方式(位置+旋转矩阵、欧拉角、四元数、齐次变换矩阵)及各自优缺点
2. 能写出标准 DH 参数的四个量(θ、d、a、α)的含义,并为一个 2 连杆平面臂列 DH 表
3. 能由 DH 表推导正运动学,算出 2 连杆臂末端位置 (x, y)
4. 能区分解析法与数值法求解逆运动学,并说明为什么会出现多解和奇异位形
5. 能写出雅可比矩阵 J 的两个用途:速度映射 v = J·q̇ 与力映射 τ = JᵀF
建议用时:约 45 分钟(含自测)

1 位姿描述:位置、旋转与姿态的四种表示

要让机器人"走到某个点、把手摆成某个角度",首先得能用数学把位置(在哪)姿态(朝向哪)写出来,合起来叫位姿(Pose)。位置相对简单,姿态(三维旋转)才是难点。

1.1 位置向量

在某个参考坐标系(比如固定在机器人骨盆的坐标系)里,一个点的位置就是一个三维列向量:

p = [ px ]     px:沿 X 轴的距离
    [ py ]     py:沿 Y 轴的距离
    [ pz ]     pz:沿 Z 轴的距离

这只能回答"点在哪儿",回答不了"物体朝向哪"。要描述朝向,需要旋转矩阵

1.2 旋转矩阵

旋转矩阵 R 是一个 3×3 的正交矩阵,它把坐标系 B 里的向量转到坐标系 A: p_A = R · p_B。它满足两个约束:RᵀR = I(列向量两两垂直且长度为 1)且 det(R) = +1(右手系,不出现镜像)。所有合法的旋转矩阵构成一个集合,记作 SO(3)

绕 Z 轴旋转 θ 角的旋转矩阵最常用,记下来:

Rz(θ) = [ cosθ   -sinθ   0 ]
        [ sinθ    cosθ   0 ]
        [ 0       0      1 ]

绕 X、Y 轴同理。旋转矩阵的优点是无歧义、可直接连乘;缺点是9 个数只表达了 3 个自由度,信息冗余,数值漂移后还可能不再"正交"。

1.3 欧拉角

欧拉角把任意旋转拆成按固定顺序绕三个轴的旋转,比如常见的 ZYX 顺序(先绕 Z 转偏航角 yaw,再绕 Y 转俯仰角 pitch,最后绕 X 转滚转角 roll):

R = Rz(ψ) · Ry(θ) · Rx(φ)
    ψ = yaw 偏航   θ = pitch 俯仰   φ = roll 滚转

欧拉角只有 3 个数,符合直觉(飞行员说"滚转 30 度、俯仰 10 度")。但它有两个致命问题:旋转顺序必须约定(ZYX 和 XYZ 结果不同),以及万向锁(Gimbal Lock)——当中间那个角(这里是 pitch)转到 ±90° 时,第一条轴和第三条轴重合,系统突然少了一个自由度,无法唯一表示姿态。

1.4 四元数

四元数 q = w + xi + yj + zk 是"1 个实部 + 3 个虚部"的超复数。表示旋转时用单位四元数(满足 w² + x² + y² + z² = 1)。把向量 v 旋转后得到 v′ 的公式是 v′ = q · v · q⁻¹,旋转的连续合成用四元数乘法(哈密顿积),插值用球面线性插值 slerp。

为什么四元数能避免万向锁?因为它不是"按顺序转三次"这种参数化,而是把旋转当作 4 维空间里的一个点来整体描述;任何姿态都有连续、唯一的表示(最多差一个正负号),不存在"两根轴重合"的退化点。代价是不直观——人很难从 (w, x, y, z) 四个数直接看出朝哪。

表示方式参数个数优点缺点典型用途
旋转矩阵 R9(冗余)无歧义、直接连乘、可直接作用于向量冗余、数值需正交化、难读齐次变换、FK 推导、渲染
欧拉角3直观、好读、适合人机界面万向锁、顺序依赖、插值不自然遥控、航向姿态显示
轴角 (axis-angle)4(轴3+角1)几何意义清晰合成/插值复杂误差表示、规划
四元数4(带单位化约束)无万向锁、平滑插值 slerp、合成快不直观IMU 姿态解算、动作插值、SLAM
💡 记忆锚点:机器人内部计算基本都用旋转矩阵或四元数;只有在"给人看、让人调"时才转成欧拉角。你看到的姿态数据如果是 4 个数,大概率是四元数 (w, x, y, z),注意 w 在前还是在后。

2 齐次变换矩阵:把旋转和平移装进一个 4×4

真实的机器人不是原地转,而是"先转个方向,再挪个位置"。位置(3 个数)+ 姿态(旋转矩阵 3×3)可以合并成一个齐次变换矩阵 T,它是 4×4 的分块矩阵:

T = [ R | p ]   =   [ r11  r12  r13 | px ]
    [---+---]       [ r21  r22  r23 | py ]
    [ 0 | 1 ]       [ r31  r32  r33 | pz ]
                    [ 0    0    0   | 1  ]
    R:3×3 旋转矩阵   p:3×1 平移向量

它的好处是一个矩阵乘法就完成"旋转+平移"两步。点用齐次坐标 [x, y, z, 1]ᵀ 表示,变换就是一次乘法 p′ = T · p。

2.1 复合变换的顺序:先旋转后平移

多个变换连乘时,顺序非常重要,且矩阵乘法不满足交换律。约定:想"先绕局部坐标旋转、再把坐标系原点平移到 p",写成:

T = Trans(p) · Rot(θ)     ← 先算 Rot,再算 Trans(写在左边,后作用)

即:p_world = R · p_local + t
    (先旋转局部点,再叠加平移)

反过来 Rot(θ) · Trans(p) 则意味着"先平移、再绕全局原点旋转",结果完全不同。记住口诀:写在最右边的矩阵最先作用在点上

2.2 一个 2D 算例

平面里点 (1, 0) 先绕原点逆时针转 90°,再沿 X 平移 3、沿 Y 平移 1:

T = Trans(3,1) · Rz(90°)

  = [ 1  0  3 ]   [ 0  -1  0 ]   [ 0  -1  3 ]
    [ 0  1  1 ] · [ 1   0  0 ] = [ 1   0  1 ]
    [ 0  0  1 ]   [ 0   0  1 ]   [ 0   0  1 ]

  作用到 (1,0,1):
  [ 0 -1 3 ]   [ 1 ]   [ 0·1 + (-1)·0 + 3 ]   [ 3 ]
  [ 1  0 1 ] · [ 0 ] = [ 1·1 + 0·0  + 1 ] = [ 2 ]
  [ 0  0 1 ]   [ 1 ]   [ 0 + 0 + 1 ]        [ 1 ]

  结果 (3, 2):确实先转到了 (0,1),再平移到 (3,2) ✓

3 DH 参数:给每根连杆"标定"四个数

一台人形机器人有几十个关节,如果每个都手动画旋转矩阵、来回换算,工程上会疯掉。1955 年 Denavit 和 Hartenberg 提出一套标准化约定(DH 参数):只要给每个关节标 4 个数,就能机械地写出相邻连杆之间的齐次变换,进而求出全臂正运动学。这是工业机器人和 URDF 之外最常见的运动学建模语言。

3.1 四个参数的含义

在每个关节上建立坐标系,从连杆 i-1 的坐标系到连杆 i 的坐标系,经过"两次旋转 + 两次平移"共 4 步,对应 4 个参数:

参数名称绕/沿哪根轴含义转动关节里
θ (theta)关节角绕 zi-1 轴旋转让 xi-1 转到与 xi 平行★ 关节变量(随电机转动变化)
d连杆偏距沿 zi-1 轴平移两坐标系沿公轴线的距离常数(通常 0 或连杆厚度)
a连杆长度沿 xi 轴平移相邻两关节轴线间公垂线长度常数(就是连杆长 L)
α (alpha)连杆扭转角绕 xi 轴旋转让 zi-1 转到与 zi 平行常数(通常 0 或 ±90°)

四个参数合成一个变换(注意相乘顺序,正好是"旋转-平移-平移-旋转"):

Ai = Rot_z(θi) · Trans_z(di) · Trans_x(ai) · Rot_x(αi)

展开成 4×4(标准 DH):
       [ cosθi   -sinθi·cosαi    sinθi·sinαi    ai·cosθi ]
Ai =   [ sinθi    cosθi·cosαi   -cosθi·sinαi    ai·sinθi ]
       [ 0        sinαi          cosαi           di        ]
       [ 0        0              0               1         ]

3.2 2 连杆平面臂的 DH 表

假设一个平面 2 连杆臂:两根连杆长 L1、L2,两个关节都在同一个平面内转(所有 z 轴平行、指向纸外),没有连杆扭转、没有偏距。它的 DH 表:

关节 iθidiaiαi
1θ1(变量)0L10
2θ2(变量)0L20

因为 α = 0、d = 0,每段变换简化为:

        [ cosθi   -sinθi   0   ai·cosθi ]
Ai =    [ sinθi    cosθi   0   ai·sinθi ]
        [ 0        0       1   0         ]
        [ 0        0       0   1         ]
⚠️ 注意区分标准 DH 与改进 DH(Craig):两者的坐标系原点放的位置不同——标准 DH 把连杆 i 的坐标系放在连杆 i 的远端(靠近关节 i+1),改进 DH 放在近端(靠近关节 i)。同样的机械臂,两套参数数值不同,且变换写成 Trans·Rot 的顺序也不同。看别人给的 DH 表或 URDF 时,先确认用的是哪套约定,否则会得到完全错误的姿态。

4 正运动学 FK:从关节角到末端位姿

正运动学(Forward Kinematics, FK)回答:"我知道每个关节当前的角度,请问末端(手/脚)现在在空间什么位置、什么朝向?"答案是唯一确定的——给定一组关节角,末端位姿就唯一确定。做法就是把 DH 表里每段变换按顺序连乘:

T_end = A1 · A2 · ... · An

  输入:q = (θ1, θ2, ..., θn)  关节角向量
  输出:末端 4×4 齐次变换 T(位置 p + 姿态 R)

4.1 2 连杆臂正运动学推导

把 3.2 的两段变换连乘,A1 · A2 的旋转部分等于 Rz(θ1+θ2)(绕 z 轴的两次旋转直接相加),平移部分展开得到著名的结果:

x = L_1\cos\theta_1 + L_2\cos(\theta_1+\theta_2), \quad y = L_1\sin\theta_1 + L_2\sin(\theta_1+\theta_2), \quad \varphi = \theta_1 + \theta_2

验证:θ1=0、θ2=0 时,臂完全伸直指向 +X, x = L1 + L2, y = 0 ✓ 与直觉一致

4.2 伪代码

function FK(theta):
    T = identity(4)
    for i = 1 to n:
        # 由 DH 参数 (theta[i], d[i], a[i], alpha[i]) 构 Ai
        Ai = dh_transform(theta[i], d[i], a[i], alpha[i])
        T = T * Ai            # 连乘
    p = T[0:3, 3]             # 末端位置
    R = T[0:3, 0:3]           # 末端姿态
    return (p, R)

正运动学在工程上的三个用途:①仿真校验——把规划好的关节角代进去看末端会不会撞墙;②标定——比对模型算出的位置和实测位置,反推真实的连杆长度误差;③作为逆运动学数值法的"打分器"(见下一节)。

5 逆运动学 IK:从末端位姿反推关节角

逆运动学(Inverse Kinematics, IK)是正运动学的反问题:"我想让手放到 (0.4, 0.3, 0.5) 这个点、朝某个方向,请问各关节要转多少度?"这才是实际控制里最常用的问题,因为人给的指令通常是"末端去哪",而不是"每个关节转几度"。IK 比 FK 难得多:可能有多个解、可能无解、还可能有奇异点

5.1 解析法 vs 数值法

解析法(闭式解)数值法(迭代解)
思路用几何/三角关系直接推出公式从初始猜测出发,一步步逼近目标
速度极快(微秒级)较慢,依赖初值与迭代次数
能否求所有解能,能看清解的个数与结构一般只收敛到离初值最近的解
适用性只对结构简单、有闭式解的臂有效几乎任意结构都能用(通用)
典型方法三角几何、Pieper 条件(6 轴臂后 3 轴交于一点)雅可比迭代、阻尼最小二乘、LM 法

5.2 2 连杆臂解析解(重点算例)

给末端目标 (x, y),两根连杆长 L1、L2。由余弦定理先求第二个关节角:

c_2 = \frac{x^2 + y^2 - L_1^2 - L_2^2}{2 L_1 L_2}, \quad \theta_2 = \pm \arccos(c_2) \;\; \text{(肘朝上 / 肘朝下两解)}

再由几何关系求 θ1:

\theta_1 = \operatorname{atan2}(y, x) - \operatorname{atan2}(L_2 \sin\theta_2,\; L_1 + L_2 \cos\theta_2)
末端同一点 → 两种手臂姿态:
        θ2>0(肘在上)           θ2<0(肘在下)
         ▲  ▲                    ▲
        /    \                  /
     L1/      \ L2           L1/
      /        ▼            /  \ 
   肩└─────────┘终点     肩└────▼终点
      (肘朝上)               (肘朝下)
💡 解的唯一性:本例有 2 组解;一般 6 轴工业臂最多有 8 组甚至 16 组解。工程上要按约束挑一组——比如"肘部朝下省力""避免撞到本体""离上一时刻最近(连续性)"。当目标点超出臂展(距离大于 L1+L2)时,c2 的绝对值大于 1,acos 无定义,即无解,意味着那个点根本够不着。

5.3 数值法:雅可比迭代

当没有闭式解时,用迭代:假设当前关节角 q,末端误差 Δx = x_target − FK(q),每步解一个线性方程让末端往目标挪一点:

Δx = J(q) · Δq
Δq = J⁺ · Δx            J⁺ 是 J 的伪逆(最小二乘解)
q ← q + Δq              更新后重算 FK,直到 ‖Δx‖ 足够小

为了让迭代稳定(尤其在奇异点附近),常用阻尼最小二乘(DLS)加一个阻尼项 λ:

Δq = Jᵀ (J·Jᵀ + λ²I)⁻¹ · Δx

λ 越大越稳但收敛越慢。数值法的坑是:初值选得差可能不收敛、或收敛到不是你想要的那个解。

5.4 交互实验:2 连杆臂 FK/IK 演练场

把 5.2 的解析公式做成可动手的实验:IK 模式直接拖红色目标点,页面实时用余弦定理反解 θ1/θ2,"肘朝上/肘朝下"两组解同时画出(实线为当前解,虚线为另一组解);FK 模式改为拖关节角滑杆,看末端 (x, y) 落到哪。把目标拖出蓝色可达域,就能亲眼看到"c2 超界→无解";把手臂拖到接近伸直,观察 det(J)=L1·L2·sinθ2 趋近 0 的奇异位形

θ1 (肩关节)--
θ2 (肘关节)--
末端 x--
末端 y--
c2 = cosθ2--
det(J)=L1·L2·sinθ2--
✔ 有解(两组姿态)
💡 IK 模式:在画布任意处按下并拖动即可移动目标;肩部灰色扇环为可达范围(半径 |L1−L2| ~ L1+L2)。奇异警告:手臂接近完全伸直或折回时 det(J)→0。

6 雅可比矩阵:速度、奇异点与力的桥梁

正/逆运动学回答"位置对不对",雅可比矩阵 J回答"快不快、用多大力",它把关节速度末端速度线性地联系起来,是机器人动力学的第一块基石。

6.1 末端速度与关节速度

v = J(q) · q̇

  v  = [vx, vy, vz, ωx, ωy, ωz]ᵀ   末端线速度 + 角速度(6×1)
  q̇ = 关节角速度向量(n×1)
  J  = 6×n 矩阵,元素是 FK 对每个关节角的偏导 Jij = ∂fi/∂qj

对 2 连杆平面臂(只关心末端 (x, y)),雅可比是 2×2:

J = [ -L1·s1 - L2·s12    -L2·s12 ]
    [  L1·c1 + L2·c12      L2·c12 ]
    (s1=sinθ1, s12=sin(θ1+θ2), c1=cosθ1, c12=cos(θ1+θ2))

行列式:det(J) = L1 · L2 · sin(θ2)

6.2 奇异位形

det(J) = 0 时,矩阵不可逆,称为奇异位形(Singularity)。对 2 连杆臂,奇异发生在 θ2 = 0(臂完全伸直)或 θ2 = π(完全折回)时。此时:

6.3 力传递:τ = JᵀF

雅可比还反向传递。若末端要顶住外力/负载 F,各关节需要输出多大的力矩 τ?

τ = Jᵀ · F

  末端 6 维力/力矩 F = [Fx, Fy, Fz, Mx, My, Mz]ᵀ
  关节力矩       τ = [τ1, τ2, ..., τn]ᵀ

直觉:末端挂重物时,力臂越长(离关节越远),关节要出的力矩越大——这正是 Jᵀ 里那堆 sin/cos 系数在做的事。同一位形下,位置映射用 J,力映射用 Jᵀ,这是一对"对偶"关系。选关节电机扭矩时,就要拿最恶劣位形下的 τ 峰值来选型。

7 人形机器人应用:腿、手臂与全身

7.1 腿:步态里的"脚踝 IK"

走路可以抽象成:规划脚底落点(末端位姿)→ 用 IK 反算髋、膝、踝三个关节的角度。人腿的髋+膝+踝在同一平面内的部分,正好退化成2~3 连杆平面 IK,和本页 5.2 的公式几乎一样。工程上会先解出"脚相对于髋的位置",再套解析 IK 得到膝盖角;膝盖的弯曲方向(向前弯,不像鸟腿向后)就是"肘朝上/朝下"那个多解选择——选错了解,机器人会做出反关节的怪姿势。

7.2 手臂:6~7 自由度 IK

人形机器人手臂(肩 3 + 肘 1 + 腕 3)是 7 自由度冗余机械臂——比到达一个位姿所需的 6 个自由度还多 1 个,所以同一末端位姿对应无穷多组关节角。这时 IK 不是"求唯一解",而是"在无数解里挑一个最好看的"(肘不夹身体、避开胸口、像人)。

7.3 与仿真、全身控制的衔接

8 工具链:动手算一遍

工具是什么典型 API
PinocchioC++ 刚体动力学库,带高效 Python 绑定,人形/四足仿真底层最爱buildModelFromUrdf / forwardKinematics / computeJacobians
Robotics Toolbox for PythonPeter Corke 的教学向 Python 库,和经典 MATLAB 版一脉相承DHRobot / fkine / ikine_LM / jacob0
URDF 解析把机器人模型文件读成运动学树pinocchio.buildModelFromURDF / urdf_parser
MATLABRobotics System Toolbox,适合快速验证与论文复现rigidBodyTree / getTransform / inverseKinematics

8.1 Python 上手示例

# 方式一:Robotics Toolbox for Python(pip install roboticstoolbox-python)
import roboticstoolbox as rtb
import numpy as np

arm = rtb.DHRobot([
    rtb.RevoluteDH(a=0.5),      # L1 = 0.5 m
    rtb.RevoluteDH(a=0.3)       # L2 = 0.3 m
], name="2link")
q = np.array([0.3, 0.9])
T = arm.fkine(q)                # 正运动学 → 4×4 齐次变换
sol = arm.ikine_LM(T)           # 逆运动学 → 数值解
J = arm.jacob0(q)               # 雅可比

# 方式二:Pinocchio(conda-forge 的 pinocchio,或 PyPI 的 pin 包)
import pinocchio as pin
model = pin.buildModelFromUrdf("robot.urdf")
data = model.createData()
pin.forwardKinematics(model, data, q)
pin.computeJointJacobians(model, data, q)
🚀 上手建议:①先在纸上(或 Excel/Python)把 2 连杆 FK/IK 手推一遍,再上库,否则你永远分不清是"我算错"还是"库用错";②Robotics Toolbox 适合学概念(API 直白、自带可视化),Pinocchio 适合上真机(快、能和 ROS2/仿真打通);③拿到任何 URDF,先读 joint 标签里的 type(revolute/prismatic)和 axis,再读 origin 的 xyz/rpy——那串数本质上就是"半个 DH 表"。

9 常见误区

🚫 误区 1:"IK 就是查表/背公式":只有结构简单、满足特定条件的臂才有闭式解;人形机器人这种冗余、含球关节的系统基本靠数值 IK + 优化,而且永远要先问"哪个解、初值多少"。
🚫 误区 2:"忽略奇异点":手臂伸直、手腕对齐这些瞬间,雅可比行列式为 0,速度指令会飙到无穷、力矩估算会失真。规划路径时必须检查 det(J),别让轨迹穿过奇异位形。
🚫 误区 3:"四元数只是欧拉角的另一种写法":两者不等价——四元数没有万向锁、能平滑插值;把四元数拆成欧拉角再插值会走"绕远路"甚至抖动,插值要用 slerp。
🚫 误区 4:"混用标准 DH 与改进 DH 却不出错":两套约定的 a、d、θ、α 数值和相乘顺序都不同,抄表前先确认约定,否则 FK 会得到镜像/错位的姿态。
🚫 误区 5:"雅可比只用于求速度":它同样做力传递 τ = JᵀF 和数值 IK 迭代,是速度、力、优化三者共用的核心结构。

10 本节自测

1. 标准 DH 约定里,描述相邻关节坐标系之间关系的四个参数是?
💡 解析:DH 参数固定为四个——θ 是绕 z_{i-1} 轴的关节角,d 是沿 z_{i-1} 的偏距,a 是沿 x_i 的连杆长度,α 是绕 x_i 的扭转角。B/C/D 都不是标准 DH 的四参数。
2. 为什么机器人姿态估计常用单位四元数,而不是欧拉角?
💡 解析:欧拉角按固定顺序转三次,中间角到 ±90° 时首末两轴重合、丢一个自由度(万向锁);四元数用 4 个数(带单位化约束)整体表示旋转,任意姿态连续无退化,插值用 slerp。A 错(是 4 个数),C 错(四元数乘法不交换),D 错(四元数不是矩阵)。
3. 平面 2 连杆臂 L1 = L2 = 1,当 θ1 = 0°、θ2 = 90° 时,末端位置是?(用 FK:x = L1·cosθ1 + L2·cos(θ1+θ2),y = L1·sinθ1 + L2·sin(θ1+θ2))
💡 解析:x = cos0° + cos(0°+90°) = 1 + 0 = 1;y = sin0° + sin90° = 0 + 1 = 1,即末端在 (1,1)。B 是 θ2=0° 伸直时的位置;D 是 L1=L2=1、两杆垂直时的错误换算。
4. 2 连杆平面臂的雅可比行列式 det(J) = L1·L2·sin(θ2)。当 θ2 为多少时,机械臂处于奇异位形?
💡 解析:det(J) = L1·L2·sinθ2,当 θ2 = 0 或 π(完全伸直/折回)时行列式为 0,J 不可逆,即奇异位形——此时末端沿臂方向无法用有限关节速度驱动。θ2 = 90° 时 sinθ2 = 1,行列式最大、灵活性最好。
5. 关于逆运动学(IK),下列说法正确的是?
💡 解析:IK 是 FK 的反问题,可能存在多解、无解和奇异点(见 5 节),A 错;解析法只对结构简单、有闭式解的臂有效,通用的是数值法(见 5.1),B 错;目标点超出臂展(距离大于 L1+L2)时 c2 绝对值大于 1、acos 无定义,即无解(见 5.2),D 错。数值法从初值出发逐步逼近,一般只收敛到离初值最近的解、初值差还可能不收敛,C 对。
6. 末端要顶住外力 F 时,各关节需要输出的力矩 τ 用雅可比矩阵 J 如何计算?
💡 解析:雅可比矩阵有两个用途——速度映射 v = J·q̇(关节速度→末端速度)与力映射 τ = Jᵀ·F(末端力→关节力矩),是一对「对偶」关系(见 6.1、6.3)。选关节电机扭矩时,就是拿最恶劣位形下的 τ 峰值来选型。
7. 关于标准 DH 与改进 DH(Craig),下列说法正确的是?
💡 解析:标准 DH 把连杆 i 的坐标系放在连杆 i 的远端(靠近关节 i+1),改进 DH 放在近端(靠近关节 i),且变换相乘顺序也不同(见 3.2 的⚠️提示)。同样的机械臂两套参数数值不同,抄表前必须先确认用的是哪套约定,否则 FK 会得到镜像/错位的姿态。
📌 本节要点速查:①位姿 = 位置 + 姿态,姿态首选旋转矩阵/四元数(避万向锁),给人看才转欧拉角;②齐次变换把旋转+平移装进 4×4,连乘「最右矩阵最先作用」,顺序不可交换;③DH 参数 θ/d/a/α 标准化每根连杆,连乘得 FK(关节角→末端,解唯一);④IK 由末端反推关节角,解析法快但受限、数值法通用但依赖初值,且有多解/无解/奇异;⑤雅可比 J:速度 v=Jq̇、力 τ=JᵀF,det(J)=0 即奇异位形,必须避开。
📌 本节小结:①位姿 = 位置 + 姿态,姿态可用旋转矩阵/欧拉角/四元数表示,计算内部首选矩阵与四元数(避免万向锁);②齐次变换把旋转和平移装进 4×4,连乘时"最右矩阵最先作用",顺序不可交换;③DH 参数用 θ、d、a、α 四个数标准化每根连杆,连乘得正运动学 FK(关节角→末端,解唯一);④逆运动学 IK 从末端反推关节角,解析法快但受限,数值法通用但依赖初值,且有多解/无解/奇异问题;⑤雅可比 J 把关节速度映射到末端速度(v=Jq̇)、把末端力映射到关节力矩(τ=JᵀF),行列式为 0 即奇异位形,必须避开。
🤔 思考题: 1. 人腿的膝盖只能向前弯。如果用 5.2 的 2 连杆解析公式解"脚落地"的 IK,你如何从 ±θ2 两个解里自动挑出"膝盖向前"的那一个?
2. 手臂伸到最直(奇异位形)时,为什么哪怕电机疯狂转,末端也几乎推不出去?结合 det(J) = L1·L2·sinθ2 解释。
3. 找一个你手头的机器人 URDF 文件,读出第一个 joint 的 type、axis 和 origin,试着说出它对应标准 DH 里的哪几个参数(θ/d/a/α)。

M 参考来源