DH 矩阵(Denavit-Hartenberg 矩阵)是 1955 年由 Denavit 和 Hartenberg 提出的一种机器人运动学建模方法,用于描述机器人连杆和关节之间的关系。该方法通过在机器人每个连杆上建立坐标系,并用 4×4 的齐次变换矩阵(DH 矩阵)描述相邻连杆的空间关系,从而推导出末端执行器相对于基坐标系的位姿,建立机器人的运动学方程 。

DH 方法包括传统 DH(Classic DH)和改进 DH(Modified DH),主要区别在于坐标系建立位置和参数变换顺序 。每个连杆用 4 个参数(如关节角 θθθ、连杆长度 aaa、连杆偏移 ddd、连杆扭角 ααα)描述,转动关节的关节变量为 θθθ,移动关节的关节变量为 ddd 。通过依次相乘各关节的 DH 矩阵,可得到机器人末端在基坐标系中的位姿,适用于机器人正运动学解算和 3D 模型运算 。
请添加图片描述
视频链接
在本人复刻Dummy机械臂的时候,重温DH矩阵,并做如下记录:

DH 方法也被用于五轴机床等复杂系统的运动学建模和几何误差补偿 。下面给出一份系统性、逐条拆解的 DH(Denavit–Hartenberg)矩阵教程。


1. 为什么要用 DH?

  • 机器人/机床通常由 nnn 个连杆 +n+ n+n 个关节 串联而成。

  • 我们需要把 关节变量 qqq(转动关节的 θθθ 或移动关节的 ddd)映射到 末端位姿 T(q)T(q)T(q),用于正运动学、仿真、控制、标定。

  • DH 提供一种最少参数、无歧义的建系规范,使所有运动学方程都可以用 4×4 齐次变换矩阵连乘得到:

    T0n(q)=T01(q1)T12(q2)⋯T(n−1)n(qn)T_{0n}(q) = T_{01}(q_1)\,T_{12}(q_2)\cdots T_{(n-1)n}(q_n)T0n(q)=T01(q1)T12(q2)T(n1)n(qn)


2. 两种约定:Classic vs. Modified

对比项Classic DH (1955)Modified DH (MDH, 1986)
坐标系位置连杆 远端(关节 i+1i+1i+1 处)连杆 近端(关节 iii 处)
变换顺序先沿 ziz_izi 旋转/平移,再沿 xix_ixi 平移/旋转( 依次ziz_izi 旋转->ziz_izi 平移,再沿 xix_ixi 平移->xix_ixi 旋转)先沿 xi−1x_{i-1}xi1 平移/旋转,再沿 ziz_izi 旋转/平移( 依次xi−1x_{i-1}xi1 旋转->xi−1x_{i-1}xi1 平移,再沿 ziz_izi 旋转->ziz_izi 平移)
工业软件RoboticsToolbox(MATLAB)、KUKAKRC、ABBRAPIDRobotics Toolbox (MATLAB)、\\KUKA KRC、ABB RAPIDRoboticsToolbox(MATLAB)KUKAKRCABBRAPIDROSMoveIt、OpenRAVE、URDF、SolidWorksROS MoveIt、OpenRAVE、\\URDF、SolidWorksROSMoveItOpenRAVEURDFSolidWorks

在这里插入图片描述

参考 https://www.bilibili.com/video/BV1Ue4y1R7QJ/?spm_id_from=333.337.search-card.all.click&vd_source=6c355cf343a2ceefccfcf5bb64aee668

同一套参数,两种约定算出的矩阵不同,千万别混用


3. 四个参数几何意义(以 MDH 为例)

Modified DH(MDH) 里,四个参数必须严格对应“前一连杆”和“当前关节”:

