ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

产线视觉识别与定位:硬件选型、九点标定与MES数据链路实践

产线视觉识别与定位:硬件选型、九点标定与MES数据链路实践

1. 产线上“识别和定位”的真实边界

“识别和定位”这五个字,在工业自动化、生产数字化、工业4.0的语境里被喊了很多年,但真正在产线上写过代码、蹲过调机、半夜被叫去救场的人,对它的理解跟 PPT 上的说法完全不是一回事。最直观地说,相机架好、灯打亮、拍一张照片出来,这件事三分钟就能干完;难的是让同一个工位在一年后、第两百万次拍照时,输出的那个坐标依然稳得住。识别负责回答“这是什么、是什么型号、有没有缺陷”,定位负责回答“它在哪、朝哪个方向、姿态角度多少”,这两件事的输出结果最后都要变成机械手能执行、MES 能追溯、数据库能查询的东西,中间任何一个环节松一点,整套系统就在产线上站不住。

我在不同规模的产线项目里反复验证过一个判断:视觉识别和定位项目的成败,八成不在算法,而在前期的问题拆解和物理层的确定性。一个识别准确率 99.9% 的模型,如果光照每两小时漂一次、相机没有硬触发、标定板只做过一次,那么它在实际运行中的表现会远不如一个准确率 98% 但工程化做扎实的系统。这也是为什么工业4.0 讲了很多年,落到车间里依然是那些最朴素的问题:节拍够不够、精度余量留了多少、异常了谁兜底、数据怎么串起来。

这篇文章适合三类人看:正在做产线视觉定位方案的工程师、负责把单站设备接入数字化系统的人、以及准备评估这类项目可行性的技术管理者。下面我会按“问题拆解、硬件光学、标定、算法链路、数据链路、排查”的路径,把我在实际项目里用过的思路、算过的参数、踩过的坑全部摊开。文中涉及的机构、项目、人物均为虚构代称,参数也是基于常见工况的示例,实际项目请按自己的场景重算。

1.1 两个词经常被混着说,其实是两套活

“识别”和“定位”在技术路径上有本质差别,混着谈会导致方案选型从一开始就偏。识别的核心是分类与判别,输入是图像或点云,输出是类别、置信度、有无;它的评价指标是准确率、召回率、误检率,难点在于样本覆盖度和类别平衡。定位的核心是测量与估计,输入同样是图像,输出是连续的坐标数字;它的评价指标是重复精度、绝对精度、角度误差,难点在于标定链路和物理稳定性。一个偏“离散判断”,一个偏“连续测量”,工程上的处理方式完全不同。

举个具体场景:某电子装配线上,来料托盘里混着三种规格的壳体,需要先判断是哪种(识别),再算出抓取点的 XY 和旋转角(定位),最后把坐标发给四轴机械手去取。识别部分错了,抓错料直接报废;定位部分偏了 0.3mm,抓取偏移导致装配卡死。这两类故障在排查时的方向完全相反:前者要去翻样本库看有没有漏掉的型号、光照变化下特征是否还稳;后者要去查标定、查镜头畸变、查来料是否在治具里没有放平。如果一开始就把它们当一个问题处理,现场调试会非常痛苦。

我习惯在方案设计阶段就把这两块拆成两张表:识别表列类别、样本数、判定阈值、误判代价;定位表列目标精度、视野、节拍、坐标系数量、误差预算分配。两张表填完,方案的基本形态就出来了——用什么相机、要不要 3D、算法走传统还是深度学习、需不需要额外的机械定位辅助。这个过程看起来慢,但能省掉后期大量的返工。

1.2 为什么工业4.0 语境下这两件事总被捆在一起

