EXP-04 · 8 学时

视觉巡检闭环与报告

在巡检点拍照/录像,用 YOLOv8/ONNX 识别表计读数或异常目标,汇总生成巡检报告,最后自主回充。验收标准:完成「建图 - 定位 - 巡检 - 识别 - 报告」五环闭环;关键技巧:光照不足需补光、目标阈值要标定。

实践YOLOv8 / ONNXcoco_detector自主回充

00课程节奏:五星学习法 · 8 段微课(每段 ≤ 15 min)

本实验按五星学习法组织:先用一个真实故障聚焦问题,再激活旧知(EXP-01~03 全链路 + 图像识别直觉 + 概率与阈值),接着示证新知(YOLO 一次看完 + 巡检日报数据流 + 回充分段动画),然后动手应用新知完成从到点拍照到自主回充的全闭环,最后借排障与拓展融会贯通。全程切成 8 段微课、每段不超过 15 分钟,段间停顿 1~2 分钟消化;纯讲授合计约 100 分钟,其余课时用于动手实操与个别辅导。

① 聚焦问题
课段 1 · 12 min
"烟雾报警狼来了"故障现场,带着问题开课
② 激活旧知
课段 2 · 8 min
EXP-01~03 全链路 · 图像识别直觉 · 概率与阈值
③ 示证新知
课段 3~4 · 27 min
YOLO 一次看完 + 日报数据流 + 回充分段
④ 应用新知
课段 5~7 · 40 min
到点拍照→识别→阈值标定→日报→自主回充
⑤ 融会贯通
课段 8 · 13 min
排障口诀 · 拓展阅读 · 思考题
课段五星阶段时长对应章节本段任务
课段 1聚焦问题12 min§01 + §02 前半抛出现场故障"烟雾报警狼来了",明确本课要解决的目标
课段 2激活旧知8 min§02 后半用 EXP-01~03 全链路、图像识别直觉、概率与阈值三条旧知解释故障成因
课段 3示证新知15 min§03认识相机、coco_detector、ONNX 与回充桩硬件
课段 4示证新知12 min§06看懂 YOLO 检测与自主回充三阶段动画
课段 5应用新知15 min§04 S1~S3 + §05 ①②③到点停稳 + 补光拍照 + coco_detector 实时识别(边讲边演)
课段 6应用新知15 min§04 S4~S5 + §05 ④⑤阈值标定 + 生成日报 + 自主回充——课段 1 的故障就此根除
课段 7应用新知10 min§07置信度阈值标定台与报告生成器自测,全通方可结课
课段 8融会贯通13 min§08~§10排障口诀收口,挑战题与思考题拔高迁移

讲课提示:课段 1/2 以讲授 + 提问为主;课段 3~6 边讲边演(实物 / 动画 / 命令行);课段 7 学员独立完成;课段 8 答疑拔高。段与段之间停顿 1~2 分钟,确认学员跟上再进下一段。

01学习目标课段 1 · 聚焦问题 · 12 min

  • 用自己的话讲清 YOLO:看图圈目标——一次看完一整张图,同时给出框、类别和置信度。
  • 读懂置信度阈值的两难:调高漏检、调低误检,理解「阈值标定」为什么是技巧项。
  • 在巡检点完成拍照取帧,并喂给 YOLOv8/ONNX 模型得到检测结果。
  • 把「到点—拍照—识别—记录」串联起来,生成一份结构化巡检日报。
  • 让 Go2 巡检结束后自主回充,打通「建图-定位-巡检-识别-报告」全闭环并复盘。
素材说明:本课无视频素材——识别效果以官方案例仓库截图与自制 SVG 动画呈现,不虚构实拍录像。

02原理:视觉识别与巡检闭环讲透课段 1 收尾 + 课段 2 · 激活旧知 · 8 min

❓ 聚焦问题(课段 1)学员现场最常遇到的怪事:反光被认成烟雾连报三次,真渗漏却一声不吭——「狼来了」式的误报让运维把告警当耳旁风,等到真泄漏反而漏掉了。问题出在哪?带着这个故障听完全课——到课段 6 你会亲手把阈值标定到位,让狼不再乱叫、真狼跑不掉。

YOLO 就是「看图圈目标」:给它一张巡检照片,它一次看完,直接在图上画框:「表计,置信度 0.91」「烟雾,置信度 0.63」。名字 YOLO = You Only Look Once(你只需看一次)——不像老办法要拿小窗口在图上一寸寸挪。每个框带一个 0~1 的置信度,代表模型有多确信框里真是那个东西;我们用一条阈值线筛它:线划高了真目标被划掉(漏检),划低了影子反光也来凑数(误检)——所以实训技巧叫「目标阈值标定」。

