和尚啃源码 之 RM深大开源RP_Infantry_Plus
闲来垂钓碧溪上。这回遇到硬茬了,任务是啃完全套RM代码,想必是一场恶战,记录一下笔记:
一、万事万物从Readme开始
1.功能介绍
本套代码完成了对RoboMaster2019赛场上大小符以及机器人装甲板的识别,通过自定的通讯协议将视觉处理后的信息发送给下位机,由单片机处理视觉信息并控制云台的运动
2.效果展示
① 装甲板检测:
在6米内的识别准确率几乎100%,辅以ROI操作和多线程,处理一张图片的时间在1ms以内,跑整套代码仅需4-6ms,能够做到实时检测
② 大小符识别:
深度学习和传统方法结合,可以做到实时预测旋转之后的位置,加上roi和多线程操作之后,处理一张图片的时间在2ms之内,加上读图也只需要4-6ms。
3.环境依赖
- ubuntu 16.04.3
- OpenCV 3.4.4
- Qt Creator 5.10.1
- CMake 3.5.1
- GCC 5.4.0
4.文件架构
深大开源/
├── depends(系统动态链接库)
├── main.cpp(主函数:1.引入配置文件 2.设置串口 3.设置多线程)
├── extraFile
│ ├── AimXMl
│ │ ├── calib_no_4_1280.yml(标定配置)
│ │ └── param_config.yml(参数配置)
│ ├── caffemodel(caffe框架网络结构)
│ │ ├── armornet_iter_200000.caffemodel
│ │ ├── deploy.prototxt
│ │ ├── lenet_iter_200000.caffemodel
│ │ └── lenet_train_test_deploy.prototxt
│ └── Rune
│ ├── lenet(lenet网络结构)
│ │ ├── deploy.prototxt
│ │ ├── lenet_iter_80000.caffemodel
│ │ ├── lenet_iter_80000加了负样本.caffemodel
│ │ └── lenet_iter_80000_旋转后.caffemodel
│ ├── xml
│ │ └── Mono_out.xml
│ └── yolo(yolov2训练结果)
│ ├── tiny-yolov2-trial3-noBatch_235000.weights
│ ├── tiny-yolov2-trial3-noBatch_80000.weights
│ ├── tiny-yolov2-trial3-noBatch.cfg
│ └── 单通道
│ ├── tiny-yolov2-trial3-noBatch_80000.weights
│ └── tiny-yolov2-trial3-noBatch.cfg
├── include
│ ├── Aim
│ │ ├── AngleSolver.hpp(RectPnPSolver及其子类AngleSolver的定义)
│ │ ├── ArmorDetector.hpp(struct ArmorParam/struct matched_rect/struct candidate_target/class ArmorDetector定义)
│ │ └── Settings.hpp(Settings类定义)
│ ├── Camera
│ │ └── video.h(static uint32_t gFormatTransferTbl[]、class Video、class FrameBuffer)
│ ├── header.h(opencv、c++、Qt等头文件)
│ ├── ImageConsProd.hpp(ImageConsProd类定义)
│ ├── Rune(class Detect)
│ │ ├── Detect.h
│ └── SerialPort
│ ├── CRC_Check.h
│ └── serialport.h(class SerialPort)
├── includes (相机 SDK 包含头文件)
├── RP_Infantry_Plus.pro
├── RP_Infantry_Plus.pro.user
└── src
├── Aim
│ ├── AngleSolver.cpp
│ └── ArmorDetector.cpp
├── Camera
│ └── video.cpp
├── ImageConsProd.cpp
├── Rune
│ ├── Detect.cpp
└── SerialPort
├── CRC_Check.cpp
└── serialport.cpp
5.文件描述
文件名 | 用途 |
---|---|
AngleSolver.cpp | 对目标进行角度解算(DJI开源) |
ArmorDetector.cpp | 进行装甲板检测 |
video.cpp | 将工业相机 SDK 封装成类 |
ImageConsProd.cpp | 处理多线程以及数据传输 |
Detect.cpp | 进行大小符装甲检测 |
serialport.cpp | 与下位机通讯的通讯协议 |
2021年9月21日 14:50-16:40
6.实现方案(重点标注为学习点)
(1) 装甲板识别
-
自瞄流程图:
-
基本原理:
①
如果 last_result为 true,