# LED 指示牌识别(RK3588 NPU) 这个包只订阅共享的 `/usb_cam/image_raw` 图像,不打开 `/dev/video0`,也不会改变相机的曝光、增益或白平衡。二维码和指示牌节点可以同时订阅同一原始图像话题,各自进行独立的软件预处理。 USB 相机驱动应保持自动曝光、自动白平衡的正常原始画面。`config/traffic_sign.yaml` 中的 `brightness`、`contrast`、`saturation`、`gamma` 和 `lab_clahe` 只作用于本包的采集器和识别节点,不会影响二维码或其他相机订阅者。物理相机曝光是全局硬件设置,不能仅对某一个 ROS 节点生效。 当前赛道流程在到达指示牌点时只使用指示牌识别,所以识别节点启动后会按同一配置文件中的 `led_*` 参数暂时切换相机到手动曝光 `50`;节点退出时会自动恢复自动曝光和默认色彩。恢复操作由节点外层启动脚本执行,不依赖 ROS/Python 的退出回调。不要在二维码或巡线仍依赖相机画面时启动该节点。 `config/head_camera.yaml` 是复制到本包的 USB 相机 640×480 标定文件。每帧先按该文件去畸变,再水平翻转和执行 LED 彩色预处理;若相机话题分辨率不是 640×480,节点会跳过该帧,避免错误套用标定参数。 ## 模型 将最终验证通过的 YOLOv5 RKNN 模型保存为: ```text models/traffic_sign_direction.rknn ``` 类别顺序必须为:`left`、`right`、`straight`、`stop`。模型输入固定为 640×640;节点兼容 YOLOv5 ONNX 导出的单一已解码输出,以及三尺度原始检测头输出。 ## 启动 ```bash source /opt/ros/noetic/setup.bash source ~/ucar_ws/devel/setup.bash roslaunch traffic_sign_recognition traffic_sign_recognition.launch ``` 节点启动包装器会固定使用 `/home/ucar/venv3.9/bin/python3`,无需手动激活 venv。 ## ROS 接口 | 话题 | 类型 | 含义 | | --- | --- | --- | | `/traffic_sign/direction` | `std_msgs/String` | `LEFT`、`RIGHT`、`STRAIGHT`、`STOP` 或 `NONE` | | `/traffic_sign/confidence` | `std_msgs/Float32` | 当前稳定结果的置信度;`NONE` 时为 `0.0` | | `/traffic_sign/debug_image` | `sensor_msgs/Image` | 标注检测框和稳定结果的调试图 | | `/traffic_sign_recognition/set_enabled` | `std_srvs/SetBool` | 启用识别与LED曝光,或停用识别并恢复自动曝光 | 默认需在最近 5 帧中至少 4 帧识别为同一类别,且单帧置信度不低于 0.25,才会发布有效方向。可在启动时临时调整,例如 `object_threshold:=0.35`。 ## 采集训练数据 先启动唯一的 USB 相机驱动,再启动采集器: ```bash roslaunch traffic_sign_recognition led_dataset_collector.launch ``` 采集器左侧显示原始帧,右侧显示去畸变、翻转和 LED 彩色预处理后的帧。当前实物测试已关闭 LAB-CLAHE,以免增强地面反光;训练采集与 NPU 推理会共用该设置。按 `1`、`2`、`3`、`4` 选择 `left`、`right`、`straight`、`stop`,按 `0` 选择 `negative`(无有效方向牌或干扰图),按 `s` 仅保存处理后的训练图到 `/home/ucar/traffic_sign_data/processed/