机器人学导论学习笔记:从DH参数到正逆运动学实战解析
发布时间:2026/10/12 13:29:30 锦皓数字建站

机器人学导论这门课可以说是我见过“劝退率”最高的一门基础课。一堆矩阵、坐标系变换、连杆参数看着就头大但真要是吃透了后面搞机械臂、移动机器人、甚至足式机器人的运动规划都会顺很多。这篇文章算是我自己的一份学习笔记整理也是持续更新的那种——凡是实操过、踩过坑的部分我都会尽量把推导过程、代码片段和翻车记录写进来而不是只堆公式。这份笔记适合谁一是刚接触机器人方向的研究生或者高年级本科生二是做嵌入式或者自动驾驶想转机器人本体的工程师三是单纯想搞明白机械臂是怎么动起来的硬件爱好者。不管你有没有现成的机械臂可以玩只要愿意花时间把变换矩阵和DH参数这一套逻辑捋清楚后面看论文、读源码都会轻松很多。我自己学这门课最痛苦的阶段就是“课上听懂了课后合上书啥也写不出来”。后来发现问题出在没把数学和实物对应起来。所以这篇笔记的思路也调整了先把一个机械臂当作一堆坐标系的串联再逐步往里面填公式和代码。1. 机器人学导论到底在讲什么先把地图看全1.1 这门课的底层逻辑很多人一开始就把机器人学导论当成“数学课”在学其实这是认知偏差。它真正的核心是解决一个问题怎么描述一个机器人本体的状态并且让这个描述可以被计算和控制。一台机械臂不管六轴的还是七轴的本质上就是一串由关节连接起来的刚体。我们需要知道末端在空间里的位置和姿态需要知道每个关节转多少度才能让末端到达目标点需要知道末端受到的力怎么反算到每个关节上。这一整套问题压缩到一门导论课里就变成了四条主线空间描述与变换用数学语言描述刚体在空间中的位置和姿态。正运动学已知每个关节的角度求末端位置和姿态。逆运动学已知末端位置和姿态求每个关节的角度。速度与静力分析关节速度和末端速度之间的关系以及力和力矩的传递关系。再往下延伸才是动力学、轨迹规划、力控制和视觉伺服。所以学导论的时候不要急着背公式先让自己建立“坐标变换链”的直觉。一台六轴机械臂从基座到末端中间就是六个坐标系依次变换每个变换都由关节变量决定。这个直觉一旦建立起来后面不管换什么结构的机器人你都能很快上手建模。1.2 一条适合自学的实战路线我不建议按课本目录顺序啃效率太低。更推荐“先整体后细节先运动学后动力学”的自学路线配合一个可视化环境去验证。具体来说先花一两天时间找一段开源仿真环境里的机械臂模型手动拖拽每个关节看看末端是怎么跟着变化的。这个阶段不需要懂公式只需要建立“关节角度影响末端位置”的空间直觉。再回到课本重点读空间变换和正运动学两章。读到齐次变换矩阵时一定要亲手算几个例子比如一个坐标系先绕Z轴转90度再平移一米看看最后映射到基坐标系的结果是什么。正运动学搞明白之后开始逆运动学。先别碰通用数值解法把两自由度和三自由度的几何解法推明白再去看解析解。最后才是雅可比矩阵和动力学。雅可比建议配合奇异位形的仿真动画一起理解动力学则可以放到你确实需要做高动态控制时再深入学习。这个路线看起来慢实际上节省时间。有人上来就死磕动力学方程结果连正运动学都没搞明白最后越学越乱。别贪快空间变换这一关过不了后面每一步都是空中楼阁。2. 空间描述与齐次变换一切运动学的地基2.1 旋转矩阵为何用3×3从“方向的描述”说起刚体在空间中的姿态本质上是“一个坐标系相对于另一个坐标系的旋转关系”。描述这种关系有三种主流工具旋转矩阵、欧拉角、四元数。导论课和高年级机器人技术课一般从旋转矩阵入手因为它最直观也最能暴露问题。旋转矩阵的每一列可以理解成被旋转坐标系各轴在参考坐标系中的方向余弦。比如某个坐标系绕参考系Z轴转90度它的X轴方向在参考系下就是(0,1,0)Y轴方向是(-1,0,0)把这些方向列向量按列排进矩阵就得到了这个旋转矩阵。这种表示方法的好处是干净、通用任何姿态都有唯一的旋转矩阵。但反过来也有代价9个数只有3个自由度所以元素之间不是相互独立的Starck约束条件隐藏在里面。实际用的时候如果从外部读取数据或者做插值直接操作矩阵很容易让数值漂移导致矩阵不再是单位正交阵。我的建议是手算和推导用旋转矩阵程序中内部保存姿态可以用四元数与人交互或者查看中间数据用欧拉角。三种工具之间要学会自由切换尤其要清楚不同工具的适用范围和坑点。2.2 齐次变换矩阵的几何直觉一个刚体在空间中的完整位姿是“位置姿态”组合。如果用旋转矩阵表示姿态那么位置和旋转是分开的两部分位置用3×1向量姿态用3×3矩阵。但运动学建模时不希望每次变换都分开处理因为坐标系经过多级变换之后写起来会非常冗长。解决办法就是升维把3×3旋转矩阵扩展成4×4的齐次变换矩阵左上角仍然放旋转矩阵右上角加一个平移向量最后一行固定为[0 0 0 1]。这样一来一次变换就把旋转和平移都包含了。多个关节串联时直接把对应的变换矩阵依次左乘最后得到的矩阵右上角就是末端在基坐标系下的位置左上角就是末端的姿态。刚开始学时我总忘记矩阵相乘的顺序。记住一个关键点如果变换是相对于当前坐标系进行的就右乘如果是相对于固定参考坐标系的就左乘。这个顺序错了计算结果完全不对。实操里机械臂正运动学一般是每个关节的变换相对于上一关节坐标系所以要按顺序左乘也就是后写的变换在矩阵链的左边。关于求逆也有个实用技巧齐次变换矩阵的逆不需要对4×4矩阵做完整求逆。因为旋转矩阵部分正交所以逆矩阵的左上角直接取原旋转矩阵的转置右上角平移部分等于旋转矩阵转置后乘以负的原平移向量。这个技巧在视觉标定、手眼标定里经常用到能省不少计算量。3. DH参数与正运动学建模实操拿一台六轴机械臂开刀3.1 建立连杆坐标系的四个参数正运动学的第一步是把机械臂简化成一组连杆和关节然后在每个关节上固定一个坐标系。这里最常用的是DH参数法。DH参数用四个量描述相邻两个坐标系之间的变换关节转角θ、连杆偏距d、连杆长度a、连杆扭角α。听起来抽象其实可以这样理解d沿着上一关节轴方向从坐标原点到公垂线交点的距离。a沿着公垂线方向两个关节轴之间的最短距离。α两个关节轴之间的夹角。θ绕上一关节轴旋转的角度让公垂线的方向对齐到当前关节轴方向。对于旋转关节θ是变量其他三个是常量对于移动关节d是变量。DH参数表就是把这些常量变成一张表放进程序里正运动学就变成了查表加矩阵连乘。这套方法极其适合工程实现因为不管机械臂结构怎么变你只需要改DH参数表代码框架不用动。3.2 一次完整的手工建模模拟项目X的六轴机械臂我做正运动学练习时用的是自己在某开源仿真环境里搭的一个六轴机械臂模型关节配置是常见的基座旋转、肩部俯仰、肘部俯仰、前三个关节形成腕部滚转、俯仰、滚转。各关节的DH参数初始值如下这里列出的是我建模时用的数值单位是毫米和度关节 iθ_id_ia_iα_i1θ_1150090°2θ_2050003θ_3040004θ_4100090°5θ_500-90°6θ_68000有了这张表正运动学就是写一个通用函数输入六个关节角依次构造每个关节的齐次变换矩阵并相乘。我写了个Python脚本来验证末端位置核心部分如下import numpy as np def dh_transform(theta, d, a, alpha): theta np.deg2rad(theta) alpha np.deg2rad(alpha) return np.array([ [np.cos(theta), -np.sin(theta)*np.cos(alpha), np.sin(theta)*np.sin(alpha), a*np.cos(theta)], [np.sin(theta), np.cos(theta)*np.cos(alpha), -np.cos(theta)*np.sin(alpha), a*np.sin(theta)], [0, np.sin(alpha), np.cos(alpha), d ], [0, 0, 0, 1 ] ]) # 按顺序相乘 T np.eye(4) for i in range(6): T T dh_transform(theta_list[i], d_list[i], a_list[i], alpha_list[i])我第一次跑这个脚本时末端位置和仿真里的测量值差了二十多毫米。排查半天才发现问题出在第二、三关节的坐标系原点上——我给d赋值的时候少了大臂偏置。说白了DH参数表必须和实际建模时的图纸一一对应凭空抄来的参数表大概率有偏差。3.3 标准DH与修正DH的约定陷阱学DH参数时最容易踩的坑就是不同教材和工具箱用的DH约定不一样。经典教材用的是标准DH也就是坐标系建立在前一个关节上的方式但很多机器人工具箱底层默认的是修正DH也就是坐标系建立在后一个关节上的方式。这两种约定计算出来的矩阵链形式略有不同。我遇到过的情况是先用标准DH在纸上推导结果丢进工具箱里仿真末端位置对不上后来才发现工具箱用的是修正DH。所以在建模之前先确认清楚你和代码用的DH约定是否一致这一点比记住公式本身更重要。另外α正负方向也容易出错。在纸上画图时扭角方向不标注清楚代入程序就成了镜像关系。我现在处理这类问题一律先在一张纸上画出相邻两个关节轴的简化图标好公垂线方向和旋转方向再填参数表。比你空想半小时靠谱得多。4. 逆运动学求解解析解与数值解的取舍4.1 为什么要解逆运动学正运动学是从关节空间到笛卡尔空间的映射逆运动学正好反过来。实际控制中我们通常希望末端执行器到某个三维位置、某个姿态去需要反推出六个关节角。听起来只是求逆函数但问题在于机器人运动学是高度非线性的逆解并不是通解。对于六自由度机械臂如果后三个关节轴交于一点腕部球形结构可以把逆解拆成两部分先解前三关节得到腕部中心位置再解后三关节得到姿态。这就是经典的解析逆解。很多工业机械臂都是这么设计的因为解析解精度高、计算快而且不需要初值。4.2 多解问题与最优解选择策略逆运动学通常不止一组解。同一个末端位姿肘部可以在上面也可以在下面腕部可以翻转也可以不翻转所以你可能会得到八组甚至更多解。工程上怎么选工业场景最常用的选择策略是“最小关节运动量”原则。当前关节角和候选解之差加权求和以后选最小。这项选择要尽量避开关节极限位置因为进入限位会导致运动中断。还有一个细节加减360度归一化是必须的不然一个结果看起来是5度另一个是355度直接相减会被误判为移动很大而实际上只转了10度。数值解法方面常见的思路是用雅可比矩阵做迭代求解。比如给定一个初始关节角计算当前末端位姿和目标位姿的误差再通过雅可比矩阵修正关节角反复迭代直到误差满足要求。这个方法的优点是通用性强任何结构都能解但缺点也很明显初值选得不好会收敛到错误解或者直接在奇异位形附近震荡。实用建议是先用解析解算一组候选解作为数值迭代的初值这样既保证收敛稳定性又能避开至少一部分奇异区域。4.3 一个最简单的二连杆几何逆解示例如果对逆运动学一时难上手建议先理解二连杆的几何解法。一个机械臂由两个旋转关节构成给定末端的二维位置需要求θ1和θ2。把两个连杆长度记为L1和L2目标到基座的距离记为r那么肘部关节角θ2由余弦定理决定cosθ2(r^2 - L1^2 - L2^2)/(2L1L2)。注意这个式子可能有正负两个解分别对应肘上解和肘下解。肩部关节角θ1则可以看作一个基准角α加上一个偏移角β。α是目标点相对基座的角度β是用正弦定理算出来的连杆偏角。最终θ1atan2(y,x)-β。整个手工推导过程不超过十行但能让你彻底理解“多解是怎么来的”“为什么同一位置会有不同构型”这两个问题。之后再看六轴解析逆解的推导就不会感觉是在看天书。5. 雅可比矩阵、奇异位形与动力学概览5.1 速度级的雅可比关节空间与笛卡尔空间的桥梁运动学只解决“位置和姿态”但控制机器人运动时还得考虑“速度和力”这就是雅可比矩阵的登场时机。雅可比矩阵J把关节速度映射到末端速度写成向量形式就是v_末端J·qd。J的每一列代表“某个关节转单位速度时末端在笛卡尔空间里产生的速度”。雅可比矩阵看起来像个矩阵实际上每列都和机械臂当前构型相关。也就是说同一个关节角速度在不同构型下产生的末端速度不一样所以雅可比矩阵每时每刻都在变。这一点在轨迹规划和振动分析中至关重要。比如机械臂完全伸直时末端在某个方向的速度会变得极难实现因为这时候雅可比丢了秩对应方向的速度传递能力接近零。雅可比矩阵的求法有几何法和解析法两大类。几何法基于“每个关节旋转造成末端速度是角速度叉乘矢径”这个物理直觉来推导直观且与坐标系的选择无关解析法则是直接对正运动学的姿态表示求导。导论课一般只要求能用几何法求出简单机器人的雅可比矩阵但后续做力控时雅可比矩阵的转置会频繁出现。5.2 奇异位形为什么机械臂会突然“锁死”雅可比矩阵降秩时机械臂就处于奇异位形。在奇异位形附近某些方向的末端速度无法通过关节速度产生也就是末端在某些方向上“动不了”。这时候逆运动学按数值办法迭代很容易得到极大的关节速度指令导致电机过速报警。我实操中遇到最典型的奇异是腕部奇异后三个关节轴接近共线时腕部的滚转动作会产生末端位置的微小变化但反过来末端微小的姿态偏差需要腕部关节速度猛烈响应。调试时如果看到某个关节速度指令突然飙到限幅之外先检查当前构型是不是接近奇异。工程上缓解奇异问题通常有三个思路一是在轨迹规划阶段尽量避开奇异区域二是用阻尼最小二乘法DLS来解雅可比逆在奇异区域牺牲一点精度换稳定的速度三是用奇异分离的方法把雅可比分解成可以独立处理的子空间。导论阶段不需要把DLS推得很细但至少要知道这个现象存在不然你以为代码写错了其实是机械臂本身的运动学特性。5.3 动力学与控制导论课需要掌握到什么程度动力学部分导论课一般点到为止主要是拉格朗日方法和牛顿欧拉方法两种建模思路。拉格朗日法从系统能量出发最终得到运动方程牛顿欧拉法是逐连杆递推求解力和力矩更适合程序实现。在控制层面最基础的是PD控制加重力补偿。一个机械臂关节如果只做简单的位置控制不用考虑科氏力和惯性矩阵的耦合时PD参数还能凑合调但只要速度快一点或者负载变化明显单纯PD就容易抖。实际调试PD参数我习惯先只调P让关节到达目标附近再逐步加D抑制震荡最后加入重力补偿项消除稳态误差。I项要慎重加多了容易出现低频振荡。导论课不用逼自己把动力学方程全部手推一遍但一定要理解动力学参数质量、质心、惯量的辨识误差、关节摩擦力、减速器柔性都会让理论模型和实体产生差距。这也是后来做力控和系统辨识时真正要头疼的事情。6. 常见问题与排查技巧实录学习机器人学导论和做仿真验证时下面这几个问题几乎每个人都会遇到。我整理成了一个速查表问题、现象、原因、排查办法都对应好了。题目/现象可能原因排查办法正运动学算出的末端位置和仿真不一致DH参数表抄错或者DH约定不一致先只动单个关节看末端轨迹是否沿预期轴线画圆弧逆运动学迭代时关节角震荡不收敛初值太远或陷在奇异位形附近用解析解作为初值检查雅可比是否接近降秩矩阵相乘结果异常左乘右乘顺序混乱明确坐标系定义后把所有变换统一写一遍再编码计算出的角度和实际偏差大没有统一角度单位度弧度混用所有输入输出统一转成弧度只在调试打印时保留度两关节联动时末端路径明显偏离直线没有做轨迹插补只对目标点做逆解在两个位姿之间做多点插补逐点求解再驱动仿真中速度超大、指令超限处于奇异位形附近观察机械臂构型加入奇异规避逻辑或限制关节速度除了表格里这些我再补两点自己的经验。第一手算复核永远比直接看代码有效。我之前经常遇到代码跑出来的结果和自己推算不一样最有效的方式不是盯着代码debug而是把机械臂某个关节固定让另一个关节转一个特殊角度比如90度或者180度手动算一个坐标再用代码算一遍。这个“特殊角度测试法”能非常快定位是公式问题、代码问题还是参数表问题。第二可视化仿真不是万能的。仿真里不会出现重力下垂、减速器摩擦、信号噪声所以你以为“跟随误差很小”只是数学上的结果上实体以后一定会打折扣。我现在的习惯是仿真的运动学结果只能证明代码在逻辑上没有大错真正要用的算法必须到实体测试要么就额外加入模型误差和噪声的仿真场景。另外建议给自己建一个“坑记录本”。我记过最典型的坑包括某次修改DH参数表后忘记同步改逆解代码里的初始关节角某次把末端姿态直接用欧拉角当四元数传给了上层控制模块某次忽略了躯干基座的坐标系方向导致机器人走了半天才发现X轴反了。这些问题看起来低级但高压调试时真容易犯。这套学习笔记后面还会持续扩展暂定的方向包括轨迹规划里的插补与平滑、动力学参数辨识入门、力控与阻抗控制的仿真实现、视觉引导抓取中的手眼标定。每完成一段我会继续把推导过程、代码和踩坑记录更新进来。如果大家在学机器人学的过程中也遇到过什么诡异问题欢迎带着具体现象和描述来交流有些问题确实只有见过实物才能解释得清楚。
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。