ARTICLE DETAIL

资讯详情

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

C#+Halcon模板识别:SMT贴片机视觉对位精度0.1mm方案

C#+Halcon模板识别:SMT贴片机视觉对位精度0.1mm方案 简介一套面向SMT贴片机视觉对位场景的C#Halcon完整工程源码适合机器视觉工程师、自动化设备开发人员以及工业相机标定学习者参考。资源围绕模板识别、上下双相机对位贴合、MARK点四点校正与两点补偿、贴合补偿算法等核心模块展开直接解决贴片机运行中由镜头畸变、机械误差和环境漂移导致的定位偏差问题也能帮助读者快速理解从相机标定到精准贴装的完整视觉控制链路以及C#上位机与Halcon视觉库的典型配合方式。压缩包共包含101个文件总大小约10.45MB以12个C#源文件为核心辅以6个DLL动态库、9个EXE可执行程序以及多份配置、缓存和资源文件。源码结构相对完整既有工程构建所需的配置与界面资源也有可运行的编译产物适合对照阅读、断点调试和二次开发。目前已有876人学习下载。通过研究这套工程读者可以掌握Halcon模板匹配在SMT设备中的落地方法学习上下双相机的分区协同定位思路并参考MARK点四点校正与两点补偿、贴合补偿算法的工程化实现减少现场安装调试中的重复排错成本。1. C# 加 Halcon 模板识别把 SMT 贴片机的对位偏差压到 0.1 毫米以内SMT 贴片机换线时最闹心的不是贴片头跑得慢而是首件就贴偏上相机看元件、下相机看 PCB两个相机各拍各的识别结果单独看都挺准贴出来就是对不上。这套 C#Halcon 模板识别方案解决的正是这个问题——用 Halcon 的 shape model 抓 MARK 点和元件轮廓用相机标定把像素坐标换算成机台坐标再用 4 点校正加 2 点补偿把板材变形、夹持偏移、热膨胀这些系统性误差吃掉最后由贴合补偿算法算出贴片头真正该走的增量。适合正在做 SMT 设备上位机、视觉对位集成或者打算评估这条技术路线值不值得投入的工程师。2. 相机标定与模板识别九点标定和 shape model 在 C# 里的落地顺序2.1 为什么先标定后做模板识别这个顺序不能反很多新手第一步就建模板、找 MARK 点结果 find_shape_model 返回的 row、col 明明是准的换算到运动轴坐标就偏出一大截。原因很简单Halcon 识别出来的是像素坐标而贴片头走的是机台坐标两者之间隔着镜头畸变、相机安装角度、丝杆和皮带的反向间隙。不先把像素坐标和机台坐标之间的映射关系定下来识别得再准都是白搭。常见做法是先做一次九点标定。所谓九点标定就是让贴片头带着一个高精度针尖或吸嘴依次走 3x3 九个已知的机台坐标位置同时让固定相机拍下针尖在这九个位置的像素坐标然后用 Halcon 的 vector_to_hom_mat2d 算子拟合成一个 3x3 的仿射矩阵。这个矩阵就把像素平面和机台平面在二维上对齐了。SMT 对位基本都在一个平面内进行焦距固定、工作高度固定仿射变换足够不需要做畸变校正那一整套。Halcon 里与标定直接相关的常用算子就是 vector_to_hom_mat2d 和 affine_trans_point_2d前者负责拟合后者负责把任意像素点换算成机台坐标。在 C# 里调用方式统一走 HalconDotNet 的 HOperatorSet 静态方法参数用 HTuple 封装跟 HDevelop 里写的脚本一一对应。2.2 九点标定在 C# 里的最小实现附参数说明下面这段代码是九点标定的核心逻辑把九组标定数据喂给 Halcon算出仿射矩阵然后用它做一次换算验证。using HalconDotNet; // 标定数据针尖在机台九个位置的机械坐标单位mm HTuple px new HTuple(new double[] { 100.0, 150.0, 200.0, 100.0, 150.0, 200.0, 100.0, 150.0, 200.0 }); HTuple py new HTuple(new double[] { 100.0, 100.0, 100.0, 150.0, 150.0, 150.0, 200.0, 200.0, 200.0 }); // 相机识别出的针尖像素坐标单位pixel注意顺序必须和机械坐标一一对应 HTuple rows new HTuple(new double[] { 520.3, 481.1, 442.0, 519.8, 480.9, 442.1, 519.5, 480.6, 442.2 }); HTuple cols new HTuple(new double[] { 310.2, 349.7, 389.1, 310.5, 349.9, 389.3, 310.8, 350.1, 389.5 }); // 拟合仿射矩阵 HTuple homMat2D; HOperatorSet.VectorToHomMat2d(rows, cols, px, py, out homMat2D); // 验证把其中一个像素坐标换算回机台坐标 HTuple qx, qy; HOperatorSet.AffineTransPoint2d(homMat2D, rows[0], cols[0], out qx, out qy); // 结果应接近 (100.0, 100.0)误差在一个丝以内 Console.WriteLine($换算结果: ({qx.D.ToString(F3)}, {qy.D.ToString(F3)}));这里有个特别容易踩的坑Halcon 的点和行列顺序。VectorToHomMat2d 的前两个参数是 row 和 col对应图像坐标系里的 y 和 x后两个参数才是机台坐标的 x 和 y。很多从 OpenCV 转过来的工程师习惯写成 x、y、x、y结果矩阵拟合出来残差巨大。如果发现换算结果在某个方向系统性偏移先检查这个顺序。标定做完建议把 homMat2D 存成 .tup 文件下次开机直接加载不要每次重新标定。存文件用 WriteTuple加载用 ReadTuple这是标定环节最容易被忽略的细节——重新标定一次要花十分钟而加载文件只需要一行代码。2.3 模板识别create_shape_model 与 find_shape_model 的参数落在哪标定矩阵就绪后才轮到模板识别。SMT 场景里的模板分两类一是 MARK 点二是元件本体比如 chip、电容、连接器。元件本体模板通常只建一个或几个典型料号换料时切换模板 IDMARK 点模板则固定建一个圆形或十字形所有板子通用。模板创建的核心算子是 create_shape_model参数不多但每一个都影响后面的匹配可靠性。图像金字塔层数 NumLevels 用 auto 就行Halcon 会自动根据模板尺寸分层角度范围 AngleStart 和 AngleExtent 对 MARK 点可以给 -10 到 10 度对元件可以给 -180 到 180 度但角度范围越大匹配越慢电子元件贴装角度一般在正负 45 度以内给太大只会拖慢速度。Contrast 用 auto 自动提取轮廓如果元件表面反光强烈导致轮廓对比度低就手动往下调。查找算子是 find_shape_modelC# 里调用长这样HTuple modelID; HTuple row, col, angle, score; // modelImage 是建模板时截取的 ROI 图像 HOperatorSet.CreateShapeModel(modelImage, auto, -10, 20, auto, auto, use_polarity, auto, auto, out modelID); // searchImage 是当前相机抓取的全幅图像 HOperatorSet.FindShapeModel(searchImage, modelID, -10, 20, 0.6, 1, 0.5, least_squares, 0, 0.8, out row, out col, out angle, out score);MinScore 设 0.6 是一个平衡点低于 0.5 容易把背景误匹配成元件高于 0.8 在反光、轻微遮挡时直接找不到。Greediness 设 0.5 左右它表示匹配时允许跳过多少搜索步长值越大越快但越容易漏匹配调试阶段先用 0 或 0.3稳定后提到 0.7 提速。SubPixel 用 least_squares它会在粗匹配位置附近做最小二乘亚像素拟合把定位精度推到亚像素级别。返回的 row、col 直接拿去换算机台坐标angle 是元件相对于模板的角度后面做角度补偿要用。注意 C# 集成 Halcon 显示控件时窗体上拖一个 HWindowControl程序发布时要把 halcondotnet.dll 和 hcanvas.dll 一起带上这两个缺一个运行时就崩而且 hcanvas.dll 报错经常被误判成 license 问题实际上是发布目录少了文件。3. MARK 点 4 点校正与 2 点补偿位置基准的建立逻辑3.1 4 点校正用四个 MARK 点拟合出整块板的旋转和平移PCB 板厂通常在板边设计四个 MARK 点分布在四角作为贴装的统一基准。为什么不用一个点一个点只能定位置定不了角度两个点能定位置和角度但定不了板子的 X/Y 方向缩放四个点则能通过最小二乘拟合出旋转、平移、缩放的完整仿射关系把板子因拼板、夹持、烘烤产生的整体形变一次性校正回来。4 点校正的做法是把标准设计坐标从 PCB 设计文件导出的 MARK 点理论位置和实际识别坐标相机拍到的四个 MARK 点经九点标定换算后的机台坐标丢给 vector_to_hom_mat2d得到校正矩阵。这个矩阵描述的是“理论位置到实际位置的映射”应用时反过来用把贴装坐标理论值乘上校正矩阵的逆矩阵得到当前这块板实际需要的贴装位置。// 理论坐标PCB 设计文件导出的四个 MARK 点位置mm HTuple designX new HTuple(new double[] { 20.0, 220.0, 220.0, 20.0 }); HTuple designY new HTuple(new double[] { 20.0, 20.0, 160.0, 160.0 }); // 实测坐标四个 MARK 点经九点标定换算后的机台坐标mm HTuple actualX new HTuple(new double[] { 20.15, 220.08, 220.12, 19.94 }); HTuple actualY new HTuple(new double[] { 20.10, 20.16, 160.21, 160.05 }); // 拟合校正矩阵 HTuple corrMat; HOperatorSet.VectorToHomMat2d(designX, designY, actualX, actualY, out corrMat); // 对某颗元件的理论坐标 (105.0, 90.0) 做校正得到实际贴装坐标 HTuple realX, realY; HOperatorSet.AffineTransPoint2d(corrMat, 105.0, 90.0, out realX, out realY);注意这里的参数顺序和九点标定是相反的九点标定输入“像素坐标到机台坐标”4 点校正是“设计坐标到实测坐标”方向别搞混。搞混的直接后果是贴装位置整体镜像或偏到板外现场排查起来非常痛苦。我一般会在代码里把这类矩阵命名加上方向注释比如 pixelToMachineMat、designToActualMat减少换人维护时理解成本。3.2 2 点补偿热膨胀和夹持变形的线性修正4 点校正解决的是整板的位置、角度、缩放偏差但它假设板材的形变是均匀的。实际 SMT 产线里过回流焊后的 PCB 会因热膨胀产生非线性形变真空夹具夹持也会让板子轻微弯曲这时候 4 点校正拟合出的全局矩阵在小范围内够用在远离 MARK 点的区域就会出现残余偏差。补这个残余偏差的常用手段是 2 点补偿。2 点补偿的思路很简单选取板子上相距最远的两个 MARK 点通常是对角线上的两个比较设计间距和实测间距算出缩放系数再比较设计角度和实测角度算出旋转角。然后把这两个修正量应用到目标坐标上。本质上是对 4 点校正结果做一次局部精修补偿中心选在两点连线的中点。// 设计坐标对角两点 double d1x 20.0, d1y 20.0, d2x 220.0, d2y 160.0; // 实测坐标对角两点 double a1x 20.15, a1y 20.10, a2x 220.12, a2y 160.05; double designDist Math.Sqrt(Math.Pow(d2x - d1x, 2) Math.Pow(d2y - d1y, 2)); double actualDist Math.Sqrt(Math.Pow(a2x - a1x, 2) Math.Pow(a2y - a1y, 2)); double scale actualDist / designDist; // 把理论坐标绕补偿中心 (cx, cy) 缩放 double cx (d1x d2x) / 2, cy (d1y d2y) / 2; double targetX 105.0, targetY 90.0; double compensatedX cx (targetX - cx) * scale; double compensatedY cy (targetY - cy) * scale;2 点补偿的坑在于它只有两个样本点很容易把识别噪声当成真实形变。如果板子本身很小、刚性又强实测间距和设计间距的差异往往只有几个微米全被相机噪声吃掉了这时候补偿反而引入额外误差。我一般会给补偿加一个阈值判断当缩放系数偏离 1.0 超过 0.001 才启用补偿否则直接用 4 点校正的结果。0.001 对应 300mm 板长上 0.3mm 的形变低于这个量级确实不需要补偿。3.3 校正与补偿的执行顺序以及旋转中心和补偿中心整个位置基准链的执行顺序是固定的像素坐标先过九点标定矩阵换算成机台坐标再过 4 点校正矩阵把整板偏差拉正最后用 2 点补偿做局部精修。每步的结果是下一步的输入顺序反了结果必然错。还有一个容易被忽略的概念校正矩阵的旋转中心。VectorToHomMat2d 拟合出的矩阵里隐含着旋转中心它通常是四个 MARK 点分布的中心区域。而 2 点补偿的补偿中心是用户指定的对角中点。如果两次运算的旋转/补偿中心不一致后面做角度补偿时算出的附加偏移就会差出几十微米。稳妥的做法是把 4 点校正和 2 点补偿合成一个矩阵先用 hom_mat2d_translate 和 hom_mat2d_scale 在统一中心下合成再用 hom_mat2d_compose 合并成一个矩阵这样运行时只要做一次 affine_trans_point_2d既减少计算量也减少中间误差。4. 上下双相机对位贴合从识别数据到贴合补偿量的换算链4.1 双相机布局与坐标系统一上下双相机对位贴合的机械布局一般是这样下相机固定在机台上镜头朝上用于拍摄 PCB 上的 MARK 点上相机装在吸嘴头或者悬臂上镜头朝下用于在取料后拍摄吸嘴上的元件。工作顺序是贴片头吸取元件后移动到上相机拍照位拍下元件实际中心和角度与此同时下相机或另一个固定相机拍摄 PCB 的 MARK 点算出当前板的基准两次识别结果经各自标定矩阵换算到统一机台坐标系后做差得到贴片头需要走的补偿量。这里最关键的工程问题是坐标系统一。上相机装在运动头上它拍到的是元件相对吸嘴中心的位置这个位置要补偿的是“吸嘴抓料抓偏了多少”下相机拍到的是 PCB 相对机台的位置要补偿的是“板子放偏了多少”。两者换算到机台坐标时基准原点必须一致。常见做法是做一个双相机互标定让吸嘴吸一个标准 MARK 件先走到上相机视野中心拍一次记录像素坐标和机台坐标再移动到下相机视野中心拍一次同样记录。两组数据之间的平移和旋转偏差就是两个相机坐标系的相对关系用 vector_to_hom_mat2d 拟合成矩阵存下来每次开机加载。如果用大恒相机这类工业相机C# 里通常用 SDK 回调拿图像数据再转成 Halcon 的 HObject。大恒的即时相机 SDK 有 C# 示例回调里拿到的 buffer 用 Halcon 的 GenImage1 包一层就能进 find_shape_model注意 GenImage1 要指定宽高和像素格式彩色转灰度用 GenImageInterleaved 后转 gray别拿 RGB 图直接跑 shape model匹配速度和稳定性都会变差。4.2 贴合补偿算法角度差加旋转中心偏移是核心贴合补偿不能让运动控制卡直接走“目标位置减元件当前位置”的差值。因为元件在吸嘴上有角度偏转贴片头旋转机构转一个角度后元件中心会绕着旋转中心画弧中心点本身会发生平移。如果不补偿这个平移元件贴下去就会绕着一个偏心点转角度对了位置偏了。补偿算法的核心分三步先算出角度差再算因旋转产生的附加 XY 偏移最后把 XY 偏移叠加上去。// 假设经过标定后元件在机台坐标系下的当前位置 double partX 105.42, partY 90.18, partAngle 1.25; // 目标位置由 PCB MARK 点校正后的理论贴装坐标 double targetX 105.00, targetY 90.00, targetAngle 0.0; // 角度差单位度 double deltaAngle targetAngle - partAngle; // 旋转中心贴片头旋转轴在机台坐标系下的位置由机械装配决定 double rotCenterX 105.00, rotCenterY 90.00; double rad deltaAngle * Math.PI / 180.0; double cosA Math.Cos(rad), sinA Math.Sin(rad); // 元件相对旋转中心的半径 double rx partX - rotCenterX; double ry partY - rotCenterY; // 旋转后的新位置绕旋转中心旋转 double rotatedX rotCenterX rx * cosA - ry * sinA; double rotatedY rotCenterY rx * sinA ry * cosA; // 旋转产生的附加偏移 double extraOffsetX rotatedX - partX; double extraOffsetY rotatedY - partY; // 最终给运动控制卡的补偿量 double finalCompX (targetX - partX) extraOffsetX; double finalCompY (targetY - partY) extraOffsetY; Console.WriteLine($X补偿: {finalCompX * 1000:F2} um, Y补偿: {finalCompY * 1000:F2} um);这段代码里的旋转中心必须下功夫量准。旋转中心在机械上就是吸嘴旋转轴轴心在机台坐标系的投影位置不同品牌的贴片头机械结构差异很大有的旋转中心与吸嘴中心重合有的偏出好几个毫米。测量方法也简单吸嘴上吸一个标准元件转 0 度拍一次、转 90 度拍一次两次元件中心的连线中点就是旋转中心。别拿图纸上的理论值直接填理论值是设计值实际装配一定有偏差。我见过一个项目就是旋转中心填错小角度补偿看不出来贴大角度旋转的元件比如连接器转 180 度时偏了将近 0.1mm排查了两天才定位到是这个参数。4.3 C# 上位机程序框架视觉和运动的线程边界C# 做这类上位机最怕把所有逻辑塞进 UI 线程。相机采集、Halcon 匹配、运动控制卡通信三个环节都有自己的阻塞点相机 SDK 回调卡一下、运动控制卡回传慢一拍UI 就无响应现场工人第一反应就是“软件死了”其实是线程模型没设计好。我一般把程序分成四个线程层次UI 线程只做状态显示和参数录入视觉线程独立跑相机采集和 Halcon 算子用 BlockingCollection 做数据队列运动线程负责任何和运动控制卡相关的命令收发补算线程只做数学运算输入是视觉结果和运动位置输出是补偿量。四个线程之间传参全用定制的数据类不用全局变量避免锁竞争。这样即使视觉线程因为 Halcon license 问题卡死LICENSE 过期会弹窗阻塞运动线程也能保证设备处于安全停止状态不至于撞机。补算线程里的代码就是上一节那个补偿算法输入输出都是结构体方便调试时把每次识别的 row、col、angle、补偿量全部记到日志现场出了问题回放日志就能定位是识别环节还是补偿环节的问题。这个日志习惯帮我省了大量现场出差时间很多时候客户说“贴不准”拉出日志一看是 MARK 点识别分数低于 0.6 时没有做超时判断程序还在用上次的结果。5. 避坑排查标定、识别与补偿里的 5 个典型翻车现场5.1 Halcon license 报错程序启动就弹窗崩溃现象C# 程序一运行到 create_shape_model 或 find_shape_model 就弹 HDevelop license 错误有时候是明明开发机好好的部署到工控机就崩。原因Halcon 的 runtime license 没有正确安装或不是同一个版本的 license 绑定到了不同网卡。开发版和 runtime 版是两套东西工控机上如果只装了开发版 license部署的 exe 拿到另一台机器上就跑不了。解决在调用任何 Halcon 算子之前先检查 license 特性用 HSystem.GetSystem 查 runtime_license或者用 has_license_feature 确认关键特性在不在。更稳妥的是在程序启动时加一个 try-catch 包住第一次算子调用捕获到 HalconException 就弹出明确提示“Halcon runtime license 缺失或过期”而不是让用户看莫名的英文弹窗。另外C# 程序发布时记得把 halcon 的 runtime DLL 和 license 文件放对目录这个坑比算子用错的频率高得多。5.2 标定板不平九点标定残差看着小实际贴偏现象九点标定拟合出的矩阵换算误差只有 1-2 个像素但贴装出来的产品边缘位置系统性偏出 0.2mm。原因标定时所用的标定板/针尖没有与相机光轴垂直。SMT 设备里的相机是固定安装的标定治具如果放不平相当于用一个倾斜平面去拟合另一个平面拟合出来的仿射矩阵在中心区域误差被匀掉了在视野边缘就暴露出偏差。解决标定前先用水平仪或者用相机拍一次标准方格纸检查图像中心与边缘是否同时清晰。如果中心清晰边缘模糊说明治具不水平调整治具重新标定。另外九点标定的九个点要尽可能覆盖相机视野的四个角和中心只集中在中心区域拟合对边缘没有任何约束力。很多新手标定取点图省事九个点挤在一起残差确实小但毫无意义。5.3 反光元件模板识别翻车MinScore 调低就误匹配现象LED、连接器这类反光强的元件正常光照下轮廓对比度时高时低find_shape_model 要么找不到要么把背景里类似形状的走线误识别成元件。原因反光导致轮廓的极性发生变化建模板时是暗边亮底实际拍照变成了亮边暗底use_polarity 模式严格校验极性极性一变评分骤降。解决建模板时把极性参数改成 ignore_global_polarity让 Halcon 忽略全局极性反转只比对轮廓形状。如果局部反光严重用 ignore_local_polarity它允许轮廓局部极性变化稳定性最好但匹配耗时会增加。另外可以在建模板前用 Halcon 的灰度浓淡校正算子对图像做预处理比如 scale_image 或 emphasize把反光造成的对比度不均拉平。现场光照调整时要保证元件表面的反光带不落在建模板的 ROI 内把模板区域画在轮廓清晰的引线框区域避开镜面反射区。5.4 MARK 点识别受铜箔和油墨干扰中心偏出 1-2 个像素现象同一个 MARK 点背光亮度调高一点识别中心就偏调低一点又找不到贴装精度忽好忽坏。原因MARK 点周围的铜箔、字符油墨在特定光照下形成高亮边缘shape model 匹配时把干扰轮廓也纳入了匹配计算拟合出的中心自然偏移。解决不要直接用全幅图跑 find_shape_model。先用 threshold 做一次二值化把灰度在 MARK 点范围内的区域筛出来再用 connection 连成连通域选择面积最接近 MARK 点设计值的那个区域最后用 smallest_circle 或者 moments_points 求中心这样得到的是区域质心抗边缘干扰能力强。这个方案对光照变化也很稳因为二值化阈值可以跟着灰度直方图自适应调整。如果遇到板厂 MARK 点做出来本身就偏心就需要用 4 点校正去吸收这个偏差单靠视觉是测不出来的它已经被校正矩阵当成真实位置了。5.5 上下双相机基准不一致单相机校正都准对位就是偏现象上相机单独标定、下相机单独标定精度都合格。双相机对位时角度小的元件贴得准角度大的元件整体偏移。原因两个相机各自标定的坐标原点不在同一个机台坐标系下。上相机装在运动头上它随运动头移动像素坐标换算出来的机台坐标依赖当前运动位置下相机固定在机台上坐标基准是固定的。两者之间存在一个固定的平移和旋转偏差没有做互标定直接相减偏差就全部叠加到补偿量里。解决做一次双相机互标定。吸嘴上吸一个高精度 MARK 件先移到上相机视野中心拍一次记录像素坐标和当前机台坐标再移到下相机视野中心拍一次同样记录。重复几次取平均两组坐标之间做 vector_to_hom_mat2d得到互标定矩阵。每次设备上电后先执行一次互标定流程把矩阵加载到内存。这个标定必须用同一个物理基准件换治具就要重标。现场调试时如果发现角度越大偏越多优先怀疑这个环节。6. 上机前先验证离线补偿仿真算一遍现场才不会花两个晚上调机上贴片机调试之前我强烈建议先把补偿算法在电脑上跑一遍离线验证。做法很简单写一段 C# 控制台程序模拟 1000 次识别结果每次在真实位置附近叠加随机噪声模拟相机识别的亚像素误差用补偿算法算出最终补偿量统计残差均值和最大偏差。这一步能帮你区分“算法错了”和“识别不准”两个问题避免到现场两眼一抹黑。Random rnd new Random(42); double sumResidualX 0, sumResidualY 0, maxResidual 0; for (int i 0; i 1000; i) { // 模拟识别误差正负 1.5 个像素换算成机台坐标约正负 0.015mm double noiseX (rnd.NextDouble() - 0.5) * 0.03; double noiseY (rnd.NextDouble() - 0.5) * 0.03; double partX 105.42 noiseX; double partY 90.18 noiseY; double partAngle 1.25 (rnd.NextDouble() - 0.5) * 0.01; // 走一遍补偿算法 // finalCompX, finalCompY ...上一章的算法逻辑 double residualX Math.Abs(finalCompX - 0.42); // 真实补偿量 0.42mm double residualY Math.Abs(finalCompY - 0.18); double residual Math.Sqrt(residualX * residualX residualY * residualY); sumResidualX residualX; sumResidualY residualY; maxResidual Math.Max(maxResidual, residual); } Console.WriteLine($X平均残差: {sumResidualX / 1000 * 1000:F2} um); Console.WriteLine($Y平均残差: {sumResidualY / 1000 * 1000:F2} um); Console.WriteLine($最大残差: {maxResidual * 1000:F2} um);如果平均残差在 20um 以内说明算法链路没问题可以上机。现场验证顺序我建议按四步走先验证九点标定再验证 MARK 点识别重复性再验证双相机互标定最后才做整机对位。前两步任何一步不稳都不要急着调贴合补偿否则会把标定误差和算法误差混在一起瞎调。我上次做一台双相机贴片机客户赶着投产直接跳过前两步上整机对位结果角度补偿和 XY 补偿互相打架调了两个通宵最后回退到按顺序验证半小时就定位到是互标定矩阵的符号搞反了。从那以后我养成了一个习惯每次换线或者改料号先贴一块玻璃基板打几个测量点用影像仪量坐标差再决定要不要重新做标定。标定这个东西不像写代码写错了一眼能看出来标定错了表面上一切正常贴出来全是次品。这个习惯帮我挡住了好几次隐性故障希望帮到你。本文还有配套的精品资源点击获取
返回列表