三条到手的路(本课走前两条)

① 现成检出(课堂主线)
go2_ros2_sdk 内置图像话题 go2_camera/color/image,配合 coco_detector 节点(ros2 run coco_detector coco_detector_node)实时发布 /detected_objects——零训练先跑通闭环。
② 自训表计模型
Ultralytics CLI 一行训练:yolo detect train;smart-gas-meter 案例(MIT)给出标数据→train_yolo.py→infer_yolo.py→导出 model_digit_yolo.onnx 的全流程。
③ ONNX 边缘部署
导出 .onnx 后在 Jetson Orin 40 TOPS 上推理,弱网也能本地出结果——识别不依赖云端。
光照是成败手
算法再好,欠曝/眩光都白搭:背光表位补光灯常开,这就是「光照不足需补光」技巧的由来。

回充:巡检的最后一个动作

识别完不是结束——电量与流程都要求狗自己回桩。Nav2 的 Docking Framework(opennav_docking)把回充分成几个阶段:先在远处把桩放进视野粗对准,再挪到桩前的预备位(staging)(参数 staging_x_offset 控制提前量),最后直线对接入库,插桩成功发完成信号。桩插上的那一刻,「建图-定位-巡检-识别-报告」五环才算真正扣成一圈。

类比收束:整个 IND-05 就是一家物流公司——EXP-02 画「配送地图」,EXP-03 是「定位+路线规划」,EXP-04 是「送货上门(拍照识别)+ 签收回单(报告)+ 空车回库(回充)」。
↺ 激活旧知(课段 2)回忆三条旧知:① EXP-01~03 的全链路(建图→定位→到点拍照,是识别的输入前提);② 图像识别直觉(人眼一眼圈目标,机器怎么学);③ 概率与阈值(0~1 置信度 + 阈值线 = 漏检/误检的跷跷板)。三条合起来,正好解释课段 1 那个故障。
smart-gas-meter 表计 YOLO 识别案例
图 4-1|表计数字 YOLO 识别开源案例(来自 Cian911/smart-gas-meter 仓库,MIT 协议):训练管线 calibrate → label → prepare → train_yolo → infer_yolo,产出 model_digit_yolo.onnx——表计读数任务的完整参考实现。
从检测结果到巡检日报(数据流示意图) 各巡检点照片 + 位姿 + 时间戳 YOLO / coco_detector类别 + 置信度 + 框 规则判定读数/异常/阈值过滤 巡检日报Markdown/JSON 日报字段范例:点位编号 · 到达时间 · 读数值 · 异常类别 · 置信度 · 照片路径 · 结论(正常/告警)五环闭环验收 = 地图(EXP-02) ⊕ 定位(EXP-03) ⊕ 巡检点到达 ⊕ 识别结果 ⊕ 本报告 归档齐全
图 4-2|巡检日报生成数据流(自制示意图):每个巡检点的「照片+位姿+时间」经检测、规则判定后汇总成结构化日报,是闭环验收的最终凭证。
自主回充三阶段:opennav_docking(SimpleChargingDock)示意(示意图) ① 发现与粗对准看到桩(AprilTag/轮廓)在代价地图里认出 dock Go2充电桩 ② 预备位 stagingstaging_x_offset 提前量对齐中轴、姿态摆正 Go2 ③ 对接入库 ✓直线进桩,触点闭合发布 dock 成功 → 开充 Go2 粗对准(还能看偏)→ 预备位(拉直线距离)→ 入库(只做纯直线):把难动作拆成三段,成功率才上得去
图 4-3|自主回充三阶段(自制示意图,对应 Nav2 opennav_docking 框架与 SimpleChargingDock 插件):发现桩 → 停到预备位(staging_x_offset)→ 直线入库充电。

03硬件与材料课段 3 · 示证新知 · 15 min

前置相机
Go2 高清相机;SDK 侧 example/front_camera/camera_opencv.py 可直接取帧,ROS2 侧 go2_camera/color/image。
补光设备
巡检点位一盏补光灯/手电:背光表位、昏暗泵房必备——光照不足识别率腰斩。
算力
Jetson Orin 40 TOPS 机载跑 ONNX/yolov8n 足够;也可先在工控机跑通再下移。
充电桩
回充分段用;EXP-02 建图时已用 Start At Dock 定过原点,桩位与地图一致。
检查项标准不达标后果
图像话题go2_camera/color/image 有帧滚动取不到图,coco_detector 无输入
模型文件best.pt / model_digit_yolo.onnx 就位识别环节开天窗
阈值标定用 10 张混合样本调出阈值并记录漏检/误检,报告结论不可信
光照每个点位试拍,直方图不过暗欠曝图喂给再好的模型也白搭
电量≥30%,否则先回充再执行闭环报告没写完狗先趴窝

