☰
机械臂运动学模型全解析:从DH参数到逆解与奇异点处理
2026/10/22 6:22:52 网站建设 项目流程

1. 从一次调试翻车说起:为什么运动学模型是机械臂的命根子

去年帮一个做自动化集成的朋友处理过一台六轴协作臂的抖动问题。现象很怪:示教器上点位走得很准,但一跑连续轨迹,末端就在某些姿态下出现肉眼可见的抖动,负载越大越明显。他一开始怀疑是伺服增益没调好,折腾了三天参数,问题依旧。后来我让他把控制器里的运动学模型参数导出来一看,DH参数里第四轴的连杆偏置填错了0.5毫米,就这0.5毫米,在末端放大成了接近2毫米的轨迹偏差,控制器为了补偿这个偏差疯狂修正关节角,抖动就来了。

这件事让我再次确认一个事实:机械臂运动学模型是整个控制系统的地基。地基歪了,上面盖什么楼都白搭。不管你是做ROS开发、做离线编程、做视觉引导抓取,还是单纯想让机械臂走个圆弧,运动学模型都是绕不开的第一道坎。

这篇内容我打算把机械臂运动学模型这件事从头到尾讲透。正运动学解决的是“给定六个关节角,末端在哪”;逆运动学解决的是“我想让末端到某个位置和姿态,六个关节该转多少度”。前者是后者的基础,后者是实际应用中最常调用、也最容易出问题的部分。适合正在入门机器人控制的学生、刚接触机械臂项目的工程师,以及被逆解多解和奇异点折磨过的同行参考。我会把DH参数怎么建、变换矩阵怎么推、逆解怎么选、奇异点怎么绕这些事,用能直接抄作业的方式讲清楚。

2. 运动学模型的整体设计思路与坐标系选型

2.1 为什么一定要先建坐标系,而不是直接写变换

很多人上手就想直接写变换矩阵,结果写到第三轴就乱了。根本原因是没有先把坐标系定死。机械臂运动学的本质是坐标系之间的相对位姿关系,每个连杆上固连一个坐标系,相邻坐标系之间的变换就是关节运动带来的变化。

建坐标系这件事,业界有两套主流做法:标准DH(Denavit-Hartenberg)和改进DH(Modified DH)。这两套的区别不在数学本质,而在坐标系固连的位置和变换顺序。

标准DH把坐标系固连在连杆的远端(也就是靠近下一个关节的那一端),变换顺序是:绕Z轴转θ,沿Z轴移d,沿X轴移a,绕X轴转α。改进DH把坐标系固连在连杆的近端,变换顺序变成:绕X轴转α,沿X轴移a,绕Z轴转θ,沿Z轴移d。

我个人的经验是:串联机械臂用改进DH更直观,因为每个坐标系的原点就在关节轴线上,视觉上更好理解。但如果你拿到的是一台老设备的图纸,上面标的是标准DH参数,那就老老实实用标准DH,别自己换算,换算过程极易出错。

提示:选哪套DH不重要,重要的是全流程统一。控制器里用一套,你的MATLAB模型用另一套,两边对不上,调试时你会怀疑人生。

2.2 六轴串联臂的坐标系建立实操

以最常见的六轴串联结构(类似UR或国产协作臂的构型)为例,建立坐标系的步骤我总结成四步:

  1. 确定Z轴:每个关节的旋转轴就是该关节坐标系的Z轴。转动关节的Z轴沿旋转轴线方向,移动关节的Z轴沿移动方向。
  2. 确定原点:第i个坐标系的原点,定在Z_i轴与Z_{i-1}轴的公垂线与Z_i轴的交点。如果两轴相交,原点就在交点;如果平行,原点位置可以任选,通常选在使d_i=0的位置。
  3. 确定X轴:X_i轴沿Z_{i-1}到Z_i的公垂线方向,从Z_{i-1}指向Z_i。如果两轴相交,X_i垂直于两轴构成的平面。
  4. 确定Y轴:右手定则,Y_i = Z_i × X_i。

基坐标系{0}通常与第一关节坐标系重合或平行,工具坐标系{6}固连在末端法兰上。这里有个坑:工具坐标系和法兰坐标系不是一回事。法兰是机械的物理接口,工具坐标系要考虑你装的夹爪、吸盘、焊枪的实际TCP(工具中心点)。很多新手把这两个混为一谈,结果标定时怎么都对不上。

