2、坐标系与空间描述:全局坐标系、局部坐标系、齐次变换矩阵、欧拉角与四元数
各位同学,咱们今天聊点硬核的。坐标系和空间描述,说白了就是回答三个问题:我在哪?我要去哪?我怎么去? 搞机器人运动规划,这玩意儿就是地基。地基没打好,后面避障算法再花哨,也是空中楼阁。
我个人习惯,拿到一个新项目,第一件事不是调参数,而是先把坐标系理清楚。你想想看,机械臂末端抓个杯子,你告诉它“往右移10厘米”。问题是,这个“右”是相对于谁的右?是机器人基座的右,还是你站在它面前看到的右?这就是坐标系要解决的事。
2.1 全局坐标系与局部坐标系
全局坐标系,也叫世界坐标系。你可以把它想象成整个场景的“参考系”。比如工厂里,我们把坐标系原点定在车间角落,X轴指向东,Y轴指向北,Z轴指向上。那么车间里所有东西——机器人、工件、传送带——都有一个固定的全局坐标。
局部坐标系,也叫物体坐标系。它是附着在某个物体上的。比如机械臂的每个关节,都有自己的局部坐标系。我建议你把它理解成“我自己的小世界”。
举个例子。我在项目中遇到过一台移动机器人,它要导航到某个工位。全局坐标系告诉它“工位在 (5, 3) 处”。但机器人自己并不知道自己面朝哪。它需要把自己的局部坐标系(车头方向为X轴)和全局坐标系对齐,才能算出“我该往左转30度还是右转30度”。
2.2 齐次变换矩阵
好了,现在我们有多个坐标系了。怎么把一个点从局部坐标系转换到全局坐标系?齐次变换矩阵就是干这个的。
说白了,它就是一张“地图”,告诉你:从坐标系A到坐标系B,需要旋转多少、平移多少。
齐次变换矩阵长这样:
| R t |
| 0 1 |
其中 R 是 3x3 的旋转矩阵,t 是 3x1 的平移向量。最后一行是 [0 0 0 1],这是为了保持矩阵形式统一,方便连续变换。
我记得刚入行时,总觉得齐次变换矩阵很抽象。后来我把它当成“坐标转换的说明书”。你有一个点 p 在局部坐标系 {B} 中,想把它转到全局坐标系 {W} 中,那就直接左乘变换矩阵:
p_W = T_WB * p_B
就这么简单。一个矩阵,搞定旋转和平移。
2.3 欧拉角
旋转矩阵虽然好用,但9个参数太冗余了。欧拉角用三个角度来描述旋转:绕X轴转(滚转 Roll)、绕Y轴转(俯仰 Pitch)、绕Z轴转(偏航 Yaw)。
你想想看,飞机飞行员就用这三个角度。抬头、低头是俯仰,左右转弯是偏航,机身侧倾是滚转。很直观,对吧?
但欧拉角有个大问题——万向锁。当俯仰角达到 ±90° 时,滚转和偏航会变得无法区分。我在做无人机仿真时就遇到过这问题,飞控突然“卡住”了,怎么调都不对。后来查了半天,才发现是欧拉角在作怪。
2.4 四元数
四元数,听起来很玄乎,其实就是一种“不会卡住”的旋转表示方法。它用四个数来表示旋转:一个实部加三个虚部。
q = w + xi + yj + zk
其中 w 是实部,x、y、z 是虚部。约束条件是 w² + x² + y² + z² = 1。
为什么用四元数?因为它没有万向锁,而且做旋转插值非常平滑。你想想看,机械臂要从姿态A平滑过渡到姿态B,用欧拉角插值可能会绕远路,但四元数插值(球面线性插值,SLERP)走的是最短路径。
我个人习惯,所有内部计算都用四元数。只有在最后显示给用户看时,才转成欧拉角。这样既保证了计算稳定性,又保留了直观性。
2.5 知识体系总览
下面这张图,是我自己总结的坐标系与空间描述的知识结构。你把它存下来,以后遇到相关问题时,先看这张图,思路就清晰了。
2.6 实际应用中的选择建议
说了这么多,到底该用哪种?我根据项目经验,给你一个快速参考表:
| 场景 | 推荐方法 | 原因 |
|---|---|---|
| 人机交互界面显示 | 欧拉角 | 直观,操作员一看就懂 |
| 内部运动学计算 | 齐次变换矩阵 | 统一处理旋转和平移 |
| 姿态插值/平滑 | 四元数 | 无万向锁,插值路径最短 |
| 传感器数据融合 | 四元数 | 数值稳定性好,适合滤波 |
| 简单2D导航 | 欧拉角(仅偏航) | 只需要一个角度,够用 |
嗯,关于坐标系和空间描述,今天就聊这么多。这些东西看着基础,但真到了项目里,每一个细节都可能让你加班到深夜。记住一句话:坐标系理不清,后面全是坑。