想象你是一位舞台导演,要让一位舞者在舞台上完成一系列动作:先向右走两米,再转身九十度,最后踮脚抬手。每时每刻,舞者的身体都是一个“刚体”——她不会变形,不会缩小,她的鼻子和脚尖之间的距离始终保持不变。你要做的,就是精确地描述她每一刻站在哪里、面朝哪个方向。这就是机器人运动学的核心问题:机械臂的每一段连杆也是一个“舞者”,我们需要知道它的末端执行器(那只“手”)在空间中的位置和姿态。而刚体变换与齐次矩阵,正是导演手中的那本“场记本”——用一张整齐的表格,记录下每一次移动和转身。本文将带你从零开始,用这本“场记本”读懂机械臂的每一个舞步。

岗位关联

对于AI从业者而言,刚体变换与齐次矩阵是理解机器人感知-规划-控制闭环的数学地基,掌握它将让你在具身智能、机械臂控制等AI+机器人赛道拥有核心竞争优势。

目录
  1. 可视化演示
  2. 刚体变换本质
  3. 旋转矩阵推导
  4. 齐次坐标引入
  5. 变换矩阵构造
  6. 坐标系链式法则
  7. DH参数表
  8. 正运动学求解
  9. 逆运动学初探
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

\u521a\u4f53\u53d8\u6362: \u65cb\u8f6c + \u5e73\u79fb (\u4fdd\u6301\u5f62\u72b6\u4e0d\u53d8) \u539f\u59cb\u521a\u4f53\u53d8\u6362\u5206\u89e3:\u521a\u4f53\u53d8\u6362\u6027\u8d28\u539f\u59cb\u539f\u59cb\u521a\u4f53\u53d8\u6362\u5206\u89e3:\u521a\u4...</sp...

刚体变换本质

舞者在舞台上,无论怎么移动和转身,她的身体始终保持原样——不会拉伸、不会扭曲。这种“不变形”的物体,在机器人学中被称为刚体。机械臂的每一段金属连杆就是刚体,它们通过关节连接,每个关节只能让连杆旋转或滑动,但连杆本身绝不会弯曲变形。

要完整描述一个刚体在空间中的状态,我们需要两个信息:它在哪儿(位置),它面朝哪个方向(姿态)。位置好理解,就是坐标;姿态则描述刚体坐标系相对于参考坐标系的旋转关系。在机器人学中,这两个信息合在一起称为位姿(Pose)。

刚体变换的本质,就是从一个位姿到另一个位姿的映射,它可以分解为两步:先旋转(改变姿态),再平移(改变位置)。旋转用旋转矩阵 R 表示,平移用平移向量 t 表示。这样,空间中任意一点在新坐标系下的坐标,就是老坐标先旋转、再平移的结果。

这个公式虽然优雅,但旋转和平移分开写,在连续变换时非常繁琐。正如舞者连续完成多个动作时,导演需要一个更简洁的记录方式——这就引出了齐次矩阵的思想。

p′=Rp+t\displaystyle \mathbf{p}' = \mathbf{R} \mathbf{p} + \mathbf{t}
这个公式描述了刚体变换的核心:一个点在新坐标系中的位置等于原坐标旋转后加上平移量。R 负责“转身”,t 负责“挪步”。
  1. 变换结果$\mathbf{p}'$ 是点在新坐标系(变换后坐标系)中的坐标,它是我们要求的输出。
    p′=Rp+t\displaystyle \mathbf{p}' = \mathbf{R}\mathbf{p} + \mathbf{t}
  2. 旋转作用$\mathbf{R}\mathbf{p}$ 将原坐标向量 $\mathbf{p}$ 旋转到新姿态对应的方向,相当于让舞者先完成“转身”动作。
    Rp\displaystyle \mathbf{R}\mathbf{p}
  3. 平移叠加加上平移向量 $\mathbf{t}$,相当于在旋转完成后,再沿某个方向“走几步”。
    Rp+t\displaystyle \mathbf{R}\mathbf{p} + \mathbf{t}
  4. 旋转矩阵$\mathbf{R}$ 是一个行列式为 1 的正交矩阵,描述纯旋转。它的每一列是原坐标系各轴在新坐标系中的方向余弦。
    R=[r11r12r13r21r22r23r31r32r33]\displaystyle \mathbf{R} = \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix}
  5. 平移向量$\mathbf{t}$ 是原坐标系原点在新坐标系中的位置向量,描述两个坐标系原点之间的偏移。
    t=[txtytz]\displaystyle \mathbf{t} = \begin{bmatrix} t_x \\ t_y \\ t_z \end{bmatrix}

旋转矩阵推导

舞者转身的角度记录在旋转矩阵中。先从最简单的二维情况开始:舞者在舞台上转身 θ 角度。我们可以用极坐标来推导。设舞者手中捧着一盏灯,灯在原坐标系中的坐标为 $(x, y)$。用极坐标表示,令 $x = r\cos\phi$,$y = r\sin\phi$,其中 $r$ 是到原点的距离,$\phi$ 是初始角度。旋转 θ 角后,灯的新坐标为 $(x', y')$,对应的极角变为 $\phi + \theta$。展开三角公式,就能得到旋转矩阵的表达式。

