第2章 机器人运动学基础

各位搞机器人的朋友,大家好。这一章咱们聊聊运动学——说白了就是研究机器人怎么动,但先不管力啊、扭矩啊那些。我个人觉得,运动学是机器人开发的“地基”,地基不稳,后面动力学、控制全得翻车。我带过不少项目,很多新手一上来就调PID,结果机械臂乱飞,回头一看,连正运动学都没算对。嗯,咱们今天就把这块硬骨头啃下来。

机器人运动学基础 空间描述与变换 齐次坐标 DH参数法 旋转矩阵 · 平移 4×4 变换矩阵 连杆参数 · 坐标系 正运动学建模

2.1 空间描述与变换

先问个问题:你怎么告诉机器人“把杯子放到桌上那个位置”?你得先描述空间。我习惯把空间想象成一个个坐标系——世界坐标系、基坐标系、工具坐标系……每个坐标系都是一个“视角”。

旋转矩阵是描述姿态的利器。比如一个坐标系绕X轴转30°,矩阵长这样:

R_x(θ) = [[1, 0, 0],
          [0, cosθ, -sinθ],
          [0, sinθ,  cosθ]]

平移就简单了,一个三维向量搞定。但注意,旋转矩阵是正交矩阵,行列式=1,这个性质在求逆时特别有用。我记得有一次联调,同事把旋转矩阵写错了,结果机械臂直接往桌面上怼……嗯,从那以后我每次都会检查行列式。

2.2 齐次坐标

为什么要有齐次坐标?说白了,就是为了把旋转和平移塞进同一个矩阵里。你想想看,如果先旋转再平移,用3×3矩阵加向量写起来又长又容易错。齐次坐标引入一个额外维度,用4×4矩阵统一表示:

T = [[R, t],
          [0, 1]]

其中R是3×3旋转矩阵,t是平移向量。这样连续变换就是矩阵乘法,非常优雅。我个人特别喜欢齐次坐标的另一个好处——它可以表示无穷远点,在视觉SLAM里经常用到。

💡 小技巧: 写代码时,我习惯用Eigen或numpy的4×4矩阵,但记得最后一行是[0,0,0,1],别手抖改掉了。曾经有个实习生把最后一行写成[0,0,1,0],结果变换后所有点都飞了……

2.3 DH参数法

DH参数是描述相邻连杆坐标系的“标准化语言”。四个参数:a, α, d, θ。每个参数都有明确的几何意义。我刚开始学的时候总觉得α和θ容易搞混,后来在项目里搭一个六轴机械臂,一个一个参数对,才彻底搞明白。

参数符号含义
连杆长度a沿x轴从zi-1到zi的距离
连杆扭转α绕x轴从zi-1到zi的转角
连杆偏距d沿zi-1轴从xi-1到xi的距离
关节角θ绕zi-1轴从xi-1到xi的转角

标准DH和改进DH的区别,我建议初学者先掌握标准DH。其实两种都能用,但坐标系定义差一点,后面算正运动学就全乱了。我的经验是:一旦选定一种,整个项目统一,别混用。

2.4 正运动学建模

正运动学,就是给定关节角度,求末端位姿。说白了,把DH参数代进去,连乘变换矩阵。以六轴机械臂为例:

T_06 = T_01 * T_12 * T_23 * T_34 * T_45 * T_56

每个T都是4×4齐次变换矩阵。我一般用符号计算先推导一遍,再用数值验证。比如在Python里用sympy:

import sympy as sp
θ1, θ2, θ3 = sp.symbols('θ1 θ2 θ3')
# 定义DH矩阵函数,然后连乘
T = dh_matrix(a, α, d, θ)  # 伪代码
T_03 = T_01 * T_12 * T_23
sp.simplify(T_03)
🔧 避坑指南: 我曾经在仿真里发现末端位置总差几毫米,查了两天,最后发现是DH参数中α的符号搞反了。正运动学这东西,差一个符号,末端能偏十万八千里。所以我的习惯是:每加一个关节,就用单位角度验证一下。

正运动学是后面逆运动学、轨迹规划的基础。你想想看,如果连正运动学都算不准,那逆解出来的关节角肯定也是错的。在Gazebo仿真里,我经常用tf2发布变换树,然后和正运动学计算结果对比,确保模型正确。

⚠️ 注意: 正运动学公式推导时,一定要明确当前使用的是标准DH还是改进DH。两种方法最后的T矩阵表达式可能不同,但物理结果应该一致。我建议团队内部统一用标准DH,减少沟通成本。

好了,这一章的内容就是这些。运动学虽然基础,但值得反复推敲。不过别急,先把运动学吃透,后面才稳。