AI 驱动文档
您想了解什么?
在单个程序中使用多个视图
本指南将向您展示如何设置单个程序,使其能够检查不同的零件、角度或视图,而无需切换到其他程序。这样做的原因有很多,但主要有两种使用场景:
- 当两次捕获之间没有足够的时间切换程序时;
- 当需要对多个零件或零件的多个角度执行相同的检查时(例如,检查汽车车身上五个不同位置的螺柱有无)。在这种情况下,此方法可避免在不同程序中多次训练同一个模型(螺柱有无)。
备注
以下示例是一个包含两个视图和一种检查类型的简单版本,但您可以将此技术用于数量不限的检查类型和视图。在此次检查中,我们将检查一个钻头盒两侧钻头的有无。一侧底部有五个钻头,另一侧顶部和底部共有八个钻头。我们将有 16 个钻头的一侧称为 A 面,有 5 个钻头的一侧称为 B 面。
![]() | ![]() |
|---|---|
| A 面(16 个钻头) | B 面(5 个钻头) |
创建并训练新程序
由于两侧布局不同,我们不为每一侧创建单独的程序,而是将两侧合并到一个程序中,这样就无需两次训练相同的有无检测模型。
-
创建一个新程序。本例中是一个分类程序,但同样的原理也适用于分割。
-
为第一个视图设置模板图像和对齐:
备注
在同一程序上检查多个视图时,对齐器不可用。模板图像和对齐器仅用于为检查设置设定基准图像。

- 为 A 面绘制 ROI。命名时应便于识别它们属于哪一面。在本例中,我们将 ROI 命名为 A1-A16。

- 返回到模板图像和对齐,将图像替换为 B 面,可以通过新的捕获或从库中选择。

- 使用每个 ROI 旁边的锁定图标,以避免移动 A 面的任何 ROI,然后为 B 面绘制并命名 ROI。

备注
对于更复杂的程序,根据需要检查的视图数量重复此过程。
- 使用 A 面和 B 面的图像对分类模型进行标注和训练。捕获和标注 A 面时,不要标注 B 面的 ROI,反之亦然。
![]() | ![]() |
|---|---|
| 标注 A 面(通过) | 标注 A 面(失败) |
![]() | ![]() |
| 标注 B 面(通过) | 标注 B 面(失败) |
配置 Node-RED 逻辑
-
导航至 IO模块(从程序编辑器中点击 Configure IO)以打开您的 Node-RED 流程。
-
创建一个数据源,告诉 OV10i 当前正在检查哪一面。
备注
这可以是机器人位置数据、来自 PLC 的信息,或您想使用的任何其他内容。在下面的示例中,我们将使用两个 Inject nodes 来模拟此操作,一个发送字符串 "A",另一个发送字符串 "B"。
- 由于传入的面数据可能是瞬时的,但我们希望检查哪一面处于活动状态,因此我们将使用 Flow variable 存储状态数据,该数据将持续保留直到接收到下一个面信息。将您的数据源连接到包含以下代码的函数模块:
flow.set('side',msg.payload);
return msg;

- 您可以通过打开 context 数据侧边栏、发送消息,然后点击 Flow variable 窗格上的 refresh 来测试面数据是否已正确存储。Flow 数据窗格仅在使用小的 refresh 按钮手动刷新时才会更新。

- 一旦面数据正确存储在 Flow variable 中,添加一个连接到 All Block Outputs 的 switch node。此模块将根据 Flow variable 中哪一面处于活动状态来路由带有检查数据的消息。配置它查看 Flow variable,如果 A 处于活动状态,则将消息路由到端口 1;如果 B 处于活动状态,则路由到端口 2。

备注
对于更复杂的程序,可针对您想要检查的不同视图重复此过程。
- 将 switch 的每个输出端口连接到 Classification Block Logic block,并根据您想为该面检查的规则配置每一个。switch node 一次只会将消息路由到其中一个节点。下图显示了 switch 的 B 面端口的配置。请注意,它没有引用任何 A 面的 ROI,因此当检查通过此节点路由时,逻辑将忽略该面的结果。

- 最后,将 logic blocks 连接到 Inspection Pass/Fail block。这使得结果可以显示在 HMI 上,并传递给任何已连接的 PLC 或其他流程组件。

测试程序
现在 Node-RED 流程已配置完成,是时候对程序进行端到端测试了。
- 首先,我们将使用 Node-RED inject node 发送 A 面命令。然后,我们将使用 HMI 检查一个合格零件。请注意,尽管其中一个 B 面区域失败,但整个检查仍然通过。

- 现在,当我们移除 A 面的一个钻头并再次检查时,我们获得了期望的失败结果。

- 继续进行 B 面检查,我们使用 Node-RED inject 发送 B 信号,并 refresh context 数据窗格中的 Flow variable 部分以确保其已被存储。

- 现在,当我们翻转到合格零件的 B 面时,我们看到尽管 A 面的所有区域都失败,但检查仍然通过。

恭喜!您现在已经了解如何在零件的多个视图中使用同一个程序和模型。这将允许以高速进行复杂检查,并与机器人实现紧密集成。这也将为您节省大量时间,避免训练多个执行相同检查但仅针对不同视图的模型。