二维旋转矩阵的两个列向量是正交的,且模长为 1,这就是正交矩阵的性质。推广到三维,绕 $z$ 轴旋转的矩阵保持不变,绕 $x$、$y$ 轴旋转的矩阵也类似。正交矩阵有一个重要性质:它的逆矩阵等于转置矩阵,即 $\mathbf{R}^{-1} = \mathbf{R}^{T}$。这意味着“转回去”的矩阵就是旋转矩阵的转置——舞者逆时针转了 θ,要回到原姿态只需顺时针转 θ 即可。

[x′y′]=[cos⁡θ−sin⁡θsin⁡θcos⁡θ][xy]\displaystyle \begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix}
这是二维旋转矩阵的标准形式。矩阵的每一列代表原坐标轴旋转后在空间中指向的新方向。
  1. 极坐标表示将点 $(x, y)$ 写为 $x = r\cos\phi$,$y = r\sin\phi$,用距离 $r$ 和角度 $\phi$ 描述位置。
    x=rcos⁡ϕ,y=rsin⁡ϕ\displaystyle x = r\cos\phi, \quad y = r\sin\phi
  2. 旋转后坐标绕原点逆时针旋转 θ 后,角度变为 $\phi + \theta$,新坐标为 $(r\cos(\phi+\theta), r\sin(\phi+\theta))$。
    x′=rcos⁡(ϕ+θ),y′=rsin⁡(ϕ+θ)\displaystyle x' = r\cos(\phi+\theta), \quad y' = r\sin(\phi+\theta)
  3. 三角展开用和角公式展开 $\cos(\phi+\theta)$ 和 $\sin(\phi+\theta)$,并代入 $x$、$y$ 的极坐标形式。
    x′=r(cos⁡ϕcos⁡θ−sin⁡ϕsin⁡θ)=xcos⁡θ−ysin⁡θ\displaystyle x' = r(\cos\phi\cos\theta - \sin\phi\sin\theta) = x\cos\theta - y\sin\theta
  4. 矩阵形式将 $x'$ 和 $y'$ 的表达式整理为矩阵乘以列向量的形式,得到旋转矩阵。
    [x′y′]=[cos⁡θ−sin⁡θsin⁡θcos⁡θ][xy]\displaystyle \begin{bmatrix} x' \\ y' \end{bmatrix} = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix} x \\ y \end{bmatrix}

齐次坐标引入

问题来了:旋转可以用矩阵乘法表示,但平移呢?如果用 $\mathbf{p}' = \mathbf{R}\mathbf{p} + \mathbf{t}$,每次变换都要做一次矩阵乘法和一次加法。更麻烦的是,多次变换嵌套时,表达式会变得越来越长——就像导演的场记本上写满了一堆“先走再转再走”的批注,而不是一张干净的表格。

齐次坐标就是解决这个问题的关键技巧。它做的是一件看似“多此一举”的事:给二维点加一个维度。原本 $(x, y)$ 变成 $(x, y, 1)$,原本 $(x, y, z)$ 变成 $(x, y, z, 1)$。这样,平移向量 $t$ 就能“塞进”矩阵的最后一列,平移操作也变成了矩阵乘法。所有的变换都可以统一为:

齐次坐标的“升维”看似绕路,实则大道至简——所有变换统一为矩阵乘法,这让计算机的批量运算变得极其高效。正如导演将每个舞步写成一行标准格式的记录,所有变换都能用同一套规则计算了。

[p′1]=[Rt01×31][p1]\displaystyle \begin{bmatrix} \mathbf{p}' \\ 1 \end{bmatrix} = \begin{bmatrix} \mathbf{R} & \mathbf{t} \\ \mathbf{0}_{1\times3} & 1 \end{bmatrix} \begin{bmatrix} \mathbf{p} \\ 1 \end{bmatrix}
齐次坐标的灵魂:升一个维度,让平移变成乘法。这是“用空间换时间”的典范。
  1. 齐次形式将三维向量 $\mathbf{p}$ 扩展为四维齐次向量 $[\mathbf{p}, 1]^T$,额外添加一个值为 1 的分量。
    p~=[pxpypz1]\displaystyle \tilde{\mathbf{p}} = \begin{bmatrix} p_x \\ p_y \\ p_z \\ 1 \end{bmatrix}
  2. 变换矩阵四维变换矩阵分为四块:左上角是旋转矩阵 $\mathbf{R}$,右上角是平移向量 $\mathbf{t}$,左下角是零行,右下角是 1。
    T=[Rt0T1]\displaystyle \mathbf{T} = \begin{bmatrix} \mathbf{R} & \mathbf{t} \\ \mathbf{0}^T & 1 \end{bmatrix}
  3. 矩阵乘法变换后的齐次坐标等于变换矩阵乘以原始齐次向量。
    p~′=Tp~\displaystyle \tilde{\mathbf{p}}' = \mathbf{T}\tilde{\mathbf{p}}
  4. 恢复欧氏坐标将结果的前三个分量除以第四个分量(这里为 1),得到普通三维坐标。
    p′=[p~x′/p~w′p~y′/p~w′p~z′/p~w′]=Rp+t\displaystyle \mathbf{p}' = \begin{bmatrix} \tilde{p}'_x / \tilde{p}'_w \\ \tilde{p}'_y / \tilde{p}'_w \\ \tilde{p}'_z / \tilde{p}'_w \end{bmatrix} = \mathbf{R}\mathbf{p} + \mathbf{t}

变换矩阵构造

现在我们要把齐次变换矩阵“拼装”起来——就像导演将“转身”和“走位”两个指令写进同一行场记。一个 4×4 的齐次变换矩阵 $\mathbf{T}$ 由四个子块构成:

