2、坐标系与空间描述:全局坐标系、局部坐标系、齐次变换矩阵、欧拉角与四元数

各位同学,今天我们来聊聊机器人轨迹规划里最基础、也最绕不开的话题——坐标系与空间描述。

说实话,我刚开始做机器人那会儿,觉得坐标系这东西太简单了。不就是XYZ嘛,谁不会?结果第一次调试机械臂,末端执行器死活对不准目标点。折腾了两天,最后发现是局部坐标系和全局坐标系搞混了。嗯,从那以后,我再也不敢小看坐标系了。

2.1 全局坐标系与局部坐标系

先说说全局坐标系。你可以把它想象成一个「参考系」。比如车间里有个固定的测量点,所有机器人的位置都相对于这个点来描述。这就是全局坐标系,也叫世界坐标系。

局部坐标系呢?说白了,就是「跟着物体走的坐标系」。比如机械臂的每个关节,都有自己的局部坐标系。你想想看,如果只用全局坐标系去描述每个关节的位置,那计算量得多大?而且一旦机器人移动,所有数据都得重算。

我个人习惯的做法是:全局坐标系只用来描述机器人的基座位置和最终目标点。中间所有的运动学计算,都在局部坐标系里完成。最后再通过变换矩阵,把结果映射回全局坐标系。

核心原则: 能用局部坐标系解决的问题,就别拖到全局坐标系里算。

2.2 齐次变换矩阵

好,现在问题来了:怎么把一个点从局部坐标系转换到全局坐标系?

答案就是齐次变换矩阵。这东西长这样:

| R   t |
| 0   1 |

其中R是3x3的旋转矩阵,t是3x1的平移向量。最后加一行[0 0 0 1],凑成4x4的方阵。

为什么要这么干?因为用4x4矩阵,旋转和平移就能合并成一次矩阵乘法。你想想看,如果分开算,先旋转再平移,代码写起来多麻烦?

我在项目中遇到过一个坑:齐次变换矩阵的乘法顺序不能搞反。假设有两个变换矩阵T1和T2,T1 * T2 和 T2 * T1 的结果完全不同。前者表示「先做T1变换,再做T2变换」,后者相反。这个顺序问题,调试的时候特别容易忽略。

注意: 齐次变换矩阵的乘法不满足交换律。顺序错了,机械臂可能直接撞到工件上。

2.3 欧拉角

欧拉角是描述旋转最直观的方式。就是用三个角度:绕X轴转多少(滚转)、绕Y轴转多少(俯仰)、绕Z轴转多少(偏航)。

听起来很简单对吧?但这里有个大坑——万向锁。

我曾经在做一个六轴机械臂的轨迹规划时,用了欧拉角来描述姿态。结果在某个特定角度下,机械臂突然「卡住」了,怎么都转不过去。查了半天,发现是万向锁问题:当俯仰角接近90度时,滚转和偏航就分不清了,自由度丢失了一个。

所以我的建议是:欧拉角适合给人看,不适合给机器算。如果你只是在UI界面上显示姿态,用欧拉角没问题。但如果你要做轨迹插值或者运动学计算,最好换用四元数。

小技巧: 如果你非要用欧拉角做计算,记得加一个「奇异点检测」。当俯仰角接近±90度时,切换到另一种表示方式。

2.4 四元数

四元数,说白了就是「没有万向锁的旋转描述方式」。它用四个数来表示旋转:一个实部和三个虚部。

q = w + xi + yj + zk

其中w是实部,x、y、z是虚部。而且满足 w² + x² + y² + z² = 1。

你可能会问:为什么非要用四个数?三个数不是更省空间吗?

嗯,原因就在于四元数能避免万向锁。而且四元数的插值(球面线性插值,简称SLERP)非常平滑,适合做轨迹规划。

我个人习惯是在代码里统一用四元数做计算,只在最后输出给UI时,才转成欧拉角给人看。这样既保证了计算的稳定性,又方便人理解。

下面这张图展示了本章的知识体系:

坐标系与空间描述知识体系 全局坐标系 参考系 局部坐标系 跟随物体的坐标系 齐次变换矩阵 4x4矩阵,旋转+平移 旋转描述方式 欧拉角 直观但有万向锁 四元数 无万向锁,适合计算

2.5 实际应用中的选择建议

说了这么多,到底该用哪种?我总结了一个表格,方便你参考:

场景 推荐方式 原因
UI显示姿态 欧拉角 直观,人容易理解
运动学计算 四元数 避免万向锁,计算稳定
轨迹插值 四元数(SLERP) 平滑过渡,无突变
坐标变换 齐次变换矩阵 旋转平移统一处理
传感器数据融合 四元数 易于滤波和预测
我的经验: 在代码里统一用四元数做内部计算,只在接口处做转换。这样能减少很多bug。

好了,关于坐标系和空间描述,今天就聊到这里。记住一句话:坐标系选对了,轨迹规划就成功了一半。下次我们聊聊具体的轨迹生成算法,到时候这些坐标系知识都会用上。

可可精品资料库