2.3 DH参数表的填写逻辑与常见错误

DH参数表就四列:a(连杆长度)、α(连杆扭角)、d(连杆偏置)、θ(关节角)。对于转动关节,θ是变量,其余三个是常数;对于移动关节,d是变量。

填表时最容易错的地方有三个:

  • a和d的符号:a是沿X轴从Z_{i-1}到Z_i的距离,d是沿Z_{i-1}轴从X_{i-1}到X_i的距离。符号搞反,整个模型就镜像了。
  • α的正负:绕X轴旋转,从Z_{i-1}转到Z_i,右手定则判断正负。这个在腕部三个轴相交的结构里特别容易错。
  • θ的零位:θ的零位对应机械臂的机械零位,但很多机械臂的机械零位和电气零位不一致,需要加偏置。

我一般建议填完表后,先代入一组已知的关节角,用正运动学算一遍末端位姿,和示教器上读出来的实际位姿对比。如果对不上,先检查DH表,别急着怀疑代码。

3. 正运动学:从关节角到末端位姿的完整推导

3.1 相邻连杆变换矩阵的构造

改进DH的相邻变换矩阵是四个基本变换的乘积:

T_i = Rot_x(α_{i-1}) · Trans_x(a_{i-1}) · Rot_z(θ_i) · Trans_z(d_i)

展开成4×4齐次变换矩阵:

T_i = [ cθ_i, -sθ_i, 0, a_{i-1} ] [ sθ_i·cα_{i-1}, cθ_i·cα_{i-1}, -sα_{i-1}, -d_i·sα_{i-1} ] [ sθ_i·sα_{i-1}, cθ_i·sα_{i-1}, cα_{i-1}, d_i·cα_{i-1} ] [ 0, 0, 0, 1 ]

其中c代表cos,s代表sin。这个矩阵的物理含义是:把第i-1坐标系下的点,变换到第i坐标系下。注意方向,是“从i-1到i”,不是反过来。

标准DH的矩阵形式不同,变换顺序是Rot_z·Trans_z·Trans_x·Rot_x,展开后矩阵元素的位置也不一样。用的时候一定要确认自己用的是哪套。

3.2 六轴臂正运动学的矩阵连乘

六轴臂的正运动学就是六个变换矩阵连乘:

T_0_6 = T_1 · T_2 · T_3 · T_4 · T_5 · T_6

得到的T_0_6是一个4×4矩阵,左上角3×3是末端姿态(旋转矩阵),右上角3×1是末端位置(平移向量)。

这里有个计算效率的问题。六个4×4矩阵连乘,如果直接算,每次乘法是64次乘加,六次连乘就是几百次运算。在实时控制里,这个开销不能忽略。实际工程中我一般用两种优化:

  • 预计算常数项:DH参数里a、α、d是常数,对应的sin、cos可以预先算好存起来,运行时只算θ相关的三角函数。
  • 用3×3旋转矩阵加平移向量代替4×4:省掉最后一行[0,0,0,1]的无效运算,能省大约30%的计算量。

在MATLAB里验证时不用管这些,直接连乘就行。但如果你要把模型移植到嵌入式控制器或者PLC里,这些优化就是必须的。

3.3 用MATLAB验证正运动学的实操记录

我习惯用MATLAB的Robotics Toolbox做快速验证。核心代码大概长这样:

% 定义连杆,这里用改进DH L(1) = Link('d', 0.15, 'a', 0, 'alpha', 0, 'modified'); L(2) = Link('d', 0, 'a', 0.25, 'alpha', -pi/2, 'modified'); L(3) = Link('d', 0, 'a', 0.05, 'alpha', pi/2, 'modified'); L(4) = Link('d', 0.30, 'a', 0, 'alpha', -pi/2, 'modified'); L(5) = Link('d', 0, 'a', 0, 'alpha', pi/2, 'modified'); L(6) = Link('d', 0.08, 'a', 0, 'alpha', -pi/2, 'modified'); robot = SerialLink(L, 'name', 'myArm'); % 给定一组关节角 q = [0, -pi/4, pi/4, 0, pi/2, 0]; % 正运动学 T = robot.fkine(q); disp(T);