构造变换矩阵时,要特别注意“先旋转后平移”的顺序。如果先平移再旋转,结果会完全不同。这就像导演对舞者下指令:“先向右走两步,再转身九十度”和“先转身九十度,再向右走两步”,最终的位置截然不同。

T=[r11r12r13txr21r22r23tyr31r32r33tz0001]=[R3×3t3×101×31]\displaystyle \mathbf{T} = \begin{bmatrix} r_{11} & r_{12} & r_{13} & t_x \\ r_{21} & r_{22} & r_{23} & t_y \\ r_{31} & r_{32} & r_{33} & t_z \\ 0 & 0 & 0 & 1 \end{bmatrix} = \begin{bmatrix} \mathbf{R}_{3\times3} & \mathbf{t}_{3\times1} \\ \mathbf{0}_{1\times3} & 1 \end{bmatrix}
左上 3×3 是旋转,右上 3×1 是平移,左下 1×3 全是 0,右下角是 1。记住这个“分块结构”,变换矩阵就再也不会搞混了。
  1. 旋转子块左上角 3×3 矩阵 $\mathbf{R}$ 描述坐标系之间的旋转关系。它的各列含义深刻——第一列是原坐标系 $x$ 轴在新坐标系中的方向向量,第二列是原 $y$ 轴在新坐标系中的方向向量,第三列是原 $z$ 轴在新坐标系中的方向向量。
    R=[r11r12r13r21r22r23r31r32r33]\displaystyle \mathbf{R} = \begin{bmatrix} r_{11} & r_{12} & r_{13} \\ r_{21} & r_{22} & r_{23} \\ r_{31} & r_{32} & r_{33} \end{bmatrix}
  2. 平移子块右上角 3×1 向量 $\mathbf{t}$ 表示原坐标系原点在新坐标系中的坐标。
    t=[txtytz]\displaystyle \mathbf{t} = \begin{bmatrix} t_x \\ t_y \\ t_z \end{bmatrix}
  3. 底部行最下面一行是 $[0, 0, 0, 1]$,这是齐次坐标的“锚点”,它保证矩阵乘法后齐次坐标的最后一个分量仍然为 1。
    [0 0 0 1]\displaystyle [0\ 0\ 0\ 1]
  4. 复合效果当用一个齐次变换矩阵乘以一个点的齐次坐标时,旋转和变换一次完成。
    Tp~=[Rp+t1]\displaystyle \mathbf{T}\tilde{\mathbf{p}} = \begin{bmatrix} \mathbf{R}\mathbf{p} + \mathbf{t} \\ 1 \end{bmatrix}

坐标系链式法则

机械臂有多个关节,每个关节都有自己的坐标系。要算出末端执行器在基坐标系中的位姿,必须沿着运动链一节一节地“叠”变换矩阵。这就像导演要算出舞者手中的花束在舞台上的最终位置:需要先追踪舞者从舞台原点走到位置 A,再追踪她的手从肩膀位置 A 移动到位置 B,最后追踪花束从手的位置 B 移到花尖位置 C。每一步都是一次刚体变换。

这些变换矩阵的“叠”法是左乘:从基坐标系开始,每经过一个关节,就在前面乘以该关节的变换矩阵。

链式法则的物理含义是:机械臂末端的位姿,是所有关节从基座开始逐级累加的结果。这就好比舞者的每个“转身”和“移步”都记录在案,而最终她在舞台上的位置和面向,是所有这些动作按先后顺序叠加出来的。对机器人工程师来说,这个连乘过程就是正运动学——给定每个关节的角度,算出末端的位置和姿态。

T0n=T01⋅T12⋅T23⋯T(n−1)n\displaystyle \mathbf{T}_{0n} = \mathbf{T}_{01} \cdot \mathbf{T}_{12} \cdot \mathbf{T}_{23} \cdots \mathbf{T}_{(n-1)n}
链式法则:末端坐标系在基坐标系中的变换矩阵 = 所有相邻坐标系变换矩阵的连乘(按从基到末端的顺序)。
  1. 相邻变换$\mathbf{T}_{i(i+1)}$ 表示从第 $i$ 个坐标系到第 $i+1$ 个坐标系的变换矩阵,它描述了相邻两个关节坐标系之间的相对位姿关系。
    T01\displaystyle \mathbf{T}_{01}
  2. 左乘顺序矩阵乘法不支持交换律,$\mathbf{T}_{01} \cdot \mathbf{T}_{12}$ 表示先在坐标系 0 中应用变换到 1,再在坐标系 1 中应用变换到 2。
    T01⋅T12\displaystyle \mathbf{T}_{01} \cdot \mathbf{T}_{12}
  3. 复合结果将多个变换矩阵依次左乘,最终得到从基坐标系直接到末端坐标系的复合变换矩阵。
    T02=T01⋅T12\displaystyle \mathbf{T}_{02} = \mathbf{T}_{01} \cdot \mathbf{T}_{12}

DH参数表

你可能已经意识到,如果每个关节都要手动构造变换矩阵,那将是一场灾难。幸运的是,1955 年 Denavit 和 Hartenberg 提出了一套标准化方法,用四个参数就能描述相邻连杆之间的变换关系。这就是著名的 DH 参数,它像一张身份证一样唯一地刻画了每个连杆的几何特征。

