ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

机械臂标定:从重复精度到绝对定位精度的关键技术与实践

机械臂标定:从重复精度到绝对定位精度的关键技术与实践

1. 标定到底在解决什么问题

第一次被机械臂的重复定位精度和绝对定位精度这两个概念搞糊涂,是在一个焊接项目上。那台六轴机械臂在示教点之间来回跑,每次落点几乎分毫不差,所有验收指标看起来都漂亮得很。结果换成离线编程生成路径之后,焊枪在真实工件上的位置和仿真里对不上,偏差超过3毫米,直接把一批试制件焊废了。

这就是典型的"重复精度高、绝对精度差"。机械臂在出厂前,厂家已经把减速比、零点位置这些参数调得很准,所以每次走到同一个示教点时都能复现得很好。可一旦坐标系、初始零点或者连杆尺寸发生变化——比如搬了机台、换了工具、关节被撞过——它脑子里存的理论参数和真实的物理尺寸就对不上了。标定做的就是一件事:通过外部测量手段,把这些"不一致"的偏差找出来,再反哺回控制模型里,让机械臂知道自己的手到底在哪里。

一个直观的理解方式:机械臂的运动学模型是一连串矩阵相乘的链式过程,每个关节的坐标系靠DH参数(a、alpha、d、theta)串起来。理想情况下,只要给出了各关节角度,模型就能算出末端法兰盘的精确位姿。可真实机械臂存在加工公差、装配误差、关节磨损、零点偏移,这些误差会叠加到一个足够惊人的量级。我见过一台用了四年的六轴臂,标定前末端绝对定位误差在2.8毫米左右,标定完直接压到0.3毫米以内。这个提升幅度,对视觉引导、力控打磨、高精度装配这类场景来说,就是能不能落地的分水岭。

做标定的人,需要同时具备三块知识:机器人运动学基础(起码能推导雅可比矩阵)、测量设备使用经验(激光跟踪仪或者拉线式测量系统)、还有数据处理能力(矩阵运算、最小二乘、奇异值分解)。别被吓到,下面我一步一步拆开讲。

2. 标定方案的整体设计与技术选型

2.1 外部测量设备怎么选

标定不能靠机械臂自己告诉你在哪,它要是知道在哪就不用标了。必须引入外部测量设备,在机械臂末端的某个已知参照点上,获取它在外界坐标系的真实位姿。测量设备的选择,直接决定了标定的天花板。

常见的选择有几类:

  • 激光跟踪仪:精度最高,动态测距,能跟踪末端靶球运动。设备贵,但对标定来说效果最好,实验室或者预算充足的产线用得多。
  • 拉线编码器系统:多根拉线挂在末端,通过线长变化解算位置。成本低不少,精度中上,适合工厂场景里做周期性复标。
  • 视觉测量方案:用高精度相机识别末端标记板,解算位置和姿态。成本适中,但受视野范围和光照影响,精度比激光跟踪仪低一档。
  • 千分表+标准球:纯人工操作,精度高但效率极低,适合小范围局部标定,不适合全臂标定。

我自己的选择标准是:先看项目对绝对精度的需求。如果要求末端误差小于0.5毫米,直接上激光跟踪仪,别在视觉方案上浪费时间。如果需求在1毫米以内,拉线编码器系统性价比最高。如果只是做工具坐标系标定,千分表和标准球组合就够用。预算、精度、效率这三者不可兼得,提前想清楚需求,能省下大量沟通成本。

2.2 标定模型选择:修正DH参数还是全参数

运动学标定的核心,就是建立误差模型。机械臂的理论模型能算出理论末端位姿,实际测量能得到真实末端位姿,两者的差值就是末端位置误差。方向没问题,可要想把这个差值"折算"回每个关节的误差参数,就需要一个足够准的误差映射模型。

这里最大的坑,是参数耦合。DH模型本身的局限性在于:相邻关节坐标系如果近乎平行,参数辨识矩阵就会病态。市面上多数六轴臂的第二、第三关节轴在设计上会尽量避免完全平行,但误差依然存在。正式标定前,我建议先做一次"参数可辨识性分析",在Matlab里用符号矩阵生成观察方程,检查各参数对应的辨识矩阵边界是否独立。