跑出来的T就是末端位姿。然后拿这个结果和实际机械臂示教器上读的位姿对比。如果位置对得上但姿态不对,大概率是腕部三个轴的α符号错了;如果位置整体偏移,检查基坐标系和工具坐标系的变换有没有加上。

注意:Robotics Toolbox的fkine默认返回的是工具坐标系相对于基坐标系的位姿。如果你在模型里没有定义工具坐标系,它返回的是法兰坐标系。实际标定时要加上工具变换T_tool,即T_0_tool = T_0_6 · T_6_tool。

4. 逆运动学:解析解、数值解与多解选择策略

4.1 逆解为什么比正解难:多解、无解与奇异

正运动学是“一对一”的,一组关节角对应唯一一个末端位姿。逆运动学是“多对一”甚至“无解”的:

  • 多解:同一个末端位姿,可能有8组甚至16组关节角组合。比如“肘部朝上”和“肘部朝下”就是两组不同的解,末端位姿完全一样。
  • 无解:目标点超出了机械臂的工作空间,或者姿态不可达,数学上就没有实数解。
  • 奇异:在奇异位形附近,逆解的雅可比矩阵秩亏,微小的末端位移需要无穷大的关节速度,实际表现为关节速度爆表或剧烈抖动。

这三件事决定了逆运动学不能只算一个解就完事,必须有一套完整的解筛选和异常处理逻辑。

4.2 解析解:几何法拆解六轴臂

对于满足Pieper准则的六轴臂(腕部三个轴相交于一点,或者三个轴平行),存在解析解。大多数工业六轴臂都满足这个条件,所以解析法是首选。

解析法的思路是几何拆解:

  1. 先解腕心位置:腕心是第四、五、六轴的交点。末端位置减去工具长度沿末端Z轴的偏移,就得到腕心位置。
  2. 解前三个关节:腕心位置只跟前三个关节有关。用几何关系,把腕心投影到基坐标系的XY平面,解出第一关节角θ1;再用余弦定理,解出θ2和θ3。这里会出现“肘上”和“肘下”两组解。
  3. 解后三个关节:腕心位置确定后,前三个关节角已知,末端姿态矩阵除以T_1·T_2·T_3,剩下的就是腕部三个关节的旋转矩阵。用欧拉角分解,解出θ4、θ5、θ6。这里会出现“腕翻转”和“腕不翻转”两组解。

前三个关节两组解,后三个关节两组解,组合起来就是8组解。实际控制器里通常还会考虑关节限位,把超出限位的解剔除,剩下的再按“关节运动量最小”或“远离奇异”的原则选一组。

4.3 数值解:雅可比迭代与阻尼最小二乘

如果机械臂不满足Pieper准则,或者你不想推解析公式,可以用数值解。最常用的是雅可比伪逆迭代:

q_{k+1} = q_k + J^+ · (x_target - x_current)

其中J是雅可比矩阵,J^+是伪逆。迭代到误差小于阈值为止。

但伪逆在奇异点附近会爆炸,所以实际工程中用的是阻尼最小二乘(DLS):

q_{k+1} = q_k + J^T · (J·J^T + λ^2·I)^{-1} · (x_target - x_current)

λ是阻尼系数,在奇异点附近自动增大,牺牲一点精度换取关节速度的平滑。这个λ怎么选是个经验活:太小了抑制不住奇异,太大了收敛慢。我一般从0.01开始试,根据实际轨迹的平滑程度调整。

数值解的优点是通用,不挑构型;缺点是慢,而且不保证收敛到全局最优。实时控制里如果要用数值解,迭代次数一般限制在5到10次,配合上一周期的解做初值,收敛会快很多。

4.4 多解选择的工程策略

8组解里选哪一组,直接决定了机械臂的动作是否自然、是否安全。我常用的筛选顺序是:

  1. 关节限位过滤:先把超出软限位的解全部剔除。这一步能干掉一半以上的解。
  2. 碰撞检测过滤:用简化模型(比如用圆柱体包络连杆)快速检测,剔除会撞到自身或环境的解。
  3. 关节运动量最小:计算每组解与当前关节角的加权距离,选距离最小的。权重可以根据关节惯量来设,大惯量的关节权重高一些,避免它大幅运动。
  4. 远离奇异:计算每组解对应的雅可比条件数,条件数越小越好。