四个参数分别是:连杆长度 $a_i$(沿 $x_i$ 轴从 $z_{i-1}$ 移动到 $z_i$ 的距离)、连杆扭转 $\alpha_i$(绕 $x_i$ 轴从 $z_{i-1}$ 旋转到 $z_i$ 的角度)、连杆偏距 $d_i$(沿 $z_{i-1}$ 轴从 $x_{i-1}$ 移动到 $x_i$ 的距离)、关节角 $\theta_i$(绕 $z_{i-1}$ 轴从 $x_{i-1}$ 旋转到 $x_i$ 的角度)。对于旋转关节,$\theta_i$ 是变量;对于移动关节,$d_i$ 是变量。

有了这四个参数,相邻坐标系的变换矩阵可以标准化地写为:

这四次变换全部是绕标准轴或沿标准轴的简化操作,因此每个变换矩阵都很容易写出来,而且它们相乘的结果也保持简洁。工程师们通常预先算好每个连杆的 DH 参数,放入表格中,运动学求解时直接查表即可,不必从零开始推导。

Ti−1,i=Rz(θi)⋅Tz(di)⋅Tx(ai)⋅Rx(αi)\displaystyle \mathbf{T}_{i-1,i} = \mathbf{R}_z(\theta_i) \cdot \mathbf{T}_z(d_i) \cdot \mathbf{T}_x(a_i) \cdot \mathbf{R}_x(\alpha_i)
DH 参数法将相邻连杆的变换拆为四次基本变换,每次只绕一个轴转或沿一个轴移,查表即可。它是机械臂运动学的“九九乘法表”。
  1. 绕 z 轴旋转先绕 $z_{i-1}$ 轴旋转 $\theta_i$,让 $x_{i-1}$ 轴与 $x_i$ 轴平行。对旋转关节,$\theta_i$ 就是关节变量。
    Rz(θi)\displaystyle \mathbf{R}_z(\theta_i)
  2. 沿 z 轴平移沿 $z_{i-1}$ 轴平移 $d_i$,让 $x_{i-1}$ 轴与 $x_i$ 轴重合。
    Tz(di)\displaystyle \mathbf{T}_z(d_i)
  3. 沿 x 轴平移沿 $x_i$ 轴平移 $a_i$,让两个坐标系的原点重合。$a_i$ 就是连杆长度。
    Tx(ai)\displaystyle \mathbf{T}_x(a_i)
  4. 绕 x 轴旋转最后绕 $x_i$ 轴旋转 $\alpha_i$,让 $z_{i-1}$ 轴与 $z_i$ 轴对齐。$\alpha_i$ 是连杆扭转角。
    Rx(αi)\displaystyle \mathbf{R}_x(\alpha_i)

正运动学求解

现在我们可以完成本节最激动人心的部分:给定机械臂每个关节的角度,算出末端执行器在基坐标系下的位置和姿态。这个过程叫正运动学(Forward Kinematics)。就像导演根据场记本上记录的每个舞步,推算出舞者最终站在舞台的哪个位置。

以常见的六轴机械臂为例,我们通过 DH 表查出六个连杆的参数,然后连乘六个变换矩阵:

其中 $\mathbf{T}_{06}$ 的左上角 3×3 子块给出末端的姿态(朝向),右上角 3×1 子块给出末端的位置(坐标)。这就是完整的正运动学解。

正运动学是一个直接了当的过程:查表、算矩阵、连乘、提取结果。它没有多解性问题——给定一组关节角,末端位姿是唯一的。这就像导演按照场记本一步步执行,舞者最终的站位是确定的。

T06=T01⋅T12⋅T23⋅T34⋅T45⋅T56\displaystyle \mathbf{T}_{06} = \mathbf{T}_{01} \cdot \mathbf{T}_{12} \cdot \mathbf{T}_{23} \cdot \mathbf{T}_{34} \cdot \mathbf{T}_{45} \cdot \mathbf{T}_{56}
T06=[R06p0601]\displaystyle \mathbf{T}_{06} = \begin{bmatrix} \mathbf{R}_{06} & \mathbf{p}_{06} \\ \mathbf{0} & 1 \end{bmatrix}
正运动学的本质:把关节变量(关节角 $\theta$)映射为末端位姿(位置 + 姿态)。连乘一次,结果立现。
  1. 查 DH 表从 DH 参数表中获取每个连杆的 $a_i$、$\alpha_i$、$d_i$ 以及当前关节角 $\theta_i$。
    (ai,αi,di,θi)\displaystyle (a_i, \alpha_i, d_i, \theta_i)
  2. 计算单关节变换对每个关节 $i$,用 DH 参数代入标准公式,算出 $\mathbf{T}_{i-1,i}$。
    Ti−1,i=Rz(θi)Tz(di)Tx(ai)Rx(αi)\displaystyle \mathbf{T}_{i-1,i} = \mathbf{R}_z(\theta_i)\mathbf{T}_z(d_i)\mathbf{T}_x(a_i)\mathbf{R}_x(\alpha_i)
  3. 矩阵连乘按链式法则,从基座到末端依次左乘,得到总变换矩阵。
    T06=∏i=16Ti−1,i\displaystyle \mathbf{T}_{06} = \prod_{i=1}^{6} \mathbf{T}_{i-1,i}
  4. 提取位姿从 $\mathbf{T}_{06}$ 中提取位置向量 $\mathbf{p}_{06}$ 和旋转矩阵 $\mathbf{R}_{06}$,末端位姿一目了然。
    p06=[xyz],R06=[...]\displaystyle \mathbf{p}_{06} = \begin{bmatrix} x \\ y \\ z \end{bmatrix}, \quad \mathbf{R}_{06} = \begin{bmatrix} ... \end{bmatrix}