选择修正DH(MDH)模型,还是指数积(POE)模型,取决于你对矩阵微分熟悉的程度。MDH模型在原有DH参数基础上加了beta项,能把平行关节的问题绕开,入门门槛低,资料也最多,适合绝大多数项目。POE模型用的是旋量理论,避开了DH模型奇异性问题,但建模繁琐,还要区分局部坐标系和全局坐标系。我做过的标定项目里,80%用MDH加最小二乘辨识就能达到预期效果,只有面对高精度高速度运动控制场景时,才会转用POE模型配合迭代辨识。

2.3 标定流程的总体架构

标定流程不是"测一组数据算一下"就完了,而是一个完整的闭环。标准流程我拆成六步:

  1. 建立机器人运动学模型,确定待辨识参数集合。
  2. 设计测量方案,确定末端靶球安装位置、测量坐标系与机器人基坐标系的转换关系。
  3. 采集覆盖工作空间的位姿样本。
  4. 将测量数据统一到机器人基坐标系下,做坐标变换。
  5. 构建误差方程,用数值方法辨识几何参数误差。
  6. 把辨识结果写回控制系统,并用未参与辨识的样本验证精度。

第3步和第4步出问题的概率最大。采集样本太少,辨识矩阵可能欠定;坐标变换没做对,那数据再准也是白费。后面我会重点讲这两个环节的实操细节。

3. 核心细节解析与实操要点

3.1 位姿样本怎么采才能保证辨识结果可靠

数据采集是标定流程里最需要耐心的一步,"采了几十个点但辨识出来参数是错的"这种情况,我见过太多次了。真正有效的标定样本,需要考虑以下几点:

空间覆盖度。末端靶球的位置必须在机械臂工作空间的不同区域均匀分布。有人图省事,就在当前姿态附近来回微调关节,采了三五十个点,辨识出来的参数只对那一片区域有效,换个位置精度就回归原形。正确做法是在工作空间里画出一系列平面网格,每个网格交点附近取一个或者多个样本点。我在实操中最少采50个样本,通常采80到120个,再多虽然理论上更好,但耗费在测量上的时间就长了。

位姿多样性。位置要覆盖,姿态也要覆盖。很多人在标定的时候只顾着让末端靶球走位置,而忽略了姿态的变化。末端位姿在测量坐标系下的旋转矩阵分布太集中,会导致辨识矩阵中出现局部共线性,参数解极端依赖某个姿态子集。我在采集时会刻意让末端在空间点保持至少三种互相不相似的姿态,这样能显著改善观察矩阵的条件数。

避开奇异位姿。机械臂在某些位姿下关节速度会突变,接近奇异时,位置对关节角的敏感度极低,微小的测量噪声就可能被放大成巨大的辨识偏差。用激光跟踪仪测的时候这个体现得尤其明显。我一般会先看一眼各个关节角的分布,确保没有关节停在0度或者180度附近,再继续下一组数据。

3.2 坐标变换与数据预处理

这个环节是"看着简单做起来容易翻车"的重灾区。激光跟踪仪有它自己的测量坐标系,机器人基坐标系又是另一个,采完的原始数据不能直接用,得先做刚体变换。

实际操作中,我会在机器人底座上固定一个带靶座的基准装置,用测量设备建立基坐标系。具体步骤是:用测量设备测基准装置上的三到四个非共线靶座,构造一个与机器人基坐标轴对齐的坐标系。这里有个隐蔽的问题——测量设备自身的坐标系和机器人基坐标系之间的旋转,如果只用三个点拟合,可能会导致几度的角度偏差,而这个偏差会带入末端位置误差。所以建议测至少六个点,利用最小二乘拟合得到变换矩阵,把拟合残差控制在0.05毫米以内。

数据预处理还有一步不能省:剔除粗大误差。测量过程中难免出现靶球被碰撞、遮挡或者镜面反光被误读的情况,这类异常点在误差方程里会被赋予巨大的权重。我通常会对原始数据做一次预处理,用拟合前的残差分布判断离群点,残差大于三倍标准差的数据直接剔除。注意,剔除数据后要重新做一次坐标变换拟合,因为变换参数本身也受异常点影响。

3.3 误差方程构建与参数辨识

来到核心算法的部分。这里我以MDH模型为例,走一遍完整的误差方程推导思路。

