在单个程序中使用多个视图
  • 28 Jan 2025
  • PDF

在单个程序中使用多个视图

  • PDF

文章摘要

此示例展示了如何设置一个单一程序,该程序可以检查不同的部件、角度或视图,而无需切换到其他程序。这样做有多种原因,但主要的两种应用场景是:

  1. 当捕获之间没有足够的时间来切换程序时,

  2. 当在多个部件或部件的角度上执行相同的检测时(例如,检查车身五个不同位置上的螺柱是否存在/缺失)。在这种情况下,使用此方法可以避免在不同程序中多次训练相同的模型(螺柱存在/缺失)。

示例程序下载:

OVModel
8.89 MB


可导入的示例流程下载:

注意

导入时,Classification Block Logic 节点中的配置将丢失。

flows (2)
7.76 KB

此示例是一个简单版本,包含两个视图和一种检测类型,但您可以使用相同的技术处理无限数量的检测类型和视图。此次检测我们将检查钻头盒两侧是否有螺柱。 一侧的底部有五个螺柱,另一侧的顶部和底部各有八个螺柱。我们将称具有 16 个螺柱的侧面为 A 侧,具有 5 个螺柱的侧面为 B 侧

A 侧(16 个螺柱)

B 侧(5 个螺柱)

创建并训练新程序

由于布局不同,我们将把两侧合并为一个程序,这样就不需要为相同的存在/缺失模型训练两次。

  1. 创建一个程序。在此案例中,我们创建的是一个分类程序,但相同的原则也可以应用于分割。

  2. 设置第一个视图的模板图像和对齐:

    注意

    在同一程序中检查多个视图时,Aligner 不可用。模板图像和对齐工具仅用于设置检测设置的基础图像。

  3. A 侧 绘制感兴趣区域(ROI)。命名时选择有助于识别所属侧面的名称。在此案例中,我们将 ROIs 命名为 A1-A16。

  4. 返回 模板图像和对齐,将图像替换为 B 侧,可以选择使用新的捕获图像或从库中选择。

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

    注意

    对于更复杂的程序,可以根据需要检查的视图数量,重复此过程。

  6. 使用 A 侧B 侧 的图像进行标记并训练分类模型。捕获和标记 A 侧 时,请勿标记 B 侧 的 ROIs,反之亦然。

    标记 A 侧,合格


    标记 A 侧,不合格


    标记 B 侧,合格


    标记 B 侧,不合格

配置 Node-RED 逻辑

  1. 导航至 IO 块(在程序编辑器中选择 Configure IO)以打开 Node-RED 流程。创建一个源,用来告诉 OV20i 当前正在检查哪个侧面。这个源可以是机器人位置数据、来自 PLC 的信息或其他任何你想使用的数据。在下面的示例中,我们将使用两个 Inject 节点 来模拟,一个发送字符串 "A",另一个发送字符串 "B"。

  2. 由于输入的侧面数据可能是瞬时的,但我们想要检查哪个侧面是活动的,因此我们将使用 Flow 变量 来存储状态数据,直到接收到下一个侧面信息为止。将数据源连接到包含以下代码的功能块:

    flow.set('side',msg.payload);
    return msg;


    image(86)

  3. 你可以通过打开 上下文 数据侧边栏来测试你的侧面数据是否被正确存储,发送一条消息,然后点击 Flow 变量面板 上的 刷新 按钮进行刷新。流数据面板只有在手动刷新时,使用小的 刷新 按钮才能更新。

    image(87)

  4. 一旦侧面数据正确存储在 Flow 变量 中,添加一个 switch 节点,并将其连接到 所有块输出。这个块将根据 Flow 变量 中当前活动的侧面,路由带有检查数据的消息。配置它以查看 Flow 变量,如果 A 侧是活动的,则将消息路由到端口 1;如果 B 侧是活动的,则将消息路由到端口 2。

    image(88)

    注意

    对于更复杂的程序,可以根据需要检查的视图数量,重复此过程。

  5. switch 节点 的每个输出端口连接到一个 Classification Block Logic 节点,并根据每个侧面的检查规则进行配置。switch 节点 一次只会将消息路由到其中一个节点。下图展示了 switch 节点的 B 侧端口配置。请注意,它没有引用任何 A 侧的 ROI,因此当检查通过此节点时,逻辑将忽略该侧的结果。

    image(89)

  6. 最后,将 逻辑块 连接到 检查合格/不合格块。这样,结果就会显示在 HMI 上,并且可以传递给任何连接的 PLC 或其他流组件。

测试程序

这完成了 Node-RED 流程,现在是时候进行端到端的程序测试了。.  

  1. 首先,我们将使用 Node-RED inject 节点 发送 A 侧命令。然后,我们将使用 HMI 检查一个合格的零件。请注意,尽管 B 侧的一个区域未通过,整个检查仍然通过。

  2. 现在,当我们移除 A 侧的一个钻头并重新检查时,我们得到了预期的失败结果。

  3. 接下来,切换到 B 侧,我们使用 Node-RED inject 节点 发送 B 信号,并在 上下文数据面板 中刷新 Flow 变量 部分,以确保它已被存储。

  4. 现在,当我们翻到合格零件的 B 侧时,尽管 A 侧的区域全部未通过,检查仍然通过。

恭喜你!你现在知道如何使用一个程序和模型在零件的多个视图上进行检查。这将允许在高速下进行复杂的检查,并与机器人实现紧密集成。它还将节省大量时间,因为你不需要为每个视图训练多个相同的检查模型。


本文对您有帮助吗?