3. 正运动学建模:D-H参数法、建立连杆坐标系、推导正运动学方程

正运动学,说白了就是:给定关节角度,算出末端在哪儿、朝哪个方向。

我刚开始做机器人时,觉得这步就是套公式。后来在产线上调试一个六轴协作臂,发现末端位置算出来总是差几毫米。查了两天,最后发现是连杆坐标系建反了。嗯,从那以后,我再也不敢小看D-H参数法了。

这一章,我们就来彻底搞定它。

3.1 D-H参数法:四个参数描述一个连杆

一个机器人手臂,说白了就是一堆连杆串在一起。每个连杆怎么描述?D-H法用了四个参数:

参数 符号 物理含义 我的理解
连杆长度 ai-1 从zi-1到zi沿xi-1的距离 两个关节轴之间的最短距离
连杆扭角 αi-1 从zi-1到zi绕xi-1的转角 两个关节轴之间的夹角
连杆偏距 di 从xi-1到xi沿zi的距离 沿当前关节轴的偏移
关节角 θi 从xi-1到xi绕zi的转角 就是我们要控制的关节角度
我的小技巧:记这四个参数,你就想成「先沿x走多远,再绕x转多少;再沿z走多远,再绕z转多少」。顺序别搞反,反了坐标系就乱了。

3.2 建立连杆坐标系:从基座到末端

坐标系怎么建?我总结了一套「三步法」,你照着做,基本不会错。

  1. 定z轴:每个关节的旋转轴就是zi轴。方向按右手定则。
  2. 定x轴:如果zi-1和zi不平行,xi-1沿它们的公垂线方向,从zi-1指向zi。如果平行,随便选一个方便的方向。
  3. 定原点:xi-1与zi的交点就是原点Oi-1。
避坑指南:我曾经在项目里犯过一个低级错误——把基座坐标系({0})的z0方向搞反了。结果后面所有关节的θ1都反号。记住:基座坐标系可以任意定,但一旦定了,后面所有坐标系都得跟着它走。

下面这张图展示了典型的六轴机器人连杆坐标系:

六轴机器人连杆坐标系示意图 六轴机器人连杆坐标系(D-H法) 基座 {0} 关节1 {1} 关节2 {2} 关节3 {3} 关节4 {4} 关节5 {5} 末端 {6} 每个坐标系 {i} 的 zi 轴沿关节 i+1 的旋转轴方向 xi 轴沿 zi 和 zi+1 的公垂线方向

3.3 推导正运动学方程:从关节空间到笛卡尔空间

坐标系建好了,接下来就是算变换矩阵。每个相邻坐标系之间的变换,可以用一个4×4的齐次变换矩阵表示:

i-1T_i = Rot(x, α_{i-1}) · Trans(x, a_{i-1}) · Rot(z, θ_i) · Trans(z, d_i)

展开后就是:

i-1T_i = 
[ cosθ_i    -sinθ_i    0       a_{i-1}          ]
[ sinθ_i·cosα_{i-1}  cosθ_i·cosα_{i-1}  -sinα_{i-1}  -d_i·sinα_{i-1} ]
[ sinθ_i·sinα_{i-1}  cosθ_i·sinα_{i-1}   cosα_{i-1}   d_i·cosα_{i-1} ]
[ 0          0          0       1                ]
核心公式:末端相对于基座的变换矩阵,就是所有相邻变换矩阵的连乘:
⁰T_n = ⁰T_1 · ¹T_2 · ²T_3 · ... · ⁿ⁻¹T_n
其中n是连杆数量(六轴机器人n=6)。

3.4 实战:一个两连杆机器人的正运动学

光讲理论太枯燥。我们拿一个最简单的两连杆平面机器人来算一遍。

假设:

  • 连杆1长度L1,连杆2长度L2
  • 关节角θ1和θ2
  • 所有z轴都垂直于纸面(朝外)

D-H参数表:

连杆i ai-1 αi-1 di θi
1 0 0 0 θ1
2 L1 0 0 θ2

代入公式,得到:

⁰T_1 = 
[ cosθ1  -sinθ1  0  0 ]
[ sinθ1   cosθ1  0  0 ]
[ 0       0      1  0 ]
[ 0       0      0  1 ]

¹T_2 = 
[ cosθ2  -sinθ2  0  L1 ]
[ sinθ2   cosθ2  0  0  ]
[ 0       0      1  0  ]
[ 0       0      0  1  ]

⁰T_2 = ⁰T_1 · ¹T_2 = 
[ cos(θ1+θ2)  -sin(θ1+θ2)  0  L1·cosθ1 + L2·cos(θ1+θ2) ]
[ sin(θ1+θ2)   cos(θ1+θ2)  0  L1·sinθ1 + L2·sin(θ1+θ2) ]
[ 0            0           1  0                         ]
[ 0            0           0  1                         ]

末端位置就是:

x = L1·cosθ1 + L2·cos(θ1+θ2)
y = L1·sinθ1 + L2·sin(θ1+θ2)
验证一下:当θ1=0, θ2=0时,末端在(L1+L2, 0)。当θ1=90°, θ2=-90°时,末端在(0, L1)。你用手比划一下,是不是这个理?

3.5 常见坑与我的经验

  • 坐标系方向搞反:我建议你每次建完坐标系,用手动转一下关节,看看末端运动方向对不对。不对就赶紧改。
  • D-H参数符号搞错:a和α的下标是i-1,d和θ的下标是i。这个细节我至少被坑过三次。
  • 连乘顺序:从基座到末端,是⁰T_1 · ¹T_2 · ...,不是反过来。矩阵乘法不满足交换律,顺序错了全完蛋。
我的血泪教训:有一次在项目里,我直接用别人的D-H参数表,没验证就往下算。结果仿真里末端位置飘到天上去。后来发现是那个参数表的坐标系定义和我用的库不一样。所以,拿到任何D-H参数,先手动验证一两个特殊位姿,再往下走。

正运动学是机器人学的基石。你把它搞透了,后面逆运动学、轨迹规划、动力学,都会轻松很多。这一章的内容,我建议你亲手算一遍,别光看。