首先感谢北京理工大学珠海学院19赛季开源代码以及深圳大学等等许多战队和DJI官方的开源,对于本套代码的编写在思路上提供了很大的帮助,秉承开源精神,希望此套代码能为其他战队提供帮助。
代码内部可能还存在部分问题,内部由于存在部分新旧代码以及模式切换代码冗余可能造成阅读困难深感抱歉,如有疑问欢迎联系相关技术人员讨论。
联系方式:解佳朋 QQ:460857545 微信:xie__1024(两个下划线)
叶宏庆 QQ:958047328 微信:yhq38414942
特此声明:该软件仅可用于参加RM对抗赛或单项式的队伍之间交流讨论不可用于各种商业用途,华北理工大学Horizon战队具有最终解释权。
该代码主要分为六个部分,分别为装甲识别、角度结算、移动预测、陀螺检测、大小符的识别与击打以及相机驱动和串口通信等其他内容。以下是对于主要功能模块的介绍。
Eigen库的安装
opencv的安装
大恒图像官网
ubuntu环境下使用qt打开以pro为后缀的文件,在FindArmor\ImageProcess.cpp文件中利用宏定义的保留与注释即可更改识别模式,共分为视频、单独usb相机、单独大恒相机、 usb相机与大恒相机共同使用四种模式,内部对于如何使用已注释。在Variables.cpp文件中可以更改xml文件路径。
算法介绍:
陀螺检测流程图:
(1)文件树:
InfantryVisionDetector/
├─include //存放各类头文件
│
├─BuffDetector //能量机关的检测和击打
│ BuffAngleSolver.cpp //能量机关角度解算和预测
│ FindBuff.cpp //能量机关检测
│
├─Filter //滤波工具
│ Filter.cpp
│
├─FindArmor //装甲检测、预测、陀螺检测
│ AngleSolver.cpp //角度解算、移动预测、陀螺击打
│ ImageProcess.cpp //图像获取与处理线程控制
│ LongFindArmor.cpp //图像处理得到装甲信息
│ ShootTuoluo.cpp //陀螺检测
│
├─GetNum //数字识别
│ GetNum.cpp
│ svm.cpp
│
├─SendRecive //与电控stm32通讯的发送和接收
│ CRC_Check.cpp //CRC校验
│ RemoteController.cpp //收发线程控制
│ serial.cpp //收发函数构建
│ '/
├─video //相机接口
│ DaHengCamera.cpp //大恒相机水星系列usb3.0接口
│ VideoCapture.cpp //usb相机接口
│ DrawCurve.cpp //波形绘制
│ InfantryVisionDetector.pro
│ InfantryVisionDetector.pro.user
│ main.cpp //主函数,创造线程
│ Readme.md
│ Variables.cpp //多文件共享全局变量的定义、各种宏定义、工具函数定义
(2)整体思路:
软件的执行开始首先创建四个线程,分别是图像生产和处理线程,与stm32数据的接收和发送线程。对于图像的生产和处理线程是通过生产者和消费者算法控制图像的异步生产和消费,提高运行速度;在接收数据线程中同步记录时间,每次在收到数据的同时将时间信息传入,在允许的误差范围内同步相机和云台;在自瞄图像处理的过程中得到装甲端点的像素坐标以及是否连续识别相同目标等基本信息,将基本信息传入角度解算函数通过pnp姿态估计得到目标在相机坐标系下的坐标,然后再根据当前目标状态(第一次发现该目标、连续识别相同目标和掉帧缓冲)执行不同的应对方案,这是该软件解决不同状态的核心思路。就移动预测方案举例,当第一次发现该目标时将各个保留值进行初始化,连续识别则连续迭代滤波计算预测量,掉帧缓冲则按上一帧位置和速度继续估算目标位置。在移动预测之前穿插陀螺检测,具体检测流程前前文流程图此处不再浪费篇幅。通过从stm32接受数据确定当前是否需要切换到击打能力机关模式。
视觉接收:
Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 |
---|---|---|---|---|---|---|
0xaa帧头 | YawAngleData | YawAngleData | YawAngleData | YawAngleData | YawAngleSymbol | PitchAngleData |
Byte7 | Byte8 | Byte9 | Byte10 | Byte11 | Byte12 | Byte13 |
---|---|---|---|---|---|---|
PitchAngleData | PitchAngleData | PitchAngleData | PitchAngleSymbol | ShootSpeedGrade | IsShootBuff | 0xbb帧尾 |
其中第0位和最后一位分别为帧头和帧尾,用于定位,未来会加上CRC校验。
第1位到第4位为机器人云台当前pitch角度的数据位,利用共用体转为float数据。
第5位为pitch轴角度标志位。
第6位到第9位为机器人云台当前yaw角度的数据位,利用共用体转为float数据 ,0代表否,1代表是。
第10位为yaw轴角度标志位。
第11位为当前步兵的射速等级。
第12位为当前是自瞄模式还是击打能量机关模式,0代表自瞄模式,1代表击打能量机关模式。
视觉发送:
Byte0 | Byte1 | Byte2 | Byte3 | Byte4 | Byte5 | Byte6 | Byte7 |
---|---|---|---|---|---|---|---|
0xaa帧头 | PitchAngleData | PitchAngleData | PitchAngleData | PitchAngleData | PitchAngleSymbol | YawAngleData | YawAngleData |
Byte8 | Byte9 | Byte10 | Byte11 | Byte12 | Byte13 | Byte14 | Byte15 |
---|---|---|---|---|---|---|---|
YawAngleData | YawAngleData | YawAngleSymbol | IsHaveArmor | distance | IsShoot | CRC_Check | CRC_Check |
其中第0位为帧头
第1位到第4位为机器人云台当前pitch角度的数据位,利用共用体转为float数据。
第5位为pitch轴角度标志位。
第6位到第9位为机器人云台当前yaw角度的数据位,利用共用体转为float数据 ,0代表否,1代表是。
第10位为yaw轴角度标志位。
第11位为当前是否识别到目标 ,0代表否,1代表是。
第12位为当前与目标间距离,以分米为单位,并舍弃小数。
第13位为是否发射弹丸,0代表否,1代表是。
第14~15位为CRC校验位。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。