机器人学导论 · 交互式学习平台

02 刚体变换Rigid-Body Transformations — 旋转 · 平移 · 齐次坐标

知识清单 K00a–K02考试对应 2024 Q1(a)(b)体系 李泽湘 / MLS 第 2 章
02.0引言WHY FRAMES — 从质点到刚体

1 坐标不是点的属性

同一个杯子,在桌上说“往东 30 厘米”,站在门口说“往北 2 米”,指的是同一个杯子。三个数全变了,杯子没动。坐标是“相对谁量”的读数,不是物体自带的标签。机器人学里绝大多数“算出来的结果和画面不一致”的困惑,追到底都是这一句没站稳。

所以本章的第一件事不是记公式,而是把“相对谁”这件事本身变成一个可以参与计算的对象——也就是坐标系。

2 质点三个数,刚体六个

描述空间中的一个质点,坐标 (x,y,z)(x,y,z) 三个数就够:位置本身就是全部信息。

机器人的连杆不是质点,是刚体——它上面任意两点的距离永远不变。于是“它在哪”不再够用,还必须回答“它朝哪”。位置 3 个自由度,姿态 3 个自由度,一共 6 个。

这里要分清两件事:自由刚体在空间中有 6 个自由度;一条六关节机械臂的位形空间也是 6 维,但那 6 个是关节角,不是位置坐标。本章只解决前者的描述,第 04 课才把关节角和刚体位形接起来。

3 描述姿态的最小装置:两个坐标系

一个固结在参考空间,记作 AA(空间系);一个固结在刚体上,记作 BB(物体系),随刚体一起运动。

为什么必须是两个?一个坐标系只能给点标坐标,说不出“一根轴朝哪”——“朝哪”永远是相对另一根轴讲的。这也解释了后面所有记号为什么都带两个下标:RABR_{AB}、gABg_{AB},第一个字母是参考系,第二个是被描述的那个。

于是“BB 相对 AA 的关系”这一个数学对象,就完整携带了刚体的位置与姿态。本章全部内容都长在这个对象上。

4 本章要造的三件东西

只转不移:旋转矩阵 RABR_{AB}(02.1)。又转又移:齐次变换 gABg_{AB}(02.2)。反过来问“AA 相对 BB 是什么”:gg 的逆(02.2 内)。

这三件东西是整门课的地基:速度是 gg 对时间求导,力用同一套矩阵搬运,第 04 课的正运动学是 gg 的连乘,第 05 课的雅可比是它的微分。

5 前置知识,以及一个 30 秒自检

需要四样:矩阵乘法、转置、逆、行列式;向量点积与叉积;sin⁡\sin、cos⁡\cos 的和角公式;特征值(03 课才用)。微积分只在 03.1 解一个最简单的常微分方程时出现。

自检:能不能在纸上推出 cos⁡(θ+90∘)=−sin⁡θ\cos(\theta+90^\circ) = -\sin\theta?推不出来先补三角恒等式——02.1 的第一步就卡在这里。

6 这个页面怎么用

每一节都是同一套节奏:读一段 → 拖一次画布 → 对一眼右侧面板 → 做小测。文字和面板是同一个对象的两面:文字说“应该是什么”,面板给“现在是多少”。

两者对不上,说明理解有偏差,回去重读那一段,而不是继续往下翻。段落带编号,就是为了让你能回头精确地找到它。

02.1旋转矩阵ROTATION MATRIX

1 把两根箭头写成数

设 BB 相对 AA 只转了一个角度 θ\theta,原点重合。“BB 的姿态”这句话翻译成数学,就是:BB 的两根轴各自指向 AA 里的哪个方向。

xBx_B 与 xAx_A 的夹角是 θ\theta,它的 AA 坐标就是 (cos⁡θ, sin⁡θ)(\cos\theta,\ \sin\theta),放进第 1 列;yBy_B 比 xBx_B 再转 90∘90^\circ,坐标 (cos⁡(θ+90∘), sin⁡(θ+90∘))=(−sin⁡θ, cos⁡θ)(\cos(\theta+90^\circ),\ \sin(\theta+90^\circ)) = (-\sin\theta,\ \cos\theta),放进第 2 列:

RAB=[cos⁡θ−sin⁡θsin⁡θcos⁡θ]R_{AB} = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}

矩阵的列就是坐标轴。拖动红色手柄,右侧矩阵逐项联动——它不是抽象表格,就是那两根箭头的坐标。这句话是本节全部内容的钥匙。

2 为什么一定是“列”,不是“行”

点 qq 固结在刚体上。它在 BB 中的坐标 qBq^{B} 不随运动改变,改变的是它在 AA 中的坐标。同一个箭头,用两套基展开:

qA=q1B xB+q2B yBq^{A} = q_1^{B}\,x_B + q_2^{B}\,y_B

把 xB=(cos⁡θ,sin⁡θ)x_B = (\cos\theta,\sin\theta)、yB=(−sin⁡θ,cos⁡θ)y_B = (-\sin\theta,\cos\theta) 代进去,按 q1Bq_1^{B}、q2Bq_2^{B} 合并同类项:

qA=[cos⁡θ−sin⁡θsin⁡θcos⁡θ][q1Bq2B]=RAB qBq^{A} = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} \begin{bmatrix} q_1^{B} \\ q_2^{B} \end{bmatrix} = R_{AB}\,q^{B}

系数正好是那两根轴的坐标。“列”不是约定,是被这个乘法逼出来的:第 1 列如果写成别的东西,qA=R qBq^{A} = R\,q^{B} 立刻不成立。

3 同一个矩阵的两个身份(最容易混的地方)

身份一,描述:RABR_{AB} 记录 BB 相对 AA 转了多少。身份二,换算:RABR_{AB} 把 BB 系的读数换成 AA 系的读数。两个用途的数值完全相同、方向也一致,不是互为逆的两个操作。

互为逆的是 RBA=RABTR_{BA} = R_{AB}^{\mathsf{T}}——它才是“AA 相对 BB 的姿态”,也是“把 AA 系读数换成 BB 系”的那个变换。

一个可靠的记忆钩子:列 = BB 的轴在 AA 中;行 = AA 的轴在 BB 中。用 θ=90∘\theta = 90^\circ 核对:RR 的第 1 行是 (0,−1)(0,-1),而 AA 的 xx 轴在转了 90∘90^\circ 的 BB 系里确实指向 −yB-y_B。

4 三条性质,来源都是“列是单位正交向量”

两列长度都是 1,且互相垂直,于是 RTR=IR^{\mathsf{T}}R = I。行列式只能是 ±1\pm 1,而刚体运动不允许镜像(那会把左右手互换),所以取 +1+1:

RTR=I,det⁡R=1R^{\mathsf{T}}R = I, \qquad \det R = 1

于是逆等于转置:R−1=RTR^{-1} = R^{\mathsf{T}}。二维三维都是零成本,而且数值上最稳——不用做除法,不会因为接近奇异而炸掉。这条在 03 课反解旋转时还会再用一次。

反过来也要记住:任何同时满足这两条的矩阵都是合法旋转。它们因此可以当验算工具,考试写完 RR 花十秒查一遍,能挡住大部分符号错。

5 复合:下标接龙

RAC=RABRBCR_{AC} = R_{AB}R_{BC}。中间字母相同才能相乘:先把 CC 系的读数换成 BB 系,再把 BB 系换成 AA 系,两步连着做。顺序不能交换——一换,中间的 BB 就接不上了。

三维里这不是空话。取 Rx(90∘)R_x(90^\circ)、Ry(90∘)R_y(90^\circ),乘积 RxRyR_xR_y 的第 1 列是 (0,1,0)(0,1,0),交换成 RyRxR_yR_x 后变成 (0,0,−1)(0,0,-1)。两次旋转的顺序,改变了结果。

二维是特例:所有平面旋转互相可交换(同轴)。这个巧合不要往外推——03.1 会给出一般结论:矩阵指数只有在可交换时才允许把指数相加。

6 手算一遍:θ=30∘\theta = 30^\circ