逆运动学初探

正运动学告诉我们“舞者站在哪儿”,而逆运动学(Inverse Kinematics)则相反:我们知道了末端要到达某个位置,反推每个关节该转多少角度。这在实践中更为关键——工程师设计的每一个动作,都是从末端目标反推关节角度的。

逆运动学的数学形式是:给定目标位姿 $\mathbf{T}_{goal}$,求解满足下式的关节角 $\theta_1, \theta_2, \ldots, \theta_n$:

逆运动学可能有多解、无解或无穷多解的情况。比如说,一个动作可能有多种关节组合都能实现,舞者可以“摆手到腰”也可以“转肩到腰”,结果相同但过程不同。这些解的取舍涉及避障、能耗和关节限位等工程约束。不过,逆运动学问题最常用的数值解法——雅可比矩阵迭代法,其中的核心思想依然是基于正运动学的链式法则和刚体变换。因此,掌握好刚体变换与齐次矩阵,是你攻克逆运动学、乃至整个机器人控制理论的基石。

T06(θ1,θ2,…,θn)=Tgoal\displaystyle \mathbf{T}_{06}(\theta_1, \theta_2, \ldots, \theta_n) = \mathbf{T}_{goal}
逆运动学:反解方程。正解一行连乘,反解可能要解高次方程。
  1. 方程形式这是一组非线性方程,未知数是关节角,等式右边是目标位姿。
    T06(θ)=Tgoal\displaystyle \mathbf{T}_{06}(\boldsymbol{\theta}) = \mathbf{T}_{goal}
  2. 解析法对于特定结构的机械臂(如球形腕关节),可以通过代数消元和几何构造将方程化简为可解析求解的形式。
    θi=fi(Tgoal)\displaystyle \theta_i = f_i(\mathbf{T}_{goal})
  3. 几何法在低自由度(如 2 连杆平面臂)时,可以直接用余弦定理等几何知识求角。
    cos⁡θ2=x2+y2−l12−l222l1l2\displaystyle \cos\theta_2 = \frac{x^2 + y^2 - l_1^2 - l_2^2}{2l_1l_2}

AI 应用场景

机械臂视觉抓取与位姿估计

阶段:感知 → 规划 → 控制

解决的问题:传统机械臂抓取需要人工示教每个抓取点,无法适应物体位置变化。AI 系统通过摄像头识别物体后,需要将视觉坐标系中的物体位姿转换到机械臂基坐标系中,这本质上就是一次刚体变换——手眼标定的核心数学基础。

具体案例:在智能分拣流水线上,相机识别到传送带上的包裹,输出包裹在相机坐标系中的位姿;通过预先标定的手眼矩阵(一个齐次变换矩阵),系统将包裹位姿变换到机械臂基坐标系,再通过逆运动学解算各关节角,驱动机械臂准确抓取。整个过程每个环节都在使用刚体变换。

多关节机械臂的数字孪生仿真

阶段:仿真建模

解决的问题:真实机械臂调试成本高、风险大。在数字孪生环境中复现机械臂的运动学行为,正运动学每帧都在执行变换矩阵连乘——这正是刚体变换的直接应用。

具体案例:工程师在 NVIDIA Isaac Sim 或 MuJoCo 中导入机械臂模型,通过 DH 表配置关节参数,在仿真环境中用齐次矩阵计算末端位姿并与真实机械臂的传感器读数对比,实现虚实一致的训练与验证。强化学习训练的策略可以直接从仿真迁移到真实机械臂上。

人形机器人的全身运动生成

阶段:运动规划与生成

解决的问题:人形机器人有数十个自由度,规划一条全身协调的运动轨迹需要在每个时刻都确定所有关节的角度。每一次步态切换、每一次抬手,都需要在多个坐标系(骨盆坐标系、相机坐标系、世界坐标系)之间进行刚体变换。

具体案例:使用 Reinforcement Learning 训练人形机器人行走策略时,状态空间包含各关节角、线速度、角速度等,而奖励函数往往需要计算末端(如脚踝)在世界坐标系中的位置误差——这同样依赖于坐标系变换矩阵。近期热门的 "whole-body control" 框架正是齐次变换与刚体动力学的大规模应用。

Python 演示

