4、正运动学求解:基于D-H参数的机器人正运动学方程推导与计算

4.1 什么是正运动学?

正运动学,说白了就是:已知关节角度,求末端位姿

你给机器人每个关节一个角度值,比如关节1转30°,关节2转45°,关节3转-60°……然后我问你:机械臂末端在空间里到底在哪儿?朝向如何?

正运动学就是回答这个问题的数学工具。

我刚开始做机器人控制时,总觉得这玩意儿太理论。直到有一次调试六轴机械臂,发现末端位置怎么算都不对,最后发现是D-H参数表里一个符号写反了……嗯,从那以后我再也不敢小看正运动学了。

4.2 D-H参数法:标准流程

D-H参数法有四个核心参数,每个关节对应一组:

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

我个人习惯用标准D-H法(也叫Craig法)。为什么?因为坐标系定义更清晰,不容易搞混。

4.3 相邻连杆的变换矩阵

每个相邻连杆之间的变换,可以拆成四个步骤:

  1. 绕xi-1轴旋转αi-1
  2. 沿xi-1轴平移ai-1
  3. 绕zi轴旋转θi
  4. 沿zi轴平移di

写成齐次变换矩阵就是:

i-1T_i = Rot(x, αi-1) · Trans(x, ai-1) · Rot(z, θi) · Trans(z, di)

展开后:

i-1T_i = 
[ cosθi   -sinθi   0    ai-1 ]
[ sinθicosαi-1  cosθicosαi-1  -sinαi-1  -disinαi-1 ]
[ sinθisinαi-1  cosθisinαi-1   cosαi-1   dicosαi-1 ]
[ 0          0           0          1         ]
小技巧: 我建议你把这个矩阵背下来。不是死记硬背,而是理解每个元素的位置含义。左上角3×3是旋转矩阵,第四列前三行是位置向量。

4.4 正运动学方程:从基座到末端

对于n自由度的机器人,正运动学方程就是:

0T_n = 0T_1 · 1T_2 · 2T_3 · … · n-1T_n

说白了,就是把每个关节的变换矩阵连乘起来。

举个例子,一个简单的2自由度平面机械臂:

  • 关节1:旋转,连杆长度a0 = L1
  • 关节2:旋转,连杆长度a1 = L2

D-H参数表:

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

代入矩阵公式,得到:

0T_2 = 0T_1 · 1T_2

最终末端位置:
x = L1·cosθ1 + L2·cos(θ12)
y = L1·sinθ1 + L2·sin(θ12)

你看,这就是正运动学的结果——一个关于关节角度的函数

4.5 知识体系结构图

下面这张图帮你理清正运动学的整体逻辑:

正运动学求解知识体系 输入:关节角度 θ₁, θ₂, …, θₙ D-H参数表:a, α, d, θ 相邻连杆变换矩阵 ⁱ⁻¹Tᵢ 矩阵连乘:⁰Tₙ = ⁰T₁ · ¹T₂ · … · ⁿ⁻¹Tₙ 输出:末端位姿 (位置+姿态)

4.6 避坑指南

⚠️ 我曾经踩过的坑:
  • 坐标系方向搞反: z轴方向必须与关节旋转轴一致。我有一回把z轴方向设反了,结果末端位置直接飞到了机器人背后。
  • a和d搞混: a是沿x轴的距离,d是沿z轴的距离。别问我怎么知道的……
  • 角度单位: 代码里一定要统一用弧度!我见过太多人把角度当弧度传进去,结果末端位置完全不对。
核心要点:

正运动学其实就是一个从关节空间到笛卡尔空间的映射。你给它关节角度,它给你末端位姿。这个映射是唯一的、确定的,不存在多解问题。

记住:正运动学永远有唯一解。如果你算出来多个解,那一定是D-H参数或者矩阵乘法出错了。

4.7 实际项目中的建议

我在做六轴协作机器人项目时,总结了几条经验:

  • 先画坐标系图: 别急着写代码。先在纸上把每个关节的坐标系画出来,标清楚z轴方向。
  • 验证每个变换矩阵: 每算出一个i-1T_i,就检查一下它的旋转部分是不是正交矩阵(行列式=1)。
  • 用已知位姿验证: 比如所有关节角为0时,末端应该在什么位置?先用手算出来,再跟代码结果对比。

嗯,正运动学就讲到这里。你想想看,其实核心就是四个参数、一个矩阵、连乘到底。掌握了这个,后面学逆运动学就轻松多了。


专注资料整理