04操作步骤课段 5~6 · 应用新知 · 2×15 min

S1到点停稳
EXP-03 队列 + 定位收敛
→
S2补光拍照
camera_opencv / 图像话题取帧
→
S3YOLO 识别
coco_detector 或自训模型推理
→
S4阈值标定
调阈值压漏检误检并记录
→
S5报告与回充
汇总日报 → follow_waypoints 回桩 → docking
  1. 到点停稳:沿用 EXP-03 的巡检队列,每到一个点等定位收敛;把「到点事件」作为拍照触发器。
  2. 补光拍照:检查取景点光照,不足先开补光;SDK 侧跑 camera_opencv.py 存帧,或直接录 /go2_camera/color/image 话题。
  3. 识别(零训练主线):启动 ros2 run coco_detector coco_detector_node,订阅图像话题,检出结果发布到 /detected_objects——先用现成类别跑通链路。
  4. 识别(自训表计):按 smart-gas-meter 流程:标定 calibrate → 标注 label → 整理 prepare → train_yolo.py 训练 → infer_yolo.py 推理 → 导出 model_digit_yolo.onnx;训练命令用 Ultralytics CLI(yolo detect train model=yolov8n.pt data=... epochs=50)。
  5. 阈值标定(技巧):取 10 张亮/暗/反光混合样本扫阈值(0.3→0.8),画出漏检/误检代价,选定工作点并写进报告参数栏。
  6. 生成报告:按图 4-2 的字段汇总各点结果,输出结构化日报(JSON)+ 可读版(Markdown)。
  7. 自主回充:把充电桩作为终点加入 waypoint 队列驶近,再交给 opennav_docking 分三段对接;桩位对齐 EXP-02 的 Dock 原点,插桩成功即闭环完成。
验收闸门:五环(建图-定位-巡检-识别-报告)每环都有产物:map.yaml、巡检点到达记录、检测结果、阈标记录、日报文件,缺一不认。

05关键命令随课段 5 / 6 对照使用

coco_detector 用法来自 go2_ros2_sdk;训练/推理命令来自 Ultralytics 与 smart-gas-meter 官方脚本。

# ① 话题侧:看图像帧、看检测结果
ros2 topic hz /go2_camera/color/image
ros2 topic echo /detected_objects        # coco_detector 输出:类别+框

# ② 启动检测节点(go2_ros2_sdk 提供,detection_threshold 可在此粗调)
ros2 run coco_detector coco_detector_node --ros-args -p detection_threshold:=0.5

# ③ SDK 侧前置相机拍照存帧(需图形界面,ESC 退出)
python3 ./example/front_camera/camera_opencv.py

# ④ 自训表计模型(smart-gas-meter / Ultralytics 官方 CLI)
yolo detect train model=yolov8n.pt data=meter.yaml epochs=50 imgsz=640
python3 train_yolo.py                    # 案例仓库训练脚本
python3 infer_yolo.py                    # 案例仓库推理脚本
yolo export model=best.pt format=onnx    # 导出 ONNX 上机载部署

# ⑤ 巡检终点=充电桩:waypoint 驶近后转入 docking 对接(示意调用)
ros2 service call /dock_robot nav2_msgs/srv/DockRobot \
  "{dock_id: 'home', start_policy: 0}"
阈值标定怎么做
固定模型扫 0.3~0.8 五档,数漏检/误检各几次,取代价和最小档;结果写进报告「参数」栏。
补光到什么程度
试拍直方图不贴暗端、表盘数字无反光白斑;宁可两盏柔光也别一盏直射。
检测在哪跑
课堂先工控机跑通,验收时切到 Jetson Orin(40 TOPS)证明边缘可行。
闭环产物清单
地图 + 到达记录 + 检测图/JSON + 阈标表 + 日报 + 回充成功截图(六件套)。

06动画:YOLO 检测与回充分段课段 4 · 示证新知 · 12 min

