# InfantryVision-WAKINGLION2019
**Repository Path**: NO_WARNING/InfantryVision-WAKINGLION2019
## Basic Information
- **Project Name**: InfantryVision-WAKINGLION2019
- **Description**: 该系统用于大疆主办的全国机器人对抗赛Robomaster,团队需要研发多兵种云台机器人参与对抗竞赛,需要机器人高效、精准打击“敌方”目标和官方设计目标;研发了一种云台视觉控制系统以及控制方法,对云台电机进行控制,预测“敌方”目标运动轨迹,提高运行系统响应的速度以及控制的精准度。解决了现有技术中所存在的一个或多个技术问题,至少提供一种有益的选择或创造条件。
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 2
- **Created**: 2020-03-06
- **Last Updated**: 2025-12-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 目录
- [目录](#目录)
- [摘要](#摘要)
- [开发环境](#开发环境)
- [开发环境搭建](#开发环境搭建)
- [系统框架](#系统框架)
- [装甲板检测 - 模块](#装甲板检测---模块)
- [装甲板检测 - 具体技术步骤](#装甲板检测---具体技术步骤)
- [命名规范](#命名规范)
- [注释规范](#注释规范)
- [成员要求](#要求)
- [算法组年计划](#算法组年计划)
- [程序调试](#程序调试)
# 摘要
该系统用于大疆主办的全国机器人对抗赛Robomaster,团队需要研发多兵种云台机器人参与对抗竞赛,需要机器人高效、精准打击“敌方”目标和官方设计目标;研发了一种云台视觉控制系统以及控制方法,对云台电机进行控制,预测“敌方”目标运动轨迹,提高运行系统响应的速度以及控制的精准度。解决了现有技术中所存在的一个或多个技术问题,至少提供一种有益的选择或创造条件。
# 开发环境
平台:ubuntu16.04
框架:opencv3.4.1 tensorflow
语言:c++ python
IDE:qt/vscode
项目管理平台:gitee
数学基础:微积分,线代,概率论
通信:串口
[其它研究方向:SLAM PCL Halcon ROS](https://mp.weixin.qq.com/s/hkhWZjWMATwWf9TojTJxTQ)
# 开发环境搭建
**平台:**
[ubuntu16.04](http://www.ubuntu.org.cn/download/desktop)
**框架:**
[opencv3.4.1](https://github.com/opencv/opencv/tree/3.4.1)
[opencv3.4.1](https://zhuanlan.zhihu.com/mengcius-opencvbase)
**语言:**
c++
http://www.cplusplus.com/doc/tutorial/(英文)
python
https://stackoverflow.com/(英文)
**IDE**
vscode
https://code.visualstudio.com/
https://code.visualstudio.com/docs/languages/cpp(英文)
**项目管理平台:**
git
https://git-scm.com/(英文)
http://rogerdudler.github.io/git-guide/index.zh.html(中文)
**数学基础:**
线代
https://m.bilibili.com/video/av6731067.html
**其它研究方向:**
SLAM PCL Halcon ROS
(https://mp.weixin.qq.com/s/hkhWZjWMATwWf9TojTJxTQ)
# 系统框架
**代码文件说明**
|文件|类|解释|详细说明|
|----|-------|----|--------|
|Preprocessing|Preprocessing|预处理| 对从相机获取的图片进行预先的处理,如二值化、滤波等,方便后续信息的提取,如目标的位置||
||AdaptiveThreshold|二值化|能根据光照自动调整阈值二值化方法||
|RuneDetector|RuneDetector|神符检测|大风车的预处理及定位||
||RuneHitLogic|神符打击逻辑|大风车的击打的逻辑及发送击打信号||
||RuneResFilter|滤波器|对计算出的角度信号滤波处理,以增强电控控制稳定性||
|InfantryInfo||步兵信息结构体|包括云台控制模式,pitch角度,yaw角度等信息,是控制步兵运动的数据||
|PackData|PackData|打包|将控制数据的结构图转成字符型数据,以便串口发送||
||UnpackData|解包|接收主控板的信号,包括控制模式(比如人工操作/开启自动辅助瞄准/神符击打,由操作手控制),敌方的颜色||
|Protocol|协议|串口相关协议,包括crc8和crc16校验||
|Serial||串口|打开串口,配置串口,发送数据||
|Tool||工具类|工具类,包括查重,命名,算距离等||
|AngleSolver||角度解算|目标角度解析,根据图片的坐标算出真实的角度||
|ArmorDetector|ArmorDetector|装甲板检测||
||ArmorHitLogic|装甲打击逻辑|装甲的击打的逻辑及发送击打信号||
|main||管理多线程|用于获取图像、处理图像检测、信号发关接收||
|IndVideoCapture|视频处理类|重写的视频处理类,有调整分辨率/FPS/曝光度等功能(暂时先收集资料)||
|Settings|设置|载入配置文件,具体参数见下方“程序调试-配置参数”|
|Gui|Gui|调试界面模块|可视化界面||
||DataCollection|数据波形|方便查看实时系统的历史数据,对数据的变化有一个直观的理解||
|TargetDetection|目标检测|提供检测的基本功能,如边缘检测,特征提取等||
**装甲板检测**
- 简介:通过摄像头获取图像,检测出目标在图片中的位置xy轴坐标,装甲板为四个点的坐标,算出云台的两个偏移角,俯仰角和偏航角。云台的指向由两个电机控制,算法要算出给这两个电机的角度。
- 原理:利用计算机视觉,从摄像头获取图像,进行二值化预处理,使目标与其它部分分离开,从而得到它在图中的位置,利用pnp解算得到它的三维坐标。(目前我们要提高它的稳定性,要理解为什么要去对图像进行特殊的二值化算法,以及我们应该学习哪些知识,图像处理,目标检测,可以去跑一下案例,https://gitee.com/NO_WARNING/data/blob/master/Opencv.md)
# 装甲板检测 - 模块
|模块名称|功能|
|----|-------|
|图像采集模块|用于获取环境信息,得到视觉图像|
|预处理模块|用于对所述视觉图像进行预处理操作|
|识别模块|用于从所述视觉图像中识别待测目标|
|第一坐标计算模块|用于建立相机坐标系,计算所述待测目标在所述相机坐标系中的三维坐标|
|第一角度计算模块|用于根据所述待测目标在所述相机坐标系中的三维坐标,计算视觉控制角度,所述视觉控制角度包括待测目标相对于相机坐标系的偏航角和俯仰角|
|第二坐标计算模块|用于建立地面坐标系,计算所述待测目标在所述地面坐标系中的三维坐标|
|第二角度计算模块|用于根据所述待测目标在所述地面坐标系中的三维坐标,计算预测补偿角度,所述预测补偿角度包括待测目标的偏航角预测补偿值以及俯仰角预测补偿值|
|控制模块|用于根据所述视觉控制角度以及所述预测补偿角度,利用基于模糊控制算法控制云台电机|
# 装甲板检测 - 具体技术步骤
1. 获取环境信息,得到视觉图像,并对所述视觉图像进行预处理,包括对所述视觉图像先后进行二值化处理、噪声滤除处理以及开运算处理;
1. 从所述视觉图像中识别待测目标,包括对所述视觉图像进行边缘检测操作以及特征筛选操作,得到待测目标,并输出所述待测目标在所述视觉图像中的投影坐标;
1.
- 建立相机坐标系,计算所述待测目标在所述相机坐标系中的三维坐标;
- 根据所述待测目标在所述视觉图像中的投影坐标,计算旋转矩阵以及偏移向量;
- 根据得到的旋转矩阵 以及偏移向量 ,通过公式 ,计算待测目标在所述相机坐标系中的三维坐标;
- 利用最小二乘法二次拟合得到待测目标在地面坐标系中的预测坐标;
1. 根据所述待测目标在所述相机坐标系中的三维坐标,计算视觉控制角度,所述视觉控制角度包括待测目标相对于相机坐标系的偏航角和俯仰角;
1. 建立地面坐标系,计算所述待测目标在所述地面坐标系中的三维坐标;
1. 根据所述待测目标在所述地面坐标系中的三维坐标,计算预测补偿角度,所述预测补偿角度包括待测目标的偏航角预测补偿值以及俯仰角预测补偿值;
1.
- 根据所述视觉控制角度以及所述预测补偿角度,利用基于模糊控制算法控制云台电机。
- 在对云台电机进行控制时,参考了结合待测目标在所述地面坐标系中的三维坐标以及陀螺仪检测数据得到的待测目标的偏航角预测补偿值以及俯仰角预测补偿值,从而提高了运行系统响应的速度以及控制的精准度;
- 另外本实施例采用了模糊控制算法对云台电机进行闭环控制,能够更进一步地提高对云台电机控制的精准度。
**神符检测**
- 简介:预处理,检测出风车5个叶子,按亮灯的顺序击打
**自动夹取弹药箱**
- 简介:检测出3维位置,控制机器人底盘,发送夹取信号
# 命名规范
一个合理的命名规范能大大提升源代码的可读性和软件的可维护性
**命名风格**
||风格|例子|
|-|---|----|
|文件名|大驼峰|AngleSolver.hpp|
|类名|大驼峰|class AngleSolver{}|
|方法(函数)|小驼峰|`void setTargetSize(double width, double height);`
`void setCameraParam(const cv::Mat & camera_matrix, const cv::Mat &dist_coeff);`
方法规范如下表:方法常用前缀|
|变量|小写+下划线|`cv::Mat cam_matrix;`
`cv::Mat distortion_coeff;`
`double width_target;`
`double height_target;`|
|宏|大写+下划线|`#define TRUNC_ABS(a) ((a) > 0 ? (a) : 0);`|
**方法常用前缀**
|方法|说明|
|----|----|
|initXX()|初始化相关方法,使用init为前缀标识,如初始化布局initView()|
|isXX()|checkXX()方法返回值为boolean型的请使用is或check为前缀标识|
|getXX()|返回某个值的方法,使用get为前缀标识|
|processXX()
xXProc()|对数据进行处理的方法,使用process为前缀标识,或使用Proc为后缀标识|
|displayXX()|弹出提示框和提示信息,使用display为前缀标识|
|saveXX()|与保存数据相关的,使用save为前缀标识|
|resetXX()|对数据重组的,使用reset前缀标识|
|clearXX()|清除数据相关的|
|removeXXX()|清除数据相关的|
|drawingXXX()|绘制数据或效果相关的,使用drawing前缀标识|
**局部变量前缀规范**
|前缀|说明|例子|意义|
|----|----|----|----|
|i|整型|int i_ miss_detection_cnt;|使用整型变量,用于检测丢失的计数|
|f|浮点数|float f_pitch;|pitch角|
|b|布尔|bool b_is_lost;|丢失目标标志|
|ch|字符|char ch_ data; |
|str|字符串|char *str_ config_file;|配置文件名称,为字符串|
|p|指针|char *p_data;|打包的数据|
|a|数组|||
|inst|类的实例|||
注:对于某些用途简单明了的局部变量,也可以使用简化的方式,如:i, j, k, x, y, z ....
**作用域前缀规范**
|前缀|说明|例子|
|g_ |全局变量(global)|g_prd_iex|
|无|局部变量 ||
|m_|类的成员变量(member)||
宗旨:尽可能用最少的字符而又能完整地表达标识符的含义**(除非该缩写是约定俗成的,否则不要用缩写)**,好的命名应直观可拼读,可望文知意,用词准确,常用例子如下:
- 英文缩写原则:
1. 较短的单词可通过去掉“元音”形成缩写
2. 较长的单词可取单词的头几个字母形成缩写
3. 此外还有一些约定成俗的英文单词缩写
|变量名|意义|缩写|全称|
|------|----|----|----|
|src_img|源图片/未经处理的图片|src_img|sourse_image|
|pc_recv_mesg|pc端接收的数据|recv_mesg|receive_message|
|hand_writing_idx|手写字的索引|idx|index|
|led_num_flag|数码管数字标志|num|number|
|avg_gray|平均灰度值|avg|average|
|buf_size|串口缓冲区大小|buf|buffer|
|gimbal_ctrl_t|云台控制数据的结构体|ctrl|control|
|err_info|错误信息|err_info|error_infomation|
|doc|略|doc|document|
|del||delete|delete|
|esc||esc|escape|
|inc||inc|increment|
|init||init|initial|
|len||len|length|
|lib||lib|library|
|pwd||pwd|password|
|pos||pos|position|
|srv||srv|server|
|tmp||tmp|temp|
|wnd||wnd|window|
# 注释规范
|||
|------|--------|
|代码块|统一规范
`//-----------------------------------【标题】----------------
// 描述:
//-----------------------------------------------------------------
|方法|统一规范
`/**`
`* @brief 这里书写该方法的简介,包括其作用等`
`* @param 第一个参数说明
* @param第二个参数说明`
`* @return 返回值说明`
`* @author 参与开发人员`
`* @date 2018.11.7`
`*/`
|宏定义|例: #define SHOW_IMAGE //如果注释掉则不显示图片,有利于加快运行速度|
|成员变量|如果变量名不能很好的显示其含义或有特殊用途,就需要注释|
|其它|不容易理解的逻辑部分|
# 成员要求
- 了解比赛规则
见规则手册《RoboMaster+2019机甲大师赛比赛规则手册V1.1(2018.11.30)》
- 学习图像处理、计算机视觉
- 熟悉opencv基本功能
- 了解算法组的作用
算法组主要做机器人的自动操作功能,代替人的操作,使得更快更精准地完成任务,分三个部分(自动瞄准/神符/自动夹取弹药箱)
- 了解算法组2018年度工作情况,理解代码框架,原理
# 算法组年计划
**~2018/11/15 培训结束**
- 培训主要针对实际解决问题能力与动手能力,学习知识有c++、python、opencv基本功能,git,ubuntu,串口、数学、智能算法等
- 要求:每人都具有良好的编程能力与调试能力。
**~2018/12/1 制定方案**
- 之前问题已经基本解决,新人对旧的框架也有了理解。做一个合理、清晰的框架,对之后开发新功能有着重大的意义。
- 要求:讨论出基本的方案,做哪些功能。队员学习到了编写工程的方法,理解编写规范(命名规范、注释规范等)
**~上学期末 基本功能完成**
- 算法完成方案里的全部功能,并与电控机械配合协调。
- 要求:算法电控并行工作,按最优调度分配任务时间,以提高开发效率。
**~下学期初 新功能**
- 新年放假回来,新的一年一定有许多新想法。就来挖掘你的脑洞吧。该段时期预测类的算法基本完成,可以做一下决策算法,主要是哨兵。
- 要求:前期的框架具有良好的可扩展性。预测算法稳定。具有一定的技术水平。
**~分区赛 优化迭代**
- 该时期是操作手大显身手的时期了。不断发现问题。
- 要求:列出问题,做到极致。
# 程序调试
使用**宏定义**开启或关闭调试功能,例:
```
#define SHOW_IMAGE //如果注释掉则不显示图片,有利于加快运行速度
#define COUT_LOG //如果注释则不显示终端打印的数据
```
**GUI界面**
例:上一年小符调试界面

**数据波形**
方便查看实时系统的历史数据,对数据的变化有一个直观的理解
**配置参数**
配置参数使用param_config.xml统一保存管理,使用Setting.hpp进行读取,为了方便调试,需要做一个按键自动保存参数的功能