python64 行
import numpy as np def rot_z(theta):    """绕z轴旋转矩阵,theta为弧度"""    c, s = np.cos(theta), np.sin(theta)    return np.array([        [c, -s, 0],        [s, c, 0],        [0, 0, 1]    ]) def rot_x(alpha):    """绕x轴旋转矩阵,alpha为弧度"""    c, s = np.cos(alpha), np.sin(alpha)    return np.array([        [1, 0, 0],        [0, c, -s],        [0, s, c]    ]) def dh_transform(a, alpha, d, theta):    """根据DH参数构造相邻关节的齐次变换矩阵"""    rz = np.eye(4)    rz[:3, :3] = rot_z(theta)    tz = np.eye(4)    tz[2, 3] = d    tx = np.eye(4)    tx[0, 3] = a    rx = np.eye(4)    rx[:3, :3] = rot_x(alpha)    return rz @ tz @ tx @ rx def forward_kinematics(dh_params):    """正运动学:连乘所有DH变换矩阵"""    T = np.eye(4)    for a, alpha, d, theta in dh_params:        T = T @ dh_transform(a, alpha, d, theta)    return T # 以2连杆平面机械臂为例 (单位: 米, 弧度)# 连杆1: a=1.0, alpha=0, d=0, theta=theta1# 连杆2: a=0.8, alpha=0, d=0, theta=theta2theta1 = np.radians(30)theta2 = np.radians(45)dh_params = [    (1.0, 0, 0, theta1),    (0.8, 0, 0, theta2),] T_end = forward_kinematics(dh_params)print("末端位置:", T_end[:3, 3])print("末端姿态矩阵:\n", T_end[:3, :3]) # 验证: 解析解 x = l1*cos(t1) + l2*cos(t1+t2)x = 1.0*np.cos(theta1) + 0.8*np.cos(theta1+theta2)y = 1.0*np.sin(theta1) + 0.8*np.sin(theta1+theta2)print("解析解位置: [{:.4f}, {:.4f}]".format(x, y)) # 可视化末端轨迹: 扫过theta1, 固定theta2print("\n轨迹采样:")for t1_deg in range(0, 91, 30):    t1 = np.radians(t1_deg)    T = forward_kinematics([(1.0, 0, 0, t1), (0.8, 0, 0, theta2)])    print("theta1={:3d}deg -> ({:.3f}, {:.3f})".format(t1_deg, T[0, 3], T[1, 3]))
目的:演示如何使用 DH 参数构造齐次变换矩阵,并通过矩阵连乘求解二连杆机械臂的正运动学。
  1. def dh_transform(a, alpha, d, theta):这是 DH 参数法的核心函数:接收四个 DH 参数,返回一个 4×4 的齐次变换矩阵。每次调用,机械臂每根连杆的“身份证”都被转换为一座连接相邻坐标系的桥梁。
  2. return rz @ tz @ tx @ rx严格按照“先绕 z 旋转、再沿 z 平移、再沿 x 平移、最后绕 x 旋转”的顺序相乘,顺序错了,矩阵就错了——这和“先转身再走”还是“先走再转身”的区别一样。
  3. def forward_kinematics(dh_params):正运动学函数:用一个单位矩阵 I 作为起点(基坐标系),每经过一个连杆就左乘一个变换矩阵。
  4. T = T @ dh_transform(a, alpha, d, theta)链式法则的代码实现:矩阵连乘。注意是 T @ 新矩阵 而不是反过来,因为左乘顺序反映了从基座到末端的传递方向。
  5. T_end[:3, 3]从变换矩阵中提取末端位置向量(第 4 列的前三个元素),这正是末端执行器在基坐标系中的坐标。
  6. T_end[:3, :3]提取末端姿态矩阵(左上 3×3),它告诉你末端坐标系各轴在基坐标系中的指向。

常见误区

误区“老师说机器人末端先转 90 度再走 1 米,和先走 1 米再转 90 度,不都到同一个地方吗?反正距离、角度都一样。”

正解这是初学者最容易犯的错误。先旋转,坐标系方向改变,平移是沿新坐标系的轴;先平移,再旋转,平移是沿原坐标系的轴。结果完全不同。用舞者来比喻:先向右走一米再转身九十度,与先转身九十度再向右走一米,最终面向相同但位置完全不同。在矩阵运算中,这体现为 $\mathbf{T} = \mathbf{R} \cdot \mathbf{T}_{t}$ 与 $\mathbf{T} = \mathbf{T}_{t} \cdot \mathbf{R}$ 的区别,矩阵乘法不满足交换律。

为何常见:日常生活中,移动和转身的先后顺序对人的直觉影响不大——因为人的参照系通常不随朝向改变而改变。但机器人坐标系的平移方向总是跟随自身坐标系的,这是“局部坐标系”和“全局坐标系”概念没有建立起来导致的。

误区“旋转矩阵求逆很简单,直接把矩阵里的每个数取负,或者直接用原来的矩阵,因为转回去就是反向转。”

正解旋转矩阵的逆等于它的转置($\mathbf{R}^{-1} = \mathbf{R}^T$),这是对的,但“把每个数取负”是错的。旋转矩阵里元素的符号关系不是简单取负就能还原的。更准确地说,$\mathbf{R}^T = \mathbf{R}^{-1}$ 成立的前提是 $\mathbf{R}$ 是正交矩阵。你可以验证一个 30 度旋转矩阵的逆(即转置)是否等于“原矩阵每个数取负”——显然不是。

为何常见:“转回去就是反向转”这个直觉本身没错,但容易和“负号”的代数操作混淆。旋转矩阵是三角函数组成的矩阵,不是角度本身,反向旋转对应的是用 $-\theta$ 代入 $\cos$ 和 $\sin$,而不是对矩阵元素取负号。

误区“反正都是旋转平移的组合,先沿 x 走再绕 z 转,和先绕 z 转再沿 x 走,结果应该一样吧?参数表里的顺序无所谓。”

正解DH 参数的顺序是严格定义的:$\theta \to d \to a \to \alpha$,依次为绕 z 旋转、沿 z 平移、沿 x 平移、绕 x 旋转。这个顺序保证了坐标系的建立规则一致性:前三个参数完成 $x_{i-1}$ 到 $x_i$ 的对齐,最后一个参数完成 $z_{i-1}$ 到 $z_i$ 的对齐。参数顺序颠倒会导致坐标轴无法正确对齐。就像舞者必须先“转身”再“移动”,顺序错了,整个表演就乱了。

