首页 / 资讯中心 / 文章详情

手眼标定技术解析:从AX=XB原理到机器人视觉引导应用

手眼标定技术解析:从AX=XB原理到机器人视觉引导应用 ★ FEATURED ARTICLE
1. 机器人为什么看不见手眼标定的本质与适用场景先说个我常用来打比方的场景。你去医院做检查医生手里的超声探头贴在你身上屏幕上的图像是探头感知到的截面但医生脑子里要做一件事把图像里那个阴影对应到你身体左侧肋骨下方这个真实位置。如果探头和身体的空间关系搞错了图像再清晰也没法指导手术。机器人手眼标定干的就是这件事。工业机器人末端装了相机相机能看到工件但机器人控制器只认自己坐标系下的坐标。相机给出的像素坐标也好相机坐标系下的三维坐标也好和机器人坐标系之间隔着一层未知的变换关系。手眼标定就是把这层关系算出来让机器人拿到相机信息后能精准地把手伸到该伸的地方。这个问题的适用范围比很多人想象得广。不只是传统六轴机械臂移动机器人抓取、AGV视觉定位、复合机器人巡检、医疗手术辅助、甚至无人机视觉降落本质都在做同一个数学问题——两个刚体坐标系之间的变换估计。区别只是载体不同、精度需求不同、标定手段略有差异。我在某项目里见过一个典型场景产线上有个工件托盘每一次托盘到位后的实际位置都有几毫米偏差机械臂如果按固定示教点去抓必然抓偏。后来在臂上装了一个2D相机先拍照识别工件的像素位置再换算成机器人基座坐标系下的抓取点位置误差从±5mm降到±0.5mm以内。这个换算关系就是手眼标定算出来的。没有这一步相机装得再高级也白搭。所以一句话概括手眼标定解决的是眼睛和手之间的坐标统一问题。它不属于锦上添花的优化项而是机器视觉引导类项目能否跑通的地基。1.1 手眼标定的核心输入与输出从工程视角看手眼标定输入的是多组已知数据输出的是一个4×4齐次变换矩阵。这个矩阵里面有旋转分量3×3和平移分量3×1。输入的已知数据通常是这几组机器人末端在基座坐标系下的位姿由控制器直接读出或者由正运动学计算得到相机拍摄标定板后估算出的标定板在相机坐标系下的位姿标定板本身的物理尺寸已知如果相机固定在场景中眼在外手还需要知道机器人末端工具在机器人末端坐标系下的位姿输出则是眼在手上相机坐标系到机器人末端坐标系的变换关系眼在手外相机坐标系到机器人基座坐标系的变换关系很多刚接触的人会把手眼标定和相机内参标定混为一谈。相机内参标定解决的是像素坐标到相机坐标系的映射比如焦距、畸变系数、主点位置。手眼标定解决的是相机坐标系到机器人坐标系的刚体变换。两者是完全串行依赖的关系先有内参才能做手眼。内参不准手眼标定结果也会跟着崩。1.2 什么情况下必须做手眼标定不是所有装了相机的机器人系统都要做手眼标定。判断标准很简单如果相机信息需要用来引导机器人运动就必须做如果相机只是用来做离线检测比如拍完图判断有没有缺陷机器人不依赖这个视觉结果去定位那可以不标定。我遇到过有人问相机固定在某个支架上位置不动是不是标定一次就永远不用管了答案是否定的。温度变化引起的机械结构形变、机器人基座被撞移位、相机松动、标定板更换这些都会让原有变换关系失效。现场调试时经常出现一种情况标定完成后一周内精度都正常突然某一天抓取偏了排查到最后发现是相机支架被叉车碰了一下。这类问题在项目验收阶段尤其容易踩坑。另一个必须做的场景是手眼协同的柔顺控制、力控装配这类要求更高的应用。相机给出的位置误差必须控制在亚毫米级而亚毫米级的前提就是手眼标定矩阵足够准。这里标定出来的不只是抓取点还包括姿态约束比如插拔、贴合、螺纹旋转这类动作对姿态的敏感度非常高旋转矩阵差个0.5度在100mm的力臂末端就会产生接近1mm的位置偏差。2. 核心公式与数学原理AXXB到底在解什么手眼标定的数学表达式在文献里非常统一AXXB。但很多第一次见这个公式的人都会觉得抽象。我试着用最直观的方式拆开讲。假设机器人从位姿A1移动到位姿A2相机跟着末端一起运动眼在手上场景。在这个过程中我们可以从机器人控制器拿到两个末端位姿进而算出末端从A1到A2的相对运动记作矩阵A。同时相机拍摄固定不动的标定板可以算出相机从C1到C2的相对运动记作矩阵B。关键来了因为相机刚性固定在末端上所以相机坐标系和末端坐标系之间的变换关系X是恒定不变的。于是A和B之间存在一个约束关系A·X X·B。等号右边的X·B表示先做相机运动B、再做手眼变换X等号左边的A·X表示先做手眼变换X、再做末端运动A。因为同一个物理过程所以两者相等。这里要特别强调A是末端在基座坐标系下的相对运动B是相机在标定板坐标系下的相对运动。A和B描述的是同一个刚体运动在不同坐标系下的表达X就是它们之间的桥梁。2.1 公式的几何直觉如果只记公式很容易忘记为什么A和B能通过X联系起来。我换个说法你在车里拿着手机朝窗外拍一棵树。车的位移是A车从位置1到位置2手机里树的位置变化是B。手机相对车是固定的所以手机和车之间的变换关系X是常数。不管车怎么开只要知道车动了多少、手机画面里树动了多少就能反推出手机相对车的安装姿态。这个类比完美对应眼在手上。车是机器人末端手机是相机树是标定板。对于眼在手外公式形式会稍微变一下但本质一样。相机固定在天花板或支架上标定板放在机器人末端末端带着标定板移动。此时机器人末端的相对运动是A相机看到的标定板相对运动是BX仍然表示相机和机器人基座之间的恒定变换。这里A·X X·B照样成立只是等式两边的含义重新对应了一遍。2.2 为什么至少要两组运动才能求解一个X里面有旋转3个自由度、平移3个自由度总共6个未知数。一组A和B的约束方程看起来有12个方程但实际独立约束只有6条旋转部分3条、平移部分3条刚好够解一组。理论上两组运动就能形成超定方程工程上至少取8到10组目的是抑制噪声。实际操作中常见的问题是采集了十几组数据每组之间机器人运动都很小只有几毫米位移。这种数据看似数量多实际上约束很弱。因为旋转分量微小变化时方程组的条件数接近奇异求出来的X会极度不稳定。最差的情况是你换了不同的初始值去求解结果X差别巨大但重投影误差看起来都一样好。这种情况几乎可以断定是数据质量问题而不是求解算法问题。2.3 求解算法的常见流派手眼标定求解算法这么多年下来主流分三类两步法先解旋转再解平移。因为旋转约束和平移约束可以解耦。代表方法包括Tsai-Lenz、Park-Martin等。优点是快、稳定适合大多数工业场景。单步法把旋转和平移放在同一个优化目标里比如通过李代数表示误差。代表方法有Li-vectorized、Daniilidis的Kronecker乘积方法。优点是精度好但实现复杂度高。非线性优化法直接把重投影误差或坐标残差定义为目标函数用牛顿法、LM算法迭代。这种方式灵活可以融合多帧数据甚至联合优化相机内参但需要好的初值。工程上最常用的还是两步法。我在实际项目里一般先用Tsai-Lenz算一个初值再拿这个初值做非线性优化精调。两步法给的初值虽然在噪声较大时会有偏差但基本上能让优化收敛到正确区域直接裸跑非线性优化反而容易掉进局部极小。3. 两种标定模式的取舍眼在手上与眼在手外选哪种模式不是拍脑袋决定的和工件尺寸、工作空间、节拍、现场布局都相关。我分别讲特点和选型逻辑。3.1 眼在手上eye-in-hand的特点相机装在机器人末端最大的优点是想看哪里看哪里。工件大、工位分散、需要多角度观察的场景眼在手上几乎是最优解。相机跟着手走手到哪眼睛到哪不存在视野遮挡问题除非手本身把工件挡住。眼在手上的标定目标是把相机坐标映射到末端坐标系。标定时通常把标定板固定在工作台上机器人带动相机走多个位姿每个位姿拍一张标定板照片同时记录机器人末端位姿。它的缺点也很明确相机跟着手臂高速运动振动和加减速冲击会影响相机寿命和图像质量每次换工具、调相机角度手眼关系都会变必须重新标定机械臂在不同姿态下末端挠度不同X会存在微小变化高精度场景需要考虑这个因素3.2 眼在手外eye-to-hand的特点相机固定安装通常架在工位上方或侧方。优点是相机不动视野稳定成像质量容易保证机器人末端不需要额外负重标定一次可以管很久。但代价是视野范围固定。如果工件位置偏离较大或者需要看多个工位要么装多个相机要么让机器人把工件送到固定拍摄位。眼在手外的标定目标是求相机到机器人基座的变换。标定时通常把标定板装在机器人末端让标定板在相机视野内移动多个位置并记录每个位置下机器人末端位姿。这种方式可以同时把机器人工具中心点TCP的手眼关系一起算出来。3.3 选型对比表对比维度眼在手上眼在手外视野灵活性高随机械臂移动低固定视野标定频率换工具/调相机后需重标长期稳定动态成像质量受振动影响大稳定大工件覆盖适合可分区域拍摄需要大视野相机或多个相机高精度装配受末端挠度影响整体更稳系统成本相机需小巧轻量可以使用较大较重相机节拍影响无额外拍照等待可能需要机器人到固定位拍照我在某焊接项目里两种方案都试过。最初用眼在手外相机架在焊接工位上方结果焊缝位置偏离大、工件尺寸差异大固定视野经常对不准。后来改成眼在手上机械臂带着相机先找焊缝再焊接问题迎刃而解。但另一个精密装配项目机械臂末端已经挂了力传感器和夹爪负载接近额定值再挂一个相机末端下垂明显最终果断选了眼在手外把精度问题转移到标定位置和固定工装上。4. 从零到一的手眼标定实操流程这一节按我实际做项目的顺序来讲包含标定板选择、数据采集、求解、验证四步每一步都有可以直接落地的参数建议。4.1 标定板与相机内参准备标定板通常用棋盘格或圆形点阵。棋盘格角点精度高OpenCV的cv::findChessboardCorners算法成熟圆形点阵则对于模糊、大倾角图像更鲁棒OpenCV的cv::findCirclesGrid有亚像素拟合能力。我个人的偏好是2D相机用棋盘格3D相机或激光轮廓仪用圆形点阵后者对点云提取特征更友好。标定板尺寸选择标准在相机视野里单个格子或圆点直径至少占20个像素以上整体标定板占视野面积的三分之一到二分之一。太小特征提取误差占比大太大标定板可能超出视场拍不全。相机内参最好在项目现场重新标不要沿用出厂值或旧数据。即使同一型号相机装配公差、镜头锁紧力度不同内参也会有差异。如果镜头是变焦的锁定焦距后再标之后严禁再动镜头的变焦环和对焦环。一个常被忽略的小细节自动光圈关闭手动设定光圈值自动白平衡关掉曝光时间固定。保证标定和实际运行时的成像环境一致否则内参标定和手眼标定之间会引入额外的尺度偏差。4.2 机器人运动规划与数据采集要点这是手眼标定最容易出问题、却最不被重视的环节。很多人随便走十几个点就开始解算结果精度忽好忽坏。正确的采集策略机器人末端或标定板在空间中要分布到工作空间的不同区域不要全部挤在同一个角落。X的平移分量对空间范围非常敏感只有覆盖足够大范围平移量才可观。姿态变化要大。每个采集点的姿态差异应尽量大覆盖不同的俯仰、偏航、翻滚角。如果所有姿态都接近同一个朝向旋转约束不足解出来的旋转矩阵基本靠猜。避免标定板与相机光轴接近垂直的纯平移运动。此时图像上的特征点位移极小数值上不稳定。记录数据时要确保机器人已经完全停稳、振动消失后再拍照。千万别让机器人在运动中触发拍照即便有视觉触发也会引入大量抖动噪声。每组数据除了记录机器人位姿和图像还应记录示教器的位姿读数用于后续交叉验证。实操时我习惯把标定点设计成双层球形分布外层大范围8个点内层小范围8个点姿态各异。这样产生的数据既覆盖范围又有姿态多样性解算稳定性明显更好。4.3 标定求解代码骨架以OpenCV和Python为例一个最简可跑的流程如下import numpy as np import cv2 # 假设已经准备好两批数据 # robot_poses: 机器人末端位姿4x4齐次矩阵列表shape(N,4,4) # board_poses: 标定板在相机坐标系下的位姿4x4齐次矩阵列表shape(N,4,4) # 注意这里用的是OpenCV标定得到的标定板位姿即从图像解算出的外参 def hand_eye_calibration(robot_poses, board_poses): # 1. 计算相对运动 A_list [] B_list [] for i in range(len(robot_poses) - 1): A np.linalg.inv(robot_poses[i]) robot_poses[i1] # 眼在手上形式的A B board_poses[i] np.linalg.inv(board_poses[i1]) # B A_list.append(A) B_list.append(B) # 2. 求解 AXXB R, t cv2.calibrateHandEye( np.array(A_list), np.array(B_list), methodcv2.CALIB_HAND_EYE_TSAI ) # 3. 组装4x4矩阵 X np.eye(4) X[:3, :3] R X[:3, 3] t.flatten() return X X hand_eye_calibration(robot_poses, board_poses)这个骨架给出了完整思路但要注意OpenCV的calibrateHandEye接收的是旋转向量和平移向量列表我为了简化直接传了4x4矩阵实际使用时需要先用cv2.Rodrigues把旋转矩阵转成旋转向量再传入。眼在手外的数据传入方式与眼在手上略有不同需要把机器人位姿取逆或者调整相对运动的构造顺序。这个细节最容易写错建议对照OpenCV官方文档确认行列约定。4.4 结果验证用一个没参加过标定的点来检验管线跑完后不能只看求解过程的残差一定要做独立验证。方法很简单让机器人末端或标定板运动到一个没有参与标定的新位姿拍照、读机器人位姿用标定结果X把相机观察值映射到机器人坐标系再与机器人实际位姿对比。验证指标我看两个位置误差映射点与实际点之间的欧氏距离工业抓取场景要求在1mm以内精密装配在0.1-0.3mm姿态误差旋转矩阵差对应的轴角角度一般控制在0.2度以内如果验证误差远大于预期不要急着调标定板或重采数据先按下一章的排查链路走一遍。5. 标定精度不达标完整的排查链路手眼标定结果不理想是现场最容易耗时间的环节。我按排查优先级排序每一步都给出判断方法和处理策略建议从第一条开始逐项检查不要跳过。5.1 内参异常内参是手眼标定的地基但很多人只标一次就忘。检查方法重新采集10张不同角度的标定板图像单独做一次相机内参标定看重投影误差。如果用OpenCV的calibrateCamera平均重投影误差一般应小于0.1像素。如果到了0.3像素甚至更高说明拍摄环境光照、反光、模糊有问题或者标定板平面度不好甚至标定板打印后发生了形变。这种情况下手眼标定怎么调都不会准。处理手段把标定板贴在刚性平整的铝板或玻璃板上避免使用普通打印纸贴在泡沫板上加强环境光避免镜面反光适当增大标定板尺寸。5.2 机器人绝对定位精度不足很多项目标定结果差其实是机器人本身的绝对定位精度就不行。工业机器人重复定位精度通常很高±0.02mm级别但绝对精度可能只有±1-2mm。手眼标定用的机器人位姿读数依赖的是运动学模型正解。如果机器人没有做过绝对精度标定模型误差会直接传导到手眼标定结果。判断方法让机器人末端分别运动到工作空间不同位置的同一姿态用激光跟踪仪或高精度测量设备对比读数与实际位置的偏差。如果偏差超过手眼标定目标的误差预算就要考虑先做机器人本体标定。对于没有外部测量设备的现场有一个相对粗糙但实用的技巧多用机器人自带的高精度重复定位让标定过程中机器人走多个不同姿态某些绝对误差会部分均摊和抵消。反正数据显示出来如果手眼验证误差稳定在2mm左右且分布随机应优先怀疑机器人本体。5.3 数据分布与多样性不足数据分布问题是手眼标定最大的隐形杀手。检查方式把采集到的机器人位姿和标定板位姿分别画在三维空间里看是否覆盖了足够的体积。如果所有点都集中在半径为100mm的球内想让X的平移误差达到亚毫米级别基本不现实。对策扩大标定区域让标定板或相机在机器人能达到的边界范围附近也采集几组。姿态方面可以在每个空间位置设置3-4个不同姿态形成位置多样姿态多样的组合。经验值采集15-20组数据空间包围盒体积至少占到工作空间体积的1/3。5.4 数据噪声与图像质量图像噪声会通过标定板位姿估计误差传导到X。检查原始图像的清晰度、反光、运动模糊、对焦情况。还有一个很多人忽略的来源标定板角点检测算法在多尺度上的不一致。同一个标定板在图像中占比太大或太小角点定位精度差异很大。我在一个分拣项目里遇到过一次奇怪的精度漂移同一个标定结果白天精度正常晚上开产线照明灯后精度变差。排查发现是工厂的钠灯频闪导致图像亮度周期性变化自动曝光又去补偿结果不同帧的噪声特性完全不一样角点检测产生了系统性偏移。处理方式固定曝光和增益用频闪照明时确保相机采集与光源同步或者干脆用手动模式把曝光时间控制在频闪周期的整数倍上。5.5 标定板位姿解算方向约定不一致这是一个非常隐蔽的坑代码层面看不出问题但结果就是不对。不同库对标定板位姿的坐标系定义不同OpenCV的solvePnP返回的是标定板坐标系在相机坐标系下的位姿某些工业视觉SDK返回的是相机在标定板坐标系下的位姿。方向搞反公式中X的旋转平移部分会整个错位。处理方法在写代码之前先用一组已知数据进行手工推理验证比如让标定板正对着相机确认从图像里解算出的Z轴指向是什么。这一步花五分钟可以省掉一整天的debug时间。6. 标定完成之后精度保持与在线监控标定结果用起来正常了不代表一劳永逸。项目经过一段时间运行机械结构磨损、热胀冷缩、螺丝松动手眼关系都会缓慢漂移。我给每个项目都做一套在线监控机制这里分享几个简单有效的方法。最直接的方法保留标定板在产线空闲时让机器人执行一次标定质量巡检动作。机器人回到某个固定位姿拍摄标定板计算当前标定板在机器人坐标系下的估算位置和首次标定时的参考值对比。偏差超过预设阈值就触发报警提示重新标定。这个巡检动作的代码可以复用标定时的验证模块成本很低。另一种思路是从生产数据中被动监控抓取或装配成功率和视觉引导精度存在相关性。当系统连续多次出现视觉引导偏差大的情况先别急着调视觉参数优先检查手眼标定矩阵是否漂移。此类问题我见过太多操作工人为了赶节拍把相机支架拧紧了一下结果整个X变了精度反而更差。还有一个工程上的小习惯每次标定完成后把标定结果、采集数据的原始位姿、图像、求解参数全部归档保存标注日期和操作人。下次现场出现精度问题时先看上次标定归档对照当前数据判断环境变化还是算法问题排查效率能翻倍。7. 进阶视角手眼标定的精度上限与提升方向说到手眼标定的精度上限需要区分两个概念标定过程中能达到的精度和实际生产运行中维持的精度。前者受限于数据质量和解算算法后者还受温漂、负载变化、机械磨损影响。在实验室条件下用高精度测量设备和高质量数据手眼标定可以达到0.1mm以下的位置精度。但到了工厂现场再加上振动、电缆拖链的拉扯、夹具变形整体视觉引导误差通常在1-3mm范围内。如果你的应用需要更高精度单靠手眼标定不够还需额外引入对位机构或力觉终端修正。提升手眼标定精度的几个现实手段联合标定相机内参与手眼关系把内参、畸变、手眼变换放在同一个优化问题里解避免两步误差叠加。用多帧图像联合估计标定板位姿而不是单帧独立估计。对标定板是固定不动的前提下多帧一起优化可以显著抑制噪声。引入激光跟踪仪等高精度外部基准直接测量机器人末端在空间中的真实位姿代替控制器读数的名义位姿。这样能把机器人本体误差从标定链路中剥离出来。标定过程中使用更高质量的机器人运动指令比如让机器人以TCP速度极低的方式运动到目标点避免轨迹跟踪误差影响最终到位精度。在实际项目里我也会结合标定板图案本身的几何约束做后验校验。比如标定板上有两列圆点圆点间距已知标定完成后可以把相机测得的圆点间距跟标称值比对如果偏差明显说明整个视觉链路从内参到位姿解算都有问题。以我个人的操作习惯来说手眼标定不是标完就结束的独立环节而是整个机器视觉引导系统的持续监控对象。从设备进场调试到产线稳定运行我至少会做三次完整的标定和验证初装完成后的首次标定用于功能跑通连续运行一周后的复标检查是否有热机漂移或机械松动最终验收前的对标确定精度余量并归档数据。三次标定结果如果一致性在0.3mm以内这套系统的视觉引导精度才算真正让人放心。如果你正准备在自己的设备上开展手眼标定我的建议是别急着追求高级算法把标定板贴平整、把内参标准、把数据采好这些基本功做好绝大多数场景的精度问题都能解决。
阅读完成 · 觉得有帮助?
咨询建站