单独一个工位的视觉定位,本质上是个自动化孤岛。而工业4.0 想解决的是孤岛之间的连通:每个工位的识别结果和定位坐标不只是喂给本地的机械手,还要带上时间戳、产品序列号、设备编号、工艺参数一起上传,形成可追溯的数据流,再被上层的排产、质量管理、设备健康分析消费。识别和定位就从“一个功能”变成了“一个数据源”,它的输出格式、稳定性、可解释性都直接决定了上层应用能不能用。

这个转变带来几个很实际的约束。第一是结果要结构化,不能只是一个“OK/NG”的灯,得包含目标类别、坐标、角度、置信度、图像路径、算法版本号。第二是要能回放,出了问题得能拿出当时的原图、参数、判定过程复盘,所以现场必须存图,且存图策略要算存储成本。第三是要能灰度,新模型上线不能一刀切,得能按工位、按班次、按比例分流对比。这三条在纯自动化时代基本没人管,一旦接上数字化系统就变成硬需求。

我参与过一个模拟项目,产线侧要求所有识别结果必须带 SN 绑定上传到 MES,结果上线第一周就暴露了一个隐蔽问题:视觉工位的节拍是 800ms,但上传接口在班次交接时段响应时间会涨到 2 秒以上,导致队列积压、内存缓慢上涨,跑了三天程序崩了。这类问题在单机版里根本不会出现,一旦进入数字化链路就会冒出来。所以后来我接手类似项目,第一步不是看算法,而是看数据链路的容量和超时策略。

1.3 选型前先算三笔账:节拍、精度、可用性

节拍账:从产品到位信号触发,到坐标下发完成,整条链路的总耗时要留 30% 余量。曝光 10ms、传输 15ms、算法 60ms、通信 10ms,加起来不到 100ms,看起来很快,但如果算法里有个异常分支会重试三次,最坏情况就是 300ms 以上,机械手等不起。我在设计时习惯把“正常路径”和“异常路径”的耗时分别算出来,异常路径必须小于产线允许的最大等待时间,否则就要改成异步处理或者直接给一个安全的默认动作。

精度账:最终精度需求要拆到每一个环节。假设产品要求抓取精度 ±0.1mm,那么误差预算大致可以分成:相机分辨率引入的量化误差、镜头畸变残余、标定误差、来料位置波动、机械手重复定位误差。这五项按均方根粗算,每项大概只能分到 ±0.04mm 左右。如果机械手本身的重复定位精度就是 ±0.05mm,那视觉部分做得再好也是白搭——这时候该去改机械定位或者加浮动机构,而不是死磕算法。

可用性账:产线设备年可用率通常要求 98% 以上,折算下来一年非计划停机不能超过七天。视觉系统最容易出的问题是光源衰减、镜头污染、标定漂移、通信断连。每一项都要有对应的预防措施:光源定期校准或者加光衰补偿、镜头加气吹或者定期清洁提醒、标定周期写入维护计划、通信加心跳和重连。这些看起来是运维的事,但在方案阶段不考虑,后期就是无穷无尽的救火。

2. 精度在上位机之前就定死了:硬件与光学怎么选

很多人以为定位精度是算法调出来的,实际上硬件的物理极限早就把天花板钉死了。算法只能在已有信息里做最优估计,无法创造不存在的分辨率。所以选型阶段的那几张纸和那几笔计算,基本决定了项目能做到什么水平。

2.1 分辨率换算:用纸和笔先把精度算清楚

基础换算是这样的:单像素对应的物理尺寸等于视野尺寸除以传感器有效像素数。假设视野是 200mm × 150mm,相机是 500 万像素,分辨率 2448 × 2048,那么水平方向单像素对应 200 / 2448 ≈ 0.082mm。这只是像素当量,不代表精度。实际能达到的重复精度取决于算法能否做到亚像素,传统形状匹配在特征清晰的情况下通常能做到 1/10 到 1/4 像素,取保守的 1/3,就是约 0.027mm。但这只是理想条件下的数字。

