第2章:正运动学——D-H参数法建立连杆坐标系、正运动学方程推导、MATLAB/Simulink仿真验证

各位同学,欢迎来到正运动学这一章。

说实话,正运动学是机器人学里最基础、也最绕不开的一块内容。你想想看,我们想让机器人动起来,首先得知道:给定每个关节的角度,末端到底在哪儿? 这就是正运动学要解决的问题。

我个人习惯把正运动学比作「搭积木」。每个关节、每根连杆,都是一块积木。我们只需要按照固定的规则,把积木一块块拼起来,末端的位置和姿态自然就出来了。这个规则,就是今天的主角——D-H参数法

核心思想: 用四个参数(a, α, d, θ)唯一确定相邻两个连杆之间的坐标变换关系。然后通过矩阵连乘,得到从基座到末端的完整变换矩阵。

2.1 D-H参数法:建立连杆坐标系

D-H参数法,说白了就是一套「标准化」的建系流程。我刚开始学的时候,总觉得它很死板,后来在项目中才发现,正是这种死板,才让代码变得通用、可靠。

我们以最常见的六轴工业机器人为例。每个关节 i 对应一个连杆 i-1。建立坐标系时,遵循以下规则:

  1. Z轴:沿关节 i 的轴线方向。
  2. X轴:沿相邻两Z轴的公垂线,方向从 Zi-1 指向 Zi
  3. Y轴:由右手定则确定。

嗯,这里要注意:如果相邻两Z轴相交,X轴方向取两Z轴的叉积方向。

建好坐标系后,四个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 的转角 这就是我们实际控制的关节角度

我的小技巧: 在纸上画坐标系时,先用粗线画出Z轴,再用细线画出X轴。这样视觉上更清晰,不容易搞混。我曾经在项目里因为Z轴方向画反,导致仿真结果完全不对,排查了整整一个下午。

2.2 正运动学方程推导

坐标系建好了,参数也定了,接下来就是数学推导。其实没那么可怕,就是矩阵乘法。

相邻两个坐标系 {i-1} 和 {i} 之间的变换矩阵,可以写成:

T_i = Rot_x(α_{i-1}) · Trans_x(a_{i-1}) · Rot_z(θ_i) · Trans_z(d_i)

展开成4x4矩阵形式:

       | 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} |
T_i =  | sinθ_i·sinα_{i-1}  cosθ_i·sinα_{i-1}   cosα_{i-1}   d_i·cosα_{i-1} |
       | 0         0         0       1        |

看着有点复杂对吧?别急,我们只需要记住这个矩阵的结构就行。实际编程时,直接套公式。

对于n轴机器人,从基座到末端的变换矩阵就是:

T_0n = T_1 · T_2 · T_3 · ... · T_n

这个矩阵的左上角3x3部分,就是末端的姿态(旋转矩阵);右上角3x1部分,就是末端的位置(平移向量)。

避坑指南: 我曾经在推导六轴机器人时,把T_1和T_2的顺序搞反了。记住:矩阵乘法不满足交换律!顺序一定是T_1乘T_2,不是T_2乘T_1。

2.3 知识体系与核心逻辑

为了让大家更直观地理解本章的知识脉络,我画了一张流程图:

正运动学知识体系 输入:关节角度 θ₁~θₙ D-H参数表:a, α, d, θ 矩阵连乘:T₀ₙ = T₁ · T₂ · ... · Tₙ 输出:末端位置 + 姿态

这张图把整个流程串起来了:从关节角度出发,查D-H参数表,做矩阵连乘,最后得到末端位姿。每一步都很清晰。

2.4 MATLAB/Simulink仿真验证

理论推导完了,不上手验证一下,总觉得不踏实。我个人习惯先用MATLAB写脚本,再搭Simulink模型。

下面是一个简单的MATLAB示例,以2轴平面机器人为例:

% 正运动学计算 - 2轴平面机器人
% D-H参数:a1=1, a2=0.8, 均为旋转关节

function T = fk_2r(theta1, theta2)
    % 定义D-H参数
    a1 = 1.0;   % 连杆1长度
    a2 = 0.8;   % 连杆2长度
    
    % 关节角度(弧度)
    th1 = theta1;
    th2 = theta2;
    
    % 变换矩阵 T1(基座到关节1)
    T1 = [cos(th1), -sin(th1), 0, a1*cos(th1);
          sin(th1),  cos(th1), 0, a1*sin(th1);
          0,         0,        1, 0;
          0,         0,        0, 1];
    
    % 变换矩阵 T2(关节1到关节2)
    T2 = [cos(th2), -sin(th2), 0, a2*cos(th2);
          sin(th2),  cos(th2), 0, a2*sin(th2);
          0,         0,        1, 0;
          0,         0,        0, 1];
    
    % 总变换矩阵
    T = T1 * T2;
end

% 测试:theta1=30°, theta2=45°
T_end = fk_2r(deg2rad(30), deg2rad(45));
disp('末端位置:');
disp(T_end(1:3, 4)');

运行这段代码,你会得到末端的位置坐标。你可以手动算一下,验证结果对不对。

我的经验: 在Simulink中做仿真时,我习惯用MATLAB Function模块封装正运动学函数。这样既保留了MATLAB的灵活性,又能利用Simulink的可视化优势。你可以在Scope里实时观察末端轨迹,非常直观。

Simulink的搭建思路很简单:输入两个关节角度(用Sine Wave或Constant模块),接入MATLAB Function,输出末端位置,再用Scope显示。整个过程不超过10分钟。

嗯,说到这里,我想起一个细节。有一次我在Simulink里仿真,发现末端位置一直在跳变。排查了半天,原来是角度单位搞错了——MATLAB Function里用的是弧度,但输入给的是角度。这种低级错误,犯过一次就再也不会忘了。

2.5 本章小结

正运动学,说白了就是「给角度,求位姿」。D-H参数法给了我们一套标准化的工具,矩阵连乘给了我们数学上的解法,MATLAB/Simulink给了我们验证的手段。

你想想看,掌握了这些,任何串联机器人的正运动学问题,都只是查表和算矩阵而已。是不是感觉也没那么难?

下一章,我们会聊逆运动学——也就是「给位姿,求角度」。那才是真正考验算法功底的地方。不过别担心,先把正运动学吃透,逆运动学就是水到渠成的事。


公众号:蓝海资料掘金营,微信deep3321