ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

机械臂DH参数标定实战:线性最小二乘法的完整指南

机械臂DH参数标定实战:线性最小二乘法的完整指南 机械臂标定这件事很多搞机器人的朋友一开始都容易忽略。我最早接触的时候也天真地以为机械臂出厂参数就是准的末端位置算出来多少就是多少。直到有一次在现场调试激光跟踪仪测出来的实际位置和理论值差了接近一个手指头的距离才意识到DH参数标定这件事有多重要。后来查资料、啃论文、自己动手撸代码用线性方程最小二乘解法把机械臂的DH参数标定了一遍才真正搞懂这里面的门道。这篇就把我整个的思路、推导过程和实操经验完整分享出来。1. 机械臂的绝对精度焦虑标定要解决什么问题1.1 重复精度与绝对精度的残酷差距如果你想了解一台机械臂的性能拿到规格书第一眼看到的一定是两个精度的指标重复定位精度和绝对定位精度。很多中低端机械臂的重复定位精度可以做到±0.02mm看着非常漂亮但绝对的定位精度可能只有±2mm甚至更差。这意味着每次让它去同一个位置它都能精确地回到那个位置但这个位置和程序里写的理论位置差距可能达到毫米级。这个差异在传统工业场景里可能问题不大因为很多应用是示教-再现模式的——你手动拖着它走一遍让它记住关节角然后它就沿着这条路反复走。这种情况下机械臂的绝对精度确实无所谓反正它是跟着记忆里的关节角度走每次都能回到同一位置就行。但一旦你让它和视觉系统配合或者需要离线编程问题就来了视觉系统告诉机械臂目标在某个坐标机械臂在程序里按照DH正解计算出需要转到的关节角结果探针一伸过去差了2mm那就根本没法用。1.2 哪些场景逼着你非标定不可从我接触过的实际案例来看有几个场景对绝对精度的要求高到回避不了标定问题一个是视觉引导抓取。相机标定好了目标物坐标也转换到了机器人基坐标系下但机械臂的关节角解算依赖DH参数。名义参数如果和实际装配有偏差视觉转换得再准也没用最终执行端就是偏的。另一个是离线编程仿真。在CAD软件、机器人仿真环境里铺好工作站直接生成运动程序下发到现场机械臂。仿真和实际工作站的一致性完全取决于机械臂模型参数的准确度DH参数不准整个仿真就是空中楼阁。还有一种是多机器人协同。两台机械臂要配合完成一个任务比如一台抓工件、一台焊接到某个位置如果各自的绝对精度都有偏差那俩误差叠加起来更是灾难。1.3 标定的本质把名义参数修正为实际参数所以标定的核心目标就是通过测量机械臂在不同姿态下的末端实际位置或姿态反算出和实际装配情况一致的DH参数替换掉厂家给的名义参数。这个反算的过程就是参数辨识而线性最小二乘法正是解决这类问题的经典手段。很多朋友一听到标定就觉得很复杂什么遗传算法啊、粒子群啊、神经网络啊全都冒出来了。其实对于DH参数标定这个问题由于误差模型是线性的至少在微小误差假设下是线性的线性最小二乘已经是很可靠的解法。不需要上那些花里胡哨的智能算法。这事儿的核心在于三点建模要建对数据要采好求解要选对方法。2. DH参数建模与误差来源拆解2.1 标准DH与修正DH选对模型比算得快更重要DH参数有标准的Denavit-Hartenberg模型和修正后的Modified DH模型也叫Craig DH。这俩模型各有各的适用场景。标准DH的变换顺序是绕Z轴旋转、沿Z轴平移、沿X轴平移、绕X轴旋转每个坐标系建立在当前关节的轴线上。修正DH的变换顺序则调整为绕X轴旋转、沿X轴平移、绕Z轴旋转、沿Z轴平移坐标系建立在下一个关节的轴线上的。两种模型对于串联机械臂都能用但是有个坑如果你的机械臂存在相邻关节轴线平行的情况哪怕理论上平行实际上也近似平行标准DH模型会在求解时出问题因为平行的轴线之间会发生失真的微小偏移数值稳定性很差。修正DH模型对这点做了改良相邻关节轴线平行时边界问题不那么敏感。我自己的建议是如果机械臂存在相邻关节轴线近乎平行的情况直接上修正DH模型如果是六轴垂直串联结构相邻关节大部分是垂直的标准DH一般也OK。但你在做参数辨识前一定要想清楚自己用的是哪种模型因为下文的误差模型推导会直接依赖这个选择。2.2 四个参数的物理含义与误差来源不管哪种DH模型核心都是四个参数关节角 θ绕当前关节转轴的角度对于旋转关节来说这是变量。连杆偏距 d沿当前关节轴线方向从上一个坐标系原点移到当前坐标系原点的距离。连杆长度 a沿公共法线方向的距离决定了两根关节轴之间的实际长度。连杆扭转角 α绕公共法线旋转两关节轴线之间的夹角。这四个参数的实际误差来源不完全一样。θ的误差分为两部分一部分是名义装配角和实际角度的偏差另一部分是编码器零点位置的偏移。d主要来自加工公差和装配累积误差a也来自加工误差α来自装配时轴线角度的偏差。我见过很多人在标定中只标定θ相关的参数觉得其他参数误差小不用管。实际经验是d、a、α的误差虽然绝对值小但它们对末端位置的影响是随姿态放大或缩小的在特定姿态下完全可以主导末端误差。要标就全标不要偷懒。2.3 还有一类参数经常被忽视工具坐标系参数这里提醒一个容易被忽略的点机械臂DH标定得到的模型是到机械臂末端法兰盘坐标系的但实际执行任务时你用的是装在法兰盘上的工具也就是Tool Center PointTCP。TCP的参数工具长度、角度偏移不准确给机械臂标完了DH参数也没用。所以严格意义上完整的标定应该同时把工具坐标系的参数也辨识出来这时候你可以把工具坐标系的偏移量加进整个误差模型作为待求参数。后面讲误差建模的时候我会提怎么扩展。3. 把标定问题翻译成线性最小二乘误差模型的推导与构造3.1 从运动学正解到误差模型的桥梁机械臂末端位置是DH参数的函数可以写成P f(θ1 θ2, ..., θn d1 ..., an α1, ...)名义参数代入后得到名义位置 P_nominal实际参数代入后得到实际位置 P_real。我们通过测量得到的是 P_real由激光跟踪仪或其它测量设备给出名义位置是程序算出来的。我们现在想知道的是参数误差 δx 和末端位置误差 δP 之间的关系。这个关系可以通过对运动学方程做一阶泰勒展开得到δP J δx其中 J 就是误差雅可比矩阵也叫辨识雅可比矩阵δx 就是所有DH参数误差组成的向量δP 是末端位置误差向量。这个式子看着简单但它的成立是有一个隐含假设的参数误差是小量所以高阶项可以被忽略。这也是线性最小二乘法的理论边界。实际工程中DH参数误差一般在毫米或零点几毫米级别一阶近似是足够用的。3.2 末端位置误差作为测量量的优势你可能会有个疑问既然末端有位置误差也有姿态误差为什么很多标定算法都只用位置误差一方面是因为姿态测量的难度和成本远高于位置测量。用激光跟踪仪测位置精度很高但要测姿态就需要球座或者特制靶标多次取点反算或者用更高级的6D激光跟踪仪价格翻好几倍。姿态测量误差引入标定系统反而可能拉低整体精度。另一方面是因为位置误差本身已经包含了全部DH参数误差的贡献。姿态误差主要影响末端朝向而位置误差不仅包含平移参数d、a的误差还包含旋转参数θ、α误差通过臂长杠杆放大后的位置偏差。所以测位置足够反算全部参数。这里有个工程技巧测量的末端点应该尽量离工具坐标系原点远一点也就是在有工具的情况下直接测TCP点在空间的坐标这样旋转参数的误差会被杠杆放大在测量数据中体现得更明显参数辨识更容易收敛。反之如果你测的是法兰盘中心离最后一个关节轴线太近末端的角误差很难反映成位置误差标定效果会变差。3.3 雅可比矩阵的具体求法解析法还是数值法误差雅可比矩阵的求法一般有两种解析法和数值法。解析法就是直接对运动学正解函数的各个DH参数求偏导。好处是计算快、精度高坏处是需要手动推导公式不同型号的机械臂由于DH参数表不一样推导结果也会不一样而且很容易算错。数值法用有限差分来近似偏导数∂P/∂δx_i ≈ (P(x εe_i) - P(x)) / ε也就是给某个参数加上一个微小扰动 ε重新算一遍正解和原来的正解之差除以 ε 就是偏导数的近似值。我自己实际做的时候更喜欢数值法。原因很简单省事不容易错。只要正解函数写对了数值雅可比基本不会出错。ε的选取也很有讲究太大则近似误差明显太小则浮点误差主导一般取1e-6到1e-8左右比较合适。3.4 线性方程的组装多组测量的联合方程组一组测量数据只能建立一个3行的方程位置误差的x、y、z分量而DH参数误差向量的维度通常是4×n一个六轴机械臂就有24个待求参数。所以需要多组测量数据联合求解。假设采集了m组数据每一组数据对应一个特定的机械臂姿态一组关节角度那么误差方程为[e_1] [J_1][e_2] [J_2] δx[...] [...][e_m] [J_m]e_i是第i组数据的末端位置误差向量实测位置减名义位置J_i是该姿态下的误差雅可比矩阵。整个矩阵的行数是3m列数是4n如果要连工具坐标系参数一起标列数再3。这个方程组中方程数远多于未知数一般采集20到50组数据的情况下方程数在60到150之间这是典型的超定方程组没有精确解最小二乘解就是最佳的近似解。4. 从方程到数值解正规方程、QR分解与SVD的工程取舍4.1 正规方程法最直观但可能让你吃大亏线性最小二乘的教科书解法是正规方程(J^T J) δx J^T e直接解这个线性方程组就得到了参数误差的最小二乘估计δx (J^T J)^(-1) J^T e这个方法原理简单代码写起来就两三行Python里用numpy的np.linalg.solve就能解。但是这里有个非常隐蔽的坑J^T J 的条件数是原矩阵J的条件数的平方。如果J本身条件数就比较差比如测量姿态不够丰富J^T J 就会变成一个病态矩阵求逆的结果对测量误差非常敏感差之毫厘谬以千里。我建议把正规方程当成先跑通流程的入门方案实际工程标定中尽量不要用它当最终方案。4.2 QR分解工程界的默认选择更稳的做法是用QR分解来求解最小二乘问题。原理是把Jacobi矩阵J分解为一个正交矩阵Q和一个上三角矩阵R的乘积然后通过回代求解。在Python里一行代码的事import numpy as np Q R np.linalg.qr(J) delta_x np.linalg.solve(R Q.T e)或者更简洁delta_x residuals rank s np.linalg.lstsq(J e rcondNone)np.linalg.lstsq内部默认使用的就是基于QR分解的算法数值稳定性比正规方程好很多。这也是我实际项目里最常用的求解方式。4.3 SVD当矩阵病态严重时的最后防线如果测量数据本身质量一般J的条件数还是不理想这时候就该上SVD了。SVD把J分解为 UΣV^T最小二乘解变为δx V Σ^(-1) U^T eSVD最强大的地方在于你可以直接看奇异值Σ的对角元素如果某些奇异值非常小就说明对应的参数方向在数据里几乎没有被激发这时候你可以直接把小奇异值对应的项砍掉或者设置一个阈值把奇异值倒数中过大的项清零得到一个稳定的解。这就是所谓的截断SVD。但是要提醒一下截断SVD在数学上很漂亮实际应用时你得有判断力。如果你确实发现某些奇异值接近零首先要反思的不是怎么截断而是你的测量数据是不是有问题——大概率是你的数据采集姿态不够多样导致某些参数在数据里没有被激活。4.4 参数的归一化一个容易被忽略的预处理步骤DH参数的几个参数单位不同θ和α是角度d和a是长度数值大小完全不在一个量级。角度参数就算是0.01弧度的误差经过臂长放大后对末端的影响可能有几十毫米而长度参数0.01mm的误差影响就是0.01mm。如果不做处理直接把所有参数误差放在一个向量里求解数值上长度参数和角度参数的权重就等于被自动分配了可能导致角度参数辨识精度不足。工程上应对的办法是对列向量做归一化每个参数或者说每个参数对应的雅可比矩阵的列先除以一个典型尺度让所有参数的量级变得可比。不过这个操作在纯线性最小二乘的框架下并不是必须的因为最小二乘本身已经考虑了各个方向的灵敏度差异归一化更多是改善数值稳定性。如果你用正规方程法强烈建议做归一化用SVD的话归一化影响不大。5. 测量方案设计与数据采集的实战细节标定成败的关键5.1 测量设备怎么选激光跟踪仪还是摄影测量测量方案的硬件主要包括两种大方向激光跟踪仪和光学摄影测量系统。激光跟踪仪精度高单点测量精度通常在±0.02mm级别动态跟踪能力也强能够连续记录运动轨迹。缺点是设备贵动辄几十上百万不是所有团队都买得起很多时候要靠外协或者实验室合作。摄影测量系统比如双目视觉测量系统、结构光扫描仪等成本相对友好一些精度也能到±0.05mm到0.1mm级别对大多数协作机械臂、桌面机械臂的标定需求来说完全够用。缺点是容易被环境光线干扰需要布置标记点操作上反而更繁琐。如果你的预算实在有限还有一个更接地气的方案用高精度位移传感器或千分表配合固定靶标来测点精度也不差就是一组一组数据慢慢采集效率低但胜在便宜。我在实验室阶段就这么干过效率虽然感人但对理解标定的整个流程还是有帮助的。5.2 数据采集里最常见的三个错误我见过很多第一次做标定的人数据采了一大堆最后解出来的参数看着就不对劲。问题往往出在以下几个地方。第一个错误是测量范围太集中。有人为了省事让机械臂只用几个小范围的姿态测量的末端点全都集中在工作空间的一小块区域内。这样的数据携带的信息量太少很多参数误差在这种关节组合下对末端位置的影响是相似的导致方程组退化。正确做法是让机械臂的各个关节尽量大范围地运动末端点尽量铺满整个可达工作空间。第二个错误是忽视了目标点在相机坐标系和机器人坐标系之间的转换。你的测量设备给出的坐标是它自己坐标系下的坐标机械臂的名义位置是机器人基坐标系下的坐标。两组坐标如果不统一到同一个坐标系下解出来的参数全错了。这一步的转换误差会直接影响标定精度通常需要在标定前用多点拟合的方法求两个坐标系的变换矩阵。第三个错误是测点的时候机械臂停得不够稳。很多人用激光跟踪仪的时候机械臂刚动到位就立刻读数其实这时候关节还在微小蠕动。别小看这几毫米的微动直接污染数据。正确做法是让机械臂到达目标姿态后停留1到2秒等它完全稳定下来再记录数据。5.3 多少组数据才够经验法则从数学上讲数据组数至少要满足 3m 4n即方程数大于未知数个数。对一个六轴机械臂24个DH参数理论上9组数据就够解出最小二乘解了。但是实际工程里这个数量远不够因为测量噪声、坐标系转换误差都会影响解的稳定性。我的建议是至少采集40到80组数据如果条件允许100组以上更好。多出来的数据量会让最小二乘解对单点测量误差的敏感性大大降低。当然数据越多成本越高现场要预留足够的时间。5.4 姿态多样性策略让每个参数都被激活前面多次提到参数被激活这个概念这里详细解释一下。测量过程中机械臂的关节配置千变万化不同姿态下末端位置对同一个DH参数误差的敏感度是不同的。比如某个DH参数只影响末端在特定方向上的位置误差如果你所有的测量姿态都让这个方向的分量处于死角那么这组数据对这个参数几乎没有约束力雅可比矩阵对应的列就接近于零向量整个方程组就病态了。所以设计采集方案时要让机械臂在关节空间里尽可能多样地采样。一个具体可操作的方法是每个关节至少在其运动范围的低、中、高三个区间分别取点然后随机组合这些关节角让末端位置在工作空间内均匀分布。另外专门加一些极姿态比如大臂抬到最高、前臂几乎收拢的极端位形这类姿态对某些参数非常敏感数据含金量很高。6. 标定结果验证与真实工程坑别以为解出参数就大功告成6.1 训练集与验证集标定界也怕过拟合算出了DH参数误差并修正参数表之后很多人的第一反应是拿这些数据回代看末端误差是不是变得很小。这时候要小心——最小二乘解在训练数据上肯定会让误差减小但数据里包含的测量噪声也可能被拟合进去了导致所谓的过拟合。正确做法是把采集的数据分成两组一组用于参数辨识训练集另一组完全不参与辨识过程专用于验证验证集。标定完成后用修正后的DH参数计算整个验证集的末端位置误差如果误差显著变小了说明标定确实有效如果训练集误差很小但验证集误差还是很大那说明你的测量数据有问题或者模型本身有问题。这个道理很多做控制、做机器学习的朋友应该很熟悉但做机器人的往往容易忽略因为大家都急着看标定效果忽略了验证这一步。6.2 参数耦合与可观测性为什么你可能解不出来DH参数之间并不是完全独立的某些参数组合对末端位置的影响可能完全相同。这在数学上的体现就是雅可比矩阵的列之间存在近似线性相关性矩阵接近奇异。一个经典的例子是第一个关节基座关节的θ误差和d误差在特定情况下会产生相似的末端位置偏差。如果基座本身没有完全调平机械臂底座倾斜一个微小角度这个倾斜的效果会和某些DH参数误差的效果混在一起无法被单独区分出来。遇到这种情况不要硬解。要么增加更多更丰富的测量姿态让本来几乎独立的参数在某个特殊姿态下能被分开要么减少待辨识参数的数量比如把那些可观测性很差、影响很小的参数直接固定为名义值不参与辨识只标定那些对末端精度影响最大的参数。这里有实际经验可以参考六自由度机械臂最常见的可辨识参数数量通常少于24个。20个左右的独立参数是比较合理的预期。如果你发现解出来的参数误差值大到不真实八成就是某些参数不可观测的问题。6.3 标定完千万别忘了更新控制器参数辨识完成之后最后一步是把修正后的DH参数表更新到机械臂的控制器里。这事儿听着简单实际有坑。不同品牌机械臂的控制系统对DH参数的配置方式差异很大。有些是直接在控制柜里通过示教器界面修改几何参数有些需要专用软件上传参数文件还有一些需要在控制器里通过控制指令写入。如果参数没写进去或者写错了单位有的系统角度用度有的用弧度那你的标定成果就全部作废了。另外要注意的是如果你标定的模型和控制器内部使用的模型不一致比如你用修正DH标定的控制器用的是标准DH参数根本不能直接替换还得做一个模型之间的转换。这点在动手前就要调查清楚宁可在建模前多花时间搞明白控制器的DH约定也不要标定完才发现对不上。6.4 迭代标定的必要性最后分享一个很重要的工程经验单次最小二乘标定往往不足以将精度推到极限。原因在于最小二乘解是在当前参数点附近做一阶线性近似后求得的如果初始误差比较大比如装配误差超过几毫米一阶近似本身的误差也不可忽略一次性求解可能得不到最优结果。这时候应该做迭代标定用当前参数计算名义位置测量实际位置求误差构造最小二乘方程解出参数误差更新DH参数用新参数重新计算名义位置再看残差如果残差明显变小且参数误差也在合理范围就继续迭代如果残差没有明显变化说明收敛了停止迭代。实际项目中一般迭代2到3次就能稳定。第一次迭代能把大头误差消掉第二次主要是精细调整第三次基本就是收敛了。判断收敛的指标可以看所有数据的位置误差RMS值连续两次迭代之间RMS变化小于5%就算OK。7. 一套可复用的最小二乘标定流程清单最后把整套流程串成清单方便直接抄作业。确定机械臂的DH模型类型标准DH还是修正DH获取名义DH参数表。构建正运动学函数输入关节角输出末端名义位置。选择测量设备完成测量坐标系和机器人基坐标系的转换标定。规划测量姿态覆盖工作空间每个关节高中低三段采样加入极端姿态总组数不少于50组。逐点触发机械臂移动并记录到点位后等待1到2秒测量末端实际位置。离线数据处理对每组数据计算名义位置与实际位置的误差。构造误差雅可比矩阵推荐数值法求偏导扰动取1e-7。组装超定方程组用SVD或QR求解最小二乘解。更新DH参数计算训练集和验证集的残差判断是否需要迭代。迭代2到3次到收敛后把最终参数写入控制器。随机挑5到10个新的姿态点做最终验证确认精度达标。这一套流程做完机械臂的绝对定位精度通常能从2mm左右提升到0.3mm以内具体效果取决于机械臂本身的机械结构刚性、测量设备精度、数据质量等因素。如果机械臂本体刚度不够或者减速器回差大标定能改善的程度就有限这是物理上限。我对这套方法的评价是对于一个有基本线性代数基础、能写点Python的人来说从理解到落地大概一到两周时间足够了。比起几万块钱的商用标定服务自己动手不仅省钱更重要的是对整个系统的理解会深一个层次。以后遇到机械臂精度问题你能从模型和数据两个维度去看而不是只会调参数或者干瞪眼。
返回列表