机器人标准 DH 与改进 DH 参数对比
在串联机器人连杆坐标系建立中,明确区分标准 Denavit-Hartenberg(SDH)和改进 Denavit-Hartenberg(MDH)参数至关重要。许多初学者容易混淆两者,导致教科书公式推导与现有代码实现不一致。
改进 DH 法 (MDH)
使用改进 D-H 参数时,坐标系定义在连杆 i 的前端关节处:

具体步骤如下:








对比了机器人运动学建模中标准 DH(SDH)与改进 DH(MDH)两种参数化方法的区别。主要差异在于连杆坐标系建立位置及变换矩阵乘法顺序。SDH 适用于开链结构,但在树形或闭链机构中易产生歧义;MDH 将坐标系置于近端,适用性更广。文章还指出了新旧教材公式不一致的问题,并提供了基于改进 DH 的 MATLAB 几何雅可比矩阵计算代码示例,帮助开发者避免实现错误。

在串联机器人连杆坐标系建立中,明确区分标准 Denavit-Hartenberg(SDH)和改进 Denavit-Hartenberg(MDH)参数至关重要。许多初学者容易混淆两者,导致教科书公式推导与现有代码实现不一致。
使用改进 D-H 参数时,坐标系定义在连杆 i 的前端关节处:

具体步骤如下:









微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online


连杆有两端,一端离基座近(近端),一端离基座远(远端)。


(a) SDH (b) MDH
对于树形结构或闭链机构的机器人,SDH 方法建立的连杆坐标系可能产生歧义。因为 SDH 将连杆 i 的坐标系建立在远端,可能导致连杆 0 上同时出现两个坐标系。而 MDH 将坐标系建立在每个连杆的近端,避免了坐标系重合的情况。

(a) SDH (b) MDH
部分教材使用标准 DH 参数,而现代代码库多采用改进 DH 参数,这会导致几何雅可比矩阵等公式推导不一致。
例如,标准 DH 下坐标系 i-1 对应的 z 轴 z_{i-1} 等同于改进 DH 下坐标系 i 的 z 轴 z_i。若混用参数体系,核心公式会有所不同。
以下是基于改进 DH 计算几何雅可比矩阵的 MATLAB 代码示例:
function J_geo = geometric_jacobian_from_q_corrected(q)
% 根据关节角度计算几何雅可比矩阵,匹配 MATLAB 工具箱的顺序
% 输入:q - 7×1 关节角向量 (弧度)
% 输出:J_geo - 6×7 几何雅可比矩阵
% Franka Panda 的 DH 参数 (Modified DH)
% 格式:[alpha, a, d, theta]
MDH = [0, 0, 0.333, q(1); -pi/2, 0, 0, q(2); pi/2, 0, 0.316, q(3);
pi/2, 0.0825, 0, q(4); -pi/2, -0.0825, 0.384, q(5);
pi/2, 0, 0, q(6); pi/2, 0.088, 0.107, q(7)];
% 计算每个关节的变换矩阵和位置
n = 7;
T = eye(4);
T_all = cell(n, 1);
p_all = zeros(3, n);
z_all = zeros(3, n);
for i = 1:n
alpha = MDH(i, 1);
a = MDH(i, 2);
d = MDH(i, 3);
theta = MDH(i, 4);
% 改进 DH 变换矩阵 Ti
Ti = [cos(theta), -sin(theta), 0, a;
sin(theta)*cos(alpha), cos(theta)*cos(alpha), -sin(alpha), -d*sin(alpha);
sin(theta)*sin(alpha), cos(theta)*sin(alpha), cos(alpha), d*cos(alpha);
0, 0, 0, 1];
T = T * Ti;
T_all{i} = T;
p_all(:, i) = T(1:3, 4);
z_all(:, i) = T(1:3, 3);
end
% 末端执行器位置
p_ee = p_all(:, end);
% 计算几何雅可比 - 修正关节编号对应关系
J_geo = zeros(6, n);
for i = 1:n
if i == 1
% 关节 1:使用基坐标系
p_i = [0; 0; 0];
z_i = [0; 0; 1];
else
% 关节 i:使用连杆 i-1 的坐标系
p_i = p_all(:, i);
z_i = z_all(:, i);
end
% MATLAB 顺序:线速度在前,角速度在后
J_geo(4:6, i) = z_i;
J_geo(1:3, i) = cross(z_i, p_ee - p_i);
end
end
function T = forward_kinematics_mdh(q)
% 改进 DH 正运动学
MDH = [0, 0, 0.333, q(1); -pi/2, 0, 0, q(2); pi/2, 0, 0.316, q(3);
pi/2, 0.0825, 0, q(4); -pi/2, -0.0825, 0.384, q(5);
pi/2, 0, 0, q(6); pi/2, 0.088, 0.107, q(7)];
T = eye(4);
for i = 1:7
alpha = MDH(i, 1);
a = MDH(i, 2);
d = MDH(i, 3);
theta = MDH(i, 4);
Ti = [cos(theta), -sin(theta), 0, a;
sin(theta)*cos(alpha), cos(theta)*cos(alpha), -sin(alpha), -d*sin(alpha);
sin(theta)*sin(alpha), cos(theta)*sin(alpha), cos(alpha), d*cos(alpha);
0, 0, 0, 1];
T = T * Ti;
end
end