装配质检:缺件与尺寸 — 部署指南

套餐

摄像头 + reComputer J30 / J40(Orin)

检测、缺件比对、尺寸测量、Modbus TCP 与 MQTT 都跑在一台 Jetson Orin 上,摄像头用任意 RTSP / ONVIF 摄像头、USB 摄像头或录制文件。

  • 模型: 随包模型训练在 DeepPCB(裸板铜箔缺陷数据集)上,只用于跑通链路;真实工位需要用自己的图像重训。
  • 已知限制: 期望件 ROI 是画面坐标,摄像头移动后模板失效;零件倾斜或标定物与被测面不共面会让测量偏差;所有摄像头共享一份 Modbus 寄存器,逐路结果只能从 MQTT 取。
  • 网络: 摄像头对 Jetson 可达,PLC 能访问 Jetson 的 502 端口。
1

部署质检运行时

下载模型、在设备上构建 TensorRT engine(首次约五分钟),然后启动运行时与 MQTT broker。

前置条件
  • 设备端口 1883、502、8080 空闲。
  • RTSP 地址已用 VLC 测试过。
故障排查
现象处理
Image ... is not on this device确认设备能访问 sensecraft-missionpack.seeed.cn 后重新部署
engine 构建失败确认 /usr/src/tensorrt/bin/trtexec 存在、磁盘有 10 GB 可用;删掉上次中断留下的 *.engine.part 后重试
ONNX 校验和不符删掉模型文件,重新部署让它重新下载
摄像头没有画面用 VLC 测 RTSP 地址,检查路径和用户名密码
容器每 30 秒左右重启一次录制文件未开循环时播放到结尾会退出,属正常
部署连不上确认 SSH 可达、用户名正确(常用 recomputer 或 nvidia)
Modbus 502 端口被拒主机上有别的 Modbus server 占用,或容器没起来,执行 docker logs edge-inspection-assembly-app 查看
部署方式

通过 SSH 部署到网络上的 Jetson。设备须为 JetPack 6.x 并装有 TensorRT dev 包、Docker 已配 NVIDIA runtime,至少 10 GB 可用磁盘。

部署时需要填写(在 SenseCraft Solution 应用里填)
  • Jetson IP*
  • SSH 用户名*默认 recomputer

    常见默认值:recomputer(Seeed reComputer J30 / J40 系列)、nvidia 或 ubuntu。

  • SSH 密码*
  • 工位名称*默认 line1

    MQTT 主题的第一段——给这个工位取名(产线、工段或站点),一个 broker 上多个工位就不会混在一起

  • 流编号*默认 line1-pcb

    在 MQTT 主题和每条事件里标识这路摄像头

  • 质检摄像头地址*

    对着板件或装配体的摄像头。可以是 RTSP 地址、/dev/videoN 设备,或容器内 /data 下的录制文件路径。RTSP 地址请先用 VLC 测一下。

  • 尺寸测量摄像头地址

    可选的第二路摄像头,用于尺寸测量,画面里要同时有被测件和标定物。留空则只部署缺件检测。

2

建立尺寸标定

可选,只在需要尺寸判定时做。跳过时尺寸段报 uncalibrated、Modbus HR 11 = 4,不影响缺件比对。

前置条件
  • 一个与被测面同平面的标定物:ArUco 标记(示例为 DICT_4X4_50、id 7、宽 25 mm)或已知宽度的参考物。打印的标记用卡尺量一遍。
  • 一件合格品,用来核对结果。
  • 步骤 1 已完成。
故障排查
现象处理
check_aruco.py 非零退出用 opencv-contrib-python-headless 重建镜像
报 status: uncalibrated检查 calibration.roi 是否框住标定物,aruco_dict 与 aruco_id 是否与打印的标记一致
报 status: not_found提高对比度,或把测量 ROI 画到正确的特征上
测量结果稳定偏差百分之几让标定物与被测面共面,ref_object_width_mm 填卡尺实测宽度
名义尺寸的件全判 NG量一批合格品,把 tolerance_mm 设在它们的离散范围之上
3