真实场景还要乘上几个系数:镜头畸变校正残余(尤其视野边缘)、光源不均匀导致的边缘位置抖动、来料本身的表面特性变化。我一般按 2 到 3 倍余量估算实际可用精度,也就是上面这个配置在实际产线上大概能稳定做到 0.06 到 0.08mm。如果产品要求 ±0.05mm,这个配置就不够,需要缩小视野(代价是相机要移动或者加多工位)、换成更高分辨率的传感器、或者改用远心镜头来压畸变。

远心镜头值得单独说一句。它的特点是主光线平行,因此在有一定景深变化时放大倍率基本不变,测量精度会明显稳定。代价是视野通常做不大、价格高、工作距离固定。对于小尺寸高精度零件(比如连接器针脚、小型结构件),远心镜头带来的稳定性提升往往比换更高像素的相机更划算。我的经验是:当视野小于 100mm 且精度要求优于 0.02mm 时,优先考虑远心方案。

还有一个容易被忽略的参数:景深。视野内的产品高度如果有变化,比如来料堆叠、托盘不平,超出景深就会失焦,边缘模糊直接导致定位漂移。景深近似计算涉及光圈、焦距、允许弥散圆,实际选型时可以直接看镜头规格书里的景深表,然后按产品高度波动留一倍余量。如果产品高度波动大,就得考虑自动对焦或者改用对高度不敏感的打光方式(比如同轴光看平面特征)。

2.2 光源与镜头:最便宜也最容易翻车的部分

光源是整个视觉系统里投入最小、影响最大的部分。它决定的是“特征能不能稳定出现”,算法只是把出现的特征找出来。我用过的方案里,翻车最多的不是算法写错,而是光源选型不对或者装的位置不对。

常见的几类打法:背光适合轮廓测量,把产品打成剪影,边缘非常锐利,定位精度最好,但只能测外轮廓;环形低角度光适合打表面划痕和字符,利用漫反射差异形成对比;同轴光适合高反光的平面,比如金属表面、玻璃,能压掉反光形成均匀背景;条形光则经常用在需要方向性照明的场景,比如检测圆柱面的缺陷。选哪种,取决于你要找的特征是什么,以及产品表面是什么材质。

这里有个实际经验:不要指望用一套光源同时满足识别和定位。识别需要突出类别差异(颜色、纹理、标识),定位需要突出几何边缘。我在一个模拟项目里就吃过这个亏——同一个工位既判断型号又算抓取中心,用的是同一套环形光,结果深色型号的边缘对比度太低,定位抖得厉害。后来加了第二组低角度光,分区点亮,识别用主光、定位用时序切换的辅助光,问题才解决。代价是曝光时间翻倍,好在节拍还有余量。

镜头方面,除了焦距要匹配视野和工作距离,还要看畸变曲线。标称低畸变的镜头在视野边缘依然可能有 0.5% 以上的畸变,如果定位点经常落在边缘,误差就会被放大。处理办法有两个:一是用标定做畸变校正(需要更多标定点,覆盖整个视野),二是把产品引导到视野中心区域,边缘只用来做粗定位。我更倾向后者,因为校正再准也有残余,物理上少用边缘总是更稳。

2.3 相机与触发:别让时间抖动吃掉精度

相机选型除了分辨率和帧率,还要看快门类型。卷帘快门在拍摄运动物体时会产生形变,如果产品在传送带上不停,形变会直接变成定位误差;全局快门没有这个问题,工业定位场景基本应该默认选全局快门。有些高速产线为了压成本用卷帘快门配闪光,理论上可行,但对闪光时序要求极严,我在实际产线上不太敢这么干。

触发方式比很多人想的更重要。软触发依赖程序发指令,受操作系统调度影响,抖动可能有几毫秒到几十毫秒;硬触发由传感器直接给相机信号,抖动在微秒级。对于节拍紧或者产品在运动中的场景,必须用硬触发。更进一步,编码器触发能做到按位移等距拍照,产品速度变化也不影响采样间隔,这在连续料带、卷材类产线上几乎是标配。