这四步下来,基本只剩一组解了。如果还有多组,就按“腕部翻转优先”或“肘部朝上优先”的固定策略选。

实操心得:多解选择策略一定要在离线仿真里反复验证。我见过一个案例,控制器默认选“关节运动量最小”的解,结果在某个过渡点,机械臂突然从“肘上”翻到“肘下”,动作幅度巨大,差点撞到旁边的设备。后来加了“姿态连续性”约束,要求相邻周期的解不能突变,问题才解决。

5. 雅可比矩阵与奇异点处理:让机械臂远离“失控区”

5.1 雅可比矩阵的物理意义与构造方法

雅可比矩阵J描述的是关节速度到末端速度的映射:

v = J · q_dot

其中v是末端六维速度(三轴线速度+三轴角速度),q_dot是关节速度向量。J是一个6×n的矩阵,n是关节数。

构造雅可比有两种方法:

  • 微分变换法:对每个关节,计算它对末端速度的贡献。转动关节i的贡献是:线速度部分为Z_i × (P_end - P_i),角速度部分为Z_i。Z_i是第i关节的旋转轴在基坐标系下的方向,P_i是第i关节原点的位置。
  • 矢量积法:直接对正运动学矩阵求偏导,数学上更严谨,但计算量大。

工程上一般用微分变换法,直观且计算量小。构造出来的J每一列对应一个关节,列向量的物理含义是“该关节转一个单位角速度,末端会产生多大的线速度和角速度”。

5.2 奇异点的三种类型与识别方法

六轴臂的奇异点主要有三类:

  • 腕部奇异:θ5 = 0或π,第四轴和第六轴共线。此时末端绕某个方向的旋转无法实现,J的秩降为5。
  • 肘部奇异:机械臂完全伸直或完全折叠,θ3接近0或π。此时末端沿某个方向的平移无法实现。
  • 肩部奇异:腕心落在第一轴的轴线上,θ1不确定。此时末端绕第一轴方向的旋转无法实现。

识别奇异点最直接的方法是算J的条件数(最大奇异值除以最小奇异值)。条件数越大,越接近奇异。一般条件数超过100就要警惕,超过1000基本就是奇异了。

另一个指标是最小奇异值。最小奇异值接近0,说明某个方向的可操作度为零。我一般同时监控这两个指标,条件数看整体,最小奇异值看具体方向。

5.3 奇异点规避的实操方案

规避奇异点有几种常用手段,我按推荐程度排序:

  1. 轨迹规划阶段绕开:在笛卡尔空间规划轨迹时,先检查整条轨迹上的条件数,如果某段接近奇异,就调整路径点或者改用关节空间插值。这是最根本的解决办法。
  2. 阻尼最小二乘:前面提到的DLS,在奇异点附近自动降速,牺牲精度换平滑。适合无法绕开的情况。
  3. 任务优先级重构:在奇异点附近,主动放弃某个次要方向的控制(比如末端绕工具轴的旋转),把自由度让给主要方向。这个在焊接和涂胶应用里很常见。
  4. 关节限位微调:有时候稍微调整一下腕部的零位偏置,就能把奇异点移出工作空间。这个需要在机械设计阶段就考虑。

注意:奇异点规避没有万能方案。我踩过的最大的坑是在一个码垛应用里,机械臂在最高点取件时接近肩部奇异,当时用了DLS,结果节拍慢了15%。后来重新规划了取件姿态,让腕心偏离第一轴轴线,问题才彻底解决。所以能绕开就绕开,别硬扛。

6. 从模型到落地:标定、验证与常见问题速查

6.1 DH参数标定:让模型和实物对上

理论DH参数和实物总有偏差,装配误差、加工误差、磨损都会导致模型不准。标定的目的就是修正这些偏差。

标定分四步:

  1. 数据采集:让机械臂走若干个不同的位姿,记录每个位姿下的关节角和实际末端位姿。末端位姿用激光跟踪仪或视觉测量设备获取。位姿数量一般20到30个,要覆盖工作空间的大部分区域。
  2. 参数辨识:把DH参数作为待辨识量,用最小二乘法或优化算法,最小化“模型预测位姿”和“实测位姿”的误差。待辨识量通常包括每个连杆的a、d、α、θ偏置,一共24个参数左右。
  3. 参数补偿:把辨识出来的偏差补偿到控制器里。有些控制器支持直接修改DH参数,有些只能改关节零位偏置,后者标定精度会打折扣。
  4. 验证:用另一组没参与辨识的位姿数据验证补偿效果。一般要求位置误差小于0.5毫米,姿态误差小于0.1度。

