2. 坐标系与位姿描述:空间坐标系、刚体位姿表示、齐次变换矩阵
各位同学,咱们今天聊点实在的。机器人运动控制,说白了就是搞清楚「它在哪里」和「它要去哪里」。这两个问题,绕不开坐标系和位姿描述。我当年刚入行时,觉得这东西太理论,结果第一次调机械臂就栽了跟头——坐标系搞反,差点把末端执行器怼到工作台上。嗯,从那以后,我再也不敢小看这章内容了。
2.1 空间坐标系——给机器人一个「家」
你想想看,要让机器人动起来,总得有个参考吧?这个参考就是坐标系。我们常用的有三种:
- 世界坐标系:固定在地面或工作空间,是全局的「绝对坐标」。我习惯把它放在机器人底座中心,这样后续计算方便。
- 工具坐标系:固定在机器人末端执行器上。比如你装了个焊枪,焊枪尖端的点就是工具坐标系原点。
- 用户坐标系:你自定义的,比如工作台的一个角。方便你按工件位置编程。
我个人习惯,在项目一开始就把这三个坐标系标定好。标定不准,后面全是白费功夫。
核心原则:坐标系的选择决定了你描述位姿的复杂程度。选对了,计算量减半;选错了,调试到崩溃。
2.2 刚体位姿表示——位置+姿态=完整描述
一个刚体在空间中有几个自由度?6个。3个位置自由度(x, y, z),3个姿态自由度(绕三个轴的旋转)。
位置表示很简单,就是一个三维向量:
P = [x, y, z]^T
姿态表示就有点讲究了。常用的有:
- 旋转矩阵:3x3矩阵,9个元素,但只有3个自由度。冗余,但直观。
- 欧拉角:绕固定轴依次旋转,比如Z-Y-X顺序。我遇到过一个问题:用欧拉角做插值,结果出现了「万向锁」——两个旋转轴重合,丢失了一个自由度。那次调试花了我整整两天。
- 四元数:4个参数,无奇点,适合插值。我现在做轨迹规划,基本都用四元数。
我的建议:如果你做的是简单的点位控制,欧拉角够用。但要做平滑轨迹或连续旋转,请用四元数。别问我怎么知道的——都是泪。
2.3 齐次变换矩阵——把旋转和平移打包
为什么要用齐次变换矩阵?因为旋转和平移分开算太麻烦。你想想看,一个点先旋转再平移,如果分开写:
P' = R * P + T
这式子没问题,但如果你要连续变换多次,比如从基座到关节1,再到关节2... 写出来就是一堆嵌套。齐次变换矩阵把旋转和平移合并成一个4x4矩阵:
T = | R T |
| 0 1 |
这样,连续变换就变成了矩阵乘法:
T_total = T1 * T2 * T3 * ...
干净、利落、好算。我曾经在项目中用齐次变换矩阵做手眼标定,把相机坐标系和机械臂基座坐标系统一起来。那次标定精度到了0.1mm,客户很满意。
注意:矩阵乘法不满足交换律!先旋转后平移,和先平移后旋转,结果完全不同。我见过新手把顺序搞反,结果机器人直接撞墙。嗯,还好当时速度慢。
2.4 知识体系总览
下面这张图,是我自己总结的本章知识结构。你把它记在心里,后面学运动学、动力学都会用到。
2.5 实战中的避坑指南
最后,分享几个我踩过的坑:
- 坐标系方向搞反:我曾经把工具坐标系的Z轴方向设反了,结果机器人每次去抓取都差一截。后来加了个可视化调试工具,一眼就看出来了。
- 忘记更新变换矩阵:机械臂用久了,关节会有磨损,标定参数会漂移。我建议每半年重新标定一次。
- 矩阵乘法顺序错误:前面说过,不满足交换律。写代码时一定要注释清楚「当前是左乘还是右乘」。
一个小技巧:调试时,先用一个已知点验证变换矩阵是否正确。比如把工具坐标系原点设到基座坐标系的原点,看变换后是不是(0,0,0)。这一步能省你半天时间。
好了,坐标系与位姿描述就讲到这里。记住,这是机器人学的「语言」,语言不通,后面寸步难行。下一节我们会用这些知识来推导机械臂的运动学方程,到时候你就知道今天的内容有多重要了。