我用过一个简单的验证方法来判断触发是否可靠:让产线空跑半小时,记录每次触发到曝光开始的延时,画个分布图。如果延时抖动超过 2ms,且产线速度在 500mm/s,那么位置误差就是 1mm,定位精度根本谈不上。这个测试十分钟就能做完,但能提前暴露大量问题。

3. 标定:把一个点从像素拽回真实世界

标定是把图像坐标系和机械坐标系连起来的唯一桥梁,它错了,后面所有算法都白搭。我在现场见过太多项目,算法调得天花乱坠,最后发现是标定板的点没打准。标定这件事没有捷径,只能老老实实做,并且用数据验收。

3.1 九点标定与仿射变换的完整推导

九点标定的本质是求一个二维仿射变换,把像素坐标映射到机械坐标。仿射变换包含旋转、缩放、平移,最多再加剪切,共 6 个未知数,理论上 3 个点就能解,但实际用 9 个甚至更多点是为了做最小二乘拟合,降低单点误差的影响。

具体操作流程:把标定板(或者一个特征明显的标准件)固定在机械手能到达的平面上,用机械手带着基准点依次走 9 个位置,每个位置记录机械坐标,同时用相机拍图记录该基准点的像素坐标,形成 9 组对应点对。然后用最小二乘求解变换矩阵。代码上大概是这样:

import numpy as np # pixel_pts: N x 2 像素坐标 # robot_pts: N x 2 机械坐标 def solve_affine(pixel_pts, robot_pts): A = [] b = [] for (u, v), (x, y) in zip(pixel_pts, robot_pts): A.append([u, v, 1, 0, 0, 0]) b.append(x) A.append([0, 0, 0, u, v, 1]) b.append(y) A = np.array(A, dtype=np.float64) b = np.array(b, dtype=np.float64) params, *_ = np.linalg.lstsq(A, b, rcond=None) M = params.reshape(2, 3) return M # [[a, b, c], [d, e, f]]

求得矩阵后,任意像素点乘以这个矩阵就能得到机械坐标。但要注意一个细节:这 9 个点必须覆盖实际使用的视野范围,不能全挤在中间。我通常按视野的 3×3 网格布点,边角各留 10% 的边距,这样拟合出来的变换在整个视野内的残差都比较均匀。验收标准是:把所有标定点反算回去,最大残差应该小于目标精度的 1/3。如果残差在某个角落明显偏大,说明该区域畸变严重或者标定点打偏了,必须重做。

还有一点经验:标定用的基准点特征,最好和实际产品要定位的特征在形态上接近。用圆点标定板做的标定,去定位一个尖锐的直角边缘,两者的亚像素提取偏差是不一样的,虽然通常很小,但在高精度场景下会体现出来。严谨的做法是用实际产品的标准件做一次验证,比对视觉算出的坐标和机械实测坐标的差值。

3.2 眼在手上:旋转中心标定的实操

机械手带着相机移动(眼在手上)的场景,标定会复杂一层。因为相机跟着手走,图像坐标到机械坐标的变换里多了一个工具坐标系,而且相机相对法兰的安装角度和偏移都是未知的。标准做法是:让机械手带着相机去拍同一个固定目标,走 3 个以上不同的姿态(包含旋转),每次记录机械手的位姿和目标的像素坐标,然后求解手眼矩阵。

实际操作中,最容易出问题的是旋转角度太小。如果几个姿态之间的旋转只有几度,那么旋转中心的解算会非常敏感,一点噪声就会放大成很大的误差。我的经验是旋转姿态至少要覆盖 ±30 度,最好能到 ±45 度,并且各姿态的平移也要拉开距离,不要都在一个小范围内挪。做 5 到 8 组姿态比做 3 组稳得多,多出来的时间完全值得。

