ARTICLE DETAIL

资讯详情

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

9点标定原理与实操:从像素坐标到机械坐标的视觉定位精度提升

9点标定原理与实操:从像素坐标到机械坐标的视觉定位精度提升 1. 为什么视觉定位总是差那么几毫米9点标定解决的到底是什么问题1.1 一个真实的现场翻车场景我在3C行业做视觉引导项目时遇到过这么一件事设备在实验室里调试相机识别Mark点模板匹配得分0.98亚像素定位精度做到了0.05个像素我当时觉得这个视觉系统“稳了”。结果整套设备拉到客户产线视觉给机械臂发的坐标每次都和实际抓取位置偏了0.3到0.5毫米。0.5毫米在精密装配里足以让产品报废。客户现场的人说了一句话让我印象特别深“你们视觉识别不是挺准的吗怎么一抓就偏”这句话背后就是机器视觉里最容易被轻视、却最影响落地效果的一个环节——标定。识别得再准像素坐标和机械坐标对不上号视觉系统就是“睁眼瞎”。而9点标定就是解决二维平面里“像素坐标转机械坐标”这件事最经典、最常用、也最容易被做错的方法。这篇内容不是教科书式的理论搬运而是按我实际调机的经验把9点标定的原理、现场采点流程、求解代码、翻车原因、精度验收一次讲透。不管你是刚入行的视觉工程师还是带项目的技术负责人照着做基本能避开大部分坑。1.2 视觉引导系统的坐标链路从“看到”到“抓到”要理解9点标定先得搞清楚一套视觉引导系统里到底有几套坐标系。以最常见的“相机固定在上方机械臂在下方抓取”的场景为例像素坐标系图像上点的位置单位是像素pixel原点在图像左上角坐标记为(u, v)。图像物理坐标系像素坐标乘以像元尺寸换算成毫米单位mm这个一般只在相机内参标定时用。机械坐标系机械臂底座坐标系或运动平台坐标系单位mm记为(X, Y)示教器上读到的就是它。视觉识别做的是第一件事拿到工件上的特征点在图像里的像素坐标(u, v)。机械臂执行的是另一件事让末端移动到机械坐标(X, Y)。两套坐标系之间的对应关系必须靠标定矩阵搭桥。9点标定做的事情就一句话采集N组“像素坐标 ↔ 机械坐标”的对应点对算出两组坐标之间的数学变换关系。后面视觉再给任意一个像素坐标系统就能算出机械臂该去的机械坐标。所以9点标定不是“提高识别精度”的手段它解决的是“坐标系统一”的问题。1.3 什么时候用9点标定什么时候必须上三维手眼标定这个边界很多新手搞混。9点标定适用于二维平面场景工件始终在一个平面上运动相机光轴基本垂直于该平面机械臂末端也在这个平面上工作。典型场景包括流水线上的平面抓取、XY运动平台上的对位贴合、屏幕/PCB板上的定位。如果工件有高度差、需要从不同角度抓取、或者相机装在机械臂末端跟着动那就要考虑三维手眼标定求相机坐标系到机械臂末端坐标系的位姿变换矩阵外参。三维手眼标定要复杂得多涉及旋转矩阵、平移向量、轴角或四元数求解不在本文讨论范围。但注意一个细节即使相机装在机械臂末端眼在手上如果你只在固定高度做平面抓取很多项目里依然可以用9点标定先建一个“该高度下的像素到机械坐标映射”。映射只对这个高度有效换高度就要重新标。理解了这一点你在方案设计阶段就能少走弯路。2. 9点标定的数学内幕从像素坐标到机械坐标的映射模型2.1 两套坐标系之间的线性关系从哪来理想情况下相机光轴垂直于机械平面镜头没有畸变那么像素平面和机械平面之间就是平面上的线性变换包括平移、旋转、缩放、错切。用数学表达就是仿射变换X a0 a1*u a2*v Y b0 b1*u b2*v写成矩阵形式更直观| X | | a0 a1 a2 | | 1 | | Y | | b0 b1 b2 | x | u | | v |这里要理解系数矩阵里每一项的物理含义。a1、b2控制缩放和旋转a2、b1控制错切a0、b0控制平移。当相机坐标系和机械坐标系之间存在一个固定角度时a1、b1、a2、b2就是一组耦合的三角函数关系所以不要试图单独调某个系数直接整体求解才是正确做法。你可能要问现实中相机安装不可能完全垂直光源和镜头畸变也存在这个模型是不是太理想了答案是在视野不大、畸变不严重、平面度够好的情况下仿射模型已经够用如果误差超标再上更复杂的模型这个我在2.3节展开。2.2 为什么是9个点冗余观测是精度来源一个仿射变换有6个未知参数a0, a1, a2, b0, b1, b2。理论上采3个不共线的点列6个方程就能解出6个未知数。那为什么业界普遍用9个点因为任何一个点的像素坐标和机械坐标都有提取误差和示教误差。用3个点求解任何一个点差0.1像素结果就跟着差而且你根本不知道哪个点不准。用9个点求解相当于用9对观测值去拟合6个参数方程数多于未知数这就成了最小二乘问题。最小二乘的实质不是“满足所有点”而是“让所有点的整体误差平方和最小”个别点的随机误差会被其他点拉平。用大白话讲3个点就是三条腿的凳子看着立得住稍微一根腿短就歪9个点是九条腿的凳子单根腿有点小毛病整体依然稳。9这个数字是工业实践里权衡出来的点太少冗余不够点太多采点累死人且视野边缘畸变影响变大。2.3 仿射变换与透视变换你的安装方式决定模型选型有些工程朋友会问我看Halcon里标定用的是vector_to_hom_mat2dOpenCV里对应findHomography那是透视变换单应矩阵不是仿射变换和你说的6参数模型不是一回事吗对这是很多教程没讲清楚的地方。两种模型的区别在这里对比项仿射变换透视变换单应矩阵参数数量6个8个3x3矩阵固定一个尺度最少点数3个4个建模能力平移旋转缩放错切在前者基础上增加透视收缩效果适用条件光轴垂直、畸变小相机倾斜安装、透视变形明显求解方式最小二乘直接线性变换或RANSAC如果你的相机和机械平面夹角超过几度或者镜头畸变在视野边缘比较明显用仿射变换拟合视野边缘的重投影误差会呈现“中间好、四周差”的放射状分布。这时改用单应矩阵它能补偿一部分透视变形。我个人的选型原则是项目一开始就用单应矩阵求解毕竟8参数模型比6参数模型更能包容安装误差而且OpenCV一条findHomography就搞定了。但博文下面的主代码还是从最小二乘仿射变换讲起因为它的求解过程最直观能把“最小二乘到底在算什么”这件事讲透。3. 现场实操全流程从采点到求解矩阵的详细步骤3.1 准备阶段的标定板与Mark点选型很多项目没有精密标定板这没关系。9点标定不要求你有一块光学级标准板核心是“每个点的机械坐标能被高精度示教出来每个点的像素坐标能被稳定提取”。我用过几种方案精密陶瓷标定板精度最高适合对精度要求苛刻的项目但贵且一般需要专业光源配合。金属板上激光打点在平面板上用激光打9个十字或圆点点的位置用三坐标测量机测出实际坐标再用这个坐标代替示教器读数。适合机加工行业。打印棋盘格或圆阵列最省钱A4纸打印即可。注意贴在平整的铝板或玻璃上别贴在不平的纸箱上。适合验证阶段和精度要求不高的项目。不管用哪种关键就一条标定点的物理位置在被相机识别和机械臂示教的整个过程中不能有任何移动。一次标定过程中标定板必须牢牢固定不能中途换位置否则数据全废。3.2 采集9个点的完整过程顺序、姿态、记录标准采点流程我总结为下面几步每一步都有讲究固定相机和标定板保证9个点都在视野范围内且分布尽量覆盖整个工作区域。用示教器把机械臂末端移动到第1个标定点让工具末端正好压在点上记录当前机械坐标(X1, Y1)。用视觉程序识别同一个点记录对应的像素坐标(u1, v1)。重复步骤2和3把9个点全部采完得到9组点对。这里有个多数教程不会强调的细节示教这些点的时候机械臂每次要按同一个方向运动到目标点。为什么要这样因为机械臂和运动平台都有回程间隙不同方向逼近同一个物理位置实际停下来的位置可能差0.02到0.1毫米。方向不一致等同于往数据里灌入随机误差。所以现场执行时我通常让设备按“从左到右、从下到上”的S形路径走每个点都从同一个方向压入。还有一个细节每采完一个点最好隔半秒再读坐标等机械臂完全停稳、震动消失后再记录。别小看这个停顿臂长的大机械臂停车瞬间有微小抖动示教器显示的数字跳变时读数误差很大。3.3 数据处理里的坐标系方向陷阱这是我最想提醒的部分。图像坐标系的原点在左上角u轴向右v轴向下而机械坐标系通常原点在机械臂底座或平台左下角X向右Y向上。这意味着同一个标定点它的v坐标越小机械Y坐标反而越大。如果你把数据不加处理直接扔进求解器也能解出一组矩阵但你会发现映射结果完全不对甚至X和Y互相颠倒。处理方式有两种第一种是在采集数据时把机械Y取反或者把图像v取反保证两套坐标系的轴方向一致第二种是不改变数据让最小二乘自己去拟合这个负的缩放关系模型里体现为a2或b1出现负的大系数。第二种是可行的但不利于你肉眼检查数据的正确性。我建议数据组织时先做一步可视化检查把9个点的像素坐标画出来把9个点的机械坐标也画出来两个点云的形状轮廓应该高度一致只是位置和角度不同。如果轮廓明显发生了镜像翻转说明某套坐标系的轴方向和预期不符赶紧回去核对采点记录而不是继续往下求解。4. 一段能直接跑通的标定求解代码Python NumPy 实现4.1 数据组织方式先看完整代码。下面的示例里p_pix是9个点的像素坐标p_mech是对应的机械坐标。实际项目中这两组数据来自你的视觉程序和示教器记录直接替换即可。import numpy as np # 像素坐标 (u, v)单位pixel来自视觉识别结果 p_pix np.array([ [123.7, 356.2], [358.1, 358.6], [592.5, 359.1], [122.4, 204.9], [356.9, 205.3], [591.3, 204.8], [121.6, 53.6], [355.8, 54.1], [590.1, 53.4], ]) # 机械坐标 (X, Y)单位mm来自示教器读数 p_mech np.array([ [100.0, 200.0], [150.0, 200.0], [200.0, 200.0], [100.0, 250.0], [150.0, 250.0], [200.0, 250.0], [100.0, 300.0], [150.0, 300.0], [200.0, 300.0], ])注意观察我构造的数据机械坐标Y从200增加到300时像素坐标v从356附近减小到53附近。这正体现了上面说的“图像v轴向下机械Y轴向上”的关系。真实项目中你必须确保两套数据的对应关系没有错位。4.2 最小二乘求解从线性方程组到lstsq接下来构造线性方程组。仿射模型里X和Y各自的映射函数是独立的所以可以分别对X坐标和Y坐标做两次最小二乘求解。# 构造系数矩阵 A每一行是 [u, v, 1] A [] for (u, v) in p_pix: A.append([u, v, 1]) A np.array(A) # 目标向量分别是机械坐标的 X 和 Y b_x p_mech[:, 0] b_y p_mech[:, 1] # 最小二乘求解 mx, *_ np.linalg.lstsq(A, b_x, rcondNone) my, *_ np.linalg.lstsq(A, b_y, rcondNone) print(X 方向系数: a0{:.4f}, a1{:.4f}, a2{:.4f}.format(mx[2], mx[0], mx[1])) print(Y 方向系数: b0{:.4f}, b1{:.4f}, b2{:.4f}.format(my[2], my[0], my[1]))np.linalg.lstsq内部用的是SVD分解数值稳定性比直接求逆好得多即使A矩阵接近奇异也能给出一个可用的解。这就是为什么不要在代码里手写inv(A^T A) A^T b大数据量或点分布不佳时直接求逆容易数值爆炸。映射函数写出来是def pix2mech(u, v): X mx[0] * u mx[1] * v mx[2] Y my[0] * u my[1] * v my[2] return np.array([X, Y])跑完这段代码后把9个点的像素坐标回代和真实机械坐标对比你会看到每个点的映射误差也就是“重投影误差”。在我编造的这组数据里误差基本在0.001毫米量级因为数据本身是人为生成的。真实项目中误差通常在0.02到0.1毫米之间这取决于你的采点质量和模型匹配度。4.3 更推荐的单应矩阵方案OpenCV一行搞定如果你用仿射变换拟合后发现视野四周的重投影误差明显比中心大说明透视变形不可忽略。这时候改用单应矩阵更合适。OpenCV里实现非常简单import cv2 import numpy as np H, mask cv2.findHomography(p_pix, p_mech, cv2.RANSAC, 3.0) print(H) def pix2mech_homography(u, v): pt np.array([[[u, v]]], dtypenp.float32) out cv2.perspectiveTransform(pt, H) return out[0][0]cv2.findHomography输入的点顺序是srcPoints像素坐标、dstPoints机械坐标返回的3x3矩阵可以把像素坐标映射到机械坐标。RANSAC模式会剔除个别误匹配点对标定数据里有坏点的情况特别有用。但注意RANSAC的阈值3.0表示“距离内点模型3个像素以内的点算内点”如果采点质量差这个阈值要调大如果设得太小可能把有效点都剔掉。我实际项目里的做法是两种都算一遍仿射结果和单应结果的重投影误差如果相差不大优先用仿射因为它参数少、对外推更稳健如果单应明显优于仿射说明安装倾角或畸变大就用单应同时顺便检查一下相机安装是不是太斜了。5. 标定精度翻车的常见原因与排查链路5.1 典型翻车案例第5个点之后数据全乱有一次我在现场给一套上下料视觉系统做标定9个点采完跑完求解代码重投影误差离谱最大误差竟然有30多毫米。我第一反应是模型错了换了单应矩阵也一样。随后我把9个点的误差单独列出来发现前4个点误差都在0.02毫米以内从第5个点开始突然变成几毫米到几十毫米。我回头查采点过程终于发现问题前4个点我是沿着平台X方向逐个示教的到了第5个点现场操作人员觉得“这么走太慢”改成了让机械臂自动走最短路径到第5个点。这一下问题就大了——机械臂从不同方向过去关节姿态发生了变化再加上Y轴回程间隙实际停下来的位置和示教器显示的位置偏差被放大了。这个案例给我们的排查思路是先看误差分布是整体偏差还是局部突变。整体偏差比如所有点误差都朝一个方向偏多半是坐标系方向反了或标定板整体错位局部突变只有个别点差基本可以断定是采点质量问题不是算法问题。5.2 回程间隙和机械震动你看到的坐标不等于实际停到的位置9点标定一个最隐蔽的误差源就是“示教器读数≠机械臂实际位置”。机械臂的绝对定位精度本来就有误差一般工业六轴机器人绝对精度在0.1毫米量级高精度的能做到0.03毫米。这意味着你示教器上显示(X, Y)机械臂实际可能停在(X0.05, Y-0.02)。这个误差无法通过算法消除因为标定的目标值本身就是带误差的。能做的就是尽量把机械误差降到最低标定时让机械臂末端位姿和实际抓取时一致、所有点从同一方向逼近、避免使用大臂展末端易下垂的姿态。另外一个容易忽略的问题是机械臂带着负载示教。如果标定时末端是空的实际抓取时候末端装了夹具和工件机械臂末端的下垂量会变化9点标定的结果自然不准。正确做法是带着真实夹具、在真实工作姿态下标定。5.3 镜头畸变边缘点为什么总差一点如果你的9个点覆盖了整个视野而镜头畸变没有补偿你会发现重投影误差呈现出“中心小、边缘大”的规律。这不是采点问题是模型本身就没能力描述畸变。处理方式有两种。第一种是先用相机内参标定得到畸变系数对图像做去畸变处理后再做9点标定。这样像素坐标已经是“理想无畸变”坐标9点标定的线性模型精度就能上来。第二种是在9点标定里直接用更复杂的多项式拟合比如加入u²、v²、u*v项。但这种方法参数变多至少需要15个以上的标定点现场采点成本高不推荐作为首选。我踩过的一个坑是标定板打光不均导致同一个圆在不同位置提取出的圆心有系统性偏移。后来换了低角度环形光源问题立刻解决。记住标定时的成像条件必须和生产时的成像条件一致光照一变像素坐标提取就变标定矩阵也跟着失效。5.4 完整排查链路从重投影误差图定位问题如果你标定完发现精度不行按这个链路一步步排查基本能定位80%的问题先把每个点的重投影误差按编号打印出来观察误差分布。如果是中心小、边缘大优先怀疑镜头畸变做内参标定加去畸变。如果是个别点突变检查这些点的采点顺序、方向、回程间隙条件允许就重采这几个点。如果是所有点误差方向一致检查机械坐标和像素坐标的轴方向、符号是否反了。如果误差随机且均匀偏大检查标定时机和目标自身的平整度、打光一致性、机械臂末端姿态是否和实际一致。最后再做一次留一验证确认不是个别坏点影响整体。这套链路我在培训新人的时候反复讲因为大部分标定翻车都不需要动代码现场花十分钟检查数据质量就能解决。6. 标定之后的验证与精度评估如何判断你的矩阵能干活6.1 重投影误差该怎么看重投影误差就是“标定点原始机械坐标”和“用矩阵把相同点的像素坐标映射出来的机械坐标”之间的差。这个指标直接反映了你的标定模型对已有数据的拟合程度。单位是毫米。要注意重投影误差小不代表系统实际精度高。因为它只是“拟合训练数据”的误差如果某个点采错了但恰好其他点也包含类似误差最小二乘会把误差摊开重投影误差可能依然好看。所以重投影误差只能作为参考不能作为唯一验收标准。6.2 留一法验证揪出偷偷捣乱的坏点我最推荐在现场做的一个验证是留一法交叉验证把9个点里拿8个点用来求解矩阵用剩下1个点做验证预测它的机械坐标并和实际记录值对比记录误差。循环9次每次留不同的点最后得到9个验证误差取平均值和最大值。这样做的好处是如果某一个点是坏点用包含它的8个点拟合时它自身的误差会拖累矩阵导致其他点的验证误差偏大而专门留它验证时预测误差会非常大。通过观察哪一轮验证误差明显偏高就能定位到哪个点不可靠。这个过程不用写很多代码把上面那个求解函数包一层for循环就行。6.3 真实抓取测试最终验收必须看这个矩阵算完、重投影误差也漂亮接下来必须做真实抓取验证。方法很简单让视觉识别一个随机放置的工件系统自动计算机械坐标并让机械臂去抓观察每次抓取的位置一致性和准确度。至少要测10次以上看重复精度和绝对精度。在真实测试环节判断标准通常是精度等级最大误差范围典型应用粗定位±0.5mm以上大件搬运、码垛、上下料精定位±0.1mm~0.3mm一般装配、锁螺丝、贴合高精度±0.05mm以内精密装配、芯片贴装、微型件插装注意真实抓取误差是视觉识别误差、标定误差、机械臂重复定位精度、夹具误差的总和不是单靠标定就能决定的。如果你的系统精度要求±0.05mm视觉标定部分至少要做到±0.02mm以内否则后端没有任何余量。6.4 精度还是不够三个升级方向当你做完以上所有优化标定精度仍然不能满足需求时按这个顺序考虑升级第一先做相机内参标定和畸变校正这是性价比最高的升级一个棋盘格加几行代码就能完成。第二增加标定点数量并覆盖整个视野比如从9点增加到16点甚至25点用更高阶的映射模型拟合畸变带来的非线性误差。第三从硬件层面改善比如换更高分辨率的相机、更小视场角度的镜头、更稳定的光源、更高精度的机械臂或运动平台。说到底9点标定解决的是“软件能把像素坐标换算成机械坐标”这件事它的上限受制于硬件和采点质量。理解了这个边界你就能在方案阶段准确判断该用什么精度的相机和机械臂而不是等问题暴露后到处找标定的锅。我自己的经验是90%的现场标定问题都不是算法不够好而是采点过程不够严谨、坐标系细节没核对清楚把基本功做扎实9点标定比想象中要可靠得多。
返回列表