MDH模型标注连杆间的四个基本参数外加一个beta转角参数,末端位姿可以写成各个关节变换矩阵的连乘。对每个参数求偏导,就能得到末端位置误差与参数误差之间的线性映射关系。写成矩阵形式就是:

J * delta_q = e

其中J是雅可比矩阵(由各参数偏导构成,n个样本点拼接而成),delta_q是待辨识的几何参数误差向量,e是末端位置误差向量(测量得到的位置与理论模型计算出的位置之差)。

方程形式看起来很简洁,但构造J矩阵时需要特别小心。相邻关节的参考坐标系定义不同,雅可比矩阵的行列顺序和符号都很容易出错。我自己的习惯是先用机器人工具箱在仿真环境里验证一遍——构造一个已知误差的虚拟机械臂,用同样的流程辨识,如果辨识结果能还原出预设误差,说明模型和代码没问题,再拿去处理真实测量数据。这一步能避免无数个夜里排查代码的噩梦。

求解方程用最小二乘法。最小二乘的本质是最小化残差的平方和,但直接用正规方程求解时,如果J的条件数太大,数值误差会被放大。我会先对J做一次列归一化,检查条件数是否异常,然后根据情况选择QR分解或者SVD分解。SVD的稳定性和可解释性最好,代价是计算量稍大,但标定这类离线任务完全不在乎这点耗时,所以SVD是我默认的选择。

辨识完参数,还要做一次数据回代。用辨识出的新参数重新计算理论位姿,和测量值对比,看看残差分布是否集中在合理的噪声范围内。如果残差分布仍然存在明显的系统性结构,说明模型还没建全,可能遗漏了重力变形或者关节间隙误差。这里给一个参考值:我对一台中等负载六轴机械臂标定的典型结果是,末端位置平均误差从标定前的1.8毫米降到0.4毫米左右,残差分布近似于高斯噪声。

4. 实操过程与核心算法实现

4.1 仿真数据验证,在接入真实机械臂之前先确认流程无误

直接拿真实机械臂开干,一旦结果不对,很难定位是采集问题、模型问题还是代码问题。我建议所有第一次做标定的人,先在软件里跑一遍仿真。

具体方法:在仿真软件中构造一个"真实机械臂",给它设定一组偏离标称值的DH参数误差,然后用它的正运动学生成末端位姿数据,人为注入微小的高斯噪声来模拟测量误差。接下来,把仿真数据当作测量数据送入标定流程,跑完整的辨识算法。如果辨识出来的参数误差和预设值基本一致,说明你的建模、代码、求解逻辑都是通的;如果差异很大,那问题一定出在流程内部,而不是现场数据。

这个验证步骤还能顺便检验你采集的样本是否足够好。用同一组仿真参数生成两组不同的样本集,一组是均匀覆盖工作空间的好样本,另一组集中在某个小区域,跑一遍对比,你会直观看到样本质量对辨识效果的影响有多显著。这个经验值在真实标定中极有参考价值。

4.2 用Python实现参数辨识的最小二乘与SVD求解

大多数中小团队不会在控制器上直接改算法,而是离线算好参数,再写入相机参数文件或者控制器配置。下面给出一个足够简洁的辨识算法代码框架,覆盖从误差方程构造到SVD求解的全过程。下面代码内容为示意性技术方案,请根据实际设备与控制器支持的参数格式适配。

import numpy as np # 假设mdh_params为所有样本的理论运动学参数列表 # observed_positions: 测量得到的末端位置 (N, 3) # nominal_theoretical_positions: 当前模型计算出的末端位置 (N, 3) def build_observation_matrix(mdh_params, joint_angles_list): # 根据MDH模型推导各参数对末端位置的雅可比 # 返回 N*3 行 x K 列的观察矩阵 pass def compute_theoretical_positions(mdh_params, joint_angles_list): # 正向运动学计算末端理论位置 pass # 主流程 N = len(joint_angles_list) J = build_observation_matrix(mdh_params, joint_angles_list) e = observed_positions.reshape(-1, 1) - compute_theoretical_positions( mdh_params, joint_angles_list ).reshape(-1, 1) # SVD求解最小二乘: J * delta_q = e U, s, Vt = np.linalg.svd(J, full_matrices=False) s_inv = np.array([1.0 / x if x > 1e-8 else 0.0 for x in s]) delta_q = Vt.T @ np.diag(s_inv) @ U.T @ e # 更新参数 updated_params = mdh_params + delta_q.flatten()