另一个坑是相机的安装刚性。手眼标定假设相机和法兰是刚性连接,如果支架有松动、线缆拉扯导致微小位移,标定结果当次是准的,跑一段时间就漂了。所以支架要做得尽量刚,线缆要留应力释放,标定完成后在支架和法兰上做标记,日常点检时看一眼标记有没有错位。

3.3 标定验收的量化标准

标定做完不能只看“看起来对”,必须有量化验收。我通常做三件事:

第一,残差检查。所有标定点反算,统计最大残差和均方根残差,设定阈值并记录归档。

第二,独立验证点。另外取 5 个不参与拟合的位置,用视觉算坐标、用机械实测,比对差值。这一步能发现过拟合问题。

第三,重复性测试。让目标静止不动,连续拍 30 次,统计坐标的标准差。这个数字代表了当前配置下的重复精度,是所有后续判断的基准。如果重复性标准差是 0.05mm,那你永远做不出 0.05mm 的定位精度,只能改善硬件。

标定周期也要定下来。我的建议是:新设备上线后第一周每天复检一次,稳定后改为每月一次,遇到撞机、更换镜头、清洁光路后必须重新标定。把这个写进设备维护规程,比事后靠人记得靠谱得多。

4. 算法链路:从图像到坐标

算法这块,我的基本立场是:能用量化、可解释的传统方法解决的,就不要上深度学习。产线环境相对固定,特征可控,传统方法的速度、稳定性、可调试性都有优势。深度学习该用在传统方法搞不定的地方,比如外观差异大、纹理变化多、缺陷形态不规则的场景。

4.1 传统2D定位:形状匹配仍然是产线主力

基于边缘梯度的形状匹配在工业定位里用了二十多年,依然是主力。它的原理是提取模板图像的边缘梯度信息,在待检图像里滑窗搜索相似度最高的位置,能同时给出 XY 和旋转角,对光照变化有一定的鲁棒性,速度也快。开源视觉库里有成熟的实现,商业视觉软件里更是标配。

用好形状匹配有几个关键参数:角度搜索范围要按实际来料的最大偏差设定,设太大浪费算力还容易误匹配;最小对比度决定哪些边缘参与匹配,设太低会把噪声当特征,设太高会漏掉弱边缘;贪心度或者搜索步长影响速度和精度的平衡,粗定位用大步长、精定位用小步长做两级搜索是常见做法;匹配分数阈值决定了判定为找到的最低标准,这个值要在实际样本上统计分布后确定,不能拍脑袋。

我在一个模拟项目里遇到过一个典型问题:同一个料号的产品,不同批次表面处理略有差异,导致边缘对比度变化,匹配分数从 0.85 掉到 0.6 左右,偶尔低于阈值就报找不到。后来做了两件事——把模板从单张改成多张(不同批次各取一张做模板组),以及把最小对比度调低一档配合分数阈值下调,误匹配率通过面积和形状校验来兜住。这套组合拳在实际产线上非常常用,比直接换深度学习省事得多。

形状匹配的局限也要清楚:它对尺度变化敏感,如果产品高度波动导致成像尺寸变化,匹配会退化;对遮挡敏感,被挡住一部分特征就容易失败;对无纹理的均匀表面基本无效。遇到这些情况,要么改打光让特征显出来,要么换算法。

4.2 深度学习识别的落地边界

深度学习在识别任务上的优势很明显:类别多、外观差异大、有轻微形变的场景,训一个检测网络往往比手写规则快得多。但落地时有几条边界必须认清。

样本量。工业场景的难点不是样本少,而是缺陷样本少且不平衡。正常品成千上万,异常品可能只有几十个。这时候不能指望简单训练,得做数据增强、用异常检测思路、或者干脆先用规则做初筛再人工复核。我一般建议:每类至少 200 张覆盖不同光照、不同批次的真实样本起步,低于这个数量就先把采集做起来,别急着训模型。

