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界面上显示姿态,用欧拉角没问题。但如果你要做轨迹插值或者运动学计算,最好换用四元数。
2.4 四元数
四元数,说白了就是「没有万向锁的旋转描述方式」。它用四个数来表示旋转:一个实部和三个虚部。
q = w + xi + yj + zk
其中w是实部,x、y、z是虚部。而且满足 w² + x² + y² + z² = 1。
你可能会问:为什么非要用四个数?三个数不是更省空间吗?
嗯,原因就在于四元数能避免万向锁。而且四元数的插值(球面线性插值,简称SLERP)非常平滑,适合做轨迹规划。
我个人习惯是在代码里统一用四元数做计算,只在最后输出给UI时,才转成欧拉角给人看。这样既保证了计算的稳定性,又方便人理解。
下面这张图展示了本章的知识体系:
2.5 实际应用中的选择建议
说了这么多,到底该用哪种?我总结了一个表格,方便你参考:
| 场景 | 推荐方式 | 原因 |
|---|---|---|
| UI显示姿态 | 欧拉角 | 直观,人容易理解 |
| 运动学计算 | 四元数 | 避免万向锁,计算稳定 |
| 轨迹插值 | 四元数(SLERP) | 平滑过渡,无突变 |
| 坐标变换 | 齐次变换矩阵 | 旋转平移统一处理 |
| 传感器数据融合 | 四元数 | 易于滤波和预测 |
好了,关于坐标系和空间描述,今天就聊到这里。记住一句话:坐标系选对了,轨迹规划就成功了一半。下次我们聊聊具体的轨迹生成算法,到时候这些坐标系知识都会用上。