华中科技大学狼牙战队2023赛季英雄视觉 - 辅瞄程序
本程序主要应用在英雄机器人上,采用的均为最简洁的方式,易于阅读理解与实践上手。
硬件上采用大恒相机
+ 8mm镜头
+ NUC11
+ 串口
。
功能:
- 定点击打(*)
- 运动预测
- 打前哨站(*)
效果预览:9 / 13 ≈ 70%
GCC 11.4.0
OpenVINO 2021.4 (Test: 2023.0 也可以)
OpenCV 4.7.0
Eigen 3.4.0
Sophus 1.22.10
Glog
CeresSolver 2.1.0
Jsoncpp
为了突出主要的代码结构,略去了部分不重要的文件树枝
.
├── armor_detector 装甲板检测模块
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── ArmorFinder.h
│ │ ├── Detector.h
│ │ ├── Inference.hpp
│ └── src
│ ├── ArmorFinder.cpp
│ ├── Detector.cpp 关键函数(*)
│ ├── Inference.cpp
├── AutoAim.cpp 辅瞄主程序
├── AutoAim.h
├── driver 相关的驱动代码(相机、串口)
├── pose_estimate 位姿解算模块(pnp+预测)
│ ├── CMakeLists.txt
│ ├── include
│ │ ├── ExtendedKalman.hpp
│ │ ├── NormalEKF.h
│ │ ├── PoseSolver.h
│ │ ├── Predictor.h
│ │ ├── Predictor_main.h
│ └── src
│ ├── NormalEKF.cpp
│ ├── PoseSolver.cpp
│ ├── Predictor.cpp
│ └── Predictor_main.cpp
└── utils 工具模块
-
击打前哨站的逻辑前需要使用ROI提高识别的精度
-
粗略计算一个装甲板能被连续识别的帧数并适当多取一些(处理一次的时间为10ms左右)
-
使用循环数组的数据结构(存储每一次解算的相对3D坐标,随着时间的推移,新的内容顶替前面的3D坐标)
-
从循环数组中提取距离最近的部分坐标进行均值滤波,作为击打点的估计坐标
-
根据弹速、发弹时间消耗以及前哨站旋转时间确定发弹延迟(即真正击打的装甲板是下一个转过来的装甲板)
-
当重新进入击打前哨站模式时,清空数组
- 将xyz坐标转换成pitch_yaw_distance
- 扩展卡尔曼滤波
借助UDP协议以及VOFA+工具,进行数据的可视化查看与调试(使用方式见下方开源仓库)
liulog/Debug_udp_VOFA (github.com)
感谢沈阳航空航天大学TUP战队顾昊以及狼牙战队视觉组的老人们!
基于nanodet-plus修改的四点网络,在docs中记录了作为一个新人如何一步步修改代码,最终成功训练四点模型,测试效果推理速度不如YOLOX-nano,但不失为新手入门四点的一种参考。