算力与节拍。产线节拍 500ms,扣掉通信和机械动作,留给算法的时间可能只有 100ms。这意味着模型不能太大,推理要么在边缘设备上跑,要么用轻量化模型。实际选型时我会先测一遍:在目标硬件上,单张推理耗时的 P99 是多少。注意是 P99 不是平均值,产线不能因为偶尔一张图慢了就卡住。

可解释性与调试。深度学习输出的是概率,出了问题不好定位。所以工程上必须配套:保存可疑样本的原图、记录置信度和阈值、支持按置信度区间回捞图片复查。我在项目里通常会加一个“低置信度存图”策略,把 0.5 到阈值之间的样本全部存下来,每周复盘一次,这些样本往往是模型迭代最有价值的素材。

版本管理。模型文件必须有版本号,和产品型号、光照配置、相机参数一起记录。上线新模型要走灰度:先在一个工位跑,对比一段时间的判定结果,一致率达标后再全量推开。没有灰度机制就直接替换模型,出了问题是查不出来的。

4.3 3D位姿与点云配准的实现路径

当产品是立体件、需要六自由度抓取,或者 2D 无法区分姿态时,就得上 3D。常见的成像方式有结构光、线激光扫描、双目、ToF。结构光精度高、速度快,适合中小视野的静态或准静态拍摄;线激光适合连续扫描,配合运动机构可以重建完整表面;ToF 视野大但精度一般,通常用于粗定位或者避障。

拿到点云之后,主流做法是模板匹配加精配准两步。粗匹配用特征描述子做全局搜索,把模板点云和场景点云大致对齐;精配准用迭代最近点算法做局部优化,输出最终的 6D 位姿。这里有几个实操要点:

第一,模板质量决定上限。模板点云要从实际产品上采,而且要采多次做平均,去掉噪声。用 CAD 模型直接生成的模板,和实际扫描数据之间往往有系统性偏差,配准分数会受影响。

第二,下采样要适度。点云太密,配准慢;太稀,特征丢失。我一般按目标特征的最小尺寸来定体素大小,保证关键特征上还有足够的点。

第三,要设收敛条件和失败判定。迭代最近点算法不保证收敛到全局最优,必须设最大迭代次数和配准误差阈值,超过就判定失败,走兜底逻辑而不是死等。

第四,对称件要特别处理。回转体、对称件在点云匹配时会有多个等价解,算法可能每次都给出不同的角度。解决办法是在工装上做不对称的定位特征,或者在上位机里加角度区间约束——比如已知来料角度不会超过 ±15 度,就把搜索范围限死。

5. 从单站到产线:生产数字化的数据链路

单站跑通只是开始,接入产线数字化系统才是真正的考验。这一层做不好,前面所有的精度和稳定性都体现不出价值,因为数据出不去、追溯做不到、问题定位不了。

5.1 边缘侧程序骨架与通信

边缘侧程序的骨架我习惯分成四层:采集层、算法层、决策层、通信层。采集层负责触发、曝光、取图,把原始数据交给算法层;算法层做识别和定位,输出结构化结果;决策层根据结果和阈值做判定,决定是放行、重试还是报警;通信层负责和 PLC、机械手、上位机、MES 打交道。分层的意义在于解耦——换相机不用动算法,换算法不用动通信,改判定逻辑不用重编译整个程序。

和 PLC 的通信方式要看现场条件。离散信号(IO)最稳,一个触发信号、一个结果信号,简单可靠,但传不了数据;现场总线(比如 EtherCAT、PROFINET)实时性好,适合节拍紧的场景;以太网协议(比如 Modbus TCP、OPC UA)通用性强,适合传结构化数据,但要注意超时和重连。我的原则是:控制信号走硬线或总线,数据走以太网,两者分开,互不干扰。