这段代码里,最需要用心写的是build_observation_matrix函数——它代表你对机械臂运动学模型的理解。每一个偏导项都可能因为坐标系顺序或者中间变量代换出错。仿真验证在这一步会救你一命。

SVD分解中,我把奇异值小于1e-8的直接置零,这本质上是把那些无法通过当前观测辨识出来的参数模式给剔除掉。如果某个参数的奇异值特别小,说明现有数据里它的变化对末端位置基本没有影响,强行辨识出来的数值没有意义,还有可能干扰其他参数。

4.3 真实机械臂标定现场的操作流程

仿真验证跑通了,就可以上真实设备了。我把现场操作流程整理成一份可以直接照做的清单:

  1. 机械臂上电,设置到合适的标定速度(一般不需要高速运动,50%以下即可),确保各轴在无碰撞的安全范围内活动。
  2. 安装末端靶标或反射球,记录靶标与法兰盘之间的固定偏移,最好是设计与测量结合得到。
  3. 在机械臂基座附近建立测量坐标系,多测几个基准点做坐标变换拟合。
  4. 规划采集路径,确保覆盖工作空间,并保持末端姿态多样化。在路径上取80~120个停靠点,每个停靠点停留2~3秒,记录关节角度和测量设备读数。
  5. 每采集10组数据后检查一次实时残差,如果某个点残差突然变大,可能是靶球位置有滑动,及时剔除。
  6. 采完数据后,先在现场做一遍坐标变换和预处理,再带回电脑跑辨识算法。
  7. 辨识完成后,把参数写入控制器,然后重新规划一组用于验证的新路径(不要用参与标定的点),对比实测位置和理论位置。

这条流程有一半时间耗在等待和数据检查上,急躁的人容易跳过第5步,结果后面返工更难受。标定是个慢工出细活的事情,尤其在现场多线程环境里,保持流程执行的严格性比追求速度重要得多。

5. 常见问题与排查技巧实录

5.1 辨识结果发散,或者参数收敛到奇怪数值

辨识结果发散,九成情况是下列原因之一:

  • 观察矩阵条件数过大。说明样本的位姿多样性不够,或者数据之间存在冗余。解决办法是增加末端姿态变化,或者让样本覆盖更大的工作空间范围。
  • 参数耦合导致病态辨识。MDH模型里如果两个参数的偏导在数值上非常接近,最小二乘就无法区分它们的贡献。这种场景下,可以冻结那些辨识可靠性低的参数——它们对末端位置的影响可以由其他参数弥补。
  • 数据里面有粗大误差。单个异常点就可能把最小二乘的解拉飞。回想一下第3章的数据预处理,先做三倍标准差筛查。

我遇到过最迷惑的一种情况是:辨识出来的参数本身数值很大,比如某个beta角从0.0001直接跳到0.5弧度,但是末端残差反而变小了。这个结果在数学上成立,在物理上几乎不可能。这是因为参数在数学上互为补偿,导致模型获得了"数值上等价却物理上荒谬"的解。面对这种结果,就要考虑引入参数范围约束,比如对所有标定后的参数做一个残差回归检查。

5.2 标定后精度不升反降,问题出在哪

标定不是万能的,尤其是当测量设备的精度不如机械臂自身重复精度时,加入外部测量数据反而会让模型变得更差。这就是典型的"垃圾进垃圾出"效应。

精度不升反降的另一个常见原因,是标定模型没有覆盖所有的主要误差源。比如你的机械臂在某个大负载姿态下有明显变形,而你的模型只考虑了运动学几何误差,那在这种情况下标定出来的参数就会试图"用几何误差去解释变形误差",结果自然不对。处理办法是先做一次误差残差分析:如果残差分布在负载变化后表现出明显相关性,就考虑增加关节变形误差模型。

还有一类情况:测量好了、辨识好了、参数也写进去了,但是控制器里存在不同的坐标系定义习惯,导致参数应用时映射错误。曾经有位同事在一个协作臂项目上标定出非常好的结果,但每次应用参数后机械臂位置就像抽了风一样乱跳,查了整整两天,最后发现是控制器的名义参数没有同步更新,标定的内部缓存和目标值不一致。这类问题排查起来很耗精力,我强烈建议在写入参数后,先做一组简单运动验证,再跑完整的验证路径。