参数下标几何意义变量
连杆扭角 ααααi−1αᵢ₋₁αi1xi−1xᵢ₋₁xi1 轴,从 zi−1zᵢ₋₁zi1 旋转到 zizᵢzi 的角度常数
连杆长度 aaaai−1aᵢ₋₁ai1沿 xi−1xᵢ₋₁xi1 轴,从 zi−1zᵢ₋₁zi1 移动到 zizᵢzi 的距离常数
关节角 θθθθiθᵢθizizᵢzi 轴,从 xi−1xᵢ₋₁xi1 旋转到 xixᵢxi 的角度转动关节变量
连杆偏距 ddddidᵢdi沿 zizᵢzi 轴,从 xi−1xᵢ₋₁xi1 移动到 xixᵢxi 的距离移动关节变量

4. 变换矩阵公式(MDH)

变换顺序

  1. 先绕 xi−1x_{i-1}xi1 轴旋转 αi−1α_{i-1}αi1 再平移 ai−1a_{i-1}ai1
  2. 再绕 ziz_izi 轴旋转 θiθ_iθi 再平移 did_idi

4×4 齐次矩阵 Ti−1,iT_{i-1,i}Ti1,i 应该是:

Ti−1,i(qi)=Rot(x,αi−1)Trans(x,ai−1)Rot(z,θi)Trans(z,di)T_{i-1,i}(q_i) = \mathrm{Rot}(x,\alpha_{i-1})\,\mathrm{Trans}(x,a_{i-1})\, \mathrm{Rot}(z,\theta_i)\,\mathrm{Trans}(z,d_i)Ti1,i(qi)=Rot(x,αi1)Trans(x,ai1)Rot(z,θi)Trans(z,di)

展开后:
Ti−1,i=[cos⁡θi−sin⁡θi0ai−1sin⁡θicos⁡αi−1cos⁡θicos⁡αi−1−sin⁡αi−1−disin⁡αi−1sin⁡θisin⁡αi−1cos⁡θisin⁡αi−1cos⁡αi−1dicos⁡αi−10001]T_{i-1,i} = \begin{bmatrix} \cos\theta_i & -\sin\theta_i & 0 & a_{i-1} \\ \sin\theta_i\cos\alpha_{i-1} & \cos\theta_i\cos\alpha_{i-1} & -\sin\alpha_{i-1} & -d_i\sin\alpha_{i-1} \\ \sin\theta_i\sin\alpha_{i-1} & \cos\theta_i\sin\alpha_{i-1} & \cos\alpha_{i-1} & d_i\cos\alpha_{i-1} \\ 0 & 0 & 0 & 1 \end{bmatrix}Ti1,i=cosθisinθicosαi1sinθisinαi10sinθicosθicosαi1cosθisinαi100sinαi1cosαi10ai1disinαi1dicosαi11

  • αααaaa 的下标是 i−1i-1i1(因为它们属于“前一连杆”的几何属性)
  • θθθddd 的下标是 iii(关节变量属于“当前关节”)

5. 建立坐标系(MDH 流程)

步骤做什么对哪个标号关键要点
0编号关节 i=1…ni=1…ni=1n基座系为 000,末端系为 nnn
1zizᵢzii=0…ni=0…ni=0nzizᵢzi 与关节 iii 的轴线重合,方向自定
2xi−1xᵢ₋₁xi1i=1…ni=1…ni=1nxi−1xᵢ₋₁xi1zi−1zᵢ₋₁zi1zizᵢzi 的公垂线,方向从 zi−1zᵢ₋₁zi1 指向 zizᵢzi
3Oi−1Oᵢ₋₁Oi1i=1…ni=1…ni=1nOi−1Oᵢ₋₁Oi1 位于 zi−1zᵢ₋₁zi1xi−1xᵢ₋₁xi1 的交点
4yi−1yᵢ₋₁yi1i=1…ni=1…ni=1nyi−1=zi−1×xi−1yᵢ₋₁ = zᵢ₋₁ × xᵢ₋₁yi1=zi1×xi1,右手定则
5重复 1−41-414直到 i=ni=ni=n末端系 nnn 的原点放在工具中心
6444 个参数i=1…ni=1…ni=1nαi−1、ai−1、θi、diαᵢ₋₁、aᵢ₋₁、θᵢ、dᵢαi1ai1θidi,按定义测量