和机械手通信通常是发坐标串。格式要提前和对方约定死,包括分隔符、小数位数、坐标系编号、成功失败标志。我见过因为小数位数不一致导致抓偏的案例——视觉给了三位小数,机械手只解析两位,等于每次多偏了不到 1mm 的随机量,查了很久才发现。所以通信协议必须写成文档,双方各留一份,改动要走版本。

5.2 结果数据结构、追溯与MES上报

一条好的结果记录大概长这样:时间戳、工位号、设备号、产品 SN、类别、置信度、X/Y/角度、算法版本、标定版本、图像路径、判定结果、异常码。这些字段缺一个,后期排查就会卡住。

存储策略要算成本。假设单张图 2MB,每个产品存 2 张,一天两万件,一天就是 80GB,一年接近 30TB。这个量级不能全存本地。我的做法是:NG 全存,OK 抽存(比如按 1% 比例或者按小时抽样),原图存边缘侧保留 7 天,归档图上传到服务器保留 3 个月,过期自动清理。同时把结构化结果单独入库,这部分数据量小,可以长期保留做趋势分析。

MES 上报要注意两个坑。一个是节拍,上报必须异步,不能阻塞主流程,队列满了要有降级策略(丢弃最老的或者转本地文件),绝不能因为上报失败卡住产线。另一个是幂等,网络抖动导致重发时,MES 端要能按 SN 加时间戳去重,否则数据会重复统计。这些细节在联合调试阶段就要和 MES 侧确认清楚,不要等上线才发现。

数据上传之后真正的价值在于分析:某个型号的置信度平均值在缓慢下降,可能是光源衰减;某个工位的定位标准差在特定班次变大,可能是环境温度或者操作差异;某类异常码集中出现,可能是来料批次问题。这些趋势只有积累了足够的结构化数据才看得出来,这也是“生产数字化”从口号变成实际价值的地方。

5.3 异常处理、看门狗与灰度上线

产线上的程序必须假设“什么都会坏”。相机断连、光源不亮、通信超时、磁盘写满、算法内存泄漏,这些都要有对应的处理路径。我的基本原则是:任何异常都要有明确的、可预期的输出,不能卡住、不能静默失败、不能给出错误的数据。

具体做法:每层都加超时,采集超时就重触发一次,再超时就报故障并给出安全信号;算法加执行时间监控,超过阈值记录并降级到快速算法或者直接报警;通信层加心跳,心跳断了自动重连并记录日志;磁盘加水位告警,超过 80% 就清理最老的文件。所有这些状态汇总到一个健康状态页面上,值班的人一眼就能看出哪里不对。

灰度上线是新功能必须走的流程。我的做法是新版本先在一个非关键工位跑,同时把新旧两个版本的判定结果都记录下来做对比,一致率达到设定标准(比如 99.5%)后再逐个工位推开。过程中保留一键回滚的能力,回滚不需要重装,切个配置就行。这套流程看着繁琐,但比起上线后半夜被叫去回退版本,成本低太多了。

6. 常见问题排查实录

这一节是我这些年被问得最多、也是现场最耗时间的部分。很多问题表面看是算法不行,实际根子在物理层或者链路层,按下面的思路过一遍,能省掉大量试错。

6.1 定位漂移的五个来源

来源一:光源衰减或者色温漂移。LED 用久了亮度会下降,尤其是大功率长时间点亮的场景。表现是定位结果整体变差、边缘提取不稳。排查方法很简单:固定一个标准件,每天开机时测一次坐标,记录一个月看趋势,如果有单调漂移,基本就是光衰。处理方式是加亮度补偿或者定期更换。

来源二:镜头或防护玻璃污染。车间粉尘、油雾、水汽都会附着在镜头上,形成局部模糊或者散射。表现为某些区域的匹配分数下降。这个靠人眼点检很难发现,建议在视野里放一个固定参考特征,实时监控它的清晰度指标,下降就报警清洁。

来源三:标定漂移。撞机、更换镜头、支架松动都会导致标定失效。表现是所有点位整体偏移。对策是定期用验证点复检,以及加装物理防撞和位置标记。

