MDH 模型简介
传统 DH 模型 vs. MDH 模型
| 特性 | 传统 DH 模型 | MDH 模型 |
|---|---|---|
| 坐标系定义 | 坐标系 i 定义在第 i 个关节和第 i+1 个关节之间。 |
坐标系 i 定义在第 i-1 个关节和第 i 个关节之间。 |
| 连杆参数 | - a_i: 从 Z_i 到 Z_{i+1} 的垂直距离- α_i: 从 Z_i 到 Z_{i+1} 的夹角 |
- a_{i-1}: 从 Z_{i-1} 到 Z_i 的垂直距离- α_{i-1}: 从 Z_{i-1} 到 Z_i 的夹角 |
| 变换矩阵 | A_i = Rot(z, θ_i) * Trans(z, d_i) * Trans(x, a_i) * Rot(x, α_i) |
A_i = Rot(z, θ_i) * Trans(z, d_i) * Trans(x, a_i) * Rot(x, α_i)公式形式相同,但参数的物理含义和下标对应关系不同。 |
| 优势 | 理论上更通用。 | 对于串联机器人,连杆参数与关节和连杆的物理属性直接对应,更直观。 在处理相邻关节轴线平行或重合的情况时,避免了奇异性。 |
核心区别:
在 MDH 中,关节变量 θ_i 和 d_i 描述的是第 i 个关节相对于第 i-1 个坐标系的位置和方向,而连杆参数 a_{i-1} 和 α_{i-1} 描述的是第 i 个连杆的物理尺寸,这种“关节在前,连杆在后”的逻辑使得参数定义非常清晰。

MDH 参数表
要定义一个机器人,首先需要确定每个关节的 MDH 参数,一个标准的 MDH 参数表包含以下四列:
| 参数 | 名称 | 描述 |
|---|---|---|
a |
Link Length (连杆长度) | 沿前一个关节 X 轴 (X_{i-1}) 到当前关节 X 轴 (X_i) 的距离。 |
alpha |
Link Twist (连杆扭转角) | 绕前一个关节 X 轴 (X_{i-1}) 从前一个关节 Z 轴 (Z_{i-1}) 旋转到当前关节 Z 轴 (Z_i) 的角度。 |
d |
Link Offset (连杆偏置) | 沿前一个关节 Z 轴 (Z_{i-1}) 从前一个关节 X 轴 (X_{i-1}) 到当前关节 X 轴 (X_i) 的距离。 |
theta |
Joint Angle (关节角) | 绕前一个关节 Z 轴 (Z_{i-1}) 从前一个关节 X 轴 (X_{i-1}) 旋转到当前关节 X 轴 (X_i) 的角度。这是关节变量。 |
注意:
- 对于旋转关节,
theta是变量,d是常量。 - 对于平移关节,
d是变量,theta是常量。
MATLAB 实现
MATLAB 的 Robotics System Toolbox 是处理机器人模型的利器,我们将以一个经典的 6 自由度机械臂 为例,演示如何使用 MDH 模型。
步骤 1:创建机器人模型对象
我们使用 rigidBodyTree 类来创建机器人的树状结构。

% 创建一个空的机器人模型
robot = rigidBodyTree('DataFormat', 'column', 'MDH', true);
% 'DataFormat', 'column' 表示关节变量以列向量形式存储
% 'MDH', true 是关键!这告诉 Toolbox 我们使用的是 MDH 模型,而不是默认的 DH 模型。
步骤 2:定义 MDH 参数并添加连杆和关节
假设我们有以下 6 自由度机械臂的 MDH 参数表(这是一个常见的结构,类似于 KUKA LBR iiwa 或 Franka Emika Panda):
| 关节 i | a (mm) | alpha (deg) | d (mm) | theta (deg) | 关节类型 |
|---|---|---|---|---|---|
| 1 | 0 | 90 | 315 | 0 | 旋转 |
| 2 | 0 | -90 | 0 | -90 | 旋转 |
| 3 | 0 | 90 | 0 | 0 | 旋转 |
| 4 | 35 | 90 | 1 | 0 | 旋转 |
| 5 | 0 | -90 | 0 | 0 | 旋转 |
| 6 | 0 | 90 | 0 | 0 | 旋转 |
注意: 坐标系 0 是基座坐标系,坐标系 6 是末端执行器坐标系。
我们根据这个表在 MATLAB 中创建机器人:
% --- 添加连杆和关节 ---
% 关节 1
body1 = rigidBody('body1');
joint1 = rigidBodyJoint('joint1', 'revolute', [0 0 1]); % 旋转关节,旋转轴为 Z
setFixedTransform(joint1, trvec2tform([0 0 315]) * ... % d = 315mm
tform2rotm(eul2rotm([90 0 0], 'ZYX'))); % alpha = 90 deg
addBody(robot, body1, joint1);
% 关节 2
body2 = rigidBody('body2');
joint2 = rigidBodyJoint('joint2', 'revolute', [0 0 1]);
setFixedTransform(joint2, trvec2tform([0 0 0]) * ... % a = 0, d = 0
tform2rotm(eul2rotm([-90 0 0], 'ZYX'))); % alpha = -90 deg
addBody(robot, body2, 'body1'); % 添加到 body1 后面
% 关节 3
body3 = rigidBody('body3');
joint3 = rigidBodyJoint('joint3', 'revolute', [0 0 1]);
setFixedTransform(joint3, trvec2tform([0 0 0]) * ...
tform2rotm(eul2rotm([90 0 0], 'ZYX'))); % alpha = 90 deg
addBody(robot, body3, 'body2');
% 关节 4
body4 = rigidBody('body4');
joint4 = rigidBodyJoint('joint4', 'revolute', [0 0 1]);
setFixedTransform(joint4, trvec2tform([133.35 0 0]) * ... % a = 133.35mm
tform2rotm(eul2rotm([90 0 0], 'ZYX'))); % alpha = 90 deg
addBody(robot, body4, 'body3');
% 关节 5
body5 = rigidBody('body5');
joint5 = rigidBodyJoint('joint5', 'revolute', [0 0 1]);
setFixedTransform(joint5, trvec2tform([0 0 0]) * ...
tform2rotm(eul2rotm([-90 0 0], 'ZYX'))); % alpha = -90 deg
addBody(robot, body5, 'body4');
% 关节 6
body6 = rigidBody('body6');
joint6 = rigidBodyJoint('joint6', 'revolute', [0 0 1]);
setFixedTransform(joint6, trvec2tform([0 0 0]) * ...
tform2rotm(eul2rotm([90 0 0], 'ZYX'))); % alpha = 90 deg
addBody(robot, body6, 'body5');
% 显示机器人结构图
show(robot);
步骤 3:可视化机器人
show 函数可以让我们直观地看到机器人的模型。

% 设置一个随机的关节角度来显示
标签: MATLAB MDH机器人建模步骤 MDH模型MATLAB机器人构建教程 MATLAB机器人MDH参数设置方法