标定这件事,数据质量比算法重要。我见过太多人用一堆集中在工作空间某个角落的数据去标定,结果标定出来的参数在别的区域完全不适用。数据一定要分散,而且要包含一些接近奇异点的位姿,这样辨识出来的参数才鲁棒。

6.2 模型验证的三种方法

标定完之后,怎么确认模型是对的?我常用三种方法交叉验证:

  • 单点验证:随机选几个位姿,对比模型预测和实测。这个方法快,但只能看局部。
  • 轨迹验证:让机械臂走一条直线或圆弧,用外部测量设备记录实际轨迹,和模型预测的轨迹对比。这个方法能看出模型在整个轨迹上的累积误差。
  • 圆点验证:让末端走一个标准圆,测量实际圆的圆度和半径误差。这个方法对姿态误差特别敏感,能暴露腕部参数的问题。

三种方法都过了,模型才算靠谱。

6.3 常见问题速查表

现象可能原因排查方向解决方法
末端位置整体偏移基坐标系或工具坐标系变换错误检查T_0_base和T_6_tool重新标定基坐标系和TCP
姿态对但位置不对连杆长度a或偏置d填错核对DH参数表用单点验证反推正确参数
位置对但姿态不对腕部α符号错误检查第四、五、六轴的α修正符号后重新验证
逆解无解目标点超出工作空间检查目标点是否可达调整目标点或改用关节空间插值
逆解跳变多解选择策略不稳定检查相邻周期的解是否突变加姿态连续性约束
关节速度爆表接近奇异点计算雅可比条件数用DLS或重新规划轨迹
轨迹圆度差标定参数不准检查标定数据分布重新标定,增加数据量
负载变化后精度下降连杆变形未补偿检查是否加了负载补偿加负载辨识或刚度补偿

6.4 几个我踩过的坑和对应的解法

坑一:忽略关节零位偏置。有次调试一台二手设备,DH参数都是对的,但末端总是差几度。后来发现是第二轴的零位偏置丢了,机械零位和电气零位差了1.2度。加上偏置后,精度立刻上来了。所以拿到任何一台设备,第一件事就是确认零位偏置。

坑二:工具坐标系标定用四点法但点选得太近。四点法标TCP,四个点如果靠得太近,解出来的TCP误差很大。我一般要求四个点分布在工作空间的不同象限,间距至少200毫米。

坑三:逆解迭代初值用上一次的解,但没做限幅。数值解迭代时,如果目标点突然跳变,初值离真实解太远,迭代可能发散。后来加了初值限幅,每次迭代的关节角变化不超过5度,问题就解决了。

坑四:雅可比矩阵用数值差分算,步长选得太大。数值差分算雅可比,步长太大精度不够,步长太小又有舍入误差。我一般用1e-6弧度作为步长,配合中心差分,精度和稳定性都够。

7. 写在最后:一些个人体会

运动学模型这件事,理论书上讲得很清楚,但真正落地时,80%的时间花在标定、验证和异常处理上,只有20%的时间花在推导公式上。我见过太多人公式推得滚瓜烂熟,但一上真机就抓瞎,就是因为忽略了实际系统的非理想因素。

我的建议是:先把正运动学在MATLAB里跑通,再用实际机械臂验证,确认模型和实物对得上,然后再去搞逆运动学。逆运动学的坑更多,没有可靠的正运动学做基础,逆解调试就是无源之水。

另外,别迷信解析解。解析解虽然快,但推导过程容易出错,而且换个构型就要重推。数值解虽然慢,但通用性强,配合好的初值和阻尼策略,实际效果并不差。我现在做新项目,一般是先用数值解快速验证,等构型确定了再推解析解做优化。

最后分享一个小技巧:调试逆运动学时,把每一组解的关节角都打印出来,画成关节空间轨迹图。哪组解在跳变、哪组解接近限位,一眼就能看出来。这个习惯帮我省了无数调试时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询