尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

视觉引导机械手抓取中的九点旋转标定:原理、实操与避坑指南

视觉引导机械手抓取中的九点旋转标定:原理、实操与避坑指南 搞视觉引导机器人抓取这行的基本都碰到过同一个让人抓狂的场景相机定位测得很准九点标定矩阵算出来了坐标映射看着也没问题结果机械手从拍照位挪到放料位再补一个旋转动作工件位置就开始飘。要么放下去偏个一两毫米要么角度一换连中心点都对不上。很多人第一反应是机械手精度不行或者相机没装正折腾半天发现真正的坑在于——标定的时候只做了九点标定没有把旋转这个自由度算进去。海康视觉这套体系里九点标定解决的是“图像像素坐标到机械手基坐标”的平面映射讲直白点就是告诉系统“像素点到底对应机械手坐标系里的哪个位置”。它本身也带旋转校正能力仿射变换矩阵里那几个参数能处理两个坐标系之间的固定夹角。但当机械手带着工件绕Z轴转角度放料时九点标定算不出旋转中心机械手到底绕着哪个点转视觉系统完全不知道这个信息一旦缺失旋转后的坐标必然偏。我这次要讲的“九点旋转标定”准确说是九点标定和旋转标定的组合方案适用于相机固定安装、机械手抓取后需要按角度放置的场景。内容从原理、配置、实操到排查一条链路讲完既有VM算法平台的操作思路也有我自己现场调了无数遍才琢磨出来的坑。如果你正在做视觉引导抓取项目或者被旋转偏移搞得头疼这篇文章应该能帮你少走几个月的弯路。1. 为什么九点标定在带旋转的场景下会翻车1.1 九点标定解决的本质问题先把九点标定的数学模型说清楚。它本质上是用一组仿射变换来描述图像坐标系和机械坐标系之间的关系矩阵形式长这样| Xm | | a11 a12 tx | | Xu | | Ym | | a21 a22 ty | x | Yu | | 1 | | 0 0 1 | | 1 |其中Xu、Yu是特征点在图像中的像素坐标Xm、Ym是对应的机械坐标。a11到a22这四个参数包含了缩放、旋转、切变的信息tx和ty是平移量。为什么叫九点标定因为理论上解这个矩阵至少需要3组对应点但实际中3组点对噪声极其敏感取9组构成一个覆盖视野的3x3网格用最小二乘去拟合才能把误差压下去。这也是工业现场约定俗成叫“九点”的原因并不是固定只能用9个点我实际做的时候经常取12个甚至16个点均匀分布比数量本身更重要。这里有个关键认知九点标定里确实带旋转项它能纠正的是图像坐标系相对机械坐标系的固定夹角。比如相机装歪了坐标系差个5度九点标定算出来的矩阵会自动把这5度吃掉映射结果照样准。很多人以为做完九点标定就万事大吉其实它校正的只是“坐标系的夹角”而不是“机械手旋转动作带来的位置偏移”。这两个旋转完全是两码事混在一起就是翻车的根源。1.2 旋转带来的是另一个自由度的误差想象一个场景相机固定在天花板上底下机械手吸起一个工件识别完位置之后要把工件旋转90度放到另一个工位。机械手的旋转轴末端和吸嘴中心严格重合吗实际上大部分设备做不到绝对重合。如果吸嘴中心和旋转轴中心之间有比如2毫米的偏差那么机械手旋转90度时工件中心就会以旋转轴为中心转一个圆弧最终位置偏掉将近3毫米。这个偏差在视觉识别出来的那一刻是不存在的因为相机拍到的只是当前角度下的位置旋转之后误差才暴露出来。用一个圆规来类比圆规的针脚扎在纸上笔尖绕针脚转一圈画圆笔尖走的是圆弧。如果针脚没扎在你想要的位置你把笔尖转到任何角度笔尖位置都不是目标位置。旋转标定要做的事情就是帮你找到那个“针脚”——也就是旋转中心到底在哪。找到了旋转中心再根据当前角度和目标角度的差值去计算抓取前应该预补偿的偏移量这样工件旋转之后中心点才能落在目标坐标上。2. 标定前怎么把相机、机械手和坐标系理顺2.1 相机安装方式对旋转标定的影响在做任何标定之前先确认相机的安装方式。常见的两种眼在手外相机固定在支架或天花板上机械手在相机视野内活动眼在手上相机装在机械手末端跟着机械手一起动。做九点加旋转标定的组合方案我强烈建议只在眼在手外的情况下用。原因不复杂眼在手外时相机姿态固定图像坐标和机械坐标的映射关系是一个稳定的二维平面变换标定一次能管很久。眼在手上的话相机随机械手姿态变化每换一个角度映射关系就变了用固定矩阵去套必然出错这种情况应该去做手眼标定而不是九点标定。视野设计也要提前想清楚。相机视野要覆盖工件实际出现的区域同时尽量让机械手旋转中心的投影落在视野范围之内。有时候旋转中心不一定在视野中心可能偏到边缘甚至看不到这时候旋转标定的精度就会大打折扣。现场条件允许的话调整相机安装高度和角度让旋转中心落在视野中间区域后续会省很多事。2.2 机械坐标的获取与坐标系约定九点标定里最关键的数据之一是九个点对应的机械坐标。很多人在这里栽跟头是因为机械坐标读取得不统一。机械手系统里有基坐标系、工具坐标系、用户坐标系之分九点标定要求所有机械坐标必须在同一个坐标系下读取。我常用的做法是把工具坐标系设在吸嘴或者治具的中心然后读取基坐标系下的X、Y、Rz值。注意Rz是绕Z轴的旋转角度做旋转标定的时候要用到。还有一个细节机械坐标的读数要从机器人控制器或者PLC里面取不要靠示教器上肉眼看的数字去记。实时的读取接口一般都有像TCP/IP、Modbus、Profinet这些常见协议直接把当前坐标读到标定程序里。手动去记9个坐标误差大不说来回切换界面还容易记串行。这个工作一定要自动化哪怕写个简单的串口助手去读坐标都能比人眼可靠得多。2.3 VM算法平台中需要准备的模块海康的VM算法平台VisionMaster做这个方案一般需要以下几个模块相机采集模块负责获取图像触发方式建议选软触发方便和机械手运动配合。图像预处理模块包括灰度化、滤波、二值化等目的是让特征点更稳定。模板匹配或圆查找定位模块找到特征点的像素坐标输出坐标值。点标定/九点标定模块输入像素坐标和机械坐标计算标定矩阵。坐标转换模块应用标定矩阵把识别到的像素坐标实时转成机械坐标。脚本模块用来做旋转补偿计算支持C#或者Python脚本。模块数量看着多实际搭起来也就几分钟的事。要注意的是标定用的流程和正式运行用的流程尽量分开。标定流程里把中间结果全部显示出来方便排查正式流程里只保留必要的模块减少耗时提升稳定性。我见过有人图省事标定和运行共用一套流程结果标定的时候把显示、保存图像的模块全跑一遍浪费了不少处理时间完全没有必要。3. 九点标定实操建立像素到机械坐标的基础映射3.1 选对特征点比选对标定板更重要九点标定的输入是“同一个物理点在图像中的像素坐标和机械坐标”。这个物理点怎么选直接决定标定精度。市面上有专门的高精度标定板陶瓷或者玻璃材质上面是圆形阵列圆心间距经过精密加工精度可以到微米级。用标定板的好处是特征点规整、圆心提取精度高坏处是贵而且现场不一定方便固定。很多时候现场不会给你精确的标定板我就用工件本身明显的特征比如一个圆的边缘、一个螺纹孔的中心、一个清晰的十字刻线。只要这个特征能被视觉模块稳定识别出来像素级重复精度能达到0.1像素以内就可以拿来当标定特征点。有一种很实用的做法做一个简易标定工装就是在机械手末端吸一个带高精度圆点的金属片或者玻璃片。把圆点当作特征点机械手移动到不同位置拍照提取圆点的像素坐标同时读取机械坐标。这个方案比固定标定板更灵活特征点一直附着在机械手上视野内的位置可以随意布点而且圆点特征好提取、精度高是我现场最常用的方式。3.2 九个点的采集流程采集流程我按下面的步骤走每一步都有明确目的把特征工装装到机械手末端确认吸嘴吸紧或者治具锁死不能有晃动。这里任何微小的松动都会直接变成标定误差而且是间歇性的那种特别难排查。示教九个位置分布成3x3网格覆盖视野的80%以上。网格范围最好略大于工件实际出现区域留出余量。注意九个点不要集中在视野中央否则外推区域的误差会非常大。机械手依次运动到每个位置到位后给相机发软触发信号拍照并提取特征点的像素坐标同时从控制器读取当前机械坐标。把9组像素坐标和9组机械坐标一一对应填入标定模块。这里有个容易搞反的地方机械坐标记录的是机械手当前的坐标不是特征点在机械坐标系下的绝对坐标。如果特征是装在机械手末端的那么机械手当前坐标和特征点之间只差一个固定的安装偏移这个偏移在旋转标定里会通过拟合旋转中心的方式一并处理。所以在九点标定阶段直接记录机械手的TCP坐标就可以不需要额外做偏移补偿后面旋转标定会统一解决。每移动到一个位置建议多拍几次图像看看特征点提取的像素坐标是不是稳定。如果重复拍照像素坐标波动超过0.3个像素先把视觉稳定性问题解决掉再往下走标定否则标定矩阵本身就不干净后面应用的时候误差会被放大。3.3 仿射变换的计算与VM关键参数解读把9组数据丢进VM的点标定模块之后模块内部会用最小二乘法解出六个参数a11、a12、a21、a22、tx、ty。VM会输出一个标定矩阵同时显示残差或者均方根误差。这个误差数值非常关键我判断标定质量的第一道关卡就是看它。不同的VM版本界面可能略有差异但基本都会有这几个参数需要注意标定类型选二维点标定不要选成手眼标定这两种数学原理完全不同。输入坐标顺序确认是先像素后机械还是先机械后像素搞反了矩阵就是逆的。标定矩阵输出记录参数后续坐标转换工具或者脚本里要用。残差/均方根误差这个值正常应该小于0.5像素超过1像素就要检查前面的流程是不是有问题。计算出矩阵之后还可以做一个直观的验证把九个点的像素坐标重新代回矩阵看算出来的机械坐标和实际记录的机械坐标差多少。这个残差和VM显示的均方根误差应该基本一致。如果某些点位残差特别大比如其他点都是0.2像素突然有一个点差了1.5像素大概率是那一个点的机械坐标记录错了或者机械手走到那个位置时有抖动。把异常点找出来重新采集比盲目重标定更高效率。4. 旋转标定实操把旋转中心精确找出来4.1 旋转标定的原理多个角度下的特征点轨迹是圆弧旋转标定的思路很简单机械手保持在某个基坐标点不动让末端绕Z轴旋转每旋转一个角度拍一张照片记录特征点的像素坐标。因为特征点固定安装在机械手末端离旋转中心有一段距离所以当机械手旋转时特征点在图像中的轨迹就是一段圆弧。这个圆弧的圆心就是旋转中心在图像坐标系下的投影位置。数学上已知圆上的三个点就能唯一确定一个圆但和九点标定一样的道理三个点对噪声太敏感。我一般会取8个或者12个角度覆盖范围尽可能大最好超过90度甚至360度。角度范围越大拟合出来的圆心越稳定。如果现场有障碍物限制转不了360度至少要保证角度跨度超过90度低于这个范围拟合出来的圆心误差会成倍增加。整个操作过程要注意一点机械手旋转的时候只改变Rz绕Z轴的角度X、Y、Z的坐标要保持不变。一些控制器存在联动或插补误差名义上只转了角度实际上位置也发生了微小偏移。这时候可以通过多次旋转取平均来降低影响但如果位置偏移太大说明机械手的绝对定位精度有问题需要先处理机械层面的问题。4.2 旋转中心的拟合计算旋转中心的拟合计算我在VM里一般用脚本模块实现。思路是用最小二乘法拟合圆算法也不复杂Python十几行就搞定了。下面这段伪代码展示了核心思路import numpy as np # points是不同角度下特征点的像素坐标格式为[[x1, y1], [x2, y2], ...] points np.array([(x1, y1), (x2, y2), (x3, y3), ...], dtypefloat) def fit_circle(points): # 使用Kasa方法拟合圆心适合点比较均匀分布在圆弧上的情况 x points[:, 0] y points[:, 1] # 构造线性方程组 A np.column_stack([2*x, 2*y, np.ones(len(points))]) b x**2 y**2 # 最小二乘解 result, _, _, _ np.linalg.lstsq(A, b, rcondNone) cx, cy result[0], result[1] r np.sqrt(result[2] cx**2 cy**2) return (cx, cy, r) center_x, center_y, radius fit_circle(points) print(旋转中心像素坐标:, center_x, center_y) print(旋转半径(像素):, radius)这段代码在VM的“全局脚本”模块里可以直接运行也可以放到外部用Python处理完之后把旋转中心的像素坐标填回流程里。需要解释一下Kasa方法它是把圆的方程展开成一个线性方程通过最小二乘拟合求解计算量小、速度快在圆弧覆盖完好、无离群点的情况下精度足够。如果点里有明显的异常点可以先做RANSAC过滤或者用更鲁棒的代数拟合方法不过我对现场数据做过对比控制好采集质量的前提下Kasa方法完全够用。拟合完之后旋转半径是一个很好的自检指标。这个半径的物理含义是特征点到旋转轴的水平距离单位是像素。如果半径忽大忽小说明机械手旋转过程中X、Y位置不稳定或者特征点没装紧。多次重复测量半径的波动应该在几个像素以内。4.3 通过九点标定矩阵把旋转中心换到机械坐标旋转中心算出来之后它还只是图像坐标系的坐标必须转换到机械坐标系才有实际意义。转换方法很简单直接套用九点标定得到的仿射变换矩阵。| Cx_m | | a11 a12 tx | | Cx_p | | Cy_m | | a21 a22 ty | x | Cy_p | | 1 | | 0 0 1 | | 1 |其中Cx_p、Cy_p是拟合出来的旋转中心像素坐标Cx_m、Cy_m是旋转中心在机械坐标系下的坐标。VM里的坐标转换工具可以直接完成这个运算不需要手算。这里有一个细节需要确认九点标定的矩阵是在某个特定的机械坐标位置下测得的而旋转中心在机械坐标系中是固定的眼在手外情况下所以矩阵可以直接套用。但如果旋转标定过程中机械手基座位置和九点标定时不一致需要先把坐标系统一到同一个基准上。得到旋转中心的机械坐标之后把它保存下来这个值在应用阶段会作为固定参数参与补偿计算。保存的时候多留几位小数不要四舍五入得太狠。旋转中心一两毫米的偏差在旋转90度后会被放大成同样量级的末端位置误差精度要求高的场合根本扛不住。5. 应用落地补偿逻辑怎么和九点标定串起来5.1 旋转补偿的坐标变换公式前面做了这么多标定工作最终目的都是落地到应用逻辑里。这里的核心是旋转补偿公式。先把变量定义好视觉识别出的工件中心机械坐标Wx、Wy视觉识别出的工件角度A_work目标放置角度A_target旋转中心机械坐标Cx、Cy角度差值delta_A A_target - A_work机械手实际应该到达的抓取坐标Gx、Gy补偿后的抓取坐标计算公式delta_A A_target - A_work cos_a cos(delta_A) sin_a sin(delta_A) Gx Cx (Wx - Cx) * cos_a - (Wy - Cy) * sin_a Gy Cy (Wx - Cx) * sin_a (Wy - Cy) * cos_a这个公式的本质是把工件中心相对旋转中心的偏移矢量绕旋转中心旋转delta_A角度。机械手先移动到Gx、Gy这个位置抓取然后旋转delta_A角度工件中心就会落在目标位置。我见过不少人在这一步脑子转不过弯来视觉识别出来的Wx、Wy是工件当前的实际位置为什么不直接在Wx、Wy抓非要跑到Gx、Gy抓原因前面说过直接抓取后一旋转工件就会绕旋转中心画弧最终位置必然偏。Gx、Gy实际上是“预补偿之后的位置”机械手按这个位置抓取再旋转工件才能正好到达目标点。如果机械手的TCP和旋转轴不是同一个点抓取坐标还要加上TCP到旋转轴的偏移量公式会复杂一些。不过在大多数应用里机械手的工具中心点已经设置在吸嘴中心旋转轴与TCP是对齐的上面的公式足够用。5.2 VM流程搭建与坐标输出配置VM正式应用流程按下面的模块顺序搭相机采集模块在触发信号到达时采集图像。图像预处理模块对图像做滤波、对比度增强确保特征区域稳定。目标定位模块使用模板匹配或圆查找输出目标工件的像素坐标和角度。标定转换模块调用九点标定矩阵把像素坐标转换成机械坐标。脚本补偿模块读入旋转中心坐标、目标放置角度、识别角度和识别坐标运行上面的补偿公式输出Gx、Gy。通信输出模块把Gx、Gy和旋转角度增量发给机械手或PLC。第5步是旋转标定和九点标定结合的关键环节。VM的脚本模块支持C#和Python具体用哪个看个人熟悉程度。我的建议是如果项目要交给别人维护用C#写注释清楚的脚本VM对C#的支持更成熟报错信息也更好懂。如果自己调试为主Python写起来更快。通信输出的时候除了Gx、Gy还要把delta_A一起发出去。机械手收到位置和角度之后运动到Gx、Gy旋转delta_A然后执行放置动作。这三个数据必须在同一帧里发出去并且和机械手的运动指令保持严格的先后顺序。否则视觉线程和运动线程之间不同步会出现位置和角度错配的问题表现出来就是工件位置偶尔偏、偶尔准毫无规律。5.3 精度验证与重复性测试的实操方法标定做完、流程搭好之后别急着上线先做一轮系统的精度验证。我的验证方法分三步第一步静态重复精度验证。把工件放在某个固定位置连续触发拍照和计算20次看输出的Gx、Gy波动范围。正常应该在0.1毫米以内如果波动超过0.3毫米先检查视觉模板匹配的稳定性再查机械手到位精度。第二步旋转精度验证。把工件放在同一位置设定不同的目标角度比如0度、15度、30度、45度、90度分别计算Gx、Gy并让机械手执行然后用千分表或者二次元测量仪测工件实际放置位置偏差。这步能直接验证旋转中心和补偿公式的正确性。第三步全场域精度验证。在相机视野的九个区域分别放工件重复第二步统计每个区域的定位误差。这个测试能暴露标定矩阵在大范围转换时是否存在畸变或外推误差。如果某个角落区域的误差明显偏大说明九点标定的网格范围可能没覆盖到位要重新标定或者增加标定点。我在现场做验证的时候习惯把每步测试的原始数据都记录下来包括像素坐标、机械坐标、补偿计算值、实际测量值。数据留得越全排查问题的时候就越是省力。很多现场问题不是现场就能立刻看出来的回头翻数据才能找到规律。6. 实战中踩过的坑与排查记录6.1 标定误差大先从这四个方向查如果九点标定的残差偏大或者应用验证的时候误差超标我一般按下面四个方向依次排查第一个方向是特征点提取稳定性。打开VM的图像显示窗口连续拍10张图看特征点像素坐标在图像里有没有跳动。如果有跳动优先检查光源——是不是有环境光干扰、光源频闪、反光点移动。海康相机对频闪比较敏感最好用DC供电的恒定光源避免PWM调光带来的亮度抖动。也可以提高曝光时间让图像的信噪比上去。第二个方向是机械坐标数据来源。确认机械坐标不是操作工手输的而是从控制器实时读取的。读取的坐标和机械手实际位置是否一致可以做一个简单测试示教机械手走一个100毫米的正方形从控制器读回坐标看四个顶点的相对关系是否准确。如果这都不准九点标定再怎么优化也没用。第三个方向是标定点的空间分布。九个点在视野里的分布是不是太靠近了如果网格范围只占了视野的三分之一矩阵在视野边缘的外推误差会非常大。重新标定把网格扩到视野的80%以上。第四个方向是机械手自身的重复定位精度。这个可以这样测示教机械手走一个点然后切换到不同路径绕一圈再回来多测几次记录坐标偏差。如果回差超过0.5毫米视觉标定的上限就被机械手卡住了再标定也突破不了这个瓶颈。这种情况要和机械调试人员沟通先解决机械精度问题。6.2 旋转中心算出来不对时的处理思路旋转中心算出来之后结果是不是合理有一个直观的判断方法旋转中心在机械坐标系下的位置应该是固定的它不会随着工件位置变化而变化。如果你在不同位置拍照做旋转标定算出来的旋转中心位置差得很大那问题基本出在采集质量上。常见的原因有三个。一是机械手在旋转时X、Y坐标发生了漂移控制器显示的角度变了但位置没锁住二是特征点固定不牢靠机械手旋转时特征点相对吸嘴滑动三是相机或镜头松动拍照过程中图像发生了微小位移。逐一排查先把机械和相机层面的问题排除掉再重新采集旋转数据。还有一种情况旋转中心算出来了但是应用验证的时候旋转后位置还是会偏。这时要检查补偿公式里的角度方向是否正确。视觉识别角度的正方向和机械手的旋转正方向不一致是很常见的问题。比如视觉里角度增大是顺时针机械手定义正方向是逆时针补偿公式里的sin项就会取反。这个问题的典型表现是不旋转时定位很准旋转角度越大误差越大且误差方向呈对称性。把公式里的delta_A取反再试一次往往立刻见效。6.3 常见问题速查表与独家避坑技巧现象可能原因排查方法九点标定残差突然变大标定板或特征点松动、光照突变重新采集固定工装检查光源旋转后工件位置整体偏移旋转中心坐标有误重新拟合旋转中心检查角度方向旋转后误差随角度增大而增大补偿公式角度方向反了将delta_A取反再验证工件在视野边缘误差大标定网格覆盖范围不够扩大标定范围增加标定点定位结果跳动但图像稳定机械手重复精度不足测机械手回差先处理机械问题旋转拟合半径波动大旋转时机械手位置漂移、特征点松动锁紧工装检查机械手轴向间隙VM坐标转换输出为0标定矩阵未加载或坐标系不对检查流程是否加载了标定结果文件最后分享一个我踩过很多次坑之后养成的习惯每次改完参数重新跑完标定验证一定把旧的标定矩阵文件备份一份。别嫌麻烦。有时候新标定结果反而不如旧的好得能快速回滚。VM里标定结果可以导出成文件我习惯按日期和标注命名比如“标定_20240115_视野80%_OK.xml”。项目上线前把最可靠的那份矩阵单独存一个固定路径正式流程只读这个路径下的文件避免误操作覆盖。别小看这个习惯关键时刻能救你一命。再做旋转标定的时候别忘了先确认机械手的Z轴高度和九点标定时保持一致。因为相机是二维成像不同高度下像素当量不一样标定矩阵也只在同一个高度下有效。如果抓取工件的高度有变化前面所有标定工作可能都要推翻重来。这也是为什么我没提Z轴补偿的内容——九点旋转标定这套方案本质上只适合工件高度固定的场景高度变化很大的场合老老实实去做带Z轴补偿的完整标定吧。
返回列表