6. 完整示例:2 自由度平面 RR 机械臂

  • 关节 1、2 平行于 zzz 轴,连杆长度 L1L1L1L2L2L2
  • 所有 αi=0,di=0,a1=L1,a2=L2α_i = 0,d_i = 0,a_1 = L1,a_2 = L2αi=0di=0a1=L1a2=L2
iiiθiθ_iθidid_idiaia_iaiαiα_iαi
111θ1θ₁θ1000L1L1L1000
222θ2θ₂θ2000L2L2L2000

计算末端位姿:
T02=T01(θ1)T12(θ2)=[c12−s120L1c1+L2c12s12c120L1s1+L2s1200100001]T_{02} = T_{01}(\theta_1)\,T_{12}(\theta_2) = \begin{bmatrix} c_{12} & -s_{12} & 0 & L_1c_1 + L_2c_{12} \\ s_{12} & c_{12} & 0 & L_1s_1 + L_2s_{12} \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}T02=T01(θ1)T12(θ2)=c12s1200s12c12000010L1c1+L2c12L1s1+L2s1201

其中 c1=cosθ1,s1=sinθ1,c12=cos(θ1+θ2)…c₁ = cosθ₁, s₁ = sinθ₁, c₁₂ = cos(θ₁+θ₂)…c1=cosθ1,s1=sinθ1,c12=cos(θ1+θ2)


7. 常见陷阱

  • 坐标系画错:Classic/Modified 的 xix_ixiziz_izi 定义不同,容易混。
  • 移动关节变量:在 MDH 中,移动关节变量是 did_idi,不是 θiθ_iθi
  • 参数符号:有的教材把 aia_iai 写成 rir_iri,把 αiα_iαi 写成 φiφ_iφi
  • 零位对齐:机器人出厂零位 ≠DH≠ DH=DH 零位,需加 offsetoffsetoffset
  • URDF ↔ DH 转换:ROS 的 URDF 用 MDH,但标签的 rpy/xyzrpy/xyzrpy/xyz 顺序是 xyzxyzxyz 而非 xαzθxα zθzθ,需要二次解析。

8. Python 代码(以 MDH 为例)

import numpy as npdef dh_matrix(theta, d, a, alpha):"""返回 4×4 DH 变换矩阵(MDH 约定)"""ct, st, ca, sa = np.cos(theta), np.sin(theta), np.cos(alpha), np.sin(alpha)return np.array([[ct, -st*ca,  st*sa, a*ct],[st,  ct*ca, -ct*sa, a*st],[0,   sa,     ca,    d   ],[0,   0,      0,     1   ]])# 2R 机械臂参数
L1, L2 = 1.0, 0.5
q1, q2 = np.deg2rad(30), np.deg2rad(45)T01 = dh_matrix(q1, 0, L1, 0)
T12 = dh_matrix(q2, 0, L2, 0)
T02 = T01 @ T12print("End-effector position:", T02[:3, 3])

9. 进阶话题

  • 标定:用激光跟踪仪或视觉测量实际 DHDHDH 参数误差,建立误差模型 ΔTΔTΔT
  • 微分运动学:对 DHDHDH 矩阵求偏导得到雅可比 J(q)J(q)J(q)
  • 树形/闭环结构:标准 DHDHDH 仅适用于串联链,需引入虚拟关节或 URDFURDFURDF<joint type="floating">

一句话总结:
DH矩阵=机械杆件的“身份证”+坐标系“说明书”,只要遵循同一套约定,就能把任何串联机构转换成一串4×4矩阵的乘积。DH 矩阵 = 机械杆件的“身份证” + 坐标系“说明书”,只要遵循同一套约定,就能把任何串联机构转换成一串 4×4 矩阵的乘积。DH矩阵=机械杆件的身份证+坐标系说明书,只要遵循同一套约定,就能把任何串联机构转换成一串4×4矩阵的乘积。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/914539.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/914539.shtml
英文地址,请注明出处:http://en.pswp.cn/news/914539.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vim的magic模式