5.3 量化标定效果时的指标怎么定

标定完成后,如果只是"感觉精度变好了",那交付验收非常费劲。我通常用一个系列化的方式来衡量标定效果:

  1. 平均绝对误差:所有验证点实测位置与理论位置之差的平均值,直观反映整体精度水平。
  2. 最大误差:最差的那一个点误差多大,这个值可以反映实际产线中最坏情况下是否仍然在允许范围内。
  3. 残差标准差:所有验证点残差的散布程度,这个指标可以判断误差里面还存在多少不确定性,标准差越小说明标定得越彻底。

举一个具体的验收例子。某装配场景要求末端绝对定位误差小于0.8毫米。标定前,平均误差1.6毫米,最大误差2.9毫米。标定并验证后,平均误差0.25毫米,最大误差0.62毫米,残差标准差从0.9毫米降到0.12毫米。这三个指标组合在一起,才能让验收方对结果有完整信心。

另外,标定后过一段时间会存在"退化"现象:机械臂换了工具、受到碰撞或者长时间高负载运转后,标定参数会渐渐失真。经验上,使用环境越恶劣的机器人,标定周期越短。我建议产线上的关键机械臂至少每六个月复标一次,如果有碰撞事故,则第一时间复标。在标定站里保留上次标定的数据文件,做快照对比,能及时定位偏差来源。

6. 几条最容易被忽略的经验

最后分享几条我踩过很多次坑之后才总结出来的经验,非常适合对照检查自己的标定工程。

第一,一定要在正式标定前做一次零点校准。机械臂的关节零点如果偏差超过0.5度,后面的DH参数辨识结果再准,也会因为零点误差存在而无法达到预期精度。我的习惯是先让机械臂回到机械零位,用水平仪或专用校准工具确认每个关节的零位偏移,全部归零之后才开始采集标定数据。零点校准的优先级高于标定本身,千万别省这一步。

第二,测量坐标系和机器人基坐标系的转换并不只是"多测几个点"那么随意。我见过有人图省事,直接用测量设备给出的默认坐标系做全局优化,结果换算出来的末端位置带进一个固定的旋转偏移。这种误差不会在标定过程中体现,但它会潜伏在每一次离线编程里。建立一个独立的校验点,在基座附近选一个固定基准,每次标定前后测一次它的坐标变化,能让坐标系转换的稳定性得到持续监控。

第三,多留一个心眼看待工具法兰偏移。末端靶标与法兰盘的相对位姿如果在标定中发生变化,比如靶球座松动或者换了一个型号,那么标定结果会整体偏移。我在装完靶标后一定会用激光跟踪仪测一次靶球中心在法兰坐标系里的坐标,宁可多花十来分钟,也不要带着一个不准确的工具偏移做完整个标定流程。

第四,不要迷信"数据越多越好"。数据量过多,也会引入各种干扰因素,比如机械臂在极端位姿下的非线性变形,并不符合误差模型的线性假设。最理想的方式是,先用一组小数据集摸清误差的量级,排除明显异常点,再逐步扩大数据覆盖范围。数据量够用的标志是:继续增加样本,辨识出的参数不再发生显著变化,这时就说明你的数据已经充分约束了模型,再采也是浪费工时。

这里再说一个实用小技巧:标定完别急着离开现场,多花五分钟手动操作机械臂走到工作空间几个特角上,看看实际位置和示教器上读数的方向性偏差是否依然在合理范围内。偶尔会有一种情况,标定后平均误差很低,但某个特定区域的误差明显偏大,这说明那一带的误差源没被完全建模,需要补采局部数据或者引入额外的局部变形模型。如果手边没有测量设备,用游标卡尺配合标准工件也能做出定性判断。

标定这件事,听起来像是一个纯理论课题,做起来却更像一场"耐心手艺活"。它考验的不是脑子有多聪明,而是流程有多严格、对细节有多敏感。我自己做过的最好的几个标定项目,没有任何一个靠的是多么高深的新算法,全部是扎实的模型、稳妥的采集、干净的预处理,再加上认真地做验证,仅此而已。如果你正打算给自己手上的机械臂做一次标定,按着这篇文章的流程走一遍,先把仿真验证跑通,再碰真实设备,你大概率能比我当时少走很多弯路。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进