一个矩阵承载完整位姿
在本章里,我们一直把旋转和位置分开存放:旋转矩阵告诉你某物朝向哪个方向,位置向量告诉你它的原点落在何处。但真实的物体——夹爪、相机、轮子——同时拥有这两者。我们把这种「在哪里」加「朝哪边」的组合称为位姿,而把一个刚体移动到新位姿、既不弯折也不拉伸,就是一次刚体变换。这最后一课的巧妙之处在于:你可以把旋转和平移折叠进同一个对象,不必再两头兼顾。
这个单一对象就是齐次变换矩阵:一个 4×4 的方格,把 3×3 的旋转塞进左上角,把 3 个数的平移放进右侧那一列,再用固定的 0 0 0 1 把底行补满。底行在物理上不做实事——它只是一行记账位,让矩阵能干净地相乘。回报是:这一个 4×4 现在一举回答了两个问题——「朝哪个方向?」和「坐落在何处?」。
T = [ R R R | px ] R = rotation (which way it faces)
[ R R R | py ] p = translation (where the origin sits)
[ R R R | pz ]
[ 0 0 0 | 1 ] bottom row is bookkeeping
to move a point: p_new = T · [ p_old ; 1 ]相乘变换沿机器人逐节走
把两者打包进一个矩阵之所以重要,原因就在这里:变换通过普通的矩阵乘法来组合。回想本章前面讲过,机器人的每个部件都有自己的坐标系,我们还区分固定的世界坐标系与各自的本体坐标系。假设你知道从世界到机器人底座的变换,又知道从底座到肩部、从肩部到肘部……一路到指尖的各段变换。把这些 4×4 矩阵按顺序相乘,就得到一个从世界直达指尖的变换——整条手臂被压缩成单一的位姿。
这条由连杆和关节构成的链,正是你在课程机构部分见过的运动链。把它每个关节的变换组合起来,就是正运动学背后实打实的算术——输入关节角,把矩阵相乘,手最终落在哪里就跳出来了。有一点要当心:顺序很重要。矩阵乘法不满足交换律,所以「先底座后肩部」和「先肩部后底座」给出的答案不同。要按坐标系实际嵌套的方向去读这条链。
你这样搭出来的每个变换,都属于一个齐整的家族,名叫特殊欧几里得群 SE(3)。「群」是个数学词,指一个集合,其成员相互组合却永远不会跑出这个集合:两个 SE(3) 变换相乘,得到的还是一个 SE(3) 变换;每个变换都有一个把它撤销的逆;什么也不做(单位元)也算在内。它那只管旋转的同胞SO(3),是纯旋转的家族。SE(3) 不过是在它之上再添了平移——它是三维空间中刚体运动的完整词汇表。
tf 变换树:机器人坐标系的实时地图
一台真实的机器人有几十个坐标系——底座、每个轮子、每个关节、激光雷达、两台相机、夹爪——而且大多在运动。靠人工把这些变换理清简直是噩梦。于是机器人软件维护着一个活的目录,叫做变换树(tf):一张图,每个坐标系是一个节点,每个已知变换是一条把父坐标系连到子坐标系的边。因为它是一棵树,任意两个坐标系之间恰好只有一条路径,所以软件总能串联这些边,回答「坐标系 A 相对于坐标系 B 在哪里?」
这棵树是活的,因为每个变换都盖有时间戳,并随机器人运动而刷新。一个关节编码器转动,两段臂连杆之间的边就更新;底座向前滚动,从地图到底座的边就更新。在某个瞬间向 tf 询问相机到夹爪的变换,它会把那个时刻、那条路径上正确的边缝合起来。正是这一点,让机器人能融合那些以不同坐标系、在略有差异的时刻到达的数据。
- 激光雷达返回一个在它自身坐标系中测得的点——比如,正前方 2 米处。
- 你想把这个点放到地图坐标系里,好让它落在一张共享地图上。你向 tf 索取从激光雷达坐标系到地图坐标系的变换。
- tf 沿着「激光雷达 → 底座 → 里程计 → 地图」这条路径行走,把沿途的 4×4 边变换相乘,合成为一个组合变换。
- 把这个变换作用到该点上,同一个障碍物现在就处在地图坐标里了——可以与机器人见过的其他一切作比对。
前沿:位姿如何运动
变换是一张快照——它告诉你某个坐标系此刻被定格在哪里。但机器人是会动的,所以我们还需要描述一个位姿此刻正如何变化。把这件事紧凑打包的方式,就是旋量速度(twist),也称空间速度:六个数,把一个物体的瞬时角速度(转得多快、绕哪根轴)和它的线速度(原点滑得多快)打包在一起。旋量速度之于变换,就如速度之于位置——是它的变化率。
这里还藏着一个更优雅的想法。力学中有一条定理说:任何刚体运动,无论多复杂,都等价于一次单一的拧螺丝运动——绕空间中某条直线旋转,同时沿着同一条直线滑动,就像拧一颗螺栓。那条直线就是螺旋轴,而事实证明,每个旋量速度都指向它自己的螺旋轴。所以「又转又移」和「绕螺旋轴拧」是同一个运动的两种看法,而螺旋这种看法常常让数学出奇地干净。
旋量速度是你后续学习下一部分的门户。一旦你问起「关节转动时夹爪移动得多快」——也就是速度运动学——你就在和旋量速度打交道了。它们还支撑着平滑的运动控制,以及「向世界施力」这件事背后的数学。你现在还不需要全套理论框架;只要带上这幅图景:变换把位姿定格,旋量速度让它动起来。
这把你带向何处
退一步,看看这一个 4×4 矩阵替你换来了什么。整章——坐标系、朝向、旋转矩阵、欧拉角及其万向锁陷阱、四元数——都在朝着这一点搭建:一种单一、可组合的方式,用来说清一切「在哪里」和「朝哪边」。把这些变换沿手臂组合,你得到正运动学;把问题反过来问——哪组关节角能到达这个位姿?——你便得到逆运动学。
同样的代数远不止于手臂。一台机器人在为陌生场所建图,它解的是同步定位与建图(SLAM),其本质是一道庞大的拼图:同时估计 SE(3) 中成千上万个位姿。而把一次测量从一个坐标系重新表达到另一个坐标系——也就是 tf 变换树的日常工作——正是传感器融合背后默默的支柱:来自众多传感器的读数,必须先被带进同一个坐标系,才能彼此吻合。把变换掌握到家,机器人里许多看似魔法的部分就不再神秘了。