在 Vim 中&#xff0c;magic 模式用于控制正则表达式中特殊字符的解析方式。它决定了哪些字符需要转义才能发挥特殊作用&#xff0c;从而影响搜索和替换命令的写法。以下是详细介绍&#xff1a; 一、三种 magic 模式 Vim 提供三种 magic 模式&#xff0c;通过在正则表达式前添加…

Git 使用技巧与原理(一)—— 基础操作

1、起步 1.1 版本控制 版本控制是一种记录一个或若干文件内容变化&#xff0c;以便将来查阅特定版本修订情况的系统。 版本控制系统&#xff08;VCS&#xff0c;Version Control System&#xff09;通常可以分为三类&#xff1a; 本地版本控制系统&#xff1a;大多都是采用某…

软件测试之自动化测试

目录 1.什么是自动化测试 2.web⾃动化测试 2.1驱动 WebDriverManager 3. Selenium 3.1selenium驱动浏览器的⼯作原理 4.常用函数 4.1元素的定位 4.1.1cssSelector选择器 4.2.2xpath 4.2操作测试对象 4.3窗⼝ 4.4等待 4.5浏览器导航 4.6弹窗 4.7文件上传 4.8设置…

sqlserver迁移日志文件和数据文件

sqlserver安装后没有指定日志存储路径或者还原库指定的日志存储位置不理想想要更改&#xff0c;都可以按照这种方式来更换&#xff1b;1.前提准备&#xff1a;数据库的备份bak文件2.查看自己当前数据库的日志文件和数据文件存储路径是否理想选中当前数据库&#xff0c;右键属性…

MFC UI表格制作从专家到入门

文章目录CListCtrl常见问题增强版CGridCtrl&#xff08;第三方&#xff09;第三方库ReoGridCListCtrl 默认情况下&#xff0c;CListCtrl不支持直接编辑单元格&#xff0c;需通过消息处理实现。 1.添加控件到资源视图 在对话框资源编辑器中拖入List Control控件&#xff0c;设…

数字后端APR innovus sroute到底是如何选取宽度来铺power rail的?

吾爱IC社区新一期IC训练营将于7月初开班&#xff08;07.06号晚上第一次直播课&#xff09;&#xff01;社区所有IC后端训练营课程均为直播课&#xff01;全网唯一一家敢开后端直播课的&#xff08;口碑不好招生一定存在困难&#xff0c;自然就无法开直播课&#xff09;&#xf…

LVS集群技术

LVS&#xff08;Linux Virtual Server&#xff09;是一种基于Linux内核的高性能、高可用性服务器集群技术&#xff0c;它通过负载均衡将客户端请求分发到多台后端真实服务器&#xff0c;实现 scalability 和 fault tolerance。LVS工作在传输层&#xff08;OSI Layer 4&#xff…

git项目,有idea文件夹,怎么去掉

要从Git项目中排除.idea文件夹&#xff08;IntelliJ IDEA的配置文件目录&#xff09;&#xff0c;可以通过以下步骤操作&#xff1a; 1. 添加.gitignore规则 在项目根目录创建或编辑.gitignore文件&#xff0c;添加以下内容&#xff1a; .idea/2. 从Git缓存中删除已跟踪的.idea…

springboot+swagger2文档从swagger-bootstrap-ui更换为knife4j及文档接口参数不显示问题

背景 已有springboot项目,且使用的是swagger2+swagger-bootstrap-ui的版本 1.pom依赖如下 <!-- Swagger接口管理工具 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9…

mysql数据库表只能查询,对于插入、更新、删除操作一直卡住,直到报错Lost connection to MySQL server during query

诊断步骤1. 查看阻塞进程SELECT * FROM performance_schema.metadata_locks WHERE LOCK_STATUS PENDING;SELECT * FROM sys.schema_table_lock_waits;2. 查看当前活动事务SELECT * FROM information_schema.INNODB_TRX;3. 查看进程列表SHOW PROCESSLIST;通过SELECT * FROM in…