查看判定结果

打开 8080 端口面板,查看实时计数、最近事件和带检测框与缺件 ROI 的预览。

故障排查
现象处理
面板打不开检查主机防火墙是否放行 8080 端口
面板能开但预览是黑的看 /healthz 里 frames_processed 是否在涨,再查容器日志里的摄像头地址
线圈与寄存器对不上先读寄存器,把线圈当触发信号
一开线全是 NG期望清单还是随包示例,按工位重建
每条事件里 dimension.enabled 都是 false该路没有 dimension 段,查看标定摄像头那一路的事件
部署完成后

工位每帧发一条 MQTT 事件,并持续更新 Modbus 寄存器与线圈。

快速验证

  1. 打开 http://<jetson-ip>:8080/healthz,frames_processed 在增长、mqtt_rejected 为 0。
  2. 执行 mosquitto_sub -h <jetson-ip> -t '<工位名>/inspection/#' -C 5,每条事件带 assembly、dimension 段和 verdict_reasons。
  3. 从工装上拿走一个期望件:missing_count 上升,verdict 变成 NG。
  4. 用 Modbus 客户端连 502 端口、unit 1:Coil 0(NG)与 Coil 1(OK)互斥,HR 8 等于缺件数。

配置期望件清单

在 config/config.json 的 sources[] 下为每台摄像头单独配置 assembly 与 dimension 段:

  • assembly.expected[]:一个装配位一条,填 class(模型类别之一)、roi(该摄像头画面下归一化的 [x1, y1, x2, y2])、min_count 和 label(缺件时显示的名字)。
  • dimension:挂在看得到标定物的那一路,calibration 框住标定物,measurements[] 每项填 ROI、名义尺寸与 tolerance_mm。
  • rules.ng_on_defect、ng_on_missing、ng_on_extra、ng_on_dimension 分别控制哪些原因判 NG。

读取输出

Modbus TCP,unit 1,端口 502:

寄存器含义
Coil 0 / Coil 1NG / OK,互斥
HR 0 / HR 1主缺陷类别 ID / 缺陷数
HR 2–5主缺陷框 cx、cy、w、h,归一化 ×10000
HR 6–7心跳,Unix 秒的 uint32 高 / 低字
HR 8 / HR 9缺件数 / 多余件数
HR 10主测量值,毫米 ×100(长边)
HR 11公差判定码:0 ok / 1 undersize / 2 oversize / 3 not_found / 4 uncalibrated

HR 10 = 0 时先读 HR 11。MQTT 主题为 <工位名>/inspection/<流编号>/results,verdict = NG 不一定意味着 defect_count > 0。

下一步

  • 把示例期望清单换成自己的装配位,并用自己的图像重训模型。
  • 把 mqtt.host 指到带凭据的 broker,随包的 mosquitto 为本机匿名访问。
  • 加摄像头就往 sources[] 里追加。reComputer J30 系列(Orin Nano 8GB)在关闭 MQTT 与 Modbus 时最多稳定运行 8 路 × 10 fps,带完整 I/O 时按更少路数规划。
4

用 SAM2 生成期望件清单与 ROI(可选)

可选。在 GPU 工作站上用上游半自动标注工具(tools/annotation/)从自己的图像生成 assembly.expected[] 模板和 ROI profile,不用手写 ROI。这一步不在质检设备上运行。

前置条件
  • 一台装有上游 edge-inspection-assembly 仓库的 GPU 工作站(--backend otsu 不需要 GPU,效果较弱)。
  • 自己的工位图像与一份 COCO 风格的类别表。
故障排查
现象处理
SAM2 后端起不来或很慢确认工作站有 GPU,或改用 --backend otsu 重跑
设备上的运行时拒绝生成的模板把这一步产出的 assembly.expected[] 模板与 ROI profile 一起重新拷过去并重新加载
SAM2 提不出有用的框类别表补上你的零件,先手工标几个类再重跑