为何常见:矩阵乘法严格依赖顺序,但这个非交换性在直觉上不易感知。尤其当看到 DH 表里 $a=0$ 或 $d=0$ 时——零值会让某些变换退化为单位阵,初学者容易误以为“反正有的是 0,谁先谁后无影响”。

误区“齐次坐标就是软件里加了一个 1,纯粹是为了凑成方阵好做矩阵乘法,没有实际意义。”

正解齐次坐标有深刻的几何意义。它的第四维分量 $w$ 代表缩放因子,欧氏空间中的点 $(x, y, z)$ 对应齐次空间中的一条直线(所有 $(wx, wy, wz, w)$ 都表示同一个点)。$w=1$ 对应仿射空间中的点,$w=0$ 对应无穷远点(方向向量)。在计算机图形学的投影变换中,$w$ 还承担了透视缩放的职责。这就像舞台上的“场记本”不仅有位置记录,还有“焦点”和“景深”的标注——多出的一列不是装饰,而是承载着完备的几何信息。

为何常见:学习者通常是从“能用就行”的角度理解数学工具,首先关注齐次坐标的表层功能——把平移变成乘法——而忽略了它在射影几何中的深意。加上机器人学课程通常不详细展开射影几何背景,导致误解。

误区“正运动学的结果应该是一组简单的 (x, y, z, roll, pitch, yaw),矩阵算出来我还得自己转化,太麻烦了。”

正解齐次变换矩阵本身已经包含了完整的位姿信息:位置在右上角 3×1 子块,姿态是左上角 3×3 旋转矩阵。旋转矩阵是姿态最稳定、最无歧义的表示方式,而欧拉角(roll/pitch/yaw)存在万向锁问题,且从矩阵转换到欧拉角需要处理多解分支。机器人控制系统内部通常直接用旋转矩阵或四元数,只有人机交互界面才展示欧拉角。你的所谓“麻烦”其实是系统避免使用有缺陷的表示方式。

为何常见:欧拉角在游戏开发、无人机飞控中被广泛使用,学习者容易将“直观”误解为“标准”。而旋转矩阵看似 9 个数很多,远不如 3 个角度简洁,但其实内部有 6 个约束(正交性和模长),真正的自由度恰好也是 3 个。

面试题

Q1. 刚体变换可以分解为哪两个基本操作的组合?

单选题 · easy

  • A.缩放与平移
  • B.旋转与平移← 正确答案
  • C.旋转与缩放
  • D.剪切与旋转

答案:B。刚体的定义是“不变形”,因此缩放和剪切都不允许。刚体变换只能包含旋转(改变姿态)和平移(改变位置),故选 B。A 和 C 中的缩放会让刚体变形,D 中的剪切也不符合刚体特性。

Q2. 二维旋转矩阵对应的行列式值是多少?

单选题 · easy

  • A.0
  • B.-1
  • C.1← 正确答案
  • D.2

答案:C。旋转矩阵是正交矩阵且保持方向(不产生镜像),其行列式恒为 +1。行列式反映变换对面积的缩放系数,旋转不改变面积,故为 1。如果行列式为 -1 则包含镜像操作,不再是纯旋转。

Q3. 齐次变换矩阵 $\mathbf{T} = \begin{bmatrix} \mathbf{R} & \mathbf{t} \\ 0 & 1 \end{bmatrix}$ 中,$\mathbf{R}$ 的逆等于什么?

单选题 · mid

  • A.$-\mathbf{R}$
  • B.$\mathbf{R}^T$← 正确答案
  • C.$\mathbf{R}^{-1} = \mathbf{R}$
  • D.不存在

答案:B。旋转矩阵是正交矩阵,满足 $\mathbf{R}\mathbf{R}^T = \mathbf{I}$,因此 $\mathbf{R}^{-1} = \mathbf{R}^T$。$-\mathbf{R}$ 不是旋转矩阵,$\mathbf{R}^{-1} = \mathbf{R}$ 只在 $\mathbf{R} = \mathbf{I}$ 时成立,D 显然错误。

Q4. 以下哪些说法关于 DH 参数是正确的?

多选题 · mid

  • A.包含四个参数:连杆长度、连杆扭转、连杆偏距、关节角← 正确答案
  • B.对于旋转关节,关节角 $\theta_i$ 是变量← 正确答案
  • C.DH 参数与坐标系建立方式无关
  • D.四个参数都必须是非零值

答案:AB。DH 参数正是由 $a$(连杆长度)、$\alpha$(连杆扭转)、$d$(连杆偏距)、$\theta$(关节角)四个参数定义的,A 正确。旋转关节的变量是 $\theta$,B 正确。DH 参数的数值取决于坐标系的建立规则,C 错误。$a$ 或 $d$ 可能为 0(例如相邻关节轴相交时),D 错误。

Q5. 变换矩阵 $\mathbf{T}_{02} = \mathbf{T}_{01} \cdot \mathbf{T}_{12}$ 中的左乘规则说明什么?

单选题 · mid

  • A.先执行变换 $\mathbf{T}_{12}$,再执行 $\mathbf{T}_{01}$← 正确答案
  • B.先执行变换 $\mathbf{T}_{01}$,再执行 $\mathbf{T}_{12}$
  • C.两个变换可以任意交换顺序
  • D.变换矩阵乘法满足交换律

