兵种通用视觉框架
本项目主要参考同济大学 SuperPower 战队 2025 赛季开源的自瞄算法,并在其各个模块基础上进行再开发与框架自行搭建。
整体框架设计思路为以 ROS2 框架为底层,使用 Node 节点组合调用独立 C++ 封装的各个模块,组成 Pipeline。整体简单易用,同时可兼容使用 ROS2 的多种调试工具,在使用过程中主要搭配 PlotJuggler 订阅 Topic 数据进行调试。
项目整体按照界限明显的文件框架组织,核心文件夹 src 下存储包含 core(核心算法层)、io(硬件封装层)、Messages(自定义消息包)、Node(节点应用层)等层级,同时在编写核心算法的时候做到兼容性和高可读性,以做到全兵种通用视觉框架为目标。
| 依赖 | 说明 |
|---|---|
| MVS | 海康相机底层 SDK |
| linux_sdk | 迈德威视相机 SDK |
| Eigen3 | 线性代数库 |
| OpenCV | 计算机视觉库 |
| fmt | 格式化库 |
| OpenVINO 2024.06 | 模型推理框架 |
| libserial | 串口通信库 |
| libusb-1.0 | USB 通信库 |
| ROS2 Humble | 机器人操作系统 |
| yaml-cpp | YAML 配置解析 |
# 编译
colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=release
# 环境加载
source install/setup.bash
# 运行节点
ros2 run [package] [node]test_node 中存储的主要为调试专用的 Node 节点,与实际最终部署的 Node 的区别为可视化调试与 Topic 调试数据的发布。在自行编写好对应的发布数据之后,启动 PlotJuggler 进行数据曲线的订阅:
ros2 run plotjuggler plotjuggler自启动脚本存储在 scripts 文件夹中,部署时需要修改以下两处路径:
sh脚本中的[WORKSPACE_DIR]service服务中的[ExecStart]
然后按照开机自启动教程 txt 中的步骤部署即可。
为解决场上电控软件复位后,上位机串口端口号随之变化导致通信中断的问题,编写了对应的一键配置脚本。脚本通过读取下位机的设备 VID,将其固定映射至 /dev/gimbal 端口。
映射完成后,下位机无论如何复位,端口号均保持不变;若通信出现异常,也可直接在代码层尝试重连,无需手动干预。
在 scripts 文件夹下,赋予脚本执行权限后直接运行即可:
sudo chmod +x setup_gimbal_udev.sh
sudo bash ./setup_gimbal_udev.shscripts
│ ├── 99-gimbal.rules # udev 规则文件,定义串口端口映射规则
│ ├── 串口设备映射.txt # 串口端口自映射配置教程
│ ├── 开机自启动.txt # 开机自启动配置教程
│ ├── auto_aim.service # systemd 服务文件,用于开机自启动
│ ├── setup_gimbal_udev.sh # 一键配置串口端口映射脚本
│ ├── start_node.sh # 节点启动脚本
src
├── Messages/ # ROS2 自定义消息 msg
│ └── msg/
├── config/ # 配置文件 yaml
│ ├── config.yaml # 通用配置(测试用)
│ ├── dart.yaml # 飞镖
│ ├── hero.yaml # 英雄
│ ├── sentry.yaml # 哨兵
│ ├── standard3.yaml # 步兵 3 号
│ ├── standard4.yaml # 步兵 4 号
│ └── uav.yaml # 无人机
├── core/ # 核心算法层
│ ├── auto_aim/ # 基础自瞄功能包
│ │ ├── aimer/ # 传统瞄准器
│ │ ├── detected/ # 检测模块
│ │ ├── planner/ # 规划器
│ │ ├── shooter/ # 传统火控决策器
│ │ ├── solver/ # 解算模块
│ │ ├── target/ # EKF 整车状态估计器
│ │ └── tracker/ # 跟踪器
│ ├── auto_base/ # 基地引导灯识别
│ │ ├── aimer/ # 瞄准器:计算像素偏差
│ │ ├── detect/ # 检测器
│ │ ├── target/ # EKF 状态管理
│ │ └── tracker/ # 追踪器
│ └── auto_buff/ # 能量机关击打
│ ├── buff_aimer/ # 瞄准器
│ ├── buff_data_type/ # 通用数据结构
│ ├── buff_detect/ # 检测器
│ ├── buff_solver/ # 解算模块
│ └── buff_target/ # EKF 状态管理
├── io/ # 硬件封装层
│ ├── device/ # 驱动包
│ │ ├── camera/ # 相机封装
│ │ ├── gimbal/ # 云台
│ │ ├── imu/ # IMU 封装(DM_IMU)
│ │ ├── lower_dart/ # 飞镖下位机封装
│ │ └── lower_sentry/ # 哨兵下位机封装(含导航数据)
│ └── serial/ # 串口通讯包
├── model/ # 权重文件
│ ├── Katrin.xml # 基地引导灯识别
│ ├── tiny_resnet.onnx # 传统数字分类
│ ├── yolo11.xml # YOLOv11 装甲板分类(无英雄)
│ ├── yolo11_buff_int8.xml # 能量机关识别
│ └── yolov5.xml # YOLOv5 装甲板分类(主要使用)
├── node/ # 实车部署节点
│ └── include/
│ ├── sentry.hpp # 哨兵实车部署节点
│ └── standard3.hpp # 步兵实车部署节点
│ └── hero.hpp # 步兵实车部署节点
├── test_node/ # 调试测试节点
│ └── include/
│ ├── base_hit_node.hpp # 飞镖引导灯识别测试节点
│ ├── capture_node.hpp # 图像捕获测试节点
│ ├── test_node_aimer.hpp # 传统瞄准器节点
│ ├── test_node_cv.hpp # 传统视觉节点
│ ├── test_node_deep.hpp # 深度视觉 YOLO 节点
│ └── video_node.hpp # 视频测试节点
└── utils/ # 工具包
