搞了这么多年机器人视觉项目,从前期技术交流到进场安装调试,再到最终验收交付,我发现自己真正长记性的地方,不是在办公室里对着PPT做方案的时候,而是在客户现场被现实狠狠教育的那几次。最近整理手头的项目笔记,翻到去年那个视觉引导上料项目从进场到交付的全过程记录,踩过的坑密密麻麻写了好几页。这篇东西就把这些坑和对应的处理方式整理出来,给准备做或者正在做机器人视觉项目的朋友一个参考,尤其是那些从方案阶段一路跟到现场交付的工程师,应该能少走不少弯路。
1. 进场阶段:先看产线,再谈相机
多数人以为视觉项目进场后的第一件事是开箱装相机,实际上这一步应该放在最后。真正的第一步,是重新把客户现场的产线完整走一遍,带着卷尺、照度计和秒表,把图纸上没画出来的实际情况摸清楚。
1.1 勘察现场时必须留意的五个细节
第一个细节是来料的一致性。视觉引导的逻辑是“看到什么抓什么”,但前提是物料本身的状态要相对稳定。我去过的一个客户现场,他们的料框用了三年多,底部定位销磨损严重,料框放上去之后每次的位置偏差能到十几毫米。这种偏差视觉能做,但如果前期只按“料框摆放误差正负2毫米”来设计视觉方案,后期肯定要返工。所以进场后第一件事,必须拿实物反复装填、定位、取走,实际测量来料的最大波动范围。
第二个细节是机械臂的实际可达空间。很多项目的视觉安装位是照着机器人工作半径图画的,但现场往往有防护围栏、料架、气动管路挡着,实际可安装位置比图纸上小得多。有一个项目就是因为现场横梁遮挡,导致相机原本规划的安装高度被迫降低了200毫米,视场跟着缩了一圈,原本的定位算法参数全部要重调。这个在进场勘察阶段就该用激光测距仪和水平仪把现场实际尺寸核实一遍。
第三个细节是地面振动。视觉对振动极其敏感,尤其是固定在高处的相机支架,哪怕只有零点几毫米的抖动,反映到工件坐标上就是几个毫米的误差。我见过一个项目,产线旁边就是AGV通道,AGV一经过,相机画面就肉眼可见地晃。后来没办法,给相机支架加了两根斜撑才稳定下来。勘察的时候一定要问清楚:附近有没有AGV、冲床、空压机这类周期性振动源。
第四个细节是光照的周期性变化。工业现场不是实验室,白天有阳光从窗户照进来,晚上工人开日光灯,不同时段的光照条件完全不一样。做视觉方案要拿到客户车间窗户的位置、朝向、遮阳措施,还有照明灯具的类型和布置。这个细节选光源的时候特别重要,后面会细说。
第五个细节是产线操作工的实操习惯。很多项目验收时操作工给出的负面反馈,都源于最初设计时没有考虑他们的使用习惯,比如放料时随手一推、按钮连按两下、不清空料框就启动。这些问题虽然看起来是“人”的问题,但最终都会变成视觉系统的误识别和漏抓。进场阶段最好花半天时间站在工位旁边,看工人实际怎么操作,而不是听客户经理怎么说。
1.2 光照、振动、粉尘——现场三座大山
这三个环境因素是我在所有现场踩坑最多的领域。
光照问题表现为环境光的不可控性。车间窗户在下午两三点会有直射阳光,大面积反光打在料框边缘,会让原本清晰的工件轮廓出现强烈光斑。解决方法是加遮光罩、用偏振光源,或者干脆选主动光源功率足够大、把环境光“压下去”。但也有一种情况是环境光在晚上突然变暗,原本正常的图像也跟着变暗,所以视觉系统的相机曝光参数要留出余量,最好做动态自适应。
振动问题的难点在于看不见摸不着,但精度就是上不去。我调试过一个项目,静态拍照定位精度0.3毫米以内,机器臂一动起来精度就掉到1毫米以上。排查到最后发现问题出在相机支架的共振频率与机器人运动频率接近,机器人加减速时整个支架跟着荡。这种问题的隐藏性很强,建议做视觉方案时就用“刚性冗余”的思路,支架用方管而不是铝型材,能加筋的地方都加上。
粉尘和油雾问题更容易被忽视。视觉项目大多数要配光源和相机镜头,表面沾灰之后图像对比度明显下降,尤其是在打磨、焊接、切割工位附近。我建议在方案里强制加入镜头防护罩和气吹装置,耗材预算里多算一份清洗耗材,而不是等到客户打电话说“视觉识别率变低了”再跑现场。
1.3 节拍核算:视觉速度不够,方案再好也白费
节拍是视觉项目中最容易被低估的指标。客户会说“节拍大概是10秒一件”,但等你到了现场一掐秒表发现,含上下料也就7.5秒,视觉能占用的时间只剩下1.2秒,这里面的坑就深了。
视觉系统的完整流程包括:触发信号接收、相机曝光、图像传输、算法处理、坐标发送、机器人动作等待,这几个环节加起来才是视觉占用的总时间。很多工程师只关注算法处理速度,忽略了前面相机曝光和图像传输的时间。工业相机在触发模式下曝光时间可能到5毫秒到50毫秒不等,GigE接口传输一张500万像素的图像大约在30到80毫秒,这些时间都是跑不掉的。
建议进场时就把完整的节拍表拉出来,明确每个环节的时间预算。如果视觉允许时间在2秒以内,尽量选全局快门相机,配合光源频闪同步,把曝光时间压到最短。如果视觉允许时间只有不到1秒,那么很可能需要拆分成“粗定位+精定位”两级视觉,或者调整机械动作时序,让机器人在运动中完成部分预判。
2. 方案设计:选错相机型号,后面全是泪
方案设计阶段是决定项目成败的关键,但也是最容易按“惯性思维”做决定的时候。很多时候我们只图省事,沿用上一个项目的相机型号和光源配置,结果到现场一测,发现精度差、反光强、视野不够。这一步是必须认真对待的。
2.1 选2D还是3D,关键看高度波动
业内对2D视觉和3D视觉的选择有个很实用的判断依据:工件的摆放高度波动是否超过视觉系统的景深容忍范围。
2D视觉的本职是二维平面上的定位,对于XY位移和旋转角度很擅长,但Z轴高度一变化,图像放大倍率就会变,因为相机离工件的距离变了。假设一个镜头的工作距离是500毫米,工件高度变化10毫米,图像缩放比例就变化了2%,如果工件本身的尺寸是100毫米,那么边缘位置就会偏差2毫米。对于抓取项目来说,2毫米的偏差往往就意味着抓偏甚至掉料。
所以我的经验是:如果工件高度波动小于3毫米,2D视觉加普通镜头完全可以应对;如果波动在3到10毫米之间,考虑加装激光测距传感器,实时补偿高度带来的缩放误差;如果波动超过10毫米,或者工况本身要求应对多层堆叠、正反混装这类复杂姿态,直接选3D视觉方案更稳妥。
现在的tva视觉引导机器人方案里,很多也采用“2D大视场粗定位+3D小视场精定位”的组合,先找到物料大致方位,再精细计算抓取点和姿态。这种思路的好处是兼顾了节拍和精度,但成本也相应上升,方案设计时需要提前和客户明确预算边界。
2.2 眼在手上还是眼在手外,别只看安装方便
“眼在手上”(Eye-in-Hand)是把相机装在机器人末端法兰上,跟着机械臂一起移动;“眼在手外”(Eye-to-Hand)则是把相机固定在工位上方或侧面,机械臂独立运动。
这两个方案的实际差异非常大。眼在手上的优点是近距离贴近工件拍摄,视野可以做得很小,精度很高,而且可以跟随机械臂在不同工位间移动,一个相机覆盖多个工位。缺点是每拍一张图,机器人就要移动到位、停顿、拍照、计算结果,这会占用额外的节拍时间;另外相机跟着机械臂长期运动,线缆的拖拽磨损和接插件松动是很大的隐患。
眼在手外的优点是拍照时机器人不需要停顿,可以提前抓拍,节拍更优;相机固定,稳定性好,维护方便。缺点是对视野范围要求大,精度受限于工作距离,而且容易被机械臂本身遮挡。
我给客户做方案时,如果是高速分拣、上料这类节拍敏感的场合,优先推荐眼在手外,让视觉提前给机器人一个目标坐标;如果是装配、对位这类需要精细定位的场合,眼在手上的近距离小视野反而更合适。也有折中方案:相机固定在机械臂之外,但加装一个可调整的云台,拍照时云台转动找最佳角度。总之,“安装方便”不应该成为首要决策因素。
2.3 光源和镜头搭配的实际讲究
光源选型比很多人想象中更讲究。从颜色上分有白、红、蓝、红外,从结构上分有环形、条形、同轴、穹顶,不同搭配对图像效果的影响是颠覆性的。
环形光源适合表面光滑的工件,可以突出边缘轮廓;条形光源斜照适合检出表面划痕和凹凸;同轴光源适合反光较强的镜面物体;穹顶光源适合半球形或曲面物体,能够提供均匀漫射。实际项目里,先用物理手段把图像质量问题解决掉,再谈算法。我见过太多人一上来就写几百行图像处理代码,结果问题出在光源角度不对——光源摆正后,原本复杂的背景分割只需要一句二值化就搞定。
镜头的核心参数是焦距、光圈和畸变。视觉定位项目里推荐用固定光圈、手动对焦的工业镜头,避免自动光圈导致画面亮度波动。畸变是另一个被忽视的地方:普通镜头的桶形畸变在视野边缘能达到几个像素,如果工件摆放在视野边缘,定位精度会明显下降。解决方法是选低畸变工业镜头,或者用标定板做畸变校正。我的习惯是方案里直接标配畸变校正,不做全视场像素当量均匀假设。
光源触发同步是一个细节中的细节。视觉拍照的瞬间,光源要以极短的闪光时间和相机曝光保持同步,这样环境光的影响会被极大削弱。这个功能一般叫“频闪触发”,配合控制器或PLC的信号实现。很多项目现场图像时好时坏,一阵一阵地抽风,其实就是没有做光源频闪同步,环境光在曝光窗口内不断变化导致的。
2.4 手眼标定:精度从这里流失
手眼标定是机器人视觉里最容易被轻视、也最容易出问题的一环。没有做过的人会觉得“不就是在机器人坐标系下定位吗”,但实际做完一次完整的标定,你就知道这里面有多细。
手眼标定分两步:相机内参标定和手眼外参标定。内参是相机的焦距、主点、畸变系数,需要拍十几张不同姿态的棋盘格标定板来解算。外参是相机坐标系到机器人坐标系的变换关系,常见的方法是N点标定(九点标定),让机器人带着针尖接触标定板的已知点,同时相机识别这些点,求出一个单应性矩阵。
九点标定看起来简单,实际操作中坑非常多:标定板必须绝对平整,不平整的板子就是垃圾进垃圾出;标定板上的点距必须经过校准,不能拿游标卡尺量一次就当标准值;标定时机器的TCP(工具中心点)指向必须准,如果TCP本身偏了0.5毫米,标定结果就不可能好。还有一个容易忽略的是标定板的反光,亚克力板在光照下会有局部高光,特征点提取会飘。
九点标定只能解决平面映射,如果机械臂存在明显的旋转动作,还要做旋转中心标定。让机械臂带着工件在原地旋转多个角度,视觉分别记录工件中心的位置,拟合出一个圆心和半径,这个圆心就是旋转中心。如果不做这一步,每次旋转都会让抓取位置偏移。
我强烈建议标定过程写成标准作业流程,每一步都记录原始数据,标定完成后用一个独立验证程序验证精度,而不是把标定数据一存就当完事。标定结果的评价指标是残差,一般控制在0.3毫米以内才算合格,如果残差太大,要么是标定板不平,要么是TCP不准,要么是机器人本身重复精度差,得一层层排查。
3. 调试阶段:定位、抓取、通信,一个都不能少
进场调试是视觉项目最漫长、最容易焦虑的阶段。设备一开动,各种现场问题像地鼠一样冒出来。这个阶段最需要的是系统化的排查思路,而不是东一榔头西一棒子的碰运气。
3.1 算法精度从图纸到现场的衰减和补偿
实验室里调好的视觉算法,到了现场大概率会降级,这是颠覆不破的规律。原因有很多:现场光照不同、工件毛刺反光、传送带抖动、来料表面有油污。我的做法是进场第一天就采集200到500张现场真实图像,覆盖不同光照、不同摆放位置、不同来料批次,用这些图重新评估算法参数的健壮性。
很多算法工程师习惯在一张“漂亮图”上调参数,把阈值调到刚好分割出工件的临界值。这样做在实验室没问题,但现场来料稍微变一点就识别失败。正确做法是留出足够的灰度余量,让图像分割的阈值比最佳值偏移20%到30%时依然能稳定识别。换句话说,好的算法应该有一定的“容错空间”,而不是追求单张图上100%完美。
定位结果从像素坐标转换到机器人坐标,中间有个关键的标定系数——像素当量(mm/pixel)。这个系数在视场的中心和边缘并不完全一致,如果只用一个固定值,工件放在视野边缘时抓取会偏。建议做完整畸变校正后,每隔一定视场区域分别计算像素当量,建立一张映射表,运行时根据工件实际位置选择对应的当量值。这个细节能让边缘抓取精度提升不少。
3.2 TCP偏差被视觉放大的真实案例
TCP标定的误差平时看不出来,但在视觉引导项目里会被放大到一个不可接受的程度。我遇到过一个抓取项目,机器人带着吸嘴去吸一个直径10毫米的圆片,系统老是偏右下方约2毫米,怎么补偿都压不下去。
排查过程很绕:先重新做了九点标定,没用;检查相机安装,没问题;检查视觉算法,定位中心非常准。最后把机器人用千分表打了一圈,发现法兰盘旋转轴与末端吸嘴的中心偏移了1.2毫米。这个偏差在普通示教轨迹里根本感觉不到,但在视觉计算“吸嘴应该移动到哪里”的时候,TCP偏差直接叠加到了最终定位上。
解决办法就是老老实实做TCP标定,用“四点法”或者“六点法”重新求工具坐标系。之后我又在项目里养成了一个习惯:每次视觉项目开始调试前,先确认客户的机器人TCP参数是最新的,如果机器人被谁改过参数,后面所有视觉引导都会一起偏掉。TCP偏差是视觉调试里最折磨人的隐性问题,排查顺序一定要靠前。
3.3 与PLC和机器人通信的隐藏问题
视觉和PLC、机器人之间的通信是联调的动脉,但实际运行中最容易出问题。传统上很多项目走I/O信号,送一个“拍照完成”脉冲,再传一个“是否找到”的到位信号,这种方式的优点是延迟低、确定性高,但信息量有限,只能传少量结果。现在更多项目走Socket通信,视觉直接以TCP/IP报文发送坐标数据,灵活性高很多,但调试复杂度也跟着上来了。
Socket通信有一个典型的坑:最大报文长度和解析格式不统一。视觉发过去的是字符串坐标“123.45,67.89,180.0”,机器人那边解析的时候,小数点位和逗号格式稍微不一致就会报错。我的建议是双方在联调前就把通信协议文档写清楚,包括报文头、数据长度、坐标系定义、单位、精度位数、校验方式,甚至并发发送的频率都要约定好。
PLC侧和信号握手的问题也很隐蔽。常见的是“上升沿触发丢失”:PLC发出“拍照”信号太快,相机的触发响应还没来得及接收,信号就已经消失了。解决办法是在PLC侧设置信号保持时间,至少保持50毫秒以上,确保视觉侧的触发采集稳定可靠。
另一个常见问题是坐标系方向不一致。机器人的坐标系X向右、Y向前,视觉图像坐标系X向右、Y向下,换算的时候少做一个反转,抓取方向就会完全反掉。我调试时习惯在系统里专门做一个“坐标转换自检”画面,把同一组视觉坐标手动输入机器人,对比实际动作是否对准。这一步看起来笨,但能节省大量排查时间。
3.4 日志记录是排查问题的唯一钥匙
现场调试到中期,往往会出现一些偶发性问题,比如“隔一段时间抓偏一次”“早上开机第一轮总是识别失败”。这类问题如果不做日志,靠人盯着屏幕看是抓不到规律的。
我后来强制要求自己在项目里配置一套视觉日志系统,每拍一张图就记录一次:拍照时间、图像文件名、定位结果、坐标值、耗时、判定结果。同时让机器人在每次抓取后回传一个“实际接触误差”或“抓取成功标志”。把这些数据放在一张表里,按时间线对齐,才能真正定位到问题出现的规律。
曾经有个月经式的故障:“每逢整点前后会出现一次抓偏”——排查了几天毫无头绪,最后是看了日志才发现,那个时间段正好是车间整点换班,头顶的照明灯会有一个瞬时的电压波动,导致光源亮度突变。没有日志,这种问题基本无解,有了日志,几天就能找到根因。日志记录这件事看起来不产生直接收益,但它真的是视觉项目长期稳定运行的基础。
4. 交付阶段:视觉验收的学问
验收是整个项目从“能跑”到“客户认可”的关键一跃,也是最容易和客户产生分歧的环节。视觉系统的验收不像普通设备那样看“转不转得起来”,它的验收标准很抽象,所以要把验收标准在协议里落到可量化、可执行的数字上。
4.1 验收标准要在协议里落到数字
视觉项目验收最怕遇到“差不多”“基本能抓就行”这类模糊表述。我吃过大亏,早期一个项目,协议里写“视觉定位精度满足生产要求”,最后客户说“生产要求就是正负0.1毫米”,而我们实际只能到0.3毫米,费了很大周折才重新谈定标准。
现在的习惯是把验收标准拆成三个量化维度:定位精度、识别成功率、节拍一致性。定位精度可以用“连续抓取100次,与基准位置的误差均值和最大值是多少”来定义;识别成功率可以用“连续运行一个班次,漏识别和误识别的件数”来定义;节拍一致性可以用“连续运行2小时,视觉处理耗时超过预算的次数”来定义。每个数字都要在协议里白纸黑字写清楚,并且约定测试方法和测试条件。
测试条件特别重要,同一个系统在白天、晚上、开灯、关灯、晴天、阴天测出来的结果是完全不同的。我的建议是验收测试至少覆盖一个完整班次,并且安排在不同时段各测一轮,展现系统在真实光照变化下的表现。
4.2 培训分三层:操作工、维修工、工程师
很多项目交付时只草草做一次操作演示就撤场了,结果过了两周客户打电话说“系统坏了,你们快来”。去了现场一看,只是某个参数被误改,或者镜头被擦花的表面没有及时清洁。所以培训必须分层,不同岗位的人学不同内容,不能一堂课解决所有人。
对操作工的培训重点是:日常开关机流程、工件摆放要求、异常停机时的判断、常见报警信息如何上报。这一层培训不需要讲原理,要给一份带图的操作手册,每个步骤都有对应的屏幕截图,让工人照着做就行。
对维修工的培训重点是:相机和光源的清洁维护周期、接插件的检查、线路松动排查、简单参数恢复、备件更换流程。维修工不需要会调算法,但要能判断“是视觉问题还是机械问题”。
对工程师的培训重点是:相机的内部参数设置、光源亮度的标定方法、模板和检测区域的更新、坐标标定复验流程、设备数据的手动导出。这一层培训通常需要1到2天的手把手教学,而且要提供一套完整的电子文档,方便他们以后查阅。
4.3 后期维护:视觉系统的“消耗品”意识
视觉系统虽然由软件和电子产品构成,但它一样有易损件。光源是最大的软肋——LED光源用久了会有亮度衰减,表面还会积灰,导致图像整体变暗,进而影响识别率。镜头表面也一样,即使有防护罩,长期在粉尘环境里还是会积累一层油膜。
我建议交付时和客户明确一个维护计划:光源和镜头每两周清洁一次,每三个月做一次亮度自检(有灰度的标准样件可以辅助判断),每半年做一次完整的手眼标定复验。这些维护动作听上去繁琐,但能避免绝大多数“设备突然不灵”的售后事故。很多项目验收后就是败在“没人管”上,半年后精度漂移了,客户第一反应是“你们的视觉有问题”,而不是“我们有半年没清洁镜头了”。
另外,相机本身内部的传感器也存在热漂移,长时间运行后图像亮度和噪点会有轻微变化。如果项目允许,我建议相机在系统启动后先预热5分钟再开始工作,或者用软件做暗电流校准,保持传感器状态的稳定。
5. 最后再分享一点切身体会
做了这么多年视觉项目,我最深的体会是:视觉项目没有“灵光一现”的时刻,有的只是大量细致的前期准备、严格的标定流程、仔细的日志记录和分层的交付培训。任何一个环节偷懒,最后都会在验收或者量产阶段以“故障”的形式加倍还回来。
所以我对每个新接手视觉项目的工程师都会强调三句话:第一,进场勘察别赶时间,现场多看两个小时,后面能省两天调试;第二,手眼标定别嫌繁琐,每步留下数据,出了问题才能定位;第三,交付培训别走过场,今天培训偷的懒,就是明天售后流的汗。做视觉项目就是这样,把每一个基础动作做到位,项目自然就顺了。