取 qB=(1,0)q^{B} = (1,0):这是 BB 的 xx 轴上一单位长的点,转 30∘30^\circ 后应落在 (cos⁡30∘, sin⁡30∘)=(0.866, 0.500)(\cos 30^\circ,\ \sin 30^\circ) = (0.866,\ 0.500)。用矩阵算:第一行 0.866×1+(−0.5)×0=0.8660.866 \times 1 + (-0.5)\times 0 = 0.866,第二行 0.5×1+0.866×0=0.50.5 \times 1 + 0.866 \times 0 = 0.5。对上了。

再取 qB=(0,1)q^{B} = (0,1):结果是 (−0.5, 0.866)(-0.5,\ 0.866),正好是第 2 列。把两个基向量各算一次,等于把矩阵的两列各读了一次——这是检查自己有没有算错的最快办法。

反查:qA=(0,1)q^{A} = (0,1)(AA 的 yy 轴)在 BB 里是多少?用 RTR^{\mathsf{T}} 乘,得 (0.5, 0.866)(0.5,\ 0.866)。这同时验证了上面的“行”规则:它就是 RR 的第 2 行。

7 面板操作清单

拖红色手柄:θ\theta 变,两列一起转,第 1 列始终指向 xBx_B。拖黑点 qq:qBq^{B} 变而 RR 不动——刚体上的点在哪,和刚体朝哪,是两件互不干扰的事。

点“转到 90°”:第 1 列变 (0,1)(0,1)、第 2 列变 (−1,0)(-1,0),RTRR^{\mathsf{T}}R 仍是 II。看算术流水:面板把 R qBR\,q^{B} 拆成逐项乘加,两个分量各占一行,手算卡住时对照这里找差异。

常见错误
  • 复合时把 RABR_{AB} 和 RBAR_{BA} 用反。下标接不上就是错的,先查这个。
  • 以为 det⁡R\det R 可以是 −1-1。−1-1 是镜射,刚体做不到。
  • 把“描述姿态”和“换算坐标”当成互为逆的两个操作。它们数值相同,都是 RABR_{AB}。
  • 把方向的乘法写反成 RAB qA=qBR_{AB}\,q^{A} = q^{B}。正确的方向是 qA=RAB qBq^{A} = R_{AB}\,q^{B}。
离开本节前,合上文字回答
  • R(90∘)R(90^\circ) 的两列各是什么?把画布转到 90° 核对。
  • θ=90∘\theta = 90^\circ、qB=(1,0)q^{B} = (1,0) 时 qAq^{A} 是多少?
  • 为什么 det⁡R=1\det R = 1 而不是 ±1\pm 1?
  • RABR_{AB} 的第 2 行代表什么?
Frame B in Frame A◎ 红色手柄 = 旋转 ▪ 黑色原点 = 拖动点 q
当前旋转矩阵θ = 0°
\(R_{AB} = \)
第 1 列 = \(x_B\) 在 \(A\) 中的坐标 第 2 列 = \(y_B\) 在 \(A\) 中的坐标

正交性:\(R^{\mathsf{T}}R = I\),\(\det R = 1\)(拖动时始终成立)。逆 = 转置:\(R^{-1} = R^{\mathsf{T}}\)。

矩阵如何作用于点 · 算术流水qᴮ = ( 1.0, 0.6 )

黑点 \(q\) 固结在刚体上。拖动它——它在 \(B\) 系里的坐标 \(q^{B}\) 改变;转动手柄——\(q^{B}\) 不变,只有 \(R\) 变。这就是坐标变换的全部工作过程。

02.2刚体变换 gHOMOGENEOUS TRANSFORM

1 RR 缺了半句话

qA=R qBq^{A} = R\,q^{B} 成立的前提是:BB 的原点与 AA 的原点重合。真实机械臂上这个前提几乎从不成立——第二根连杆的坐标系原点,离第一根有好几十厘米。

拿数看一眼:θ=90∘\theta = 90^\circ,BB 原点在 AA 的 (2,1)(2,1),qB=(1,0)q^{B} = (1,0)。R qB=(0,1)R\,q^{B} = (0,1),可真实的点在 (2,2)(2,2)——差了整整一个原点偏移。旋转没错,缺的是平移。

2 先转再移:仿射形式

补上平移,最直接的形式是

qA=RAB qB+pABq^{A} = R_{AB}\,q^{B} + p_{AB}