Redis BigKey 深度解析:从原理到实战解决方案

引言&#xff1a;什么是 BigKey&#xff1f;在 Redis 的使用场景中&#xff0c;BigKey&#xff08;大键&#xff09;是指那些数据量异常庞大的键值&#xff0c;通常表现为&#xff1a;String 类型&#xff1a;值大小超过 10KBHash/Set 等&#xff1a;元素数量超过 5000List/ZSe…

Qt 实现新手引导

Qt实现新手引导 对于一个新安装的软件或者一个新的功能&#xff0c;提供一个新手引导步骤&#xff0c;能够让用户快速熟悉。这是最终效果&#xff0c;每一个按钮都会有一个简单引导&#xff0c;通过点击上一步、下一步来切换不同的指导。当前引导的功能&#xff0c;会有一个高光…

Maven+Spring

一、Maven 相关- 本地仓库设置&#xff1a;- 在 IDE&#xff08;如 IntelliJ IDEA&#xff09;中可以设置 Maven 的本地仓库路径&#xff0c;本地仓库用于存储从远程仓库下载的依赖库&#xff0c;方便项目重复使用。- 仓库关系&#xff1a;- 项目&#xff1a;开发中的项目&…

Android Handler 消息机制

常用场景&#xff1a; 子线程发送Message 主线程处理Message 子线程发送消息 public final boolean sendEmptyMessageDelayed(int what, long delayMillis) {Message msg Message.obtain();msg.what what;return sendMessageDelayed(msg, delayMillis);}public final boole…

day9 串口通信

1串口通信串口通信是嵌入式系统和电子设备中最常用的 异步串行通信 方式&#xff0c;核心是通过 TX&#xff08;发送&#xff09; 和 R&#xff08;接收&#xff09; 两根线实现全双工数据传输。2通信协议分类2.1同步/异步通信同步和异步是串行通信中两种根本不同的数据传输方式…

面向对象的设计模式

一、设计模式简介1、什么是设计模式针对反复出现的问题所总结归纳出的通用解决方设计模式是指在软件开发过程中案。这些方案是众多软件开发人员经过大量实践总结出来的&#xff0c;具有高效性、可维护性和可扩展性等优点。使用设计模式可以帮助开发者更高效地构建软件系统&…

每日钉钉API探索:chooseDepartments专注于部门维度的选择接口

在企业级应用开发过程中&#xff0c;针对组织架构中的部门进行操作是非常常见的需求。今天我们要介绍的是钉钉的chooseDepartments API&#xff0c;它允许用户以部门为单位进行选择&#xff0c;并返回所选部门的相关信息。&#x1f4cc; 功能概述chooseDepartments API主要用于…

生产环境CI/CD流水线构建与优化实践指南

生产环境CI/CD流水线构建与优化实践指南 目录 业务场景描述技术选型过程实现方案详解 流水线结构设计并行构建与缓存策略部署策略&#xff1a;滚动、蓝绿、金丝雀回滚与告警自动化 踩过的坑与解决方案总结与最佳实践 业务场景描述 某大型电商平台&#xff0c;为了保证代码持续交…

腾讯云和火山云优劣势对比

从问题本身看&#xff0c;用户没有限定具体场景&#xff0c;说明可能需要一个全面的横向对比。不过云计算服务涉及面太广&#xff0c;我最好先搭建一个框架性的分析结构&#xff0c;再填充具体细节。 首先想到从几个核心维度切入&#xff1a;基础能力&#xff08;计算存储网络&…

Augment AI 0.502.0版本深度解析:Task、Guidelines、Memory三大核心功能实战指南

Augment AI 0.502.0版本深度解析&#xff1a;Task、Guidelines、Memory三大核心功能实战指南 augment最新版辅助功能全解析续杯免费额度再用满教程|memory|userguidlines|tasksaugment最新插件功能教程前言 在AI辅助编程领域&#xff0c;Augment AI作为一款强大的VS Code插件&…