ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

旋转标定与旋转纠偏:旋转中心、手眼标定与多传感器解耦标定

旋转标定与旋转纠偏:旋转中心、手眼标定与多传感器解耦标定 标定这件事很多人第一次接触都是在设备调试现场机器人抓不准、贴装偏了几丝、视觉定位莫名其妙差半个毫米。而一旦场景里出现转台、旋转轴、工件随机摆放角度问题就会立刻升级成旋转标定和旋转纠偏——前者解决转轴和旋转中心到底在哪、转了多少度后者解决工件歪了怎么把轨迹和动作跟着掰回来。这两个词听起来像孪生兄弟实际分工完全不同旋转标定是前置的、一次性的、追求绝对精度的建模工作旋转纠偏是运行时的、每个节拍都要跑的补偿动作。把它们混在一起谈现场最常见的后果就是标定做得特别认真纠偏照样偏。这篇东西我打算按实际干活的顺序来写先分清几种标定语境再把旋转中心的求解过程一步步摊开然后接到旋转纠偏的数学模型和补偿链路最后把相机、激光雷达、IMU 的外参标定以及多轴传感器里那个w c·v w0的解耦标定一起讲清楚。适合刚接手视觉机器人项目的工程师也适合已经在做但总觉得精度上不去、重复性飘的老手对照排查。里面有公式但都不难我会把每一步为什么这么算讲明白。1. 先把标定这两个字拆开三种语境别混着说1.1 几何标定、参数标定、零点标定的界限行业里标定这个词被用得太随意了至少混着三种完全不同的意思。第一种是几何标定也叫空间标定。它的目标是建立两个坐标系之间的映射关系像素坐标到机器人坐标、相机坐标到激光雷达坐标、末端法兰坐标到工具坐标。九点标定、手眼标定、张正友标定法、旋转标定全都属于这一类。它的输出是一组矩阵或变换参数验收指标通常是重投影误差、定位残差、重复定位极差单位是像素或毫米。第二种是参数标定典型代表是汽车电子里的 ECU 标定。用 CANape 这类工具基于 A2L 描述文件通过 XCP 或 CCP 协议在线读写标定量把喷油脉宽、点火提前角、扭矩滤波系数这些特性参数调到最优。这类标定的输出不是坐标变换而是一堆查表数据验收指标是排放、油耗、动力响应曲线。它和几何标定除了名字像方法论几乎没有交集。第三种是零点标定。安川这类机器人在绝对编码器电池没电、或者拆过电机之后机械零点和编码器计数就对不上了必须重新做原点标定有些厂家叫零点复归。做法通常是用专用治具或者标定杆把某个关节顶到机械限位再写入原点数据。这类标定解决的是计数从哪儿开始算不涉及任何矩阵运算。之所以要先把这三类分开是因为现场经常出现这样的对话设备精度不行有人提议重新标定一下结果一群人围着相机拍棋盘格问题其实出在机器人换过电池、零点漂了 0.05 度上。搞清楚你面对的是哪一类能省掉一大半无效劳动。1.2 旋转标定和旋转纠偏的分工回到今天的主题。旋转标定的核心任务只有两件找到旋转中心或者在三维里找旋转轴以及确定旋转量与传感器读数之间的对应关系。举个最常见的例子一台贴装设备工件放在转台上转台由伺服驱动视觉相机从上方拍照。你要做的是——先标定出转台中心在相机坐标系里的位置再标定出伺服编码器读数变化 1 个单位实际工件转动了多少度这个比例关系。有了这两个量视觉算出工件偏了 3.2 度系统才知道该让伺服走多少、绕哪个点转。旋转纠偏是这套标定的下游消费者。它的输入是视觉给出的角度偏差和偏移量输出是修正后的轨迹点或机械臂目标位姿。纠偏的数学内核只有一句话把预设轨迹上的每一个点绕旋转中心转一个角度偏差再加上平移补偿。两者分工很清楚——标定错一点纠偏就是错的纠偏做得好也救不回来标定的偏差。我见过好几个项目纠偏算法写了三百行又是插值又是滤波最后发现是旋转中心标定错了 1.2 毫米白折腾。注意旋转标定的精度要求通常比平移标定高一个数量级。平移偏 0.1 毫米轨迹整体平移 0.1 毫米旋转中心偏 0.1 毫米、工件偏 30 度最终误差会被放大到接近 0.05 毫米以上而且是随角度变化的很难用固定补偿修正。2. 旋转标定旋转中心到底怎么找才靠谱2.1 为什么不能信图纸上的旋转中心新手最容易犯的错是直接拿机械设计图上的旋转中心坐标用。我这么说不是否定设计而是图纸上的中心点通常有三个坑。第一个坑是装配公差。转台的轴承、法兰、工装板叠起来少说四五层配合每层的同轴度误差累积下来实际中心和图纸中心差 0.05 到 0.3 毫米很常见精密转台好一些但也难得进 0.02 毫米。第二个坑是工装夹持本身的偏移。图纸标的是转台中心可工件是被夹爪夹住的工件上的特征点相对转台中心的位置每次换工装都会变。旋转标定真正需要的是工件特征点绕哪个点在转这个点会随工装变化。第三个坑是相机坐标系和机械坐标系的差异。图纸坐标是机械系的视觉算出来的偏差是像素系的中间隔着一整套手眼映射。你可以把机械系的中心映射到像素系但映射本身有误差误差又被旋转放大。所以我的做法是旋转中心一律实测图纸值只当初始参考、用于检查量级是否合理。实测出来的值和图纸差 0.5 毫米以上先别急着信实测去查机械装配有没有问题差 0.1 毫米以内直接用实测值。2.2 三点法与最小二乘圆拟合手算一遍实测旋转中心的方法本质是在同一坐标系下记录特征点在不同旋转角度的位置然后拟合圆圆心就是旋转中心。原理朴素但细节不少。先说三点法适合快速验证。让转台分别停在 θ1、θ2、θ3 三个角度角度间隔建议 60 度以上太近了三点接近共线解不稳用相机测出特征点的平面坐标 P1、P2、P3。圆心是三条边的垂直平分线的交点可以直接写成行列式形式x0 [(y3-y2)(x1²y1²) (y1-y3)(x2²y2²) (y2-y1)(x3²y3²)] / {2[(y3-y2)(x1-x2) (y1-y3)(x2-x3) (y2-y1)(x3-x1)]} y0 [(x3-x2)(x1²y1²) (x1-x3)(x2²y2²) (x2-x1)(x3²y3²)] / {2[(y3-y2)(x1-x2) (y1-y3)(x2-x3) (y2-y1)(x3-x1)]}分母趋近于零就说明三点共线这是三点法唯一的失效条件。这个公式拿来现场心算验证特别方便我经常在笔记本上花两分钟算一遍和软件结果对一下两个数差得远就说明数据有问题。再说最小二乘拟合这是正经生产用的方法。采 8 到 12 个角度每个角度测特征点坐标 (xi, yi)。圆方程展开xi² yi² 2a·xi 2b·yi c其中 (a, b) 是圆心c r² - a² - b²。每个点给一个方程写成矩阵形式就是[2xi, 2yi, 1] · [a, b, c] xi² yi²。这是标准的线性最小二乘用numpy.linalg.lstsq一行就能解不需要迭代。import numpy as np def fit_circle(pts): pts np.asarray(pts, dtypefloat) A np.c_[2*pts[:,0], 2*pts[:,1], np.ones(len(pts))] b pts[:,0]**2 pts[:,1]**2 sol, *_ np.linalg.lstsq(A, b, rcondNone) a, bb, c sol r np.sqrt(c a*a bb*bb) resid np.sqrt((pts[:,0]-a)**2 (pts[:,1]-bb)**2) - r return a, bb, r, resid这个叫 Kasa 拟合优点是线性、快、稳定缺点是当数据只覆盖一小段圆弧时会有系统性偏差它最小化的是代数距离不是几何距离。旋转标定的数据通常是整圈或者大半圈Kasa 完全够用。如果只允许小角度摆动比如 ±10 度那就得上 Pratt 或者 Taubin 拟合或者干脆用几何距离做非线性优化。残差怎么用拟合完一定要看残差。正常情况下残差应该在 ±0.01 毫米量级取决于视觉精度。如果某个点的残差明显跳出去八成是这个角度的图像没识别好——Mark 点被反光、被遮挡、或者转台停稳前就拍了。别把所有点硬塞进去拟合先把异常点剔掉再算这一步比换算法有用得多。2.3 采集数据时的几个硬性规范旋转标定的数据质量七成取决于采集环节。这几条是我这些年总结下来的硬规矩。第一转台必须停稳再拍照。伺服到位信号给出之后机械还有残余振动尤其是大转盘、重载工装。我的经验是到位后再等 150 到 300 毫秒或者干脆读伺服的实际位置波动波动小于编码器 1 个当量再触发相机。第二角度间隔要均匀且覆盖整圈。8 个点就每 45 度一个12 个点就每 30 度一个。别偷懒只做半圈那样拟合出来的圆心在垂直于圆弧的方向上会飘得很厉害——直观理解就是你只用一段弧去推整圆的位置弧外的方向完全靠猜。第三特征点要尽量远离旋转中心。同样的角度测量误差力臂越长圆心解算越稳。特征点在半径 20 毫米处和在半径 200 毫米处圆心解算的方差能差一个数量级。工装上如果没有合适的特征临时贴个高对比度的 Mark 点也比将就强。第四全程不要动相机、不要动光源、不要调焦。这一点听着像废话但真的有人中途觉得图像暗了去调了曝光结果整场数据作废因为灰度变化会让亚像素角点检测产生系统性偏移。第五记录环境温度。铝制转台在 10 度温差下直径 300 毫米的盘热膨胀能带来几十微米的变化。不是每个项目都要补偿温漂但你至少得知道这个量级存不存在否则后期精度上不去会找不到方向。实操心得采集时把每个角度的原始图像和识别结果都存盘别只存最终坐标。出了问题回溯的时候有原图你能判断是识别问题还是机械问题没原图就只能重做一遍。3. 九点标定、标定板标定、手眼标定到底谁解谁的方程3.1 九点标定解的是一组二元一次方程九点标定是机器视觉里最常被问到、也最常被误解的东西。它的标准做法是机器人末端带一根尖针或者带 Mark 点在相机视野内走一个 3×3 的网格每个位置记录机器人坐标 (X, Y) 和图像里尖针的像素坐标 (u, v)。九个点给 18 个方程解出下面这 6 个参数u a11·X a12·Y a13 v a21·X a22·Y a23这就是一个二维仿射变换。注意它包含的信息平移a13, a23、缩放和旋转a11, a12, a21, a22 构成的 2×2 矩阵、以及剪切。它能表达旋转所以有人以为九点标定能解决旋转问题这是个误解——九点标定的 2×2 矩阵里确实含旋转分量但它描述的是两个坐标系之间的姿态差异不是旋转中心的标定。这两件事完全不同。九点标定的几个使用边界我必须强调一下标定平面必须固定。公式里没有 Z标定时尖针在哪个高度实际测量就必须在同一个高度。差 0.5 毫米在 20 倍镜头下就是明显的误差。相机不能有大的透视畸变。仿射模型不含透视项相机光轴和标定平面不垂直超过 5 度误差就开始显现。要处理透视得上 8 参数投影模型采点也要超过 9 个。九点不能共线。3×3 网格里如果你只走了两条线矩阵秩不够解不出来。九点标定不补偿镜头畸变。畸变是相机内参的事得先做标定板标定把畸变校正掉再在上面做九点标定。顺序反了精度永远上不去。那什么时候该用九点什么时候该用标定板一句话九点标定解决像素和机器人怎么对应标定板标定解决相机自己有多歪。前者是外参性质的手眼映射后者是内参标定。两者配合使用不能互相替代。3.2 标定板标定张正友法管的是相机自己张正友标定法从 1999 年发表到现在依然是工业界最主流的相机内参标定方法原因很实在只需要一块平面棋盘格不需要精密三维靶标操作门槛低精度也够用。它的数学脉络是这样的相机成像写成s·m K·[R|t]·M其中 K 是内参矩阵含焦距 fx、fy 和主点 cx、cy。棋盘格是平面可以让 Z0于是单应矩阵 H 就能把棋盘格坐标直接映射到像素坐标。每张图像给一个 HH 里包含 K 和位姿的信息。利用旋转矩阵的正交约束两张以上不同姿态的图像就能建立关于 K 的方程解出内参初值然后用最大似然估计把所有参数含畸变系数一起优化。实操上几个关键点棋盘格的质量。打印的棋盘格必须平整不能有褶皱格距要精确打印后建议用游标卡尺量一下实际格距——打印机的缩放误差 0.5% 很常见直接填标称值会引入系统误差。工业场合我更推荐陶瓷标定板或者氧化铝标定板平面度能到微米级格距出厂带证书。采集姿态的多样性。这是最容易偷懒的地方。很多人拿着板子在相机前面平移几下就采完了结果标出来的内参在图像边缘严重失真。正确做法是让标定板在图像里覆盖不同区域中心、四角、边缘并且有明显不同的倾角——倾斜 30 度左右的姿态至少要有 3 到 5 张。总量 15 到 25 张比较合适。重投影误差怎么判断。OpenCV 输出的整体 RMS 重投影误差小于 0.3 像素算合格小于 0.15 像素算好。但更重要的是逐张看误差如果 20 张里只有 2 张误差大把那两张剔掉重算整体误差往往会明显下降。别迷信张数越多越好两张坏数据能把好数据全带偏。分辨率和视场的取舍。工业相机不是像素越高越好标定精度和镜头畸变、标定板在图像中占的比例密切相关。我的经验是标定板占图像宽度的 60% 到 80% 比较合适太小了内参解不稳太大了容易采不到四个角都完整的姿态。3.3 手眼标定要的数据清单和姿态多样性手眼标定是旋转标定在机器人领域最重要的应用核心方程是经典的那一个AX XB。A机械臂相邻两次运动的末端位姿变化来自机器人控制器B相机相邻两次观测到的标定板位姿变化来自图像X待求的手眼矩阵它分两种情况Eye-in-Hand相机装在末端跟着手一起动和Eye-to-Hand相机固定看着手和工件动。两者的方程形式略有差别但解题思路一致。数据清单列一下缺一样都做不成数据类型来源精度要求常见坑机器人末端位姿控制器读出的 x,y,z,rx,ry,rz 或四元数用控制器内部值别用视觉反推欧拉角顺序ZYX 还是 XYZ搞错相机内参和畸变系数事先用标定板标好RMS 0.2 像素标定完之后又调了焦距标定板在相机下的位姿每帧图像求解 PnP板子四个角完整可见板子出视野一角姿态解算直接错时间戳同步图像与机器人位姿对齐 10 毫秒机器人运动中标定位姿和图像对不上工具坐标系定义TCP 补偿值精确到 0.05 毫米TCP 没标定就做手眼白做姿态多样性是成败关键这一点必须在数据采集前就想清楚。如果机械臂只是平移或者所有姿态都绕同一个轴转那么旋转部分就是欠约束的解出来的手眼矩阵在某个方向上完全不可信。我的要求是至少绕两个不平行且夹角大于 30 度的轴旋转姿态角变化幅度大于 30 度总共采 12 到 20 组。还有一个经常被忽略的点标定板和机器人的相对安装要稳固。Eye-to-Hand 情况下标定板固定在末端或者工作台上标定过程中绝对不能移动Eye-in-Hand 情况下标定板固定在世界坐标里同样不能动。移动了任何一方整场数据作废。求解器方面OpenCV 的calibrateHandEye内置了 Tsai-Lenz、Park-Martin、Daniilidis 等多种算法。我的习惯是用两三种算法都跑一遍结果接近就用平均值结果差得远就回头查数据——算法之间的差异往往是数据质量问题的报警信号。4. 旋转纠偏从角度偏差到轨迹补偿的完整链路4.1 纠偏量的数学模型纠偏的输入通常是视觉识别出的工件实际位置Mark 点坐标和实际角度 θ_actual而系统里存的是一套示教好的理论轨迹对应理论位置和理论角度 θ_teach。偏差量就是Δθ θ_actual - θ_teach Δx X_actual - X_teach Δy Y_actual - Y_teach然后先平移到理论基准再绕旋转中心转 Δθ最后叠加平移补偿。这里有个顺序问题很多人搞错。正确顺序是第一步把工件坐标系的原点从实际位置挪到理论位置也就是减去 Δx、Δy 的影响。第二步以旋转中心 C 为基准把整条理论轨迹旋转 Δθ。绕点 C 旋转的公式x Cx (x - Cx)·cosΔθ - (y - Cy)·sinΔθ y Cy (x - Cx)·sinΔθ (y - Cy)·cosΔθ如果工件的平移偏差也需要补偿比如贴装位置整体偏了就把 Δx、Δy 加在旋转后的结果上。注意先旋转后平移和先平移后旋转的结果是不同的除非旋转量为零。行业里的通行做法是先旋转、后平移因为平移补偿通常定义在工件自身的坐标系里。这里的 Δθ 有一个容易被忽略的坑角度从图像里算出来通常是像素系下的角度方向顺时针/逆时针和机器人坐标系可能相反。因为图像坐标系 Y 轴向下机器人坐标系 Y 轴向上同一个旋转在两边符号相反。这个必须用一次简单实验验证工件顺时针转 5 度看系统算出来的 Δθ 是正还是负记住这个符号关系写死在代码里。4.2 旋转中心误差会被放大多少这一节是整篇文章里我最想让人记住的。很多人对旋转中心精度的重视程度不够觉得反正偏一点点差不了多少。实际差多少可以精确算出来。设旋转中心标定误差为向量 δC实际旋转角度为 Δθ。那么纠偏后的点位残差是残差 |R(Δθ)·δC - δC| 2·|δC|·sin(Δθ/2)这里假设 δC 垂直于旋转轴二维平面上总是成立的。这个式子告诉我们三件事第一小角度纠偏对旋转中心误差不敏感。Δθ 5 度时2·sin(2.5°) 0.087δC 有 0.5 毫米残差只有 0.044 毫米。这就是为什么有些精度要求不高的项目旋转中心做得很粗糙也能跑。第二大角度纠偏会成倍放大。Δθ 90 度时2·sin(45°) 1.414同样的 0.5 毫米中心误差残差变成 0.7 毫米。Δθ 180 度时达到最大值 2.0 倍残差 1.0 毫米。这也是为什么来料摆放角度随机的产线对旋转标定精度的要求远高于来料基本摆正的产线。第三残差和 δC 的方向关系不是固定的它随 Δθ 转动。这意味着你没法用一个固定的偏移补偿把它修掉——如果你发现纠偏后的残差随工件角度变化而变化且变化的模式是圆形的那基本可以确定是旋转中心标定有问题而不是别的原因。这张表可以直接拿来估算你的项目需要多高的标定精度最大纠偏角度放大系数 2·sin(Δθ/2)中心误差 0.1mm 时的残差中心误差 0.5mm 时的残差±5°0.0870.009 mm0.044 mm±15°0.2610.026 mm0.131 mm±30°0.5180.052 mm0.259 mm±60°1.0000.100 mm0.500 mm±180°2.0000.200 mm1.000 mm我一般拿这张表反推先把产品公差倒推到处点位残差的允许上限再用最大纠偏角度查出放大系数除一下就是旋转中心标定必须达到的精度。4.3 一次纠偏还是迭代纠偏理论上只要标定准确、偏差计算准确一次纠偏就够了。实际项目里要不要迭代取决于三个因素。看节拍预算。一次纠偏只需要拍一次照、算一次、走一次迭代纠偏要拍两到三次节拍直接翻倍。如果单机节拍是 0.8 秒迭代一次就超了只能想办法提升单次纠偏的精度。看残差来源。如果残差主要来自旋转中心误差迭代也没用——第二次拍照算出来的 Δθ 已经很小了但那个与角度相关的残差还在收敛速度极慢。如果残差来自机械回程间隙、伺服定位误差迭代确实有效因为这类误差是随机的二次修正能显著改善。看是不是闭环。有二次视觉确认的场合贴装完再拍一次检查迭代纠偏是自然的选择。没有二次视觉的场合硬做迭代要么加一个相机工位要么走半闭环——用运动完成后的编码器反馈位置来判断精度一般但成本最低。我的建议是首件调试阶段一定做迭代用它来判断误差到底是系统性还是随机性。如果迭代一次就好了说明前面有一次性的系统误差比如旋转中心偏了、标定用的数据有问题。如果迭代三次还在 ±0.05 毫米上下抖动那就是随机误差再迭代也没用该去看机械了。这个判断方法我在现场用了很多次比翻手册快。5. 多传感器联合标定相机、激光雷达、IMU 怎么串起来5.1 相机与激光雷达联合标定的三条路相机和激光雷达的联合标定本质是求一个 6 自由度的外参矩阵把激光雷达点云投到图像上或者反过来。这条路我走过三条各有适用场景。第一条路是靶标法。用一块特制的标定板既能被相机识别出棋盘格角点又能被激光雷达识别出平面或者孔洞阵列常用的做法是棋盘格后面加一块带规则圆孔的金属板或者在标定板上做几个深度凸起。先在图像里识别角点再在点云里拟合出板平面和孔位中心两组三维-二维对应点用 PnP 求解。精度高可重复性好缺点是需要定制靶标而且激光雷达的分辨率决定了能不能识别出孔——16 线的雷达对近距离小孔识别很吃力通常得用 32 线以上或者把标定板做很大、放得很近。第二条路是无靶标法。直接利用场景中的自然特征把点云里的深度不连续边缘提取出来和图像里的边缘做对齐通过最大化互信息MI或者最小化边缘距离来优化外参。优点是不需要靶标、可以在线做缺点是初值要求高初值差 5 度以上基本收敛不到正确解。所以实际用的时候通常还是先用卷尺量一个初始值填进去。第三条路是运动法。让整个传感器组合运动起来相机做视觉里程计激光雷达做点云配准各自估计出运动轨迹再通过轨迹对齐来求相对外参。这种方法本质上不需要任何标定物但需要足够的运动激励——直线匀速开是没用的要有充分的旋转。Autoware 生态里的相机-雷达联合标定工具不少就是走的靶标法加手动选点的混合路径先人工在图像和点云里各点几个对应点求出粗略外参初值再自动优化。不管走哪条路有几条通用经验标定场地的背景要干净杂乱的边缘会让无靶标法彻底失效距离要覆盖实际工作范围只在 2 米处标定的外参拿到 20 米外用误差会明显变大标定结束后一定做正向投影验证把点云投到图像上肉眼看重不重合这一步比任何数值指标都直观。5.2 激光雷达与 IMU 外参标定激光雷达和 IMU 的外参标定在自动驾驶和移动机器人里是标配。它要解的是激光雷达坐标系和 IMU 坐标系之间的旋转和平移其中旋转部分比平移部分重要得多——平移偏差 1 厘米对融合定位的影响往往可以忽略旋转偏差 1 度在 100 米处就是 1.7 米的横向误差。IMU 内参先标。这一步很多人跳过直接标外参结果一直调不好。IMU 的噪声密度和随机游走系数必须用 Allan 方差先标出来采集静止数据通常要 2 小时以上才能把零偏不稳定性bias instability那段看出来。如果 IMU 内参是错的后续外参优化出来的结果就是在拟合噪声。外参的初值靠测量。拿卡尺量 IMU 中心到激光雷达中心的相对位置拿角度尺量安装角度。别嫌粗糙有初值和没初值完全是两个难度。优化靠运动。让设备在开阔区域做充分的旋转运动绕竖直轴左右各转几圈、绕另外两个轴做倾斜采集同步的激光雷达点云和 IMU 数据然后做联合优化。可用的方法有两类一类是滤波器式把外参当成状态量放进 ESKF 里在线估计一类是优化式构造点云配准残差加 IMU 预积分残差一起做非线性优化。我倾向于先跑优化式拿一个稳定的初值再开滤波器式在线微调。验证靠闭环。把标定好的外参代进去跑一圈回到起点看位置闭环误差再做一个纯旋转的运动看姿态积分漂移。两个指标都合格外参才算过关。5.3 双目相机标定与不合格角点剔除双目相机标定比单目多一层不仅要标各自的内部参数还要标两个相机之间的相对位姿R 和 T。标定完再做立体校正stereoRectify让两幅图的极线变成水平线这样视差搜索就变成了一维的效率和准确率都高。角点剔除这块值得单独说因为它是双目标定精度的关键瓶颈。标定板上有几百个角点只要有几个识别错了整个标定结果就偏了。我在实践中用这几层过滤第一层对称性检查。棋盘格角点检测算法OpenCV 的findChessboardCornersSB比老的findChessboardCorners稳很多会在每个角点给出位置正常的角点应该和它的理论网格位置差得不多。计算每个角点相对于局部网格拟合的偏差超过 0.5 个格距的直接丢掉。第二层极线约束检查。左右图像里的对应角点在校正之后应该在同一水平线上。垂直方向偏差超过 1 个像素的说明这一对角点至少有一个识别错了。第三层重投影误差过滤。用初步求解出的参数把棋盘格角点重投影回图像误差大于 1 个像素的对直接剔除重新标定。迭代两到三次把 RMS 压到 0.15 像素以下。第四层图像质量门限。这一步在标定前做对每对标定图计算角点邻域的梯度幅值梯度太弱的说明图像模糊或者对比度不够直接不要。这个预过滤能省掉后面很多麻烦。注意剔除角点要成对剔除。左图丢了一个点右图对应的那个也必须丢否则两个相机的点集不对应标定直接崩。双目校正完之后还有一个经常被忽略的验收步骤看校正后左右图像的公共区域。如果两个相机的姿态差异大或者焦距不一致校正后的有效视差区域会非常窄边缘全是黑边。这种情况说明相机选型或者安装角度有问题靠标定是救不回来的。6. 桥路输出的解耦标定w c·v w0 到底在干什么6.1 公式里每个量对应什么物理对象前面讲的都是几何标定现在换一个维度讲讲传感器领域的解耦标定。这个公式在很多多维力传感器、应变式传感器的说明书里出现w c·v w0v桥路输出的向量比如六维力传感器有 6 路或者 8 路桥路输出电压或经过 AD 之后的数字量。w我们真正想要的物理量向量比如 Fx、Fy、Fz、Mx、My、Mz 六个分量。c解耦标定矩阵维度通常是 6×8 或者 6×6负责把桥路输出线性映射成物理量。w0零漂向量空载时输出的偏置。为什么要解耦因为多维力传感器的各路桥路之间天然存在耦合你在 X 方向加力Y 方向的桥路也会有输出因为应变片的粘贴位置、弹性体的结构、加工公差都会造成交叉敏感。这种耦合如果不管测出来的力就是错的而且错得很微妙——单独加载时看着还行多方向同时加载时误差就炸了。线性模型能不能用对绝大多数应变式传感器在工作量程的 20% 到 80% 区间内线性度是够的。但如果量程跨度很大比如从 1 牛到 1000 牛或者弹性体有明显的非线性就得加上二次项或者用分段线性。6.2 解耦矩阵和零漂的实测求法零漂w0的测法比较直接传感器空载、安装在最终使用姿态下通电预热通常 15 到 30 分钟让应变片和电路达到热平衡然后连续采样 60 秒以上取平均值作为w0。注意必须是最终使用姿态因为重力对弹性体的作用方向变了零漂也会变。解耦矩阵c的测法是这套标定的核心。基本流程第一步准备标准载荷。每个方向至少要能施加已知大小的力或力矩。常见做法是用标准砝码通过滑轮组加载或者用标准力传感器做串接比对。第二步设计加载矩阵。假设有 6 个待求的物理分量最少需要 6 组线性无关的加载。但实际操作中为了求解稳定和评估耦合通常会加载几十组甚至上百组。加载矩阵要满足每个方向单独加载看主灵敏度、两两组合加载看耦合系数、正负方向都加载看对称性。第三步记录桥路输出。每个加载状态下等读数稳定后采样 N 次取平均作为该状态的v。第四步最小二乘求解。把所有的 (v_i, w_i) 对写成矩阵形式W C·V用伪逆或者lstsq求解 C。如果加载点数远多于未知数通常是这种情况就是超定最小二乘。第五步验证残差。用求出的 C 反算所有已知载荷看最大误差。合格的标准因应用而异一般要求在量程的 1% 以内。几个实操细节温度补偿要单独处理。w0会随温度漂移这个漂移量在精密测量里不能忽略。做法是同时记录温度把w0写成温度的函数w0(T) w0_0 k·(T - T0)其中 k 由升温实验标出来。有些高端传感器内部直接集成了温度传感器和补偿电路。解耦矩阵需要定期复标。应变片会蠕变胶层会老化结构螺栓会松动这些都会让 C 慢慢变化。我的经验是普通工业场合一年复标一次高精度测量场合半年一次如果传感器经历过过载、跌落、高温立刻复标。别用厂家给的 C 直接用。厂家标定的 C 是在他们的标定台上、用他们的加载方式得到的和你现场的安装方式、受力方向、输出电路都可能不同。厂家值只能当初始值参考真正要用必须自己标一遍。这套思路其实和几何标定是相通的——都是找一个线性映射矩阵都是靠已知输入输出对做最小二乘。区别只是几何标定关心的是坐标变换传感器标定关心的是物理量映射。7. 现场排查旋转标定与纠偏的常见故障速查7.1 问题速查表这张表是我自己总结的按现象反查原因现场可以直接对照用。现象最可能的原因排查方法处理方式纠偏后残差随工件角度呈圆形变化旋转中心标定有误差用 4.2 的放大系数公式反推看量级是否吻合重新标定旋转中心增加采点数量纠偏方向反了图像坐标系与机器人坐标系 Y 轴方向相反手转工件 5 度看 Δθ 符号在代码里统一符号或转置旋转矩阵大角度纠偏没事小角度反而偏平移补偿和旋转补偿的顺序搞反检查是先旋转后平移还是反过来改成先旋转、后平移九点标定后中心区域准、边缘不准镜头畸变未校正用标定板看边缘直线是否弯曲先做内参标定再做九点手眼标定结果稳定但精度差姿态多样性不足检查采集姿态的旋转轴是否单一重新采集绕两个以上不平行的轴标定重复性差每次结果都不一样相机参数被改过或标定板移动了比对两次标定用的内参固定相机参数标定过程中禁止移动标定板力传感器单轴加载准、多轴加载差解耦矩阵未标定或已失效施加两轴同时加载做对比重新做解耦标定力传感器空载读数缓慢漂移温漂未补偿记录温度与读数关系增加温度补偿项或延长预热时间激光雷达与相机投影对不上远处误差更大外参旋转分量错误检查近处和远处的投影偏差是否成比例重新标定重点校旋转双目视差图边缘大面积空白两相机姿态差异过大看校正后的公共视场调整安装角度或更换焦距一致的镜头7.2 几个我自己踩过的坑坑一标定板格距填了标称值。早期做相机标定时我直接用 25 毫米的标称格距重投影误差一直在 0.35 像素上下徘徊怎么调都下不来。后来拿游标卡尺量了打印出来的板子实际格距是 24.87 毫米差 0.13 毫米相对误差 0.5%。把这个值改进算法之后重投影误差直接掉到 0.18 像素。从那以后凡是打印的标定板我都要求先量再用。坑二机器人在运动过程中做手眼标定。有一次为了赶进度让机械臂边走边采图省下停稳的时间。结果手眼矩阵怎么算都不对换了三种算法结果差得离谱。后来才发现图像时间戳和机器人位姿时间戳差了 80 毫秒机器人以 200 毫米/秒的速度走80 毫秒就是 16 毫米的位置误差。手眼标定必须在静止状态下做这条没有例外。坑三旋转标定的特征点选得太靠近中心。有个项目用工件上的一个小圆孔做特征孔位离旋转中心只有 15 毫米。标定出来看着挺好重投影残差也很小但实际纠偏的时候大角度误差有 0.15 毫米。原因是力臂太短同样 0.5 像素的识别误差换算成角度误差被放大了好几倍。后来换到工件边角上的一个特征问题立刻解决。坑四解耦标定用了过期的砝码。标准砝码也是有检定周期的超期使用、表面磨损、锈蚀都会带来质量偏差。有一次排查了半天电路和算法最后发现是码本身的误差。这件事给我的教训是标定用的标准器具本身必须有可追溯的精度否则你标出来的东西没有意义。坑五以为标定一次能用到底。有个长期运行的设备投产时标定得很好运行两年后精度慢慢下降都没人发现。后来定了个规矩每月用标准件做一次精度点检偏差超过阈值就触发复标。这个习惯比任何事后补救都值钱。7.3 标定的日常维护清单标定不是做完就完了日常维护同样重要。我一般会给项目定这么一张清单周期维护动作判定标准每班次用标准件做一次定位点检偏差 产品公差的 1/5每周检查标定板、靶标是否移位或污染目视无异常每月复测旋转中心与手眼矩阵与基准值偏差 0.05 mm每季度检查相机镜头、光源亮度衰减图像灰度均值波动 10%每年传感器解耦矩阵复标各向残余误差 1% 量程触发式换工装、换镜头、机器人维护后立即全面复标这张表执行下来能把大部分精度问题掐死在萌芽阶段。最后分享一个我在实际使用中体会最深的小技巧任何一次标定务必把原始数据和中间结果全部存档并且记录环境条件温度、湿度、时间。我遇到过好几次这样的情况——半年前标的数据现在精度不对了想分析原因结果只有一份最终参数什么都查不出来。存档这件事花不了几分钟但能救命。另外如果你不确定一套标定结果靠不靠谱最省钱的办法是拿它去测一个已知尺寸的标准件一次性就能判断出系统误差的量级和方向比盯着重投影误差数字猜强得多。
RELATED READING

延伸阅读

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