YOLO = 看图圈目标:一次前向,全图框 + 置信度 表盘 管道阀门 meter 0.93(✓通过阈值) valve 0.41 ✗低于阈值0.5 阈值线(动画中自动标定)0.93 通过 → 报告「表计正常」0.41 拦下 → 避免误报 阈值↑ 检出少(漏检↑)阈值↓ 检出多(误检↑) 左=巡检画面(黄框通过 / 红框被拦) 右=置信度分布条与滑动阈值线
动画 4-1:黄框 0.93 高于阈值线进入报告,红框 0.41 被动态下压/抬升的阈值线拦下——「漏检与误检的跷跷板」随线移动实时可见。
回充三阶段推进 + 五环闭环扣合 ① 发现与粗对准② staging 预备位③ 直线入库 建图定位巡检识别报告·回充
动画 4-2:上半部分 Go2 分三段回充(发现→预备位→直线入库,站位停顿对应每个阶段的收尾判定);下半五环按「建图→定位→巡检→识别→报告/回充」依次点亮扣合成闭环。
观察动画 4-1 中阈值线上移时红框先消失、黄框还在;继续上移黄框也没了——漏检从这条线开始。「阈值标定」就是在这张跷跷板上找业务能接受的平衡点。

07互动:置信度阈值标定台 + 报告生成器课段 7 · 应用新知 · 10 min

第一步:拖动阈值看漏检/误检如何此消彼长;第二步:勾选检测结果一键生成巡检日报

阈值定在 0.5 左右拿「0.93/0.88/0.71」稳稳的,「0.44」被拦——把场景切到昏暗,所有置信度被打 75 折,同一阈值立刻出现漏检:这就是报告里必须记录阈值 + 光照条件的原因。

08常见问题课段 8 · 融会贯通 · 13 min

Q 图像话题没数据?
先 ros2 topic hz /go2_camera/color/image;CONN_TYPE=webrtc 时部分图像链路受限,优先 cyclonedds 网线直连。
Q coco_detector 起不来?
确认工作空间已 source、模型权重路径正确;detection_threshold 参数别设成超过 1 的数。
Q 表计数字总认错?
框住整个表盘 ≠ 读数:digit 级任务按 smart-gas-meter 分位裁切标注,先 collect 数据再训。
Q 阈值该定多少?
没有万能值:按 s7 标定台方法在真实样本上扫档,漏检代价高的场景偏低、误报代价高的偏高,并写进报告。
Q 反光被当烟雾?
眩光是头号假阳性源:调相机角度+偏振/柔光补光;仍误判就加时间维度(连续多帧同判)再报警。
Q 报告字段哪些必填?
点位、时间、结果(值/类别)、置信度、阈值、光照条件、结论——缺阈值与光照的报告无法复核。
Q 回充对不准桩?
三段拆开查:发现阶段看桩检测;staging 调 staging_x_offset;入库段地面打滑/桩歪需人工复位后重试。
Q 算力不够帧率低?
换 yolov8n/量化 ONNX、降推理分辨率;检测可以隔帧跑,到点拍照这一张必须跑全精度。

09拓展阅读课段 8 · 融会贯通

  • smart-gas-meter(MIT):表计识别全管线参考——calibrate/label/prepare/train_yolo/infer_yolo 脚本化,数据集 meter-captures(HuggingFace,CC-BY-4.0)可直接练手。
  • Ultralytics 官方文档:detect 任务 train/val/predict/export 全参数表;导出格式还有 TensorRT(Jetson 更快)。
  • Nav2 Docking Framework:opennav_docking(Apache-2.0),dock_plugins 可自定义桩检测,SimpleChargingDock 适合直线桩演示——https://api.nav2.org/nav2-rolling/html/md_nav2_docking_README.html
  • unitree_rl_gym(BSD-3):把「回充对接最后一厘米」交给强化学习策略,是进阶课题方向。
  • webhook/告警集成:日报里「告警」条目推送企业微信/钉钉,把实训报告升级成真告警系统。

10思考题 · 自测课段 8 · 融会贯通

✅ 完成成果
「建图-定位-巡检-识别-报告」六件套产物齐全并成功回充。
🧠 原理收获
讲清 YOLO 一次看全图的机制、阈值跷跷板与回充三段式拆解。
🛠 技能收获
独立完成拍照→识别→阈标→日报→回充全流程并排除至少一个光照/阈值问题。
📐 评分速览
闭环完整性 40% + 阈标记录 20% + 报告质量 20% + 动画互动 20%。
思考 1漏检和误检哪个对巡检业务更不可接受?按「漏检=隐患没报、误检=狼来了」两种代价,推导你负责的厂区应把阈值推向哪边,并说明如何用数据支撑这个选择。
思考 2为什么回充分成「粗对准—预备位—入库」三段,而不是一步伺服到位?用「误差分层吸收」的角度解释 staging_x_offset 存在的意义。