运动学基础:位姿表示、旋转矩阵、齐次变换、正逆运动学
各位同学,今天我们来啃一块硬骨头——运动学基础。说实话,我刚入行那会儿,觉得这东西就是一堆矩阵乘法,枯燥得很。直到有一次做机械臂的在线轨迹规划,发现末端执行器死活对不准目标点,折腾了两天,最后发现是旋转矩阵的乘法顺序搞反了。嗯,从那以后,我再也不敢小看这些基础概念了。
你想想看,机器人要动起来,首先得知道自己在哪、胳膊往哪伸、手爪朝哪个方向。这些信息,说白了就是位姿。位姿包含两个部分:位置和姿态。位置好理解,就是三维空间里的一个点;姿态嘛,就是物体朝哪个方向、转了多少角度。
1. 位姿表示:从坐标系说起
我个人习惯,拿到一个机器人系统,第一件事就是画坐标系。为什么?因为所有运动学计算都依赖于坐标系之间的变换。
一个刚体在空间中的位姿,可以用一个4×4的齐次变换矩阵来表示:
\[
T = \begin{bmatrix}
R & p \\
0 & 1
\end{bmatrix}
\]
其中,R是3×3的旋转矩阵,p是3×1的位置向量。这个矩阵把旋转和平移打包在一起,非常优雅。
核心要点:位姿 = 位置 + 姿态。位置用向量,姿态用旋转矩阵。两者合在一起,就是齐次变换矩阵。
2. 旋转矩阵:绕来绕去的学问
旋转矩阵,说白了就是描述一个坐标系相对于另一个坐标系的朝向。它是一个正交矩阵,行列式为+1。我记得有一次做视觉引导抓取,相机坐标系和机器人基坐标系之间的旋转矩阵算错了,结果机械臂直接往桌子上怼。嗯,教训深刻。
常见的旋转矩阵有绕X轴、Y轴、Z轴旋转的基本形式:
绕Z轴旋转θ角:
R_z(θ) = [[cosθ, -sinθ, 0],
[sinθ, cosθ, 0],
[0, 0, 1]]
绕Y轴旋转θ角:
R_y(θ) = [[cosθ, 0, sinθ],
[0, 1, 0 ],
[-sinθ, 0, cosθ]]
绕X轴旋转θ角:
R_x(θ) = [[1, 0, 0 ],
[0, cosθ, -sinθ],
[0, sinθ, cosθ]]
避坑指南:我曾经在项目中把旋转顺序搞反了。记住,矩阵乘法不满足交换律!先绕X轴再绕Y轴,和先绕Y轴再绕X轴,结果完全不同。建议用欧拉角时,明确约定旋转顺序,比如ZYX顺序。
3. 齐次变换:把旋转和平移打包
为什么要用齐次变换?因为方便。你想想看,如果每次变换都要先旋转再平移,写代码得多麻烦。齐次变换矩阵把旋转和平移合并成一个4×4矩阵,连续变换就是矩阵连乘,简单粗暴。
齐次变换的乘法规则:
T_AC = T_AB * T_BC
这个公式的意思是:从A到C的变换,等于先从A到B,再从B到C。我在做多关节机器人运动学时,就是靠这个公式一层层往下推的。
实用技巧:写代码时,建议把齐次变换矩阵封装成一个类,包含乘法、求逆、提取旋转和平移等操作。这样后续做正逆运动学时会省很多事。
4. 正运动学:从关节空间到笛卡尔空间
正运动学,说白了就是已知每个关节的角度,求末端执行器的位姿。对于串联机器人,就是一连串的齐次变换矩阵相乘。
以六轴工业机器人为例,正运动学公式:
T_06 = T_01 * T_12 * T_23 * T_34 * T_45 * T_56
其中,T_ij表示从第i个关节坐标系到第j个关节坐标系的变换。每个T_ij都包含一个旋转(关节角度)和一个平移(连杆长度)。
我记得有一次做离线编程,正运动学算出来的位置和实际示教的位置差了2毫米。排查了半天,发现是DH参数表里的连杆长度写错了。嗯,细节决定成败。
注意:正运动学计算时,一定要确认DH参数的定义方式。标准DH和改进DH的坐标系建立方式不同,变换矩阵的表达式也不同。混用的话,结果会完全错误。
5. 逆运动学:从笛卡尔空间回到关节空间
逆运动学比正运动学难得多。正运动学是唯一的,但逆运动学可能有多个解,甚至无解。你想想看,机械臂末端到达同一个位置,肘关节可以朝上也可以朝下,这就是多解问题。
常见的逆运动学求解方法:
- 解析法:对于特定构型的机器人(如PUMA 560),可以推导出封闭解。速度快,适合实时控制。
- 数值法:使用迭代方法(如牛顿-拉夫森法)求解。通用性强,但计算量大,可能不收敛。
- 几何法:利用几何关系直接求解。适合简单构型,比如2R平面机械臂。
我在项目中遇到过一个坑:用数值法做逆运动学,初始值选得不好,迭代直接发散,机械臂差点撞到工件。后来我改用解析法加多解选择策略,才稳定下来。
经验之谈:做在线轨迹规划时,逆运动学一定要考虑关节限位和奇异点。我曾经在奇异点附近做逆解,关节速度瞬间飙到极限,电机直接报警。建议在规划层就避开奇异区域。
6. 知识体系总览
下面这张图,是我自己总结的运动学基础知识体系。你可以把它当作学习路线图:
7. 实战中的几点建议
最后,分享几个我在实际项目中总结的经验:
- 坐标系一定要统一。我见过一个团队,基坐标系用Z轴向上,工具坐标系用Z轴向前,结果对不上。建议全系统统一使用右手坐标系。
- 旋转矩阵的数值稳定性。长时间运行后,旋转矩阵可能因为累积误差不再是正交矩阵。建议定期做正交化处理。
- 逆运动学多解选择。不要随便选一个解。我一般会选离当前关节角度最近的那个解,这样运动最平滑。
- 测试验证。正运动学算出来的结果,一定要和实际示教器上的数值对比。差一点点都不行。
总结一下:运动学基础是机器人轨迹规划的基石。位姿表示是语言,齐次变换是语法,正逆运动学是应用。把这套东西吃透了,后面做轨迹规划、速度规划、动力学控制,都会顺手很多。
好了,这一章的内容就到这里。记住,多动手算一算,多写代码跑一跑,比光看书强一百倍。