pABp_{AB} 的定义要咬死:BB 的原点在 AA 中的坐标。它描述一个随刚体运动的点,不是“每次平移了多少”,也和 θ\theta 无关——BB 原地转身,pp 一动不动。

顺序同样不能倒:先 RR 后加 pp。写成 R(qB+p)R(q^{B} + p) 就变成了“先在 BB 系里挪一段,再整体转”,是另一个变换,结果也不同。

3 为什么必须升一维

矩阵乘法是线性的:M(0)=0M(0)=0,M(ax+by)=aMx+bMyM(ax+by)=aMx+bMy。而“加上 pp”把原点挪走了,它不是线性映射,2×22\times2 的矩阵装不下它。

齐次坐标的办法:给点补一个 11,把 2×22\times2 扩成 3×33\times3:

[qA1]=[RABpAB01]⏟gAB[qB1]\begin{bmatrix} q^{A} \\ 1 \end{bmatrix} = \underbrace{\begin{bmatrix} R_{AB} & p_{AB} \\ 0 & 1 \end{bmatrix}}_{g_{AB}} \begin{bmatrix} q^{B} \\ 1 \end{bmatrix}

把乘法展开:前两行给出 R qB+p⋅1R\,q^{B} + p\cdot 1,正是要的仿射式;底行给出 0⋅qB+1⋅1=10\cdot q^{B} + 1\cdot 1 = 1,恒成立,意思是“补的那个 11 保持为 11”。加法的位置,就是这样被 11 腾出来的。

三维把 2×22\times2 换成 3×33\times3、3×33\times3 换成 4×44\times4,结构一模一样。本页画布是二维,所以面板显示 3×33\times3。

4 齐次坐标顺手解决了另一件事

方向向量(速度、力、轴)不该被平移影响。把补的那个数写成 00:

gAB[v0]=[RAB v0]g_{AB} \begin{bmatrix} v \\ 0 \end{bmatrix} = \begin{bmatrix} R_{AB}\,v \\ 0 \end{bmatrix}

只转不移。同一套 4×44\times4 矩阵因此能同时搬运“点”和“方向”,区别只在最后一个数是 11 还是 00。这个区分在后面会变成 twist 与 wrench 的区别——现在只要记住:点是 11,方向是 00。

5 复合时 pp 的公式是易错点

把两个 gg 按块乘开:

[RABpAB01][RBCpBC01]=[RABRBCRAB pBC+pAB01]\begin{bmatrix} R_{AB} & p_{AB} \\ 0 & 1 \end{bmatrix} \begin{bmatrix} R_{BC} & p_{BC} \\ 0 & 1 \end{bmatrix} = \begin{bmatrix} R_{AB}R_{BC} & R_{AB}\,p_{BC} + p_{AB} \\ 0 & 1 \end{bmatrix}

所以

RAC=RABRBC,pAC=RAB pBC+pABR_{AC} = R_{AB}R_{BC}, \qquad p_{AC} = R_{AB}\,p_{BC} + p_{AB}

位置块不是 pAB+pBCp_{AB} + p_{BC}。几何上很清楚:pBCp_{BC} 是 CC 原点在 BB 系里的坐标,得先用 BB 的朝向把它转到 AA 的方向(乘 RABR_{AB}),才能和 BB 原点在 AA 的位置相加。

漏掉那个 RABR_{AB} 是最高频的复合错误,而且只在 RAB=IR_{AB}=I 时才碰巧正确——所以对着一个“转过的”例子验一遍,就会暴露。

6 求逆:2024 Q1(a) 原题

求 g−1g^{-1} 不需要背公式,解方程就行。设 g−1g^{-1} 的左上块为 AA、右上块为 bb,由 g g−1=Ig\,g^{-1}=I 得到两个块方程:R A=IR\,A = I 与 R b+p=0R\,b + p = 0。于是 A=RTA = R^{\mathsf{T}}、b=−RTpb = -R^{\mathsf{T}}p:

gAB−1=[RABT−RABTpAB01]g_{AB}^{-1} = \begin{bmatrix} R_{AB}^{\mathsf{T}} & -R_{AB}^{\mathsf{T}}p_{AB} \\ 0 & 1 \end{bmatrix}

