MDH模型在MATLAB中如何构建机器人?

99ANYc3cd6 机器人 15

MDH 模型简介

传统 DH 模型 vs. MDH 模型

特性 传统 DH 模型 MDH 模型
坐标系定义 坐标系 i 定义在第 i 个关节和第 i+1 个关节之间。 坐标系 i 定义在第 i-1 个关节和第 i 个关节之间。
连杆参数 - a_i: 从 Z_iZ_{i+1} 的垂直距离
- α_i: 从 Z_iZ_{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 中,关节变量 θ_id_i 描述的是第 i 个关节相对于第 i-1 个坐标系的位置和方向,而连杆参数 a_{i-1}α_{i-1} 描述的是第 i 个连杆的物理尺寸,这种“关节在前,连杆在后”的逻辑使得参数定义非常清晰。

MDH模型在MATLAB中如何构建机器人?-第1张图片-广州国自机器人
(图片来源网络,侵删)

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 类来创建机器人的树状结构。

MDH模型在MATLAB中如何构建机器人?-第2张图片-广州国自机器人
(图片来源网络,侵删)
% 创建一个空的机器人模型
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 函数可以让我们直观地看到机器人的模型。

MDH模型在MATLAB中如何构建机器人?-第3张图片-广州国自机器人
(图片来源网络,侵删)
% 设置一个随机的关节角度来显示

标签: MATLAB MDH机器人建模步骤 MDH模型MATLAB机器人构建教程 MATLAB机器人MDH参数设置方法

抱歉,评论功能暂时关闭!