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

机器人抓取不靠猜:视觉引导与手眼标定实战解析

机器人抓取不靠猜:视觉引导与手眼标定实战解析 ★ FEATURED ARTICLE
车间里的机械臂又抓空了。操作工老张把料筐里的铝件往里推了推设备继续跑下一轮没人知道这次抓空是因为上一道工序的定位销松了0.5毫米还是料筐被叉车撞偏了两个毫毛。这种场景在大多数工厂里每天都在重演大家早就习惯了——“机器人就这样你得多给它留点余量”。我干机器人应用这行十几年最怕听到的一句话就是“差不多能抓就行”。差不多就是赌。赌工件还在程序里那个固定点位赌托盘没被挪过赌上一道工序没给你留坑。而真正稳定的机器人抓取核心就一条不赌猜测让机器人自己看见、自己算、自己校验。这篇文章就把这件事拆开讲透从为什么不能赌到怎么做到不赌再到实际调试中那些文档里不会写的问题。这不是一篇纯理论的东西是我在产线上反复折腾、踩坑、返工之后总结出来的实操经验。如果你是做集成方案的工程师、搞机器人应用的开发或者自己搭过视觉抓取但总觉得“时灵时不灵”这篇内容应该能帮你少走不少弯路。里面涉及的数据、步骤、参数都是可以直接拿到现场对照使用的。1. 为什么说多数抓取系统其实都在“赌猜测”1.1 固定点位抓取的“三重不确定性”先给“赌猜测”下一个定义在不获取工件实际状态的前提下仅仅依赖预编程位置执行抓取动作。这句话听着有点学术落到产线上就是下面三个场景。第一个不确定性是工件位置漂移。上一道工序的夹具磨损了传送带停位精度从±1mm变成±3mm料筐换了一个供应商底部定位不一致这些都会让实际工件位置和示教点位之间出现偏差。你示教的时候用千分尺对着打的点跑两周之后可能已经偏出去两三个毫米了。第二个不确定性是工件本身姿态变化。这个在搬运、上下料场景里最突出。铸造件毛坯、锻造件、注塑件码放在料筐里的时候角度各异叠压、歪斜、互相卡住。固定位姿抓取对这种场景几乎无能为力——不是偏一点的问题而是姿态完全随机。第三个不确定性是外围环境变化。光照、震动、温度都会影响抓取系统的稳定边界。比如气动夹爪的工装用了半年开始磨损比如机械臂长期高速运行后各轴零点出现细微漂移这些慢变量不会让你马上失败但会在某个临界点突然批量抓空。1.2 “赌”的代价为什么越来越难以接受以前人工上下料时代这些偏差靠人眼补偿操作工顺手就调整了。现在设备替代人如果抓取系统还停留在“赌”的阶段代价是层层放大的。直接代价是停机。抓空之后机械臂还可能继续执行后续动作比如砸到工件、撞到料筐侧壁轻则报警停机重则损坏治具。一条节拍30秒的生产线停一次机可能影响的不只是那30秒还有整条产线的节拍紊乱。间接代价是质量事故。如果抓取位置不准放料就会不准。放偏了后续定位机构夹不紧加工尺寸发生变化等发现的时候可能已经做完一整批。我在一个铝件加工项目里就遇到过抓取偏差累积到放料端导致零件没落到位操作工没注意连续加工了四十多件报废率直接拉满。更深一层的问题是它不可预测。赌的系统失败是随机的、偶发的很难在事前控制。你没法在程序里预判“今天下午三点会抓空两次”只能等它发生了去处理。这和“不赌”的系统完全是两个逻辑前者是出了事补救后者是让机器人自己根据实时反馈调整动作从源头上消除随机性。1.3 不赌的核心让机器人具备感知-决策-校验闭环要摆脱赌猜测说到底就是给机器人补上三样东西感知、决策、校验。感知让机器人知道工件在哪、是什么姿态决策让机器人根据感知结果算出一个合理的抓取位姿校验确认这次抓取是否成功、是否需要修正。这三件事组合在一起就是我们常说的视觉引导闭环。把这个闭环做扎实了机械臂从“盲人摸象”变成“睁眼干活”抓取的稳定性完全不在一个量级上。后面几章我按实际落地顺序把这三件事拆开讲先聊系统架构怎么搭再讲视觉标定这个最容易被忽视的地基然后是位姿估计和抓取规划怎么算最后用一次完整项目复盘把整个流程串起来。2. 不赌的核心视觉引导闭环的系统架构2.1 系统有哪些模块各自干什么一套完整的视觉引导抓取系统物理上通常由四大部分组成机械臂本体、末端执行器夹爪或吸盘、视觉传感器2D相机或3D相机、控制与计算单元工业PC或机器人控制器。逻辑上则分成感知层、规划层、执行层。感知层负责采集数据、识别工件、计算位姿规划层负责根据位姿生成可达的、无碰撞的机械臂运动轨迹和抓取点执行层负责驱动电机和气动元件完成动作。这里面最关键的逻辑关系是感知层的输出必须直接作为规划层的输入而不是存一个固定值。很多项目做成半吊子——视觉识别出来了但程序还是只认示教的点等于白装了视觉。2.2 两种相机安装方式眼在手外与眼在手上的选择视觉引导抓取第一步就是确定相机装哪。两种主流方案眼在手外Eye-to-Hand相机固定安装在机械臂工作空间上方或侧方。适合抓取区域相对固定、工件不会大面积遮挡的场景比如流水线定点抓取、托盘码垛。它的优点是标定后视野稳定、不受机械臂运动影响缺点是如果工件堆叠或被机械臂本体挡住相机看不到。眼在手上Eye-in-Hand相机安装在机械臂末端法兰上跟着机械臂一起动。适合大范围扫描、料筐深挖、工件分布区域大的场景。优点是灵活性高可以移动到最佳观察角度规避遮挡缺点是每一帧图像对应的机械臂姿态都在变标定关系更复杂而且对相机体积重量有要求。怎么选我给一个实用判断标准如果工件分布在一个固定平面上选眼在手外简单可靠如果工件是三维堆叠、需要多角度观察选眼在手上。我见过最惨的项目就是料筐堆叠场景装了固定相机结果相机只能看到最上面一层下面全是盲区最后还得返工改结构。2.3 视觉传感器选型2D还是3D传感器选型也直接影响能不能“不赌”。2D相机只能提供平面像素坐标适合工件姿态基本不变、只有XY偏移的场合比如传送带上位置检测。3D相机能提供深度信息才能获得工件的完整六自由度位姿这是应对工件姿态随机变化的前提。目前工业界主流的3D方案有三类结构光精度高但易受环境光干扰ToF飞行时间速度快但深度精度相对低近景细节不足双目立体视觉被动式成像不依赖结构光但工件表面纹理不足时匹配容易失败。对于精密装配、定位类抓取优先考虑结构光或高精度双目对于分拣、搬运这类对绝对精度要求不那么苛刻的场景ToF也够用。挑选时记住一个公式深度精度至少优于抓取容差的1/3。比如夹爪开口容差是±1.5mm那么深度测量的标准差最好小于0.5mm否则视觉精度本身就吃掉绝大部分容差。3. 手眼标定与坐标变换——所有“不赌”的地基3.1 为什么说标定是抓取精度的天花板我把话放这儿标定不做好视觉算法再牛都是零。原因是这样的视觉系统识别出的是相机坐标系下的工件坐标而机械臂要在自己的坐标系里运动。两个坐标系之间的变换关系完全由手眼标定决定。标定误差是多少抓取误差就有多大的下限。举一组实际数据。我的一个项目里手眼标定误差大约0.8mm旋转误差折算到工作距离上的平移偏差加上视觉识别误差0.5mm夹爪定位误差理论合计约1.3mm。这个项目夹爪开口容差只有±1mm所以偶尔会抓偏。后来换了标定板、重做了标定流程标定误差降到0.3mm左右整个系统的抓取成功率从96.2%提升到99.7%。就这一个数字的变化反光、环境光、模型误差全都没变变的只是坐标系变换的准确性。3.2 手眼标定的完整实操步骤以最常见的眼在手外、固定相机场景为例标准流程如下准备标定板棋盘格或圆点阵列标定板贴在平整刚性平面上避免翘曲。我建议用陶瓷或玻璃基材的标定板精度比打印在纸上的高一个数量级。采集多组图像控制机械臂带着标定板在相机视野内移动采集至少15-20组不同位置、不同姿态的图像。关键是让标定板在视野内分布均匀覆盖各个区域和角度不要集中在中心。解算相机内参用OpenCV或Halcon等工具检测角点标定相机内参焦距、主点、畸变系数。获取机械臂位姿对于每组图像记录当前机械臂末端在机器人基坐标系下的位姿从控制器读出。求解手眼矩阵X利用方程AX XB求解。A是相机两次拍照位姿之间的变换B是机械臂末端两次位姿之间的变换X即相机坐标系到机器人基坐标系的手眼变换矩阵。常用Tsai-Lenz或Park-Martin算法求解。验证标定精度把标定板放在视野内几个不同位置用视觉识别标定板中心再让机械臂末端移动到识别位置看看实际偏差。满足项目精度要求才算完成。3.3 从像素坐标到机器人坐标的完整计算这一步很多新手容易犯迷糊我把完整链路写出来。假设通过图像识别得到了工件上某点在像素坐标系下的齐次坐标 p_pixel (u, v, 1)^T第一步用相机内参矩阵K去除畸变得到归一化相机坐标系下的坐标 p_cam K^(-1) · p_pixel。如果是3D相机这一步通常已经由深度图直接给出三维坐标不需要从像素反算。第二步用相机外参T_cam_to_base将坐标变换到机器人基坐标系p_base T_cam_to_base · p_cam。这个T_cam_to_base就是手眼标定求出来的矩阵。第三步结合工件本身的几何尺寸计算出夹爪中心的目标位置和姿态。逻辑并不复杂但执行中有一个极易出错的地方手眼矩阵是相机坐标系到哪个机器人坐标系的变换必须明确。有的项目里矩阵是相机到机器人基坐标系有的是相机到机械臂末端坐标系混用的话差几毫米到几十毫米都很正常。每次拿到标定结果先看一眼矩阵实际数值是否合理平移量量级的粗糙校验再做一次探针验证再投产这个习惯能省掉后面大量排查时间。4. 位姿估计与抓取点生成——把“猜”变成“算”4.1 从点云/图像到目标位姿的完整处理链路视觉识别工件本质是解决“它在哪、它朝向哪”的问题。3D场景下的常规处理链路是预处理点云降采样、去噪、去背景。去背景这一步在固定场景里非常好用——提前采集一张空料筐或空工作台的点云作为背景模型直接做差就能把工件点云剥离出来。目标分割对于单一工件或规则排列的工件可以用平面分割RANSAC提取平面剩余聚类或欧式聚类。对于堆叠、密集场景更推荐基于深度学习的实例分割Mask R-CNN来区分不同工件个体。位姿估计拿到单个工件的点云后与CAD模型点云做配准。工业界最常用的方法是ICP迭代最近点配准和PPF点对特征全局匹配。PPF不依赖初始猜测适合姿态完全未知的场景ICP精度高但需要较好的初始位姿所以常用“先用PPF粗配准、再用ICP精配准”的组合拳。输出位姿滤波连续帧之间目标位姿不会突变加一个中值滤波或一阶低通滤波能有效抑制跳变。我就遇到过视觉偶尔输出一个明显错误的位姿差了几十毫米幸好加了滤波才没有让机械臂冲过去抓空气。4.2 抓取点计算不是“看着能抓”就行有了工件位姿下一步是确定夹爪怎么接触工件。这里最容易犯的错误是“看着差不多”。真正靠谱的抓取点计算要考虑三个物理条件接触条件夹爪的两个手指或吸盘必须落在工件表面的可抓取区域避开孔洞、曲面、易碎位置。力闭合条件Force Closure两个接触点的法向量形成的摩擦锥必须能覆盖工件重力和可能的扰动。简单理解就是夹持方向要能“锁住”工件而不是一受力就滑脱。干涉条件夹爪在闭合路径上不能撞到工件其他部位或周边障碍。计算流程通常是在候选抓取点集合上做采样评分。工具上可以用开源库GraspIt!自动生成和评价抓取姿态也可以用MoveIt! 的Grasp Planning接口做运动规划可行性校验。最简单的工程做法是离散采样多个抓取方向用上面三个条件做布尔判断和评分过滤取最优解。这里我要特别提一个摩擦系数的问题。计算夹爪夹持力时公式是夹持力 F ≥ (m × g) / (2 × μ) × 安全系数假设工件质量m2kg夹爪与工件间摩擦系数μ0.4安全系数取2那么夹持力至少需要 F (2×9.8)/(2×0.4)×2 49N。很多人不查摩擦系数凭感觉调气压导致工件从夹爪里滑脱这在中高速运动场景里是致命的。4.3 堆叠抓取从“抓最近的”到“抓最对的”无序堆叠是抓取场景里最难的。核心问题不再是单个工件的位姿估计而是抓取顺序规划——先抓哪个才不会导致后面的工件更难抓。简单粗暴的方案是抓最上面的。实际中这常常不是最优解。我见过一个案例机械臂每次都先抓最顶上的工件结果那个工件面朝下、重心偏夹爪很难稳定接触反而频繁失败而旁边一个稍微靠下的工件姿态非常好抓取成功率高得多。改进做法是给每个候选目标打分权重包括可达性机械臂能不能无碰撞到达、抓取质量力闭合程度、接触面积、堆叠关系抓着这个工件时会不会拖动压住的其他工件、夹具适应性。这些因素加权排序后选最优抓取效率提升非常明显。实践数据是单纯抓最上层成功率约85%换成综合打分后能到95%以上且机器人每次抓完料筐剩余状态明显更规整。5. 实操实录一套典型视觉引导抓取流程的完整复盘5.1 项目背景与硬件配置去年我做一个汽车零部件毛坯上料项目。场景是这样的铸造铝件在料筐里无序堆放每个约1.8kg形状不规则机械臂要把它们一个个抓到加工中心的定位夹具上。硬件配置六轴工业机器人结构光3D相机工作距离800mm视野约600×450mm深度精度0.4mm电动平行两指夹爪行程可调支持力控工控机i716G内存NVIDIA T400 GPU。为什么选结构光因为工件表面是铸造哑光面ToF的深度精度不够双目在这种无明显纹理的金属件上容易匹配失败。5.2 标准流程七步每一步做什么、调什么整个抓取循环拆成七步每步都有明确的输入输出触发拍照机械臂运动到拍照位眼在手外的固定相机不需要这一步眼在手上需要先撤退到拍照点相机触发拍照并采集点云。这里要注意触发信号和运动完成的握手时序我用的是硬线IO触发延迟固定软触发容易有毫秒级抖动影响重复精度。点云预处理降采样体素尺寸1mm去除离群点邻域点数小于20的滤除背景扣除。耗时约80ms。工件分割与位姿估计先用聚类把点云分成不同工件个体然后对每个聚类用PPF匹配ICP精配输出各工件的6D位姿。耗时约300ms。抓取点计算对每个候选工件用前面说的评分函数计算最优抓取点包括夹爪接近方向、开口宽度、夹持力设定。这里的接近方向要尽量沿工件主轴的可行方向避免倾斜插入。运动规划与执行MoveIt!规划一条从当前位姿到预抓取点、再到抓取点的无碰撞轨迹。分段执行先快速移动到预抓取点离工件80mm再慢速直线逼近抓取点。慢速逼近速度设置在100mm/s以下这个环节直接影响抓取稳定性跑太快会把工件撞歪。夹爪闭合与确认闭合夹爪用夹爪的力传感器或编码器确认是否确实夹到了工件。这一步就是前面说的“校验”环节。如果夹爪闭合后开口宽度和预期差异过大判定抓取失败进入重试逻辑。搬运与放料抬起工件运动到放料位。放料时同样不要盲目下放——我加了接近传感器校验工件是否已脱离防止工件卡在夹具上导致下一轮撞机。5.3 关键参数与调试记录贴一组调试中的实测参数供参考参数初始值优化后说明视觉处理总耗时560ms380ms降采样参数和ICP迭代次数优化抓取成功率首抓89%97%主要靠标定优化和抓取点评分改进单件节拍16.2秒12.8秒运动速度曲线和路径缩短系统停机次数周5次1次增加失败重试机制后明显改善调试中一个重要的参数是夹爪容差阈值。我把工件真实宽度60mm±0.3mm输入系统夹爪闭合后如果实际开口大于62mm判定为没抓到如果小于58mm判定为夹到异物。这个阈值一开始设得太宽±3mm导致夹到半截工件没被发现后来收紧到±2mm问题消失。5.4 效果对比赌与不赌的差距有多大上线后跑了一个完整班次8小时实际抓取346件首抓成功335件成功率96.8%。其中失败的11件里有7件在重试逻辑后成功最终只有4件需要人工干预。相比之前纯示教点位的方案——那个方案同类料筐成功率不到70%随时需要人盯着——差距肉眼可见。最直观的感受是操作工终于敢离开设备去干别的了。这是“不赌”这件事最有价值的地方它把随机性变成可控的、可预测的设备不再是靠运气干活。6. 常见问题与排查技巧实录6.1 抓取偏移严重先查什么抓取偏移的排查顺序非常重要很多人一上来就调视觉算法走了弯路。按我的经验严格按下面的顺序排查第一步查机械。末端法兰有没有松动、夹爪有没有磨损偏移、工具中心点TCP值有没有漂移。用千分表打一下TCP实际位置和控制器示教值对比偏差大于0.5mm就先解决机械问题。第二步查标定。用前面说的探针验证法选视野内几个固定点视觉引导机械臂去触碰看实测偏差。如果某一区域偏差远大于其他区域大概率是标定板采集图像时该区域覆盖不足重新标定。第三步查视觉识别。在固定位置放标准件连续识别20次统计位姿输出的均值和方差。方差大说明识别算法不稳方差小但和真实值差得多说明算法有系统偏差比如模型尺寸错误。第四步查运动规划。有时候视觉输出对机械臂过去就歪。这可能是轨迹规划在接近段产生了曲线路径导致末端姿态在快接近时仍变化。解决办法是接近段强制使用直线插补如ABB的MoveL或KUKA的LIN指令。6.2 反光、透明、深色工件的识别怎么办金属反光件是最让人头疼的。结构光相机遇到镜面反射会产生大量飞点点云上全是噪点。三个实用处理思路改变观察角度让相机视线避免正对镜面反射方向稍微倾斜能大幅减少飞点。这个成本最低优先试。喷涂或表面处理如果是样件验证喷一层显影剂洗掉即可看看效果。量产不能每件喷但可以此验证“工件本身可识别”后续通过打光方案解决。多帧融合对于眼在手上的方案让机械臂在目标上方小幅移动拍2-3帧点云做融合可以有效抑制单帧飞点。透明件玻璃、亚克力则基本不能指望纯光学方案。工程上常见做法是加UV荧光漆标记点或改用2D相机配合背光检测轮廓再做2.5D定位。别在3D光学上死磕换思路更高效。6.3 抓取失败后怎么重试才聪明最简单的问题抓取失败后是原样重试同一个动作吗答案很明确不是。原样重试大概率还是失败因为失败往往由系统误差或位姿估计边界问题导致。聪明的重试策略按层级递增随机微扰重试在原抓取点上叠加一个随机偏移比如X/Y方向±5mm、绕Z轴旋转±5°绕过原来的不佳接触状态。这个实现最简单实测能挽回40%的失败。视觉重识别重试重新拍照、重新做位姿估计。有时首次识别受反光、遮挡影响位姿算偏了重拍一次换个视角就好了。抓取点重新规划重试不再用同一个评分函数而是强制选择另一个候选工件或该工件的次优抓取点。适合该工件本身姿态很差、成功率低的情况。安全回收机制连续失败超过两次机械臂放弃当前目标去抓别的工件同时把当前目标标记为“困难件”留待最后人工处理。这能避免机械臂在同一个工件上无限死循环。我给项目设备加的最后一道保险是如果连续三次重试均失败系统不再自动动作而是亮灯请求人工干预。别小看这个逻辑它能阻止最坏的情况——机械臂反复试抓把工件越推越深最终彻底无法抓取。写在最后抓取这件事从“赌”到“不赌”的转变我个人的体会是它更像是一个工程习惯的改变而不是某个单项技术的突破。视觉算法、标定、规划、力控每一项单独拎出来都不算黑科技但把它们串成一个闭环、按正确的顺序调校系统稳定性就会完全上一个台阶。调试的时候我有个习惯每个现场都保留一张“标定验证记录表”每次换线、换治具、换相机位置后强制做一次探针验证。这几分钟的成本换来的是一整天不用盯设备。另外记住一点你的系统再“不赌”也要设计好失败之后的应对策略因为环境是活的总会有你意料之外的情况一个体面的失败处理机制往往比完美的识别算法更能决定一个项目能不能顺利交付。
阅读完成 · 觉得有帮助?
咨询建站