来源四:来料位置波动。治具磨损、来料堆叠、托盘变形,都会让产品在视野里的位置超出预期。表现是偶发的找不到目标。对策是扩大搜索范围(代价是速度)、加机械定位特征、或者改用先粗后精的两级策略。

来源五:温漂。相机传感器和镜头在温度变化时会有微小的焦距和法兰距变化,高精度场景(亚微米级)会体现出来。表现为开机一段时间内精度逐渐稳定。对策是预热足够时间再标定和运行,或者做温度补偿。

6.2 排查速查表

现象高概率原因优先排查动作
所有点位整体偏移标定失效、坐标系切换错误用验证点复算,检查坐标系编号
个别区域偏差大镜头畸变、视野边缘、来料不平换到中心区域测试,检查景深
偶发找不到目标搜索范围不足、置信度阈值偏高扩大范围测试,统计分数分布
角度抖动明显特征对称、旋转中心标定不准增加不对称特征,重做旋转标定
白天正常夜间异常环境光干扰、温度变化加遮光罩,检查温漂趋势
开机初期不稳设备未预热、光源未稳定强制预热 20 分钟再运行
通信偶发超时网络抖动、上报阻塞主流程改异步,加大超时和重试
程序运行数天后变慢内存泄漏、图像未释放、日志过大加内存监控,日志按天切割

这张表是我自己维护的,每次遇到新问题就加一行,慢慢就成了团队共用的排查手册。比每次从头分析要快得多。

6.3 踩过的坑:几条不太好写进文档的经验

第一条,别一上来就调算法。我见过太多人遇到定位不准第一反应是换算法、调参数,折腾几天没结果,最后发现是相机的硬触发线松了。我的习惯是先验证物理层:拍一张静态图,连续拍 100 张,看同一特征的位置标准差是多少。这个数字就是系统的噪声底,如果它已经超过目标精度,算法调什么都白搭。

第二条,把所有参数都写进配置文件。阈值、搜索范围、曝光时间、增益、标定矩阵、通信地址,全部外置到配置文件,程序启动时读取,支持热加载。这个习惯来自一次惨痛经历:早期我把参数硬编码在代码里,现场需要微调曝光,结果改了代码重新编译,不小心带进去了另一个未完成的改动,导致产线停了四十分钟。从那以后我再也不写死任何参数。

第三条,日志要能还原现场。光记录“匹配失败”没有意义,要记录当时的图像路径、模板编号、匹配分数、搜索范围、耗时。有了这些,出问题不用去现场也能分析个七七八八。日志的粒度也要控制,全量记录会把硬盘写满,我一般按 INFO 记流程、WARN 记异常、DEBUG 记细节并支持按需开启。

第四条,验收标准要在项目开始前写死。精度做到多少算合格、节拍多快算达标、连续运行多久不出错算稳定,这些数字必须在合同或者技术协议里写清楚,而且要有可复现的测试方法。我参与过一个模拟项目,验收时双方对“精度”的理解不一致——一方指重复精度,一方指绝对精度,差了将近三倍,扯了很久。后来我们的技术协议里加了一页测试规范,明确测试条件、样本数量、统计口径,再没出过这类问题。

第五条,留一个“手动模式”。自动流程再完善,也总有需要人工介入的时候:新产品试产、异常件复检、参数调试。留一个能让工程师手动触发拍照、手动输入坐标、手动下发指令的界面,调试效率会高很多。这个功能开发成本很低,但现场价值极高。

我在实际项目中的体会是,识别和定位这类系统,最终能不能稳定跑三年,取决于你在最初两个月有没有把那些“看起来不重要”的细节做扎实——触发方式、标定验收、参数外置、日志留痕、异常兜底。这些东西不出彩,但它们在的时候你感觉不到,一旦缺了,就是无休止的救火。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进