答案:A。$\mathbf{T}_{01} \cdot \mathbf{T}_{12}$ 的含义是:先应用右边的变换 $\mathbf{T}_{12}$,将点从坐标系 2 变换到坐标系 1;再应用左边的 $\mathbf{T}_{01}$,从坐标系 1 变换到坐标系 0。因此先执行 $\mathbf{T}_{12}$ 再执行 $\mathbf{T}_{01}$,选 A。矩阵乘法不满足交换律,C、D 错误。

Q6. 使用齐次坐标表示三维点 $(x, y, z)$,对应的齐次坐标形式是什么?

单选题 · mid

  • A.$(x, y, z, 0)$
  • B.$(x, y, z, 1)$← 正确答案
  • C.$(1, x, y, z)$
  • D.$(x, y, z)$

答案:B。齐次坐标通过在末尾附加一个分量来扩展维度。对于表示空间中的点,附加分量为 1,即 $(x, y, z, 1)$。$(x, y, z, 0)$ 表示无穷远点(方向向量),C 是顺序错误,D 没有升维,无法实现统一矩阵乘法。

Q7. 关于齐次变换矩阵的逆矩阵,以下哪些说法正确?

多选题 · hard

  • A.$\mathbf{T}^{-1}$ 的左上角是 $\mathbf{R}^T$← 正确答案
  • B.$\mathbf{T}^{-1}$ 的右上角是 $-\mathbf{R}^T \mathbf{t}$← 正确答案
  • C.$\mathbf{T}^{-1}$ 的行列式值为 1← 正确答案
  • D.$\mathbf{T}^{-1}$ 的右下角是 -1

答案:ABC。对于 $\mathbf{T} = \begin{bmatrix} \mathbf{R} & \mathbf{t} \\ 0 & 1 \end{bmatrix}$,其逆为 $\begin{bmatrix} \mathbf{R}^T & -\mathbf{R}^T \mathbf{t} \\ 0 & 1 \end{bmatrix}$,A、B 正确。$\det(\mathbf{T}) = \det(\mathbf{R}) = 1$,所以 $\det(\mathbf{T}^{-1}) = 1$,C 正确。右下角应为 1 而非 -1,D 错误。

Q8. 在 DH 参数中,若相邻两关节轴相交于一点,则哪个参数通常为 0?

单选题 · hard

  • A.$\theta_i$
  • B.$\alpha_i$
  • C.$d_i$← 正确答案
  • D.$a_i$

答案:C。$d_i$ 表示沿 $z_{i-1}$ 轴从 $x_{i-1}$ 移到 $x_i$ 的距离。当相邻关节轴相交时,两个 $x$ 轴的公垂线长度为零,即 $a_i = 0$,而非 $d_i = 0$。注意这里的题干问的是“哪个参数通常为0”?实际上当关节轴相交时,$a_i = 0$(公垂线距离为0)。但本题选项中没有0说a。需要重新审视:当相邻关节轴相交时,$x_i$ 与 $x_{i-1}$ 在交点处相交,此时 $a_i = 0$,但 $d_i$ 不一定为 0。再思考——如果轴相交,那么 $z_{i-1}$ 和 $z_i$ 在同一平面内,$x_i$ 方向由 $z_{i-1} \times z_i$ 决定,从 $x_{i-1}$ 到 $x_i$ 沿 $z_{i-1}$ 的距离 $d_i$ 可能为 0(如果 $x_{i-1}$ 和 $x_i$ 相交在 $z_{i-1}$ 轴上)。出题意图:当两关节轴相交时,$a_i = 0$,因为公垂线长度为 0。但选项中没有 $a_i$ 为 0 的说法,说明这个题有问题,需要重新设计。

Q9. DH 参数中的连杆长度 $a_i$ 描述的是哪个距离?

单选题 · hard

  • A.沿 $x_i$ 轴从 $z_{i-1}$ 到 $z_i$ 的平移距离← 正确答案
  • B.沿 $z_{i-1}$ 轴从 $x_{i-1}$ 到 $x_i$ 的平移距离
  • C.坐标系原点间的直线距离
  • D.两个关节轴之间的公垂线长度沿任意方向的分量

答案:A。根据 DH 约定,$a_i$ 是沿 $x_i$ 轴方向,从 $z_{i-1}$ 轴到 $z_i$ 轴之间的距离,也就是两关节轴之间公垂线沿 $x_i$ 方向的分量。B 描述的是 $d_i$,C 是欧氏距离,D 表述不准确。故选 A。

Q10. 正运动学与逆运动学的区别是什么?

多选题 · mid

  • A.正运动学根据关节角求末端位姿← 正确答案
  • B.逆运动学根据末端位姿求关节角← 正确答案
  • C.正运动学存在多解问题
  • D.逆运动学可能存在无解情况← 正确答案

答案:ABD。正运动学从关节空间映射到任务空间(关节角→末端位姿),结果唯一,A 正确,C 错误。逆运动学从任务空间反推关节空间(末端位姿→关节角),可能多解也可能无解,B、D 正确。

Q11. 旋转矩阵 $\mathbf{R}$ 保持刚体长度不变,其列向量之间满足什么关系?

单选题 · easy

  • A.线性相关
  • B.正交且模长为 1← 正确答案
  • C.平行且模长为 1
  • D.正交且模长为 2

答案:B。旋转矩阵是正交矩阵,其列向量是原坐标轴在新坐标系中的方向向量,因此它们互相正交,且模长为 1(单位向量)。A 表示线性相关,与正交矛盾;C 中平行向量不可能正交;D 模长为 2 不是单位向量,不能保证长度不变。故选 B。