运动学基础:位姿表示、旋转矩阵、齐次变换、正逆运动学

各位同学,今天我们来啃一块硬骨头——运动学基础。说实话,我刚入行那会儿,觉得这东西就是一堆矩阵乘法,枯燥得很。直到有一次做机械臂的在线轨迹规划,发现末端执行器死活对不准目标点,折腾了两天,最后发现是旋转矩阵的乘法顺序搞反了。嗯,从那以后,我再也不敢小看这些基础概念了。

你想想看,机器人要动起来,首先得知道自己在哪、胳膊往哪伸、手爪朝哪个方向。这些信息,说白了就是位姿。位姿包含两个部分:位置和姿态。位置好理解,就是三维空间里的一个点;姿态嘛,就是物体朝哪个方向、转了多少角度。

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. 实战中的几点建议

最后,分享几个我在实际项目中总结的经验:

  1. 坐标系一定要统一。我见过一个团队,基坐标系用Z轴向上,工具坐标系用Z轴向前,结果对不上。建议全系统统一使用右手坐标系。
  2. 旋转矩阵的数值稳定性。长时间运行后,旋转矩阵可能因为累积误差不再是正交矩阵。建议定期做正交化处理。
  3. 逆运动学多解选择。不要随便选一个解。我一般会选离当前关节角度最近的那个解,这样运动最平滑。
  4. 测试验证。正运动学算出来的结果,一定要和实际示教器上的数值对比。差一点点都不行。

总结一下:运动学基础是机器人轨迹规划的基石。位姿表示是语言,齐次变换是语法,正逆运动学是应用。把这套东西吃透了,后面做轨迹规划、速度规划、动力学控制,都会顺手很多。

好了,这一章的内容就到这里。记住,多动手算一算,多写代码跑一跑,比光看书强一百倍。

专注资料整理