第2章:坐标系与空间描述
各位同学,今天我们来聊聊机器人学里最基础、也最绕不开的话题——坐标系与空间描述。
说实话,我刚入行那会儿,觉得这东西不就是几个坐标轴嘛,有啥好学的?直到第一次做机械臂标定,机器人死活对不准目标点,折腾了两天,最后发现是旋转顺序搞反了。嗯,从那以后,我再也不敢小看坐标系了。
2.1 位置与姿态:机器人的“身份证”
想象一下,你要告诉朋友“杯子在桌子上”。这句话其实包含了两层信息:位置(杯子在哪儿)和姿态(杯子是正着放还是歪着放)。机器人也一样,它需要知道自己在空间中的位置和姿态,合起来就是位姿。
核心概念:
- 位置:用三维坐标 (x, y, z) 表示,描述物体在空间中的“点”。
- 姿态:描述物体“朝向”哪个方向,比如是正立、侧躺还是倒立。
- 位姿 = 位置 + 姿态,完整描述一个刚体在空间中的状态。
我个人习惯把位姿想象成“给机器人发定位”。位置是经纬度,姿态是面朝哪个方向。缺一个,机器人就找不到北。
2.2 旋转矩阵:最直观的旋转表达
旋转矩阵,说白了就是用一个3x3的矩阵来描述旋转。它的每一列,代表旋转后的新坐标轴在原坐标系下的投影。
// 绕Z轴旋转θ角的旋转矩阵
R_z(θ) = [
[cosθ, -sinθ, 0],
[sinθ, cosθ, 0],
[0, 0, 1]
]
我在项目中遇到过一个问题:用旋转矩阵做连续旋转时,矩阵乘法顺序特别容易搞混。记住一个原则:左乘是绕固定轴旋转,右乘是绕自身轴旋转。你想想看,这个区别在实际调试中能省多少时间?
我的小技巧:
调试旋转矩阵时,先验证它的行列式是否为1。如果行列式不是1,说明矩阵不是纯旋转,可能混入了缩放或剪切。我曾经因为这个bug排查了整整一个下午。
2.3 欧拉角:直观但暗藏陷阱
欧拉角用三个角度(比如绕Z轴转γ,绕Y轴转β,绕X轴转α)来描述旋转。听起来很直观对吧?但这里有个大坑——万向锁。
为什么会这样?当中间轴旋转到90°时,第一个轴和第三个轴会重合,丢失一个自由度。我记得第一次做无人机姿态控制时,就遇到了万向锁,飞机直接翻了个跟头。嗯,那场面,挺难忘的。
避坑指南:
我曾经在机械臂逆解中用了欧拉角,结果在奇异点附近算法直接崩溃。后来我改用四元数,问题就解决了。所以,如果你要做连续旋转或插值,建议直接上四元数。
2.4 四元数:优雅的旋转解决方案
四元数可以理解为“带约束的复数”。它用四个数 (w, x, y, z) 表示旋转,其中 w 是实部, (x, y, z) 是虚部。最关键的是,它没有万向锁问题,而且插值平滑。
// 四元数表示绕单位向量 (nx, ny, nz) 旋转 θ 角
q = [cos(θ/2), nx*sin(θ/2), ny*sin(θ/2), nz*sin(θ/2)]
// 四元数乘法(注意顺序)
q1 * q2 = (w1*w2 - x1*x2 - y1*y2 - z1*z2,
w1*x2 + x1*w2 + y1*z2 - z1*y2,
w1*y2 - x1*z2 + y1*w2 + z1*x2,
w1*z2 + x1*y2 - y1*x2 + z1*w2)
我个人建议,所有涉及姿态插值的场景,比如机械臂轨迹规划、相机平滑跟随,都用四元数。虽然它不如欧拉角直观,但稳定性和平滑度好太多了。
2.5 齐次变换矩阵:位置+姿态的终极封装
齐次变换矩阵把旋转和位移打包成一个4x4矩阵。它的左上角3x3是旋转矩阵,右上角3x1是位移向量,最后一行是 [0, 0, 0, 1]。
T = [
[R11, R12, R13, tx],
[R21, R22, R23, ty],
[R31, R32, R33, tz],
[0, 0, 0, 1 ]
]
有了齐次变换矩阵,我们就可以用矩阵乘法把多个坐标系变换串联起来。比如,从基座到末端执行器的变换:
T_base_to_end = T_base_to_shoulder * T_shoulder_to_elbow * T_elbow_to_wrist * T_wrist_to_end
为什么用齐次变换矩阵?
因为它把旋转和平移统一成了矩阵乘法,避免了先旋转再平移的繁琐计算。你想想看,在机器人运动学里,我们要做几十次坐标系变换,用齐次矩阵一行代码就搞定了。
2.6 知识体系总览
下面这张图,是我自己总结的坐标系与空间描述的知识框架。你可以把它当作学习地图:
2.7 实际应用中的选择建议
| 场景 | 推荐表示 | 原因 |
|---|---|---|
| 机械臂运动学正解 | 齐次变换矩阵 | 方便串联多个关节变换 |
| 姿态插值/平滑 | 四元数 | 无万向锁,插值均匀 |
| 人机交互/可视化 | 欧拉角 | 直观,容易理解 |
| 底层数学计算 | 旋转矩阵 | 线性代数工具丰富 |
我的经验之谈:
在实际项目中,我通常会在内部计算全部用四元数,只在用户界面显示时转成欧拉角。这样既保证了计算的稳定性,又方便人机交互。你试试看,这个习惯能帮你省掉不少调试时间。
好了,坐标系与空间描述就讲到这里。记住,这些概念是机器人学的基石,就像盖房子的地基。地基打不牢,后面学再多算法也是空中楼阁。下一章我们会聊运动学,到时候这些坐标系知识会派上大用场。