相机说物体在前方一米,底盘说自己转过九十度,机械臂却需要相对基座的抓取位置。它们描述的是同一个物理世界,但数字属于不同坐标系。机器人程序中的每个位置、速度和力都应能回答:相对谁、在哪个坐标系表达、对应什么时刻、单位是什么。
给变换规定方向
本文用 T_ab 表示“把 b 系坐标变成 a 系坐标”的刚体变换。它同时包含旋转 R_ab 和 b 系原点在 a 系中的位置 t_ab:
p_a = R_ab · p_b + t_ab
T_ab = [ R_ab t_ab ]
[ 0 0 0 1 ]
T_ac = T_ab · T_bc
T_ba = [ R_abᵀ -R_abᵀ·t_ab ]
[ 0 0 0 1 ]
下标相消帮助检查乘法顺序。不能把 T_ab · T_cb 当成合法的坐标链。齐次点的第四维为 1,方向向量的第四维为 0,因此平移会影响点,不会影响纯方向。
二维例子:机器人位于世界系 (2, 1) 米,朝向为逆时针九十度。机身系中的点 (1, 0) 先旋转成 (0, 1),再平移,得到世界系 (2, 2)。若相机还在机身前方 0.2 米,应继续乘相机到机身的变换,不能直接给世界坐标的 x 加 0.2。
三维旋转矩阵满足 RᵀR = I、det(R) = 1。SE(3) 是三维刚体变换的集合;旋转和平移可组合,但变换通常不能交换顺序。推导和示例见 Modern Robotics 的齐次变换章节。
怎样选择旋转表示
欧拉角容易读,但顺序必须写清楚,还存在表示奇异性。单位四元数适合组合与插值,不过 q 和 -q 表示同一旋转,分量顺序也有 xyzw、wxyz 两种常见约定。旋转向量适合局部小误差和优化;其长度是旋转角,方向是旋转轴。不要把欧拉角的三个分量分别线性插值后,就认为得到了固定角速度的旋转。
同一条数据链可以用矩阵计算、用四元数存储、用角度给人看;转换边界需要统一测试。位置常用米、角度计算用弧度,显示时再转换为度。相机光学坐标与底盘坐标的轴向可能不同,要以设备和接口文档为准。
三个便宜但有效的检查
- 检查
T_ab · T_ba是否接近单位阵,而非只观察可视化是否“差不多”。 - 用原点、各坐标轴上的单位点测试变换方向。例如相机正前方的点是否落在机器人预期的前方。
- 做带数值的闭环:相机点转世界、再转回相机,应恢复原坐标。误差容限应依据浮点精度与标定误差分别制定。
“地图里的物体跟着机器人移动”常见于变换方向写反、固定外参被当成动态位姿,或把旧时刻的传感器数据配上当前位姿。矩阵正确并不能弥补时间不一致,后者见传感器标定与时间同步。
面试自查与练习
能否解释左乘与右乘为什么不同?为什么变换的逆矩阵不能只把平移取负?四元数分量接近不代表旋转距离一定接近,原因是什么?
手算上面的二维例子,再给机器人增加一个机身系中的 (0.2, 0) 平移。分别计算“先转后平移”和“先平移后转”,注明每个平移量所属的坐标系。答案若不同,应能指出差异来自坐标约定,而不是浮点误差。