几何读法:−RTp-R^{\mathsf{T}}p 就是 AA 的原点在 BB 中的坐标。先算 RTpR^{\mathsf{T}}p(把 pp 转进 BB 的方向),再取反(从 BB 原点指回 AA 原点)。

考场写法,三步:左上写 RTR^{\mathsf{T}};右上写 −RTp-R^{\mathsf{T}}p(转置、乘 pp、添负号);底行照抄零行加 1。不需要思考,但一定要用 g−1g=Ig^{-1}g = I 或代一个点复核,符号错一眼就能看出来。

7 数值走一遍

取 θ=90∘\theta = 90^\circ、pAB=(2,1)p_{AB} = (2,1)、qB=(1,0)q^{B} = (1,0)。

正向:R qB=(0,1)R\,q^{B} = (0,1),加 pp 得 qA=(2,2)q^{A} = (2,2)。

逆向:RTR^{\mathsf{T}} 的两行分别是 (0,1)(0,1) 与 (−1,0)(-1,0),所以 RTp=(1,−2)R^{\mathsf{T}}p = (1,-2),取反得 (−1,2)(-1,2)。核对:RTqA+(−1,2)=(2,−2)+(−1,2)=(1,0)R^{\mathsf{T}}q^{A} + (-1,2) = (2,-2) + (-1,2) = (1,0),回到 qBq^{B}。

8 面板怎么用,以及和考场的关系

拖 BB 原点(黑手柄):只有第 3 列在变,左上 2×22\times2 一动不动。拖红色手柄:只有左上块在变。gg 的两块各管各的,这就是“打包”的含义。

下方流水实时算 −RTp-R^{\mathsf{T}}p,并核对 g−1g=Ig^{-1}g = I。把它和自己手算的一行对照,就知道错在转置、乘法还是符号。

常见错误
  • 逆的位置块写成 −p-p(漏了 RTR^{\mathsf{T}})。只有 θ=0\theta = 0 时才对。
  • 复合的位置块写成 pAB+pBCp_{AB} + p_{BC}。
  • 把 pp 当成“旋转中心”。pp 是 BB 的原点;旋转绕 BB 原点发生,要绕别的点转得另构造一个 gg。
  • 三维里用 3×33\times3 的齐次矩阵乘三维点——少补了一个 11。
离开本节前,合上文字回答
  • θ=180∘\theta = 180^\circ、p=(1,0)p = (1,0) 时写出 gg 与 g−1g^{-1},再用 qB=(1,0)q^{B} = (1,0) 验一遍。
  • 为什么底行不能写成 0 0 20\ 0\ 2?
  • gABgBCg_{AB}g_{BC} 的位置块里,pBCp_{BC} 为什么必须乘 RABR_{AB}?
g = ( R , p )◎ 旋转手柄 ◎ B 原点 = 平移 ▪ 点 q
齐次变换矩阵 · 结构 → 实时数值g live
\(g_{AB} =\)

底行的 \(0\ 0\ 1\) 就是让加法自动发生的机关。拖原点时只有第 3 列变,转手柄时只有左上 \(2\times2\) 块变——\(g\) 的两块各管各的。

求逆 · 2024 Q1(a) 原题g⁻¹ live
\(g_{AB}^{-1} =\)

套路:姿态块转置 \(R^{\mathsf{T}}\),位置块换成 \(-R^{\mathsf{T}}p\)。考场按此三秒写出答案。下方面板验证 \(g^{-1}g = I\) 恒成立。

02.3小测CHECK

规则。三道题,做完即时反馈。答错不算失败——错题会告诉我们明天从哪里开始。做题时可以用上方画布:把 02.1 转到对应角度,右侧矩阵就是答案的对照。

Q1拖动手柄使 \(\theta = 90^\circ\)。此时旋转矩阵 \(R_{AB}\) 是?
Q2点 \(q\) 在 \(B\) 系下坐标为 \((1,0)\)。当 \(\theta = 180^\circ\) 且 \(p_{AB} = (2,0)\) 时,\(q\) 在 \(A\) 系下的坐标是?
Q3齐次变换 \(g\) 的逆 \(g^{-1}\) 是?(2024 Q1(a) 考点)
0/ 3 · 答对即刻计入