绪论

上学期一直在请教大佬和自学代码的路上,没有什么产出,想着这学期自己写点东西,就从RoboMaster这个比赛写起吧。我是研一上学期参加的比赛,做视觉识别部分。当时的想法很简单,因为很喜欢Linux,个人不太想调电控和焊板子接线,就参加了视觉部分。由于本科专业以及之前工作的关系,其实更熟悉机械结构设计,学视觉主要是因为兴趣,还有想换个方向。做视觉可以开发一些很有趣的东西,学到很多前沿的知识。

来到新战队之后百废待兴。今年我担任战队项目管理(兼任视觉组长),发现了一些现实问题:

一个是队员基础能力弱和经验缺乏带来的队伍上限不高。上学期各组真的是从零开始的——没技术没经验。虽然队里之前有研究生做,但是却没有相关技术传承,连个真正能解答问题的人都没有。例如上届视学组名义上是有几个人的,但由于各种原因都跑路了,只有一位学姐偶尔能说上话,但是很多时候她也无法及时帮忙解决问题。所以我很能理解一些新接触RM视觉的学弟学妹心中的迷茫;

一个是人员稀缺,目前视觉组只有我和另外一名研究生(之前还有个本科学弟的,前不久因为个人原因退队了……),现阶段再招人也不现实,而且参赛名额有限,所以暂时由我负责两个兵种。希望换届的时候,梯队这边能留下足够多人数;

所以我打算将RoboMaster视觉的各个方面的技术要点写成教程,帮助新手入门,也希望对其他战队有一点参考价值。教程代码主要参考了南理工本部Alliance战队上个赛季代码(感谢磊哥),传送门:https://github.com/shilei31415/AutoShot 。本部往届的代码写得不错,搭建了一个很好的项目框架,很感谢他们能分享出来,帮助我们新队伍更快成型。

下面是代码框架,可以先看下:

AutoShot								
├── AutoShot //识别装甲
│ ├── include //.h文件
│ │ ├── ANN.h //数字识别
│ │ ├── Armor.h //Mark匹配
│ │ ├── Mark.h //识别Mark
│ │ ├── pnp.h //PnP测距
│ │ ├── TargetFind.h //调用Armor和Mark
│ │ └── trajectory.h //考虑空气阻力的抛物线(未使用)
│ └── src //.cpp文件
│ ├── ANN.cpp
│ ├── Armor.cpp
│ ├── Mark.cpp
│ ├── pnp.cpp
│ ├── TargetFind.cpp
│ └── targetFinderTest.cpp //测试targetFinder
├── CMakeLists.txt
├── HeroVision.h //常用宏定义
├── include.h //常用头文件
├── main.cpp
├── others //其他功能
│ ├── Calibrator //标定
│ │ ├── Calibrate.cpp
│ │ ├── Calibrator.cpp
│ │ ├── Calibrator.h
│ │ ├── cr
│ │ └── ip
│ ├── camera //相机驱动
│ │ ├── CameraApi.h
│ │ ├── CameraDefine.h
│ │ ├── CameraStatus.h
│ │ ├── MindVisionCamera.cpp
│ │ └── MindVisionCamera.h
│ ├── JLink //自己编写的调试助手,显示变量随时间的变化
│ │ ├── JLink.cpp
│ │ └── JLink.h
│ ├── picture //程序运行时保存的图片
│ ├── SerialPort //串口通信
│ │ ├── SerialPort.cpp
│ │ ├── SerialPort.h
│ │ ├── SerialPortTest.cpp
│ │ └── serial.sh
│ └── video //程序运行时保存的视频
├── README.md
└── tools //运行及调试时常用函数
├── excption //catch excption并保存到txt (未使用)
│ ├── myExcption.cpp
│ └── myExcption.h
├── MathTool //常用数学函数
│ └── MathTool.h
├── setter //读取参数
│ ├── model.pb
│ ├── para.yaml
│ ├── setter.cpp
│ └── setter.h
└── time //计算帧率,控制帧率
├── timer.cpp
└── timer.h

写在前面

在讲代码之前先解答一些大家可能会有的疑问:

为什么要用Ubuntu系统

跟 win 相比:

  • 免费,安全;
  • 很多软件可以通过 ppa 源下载,不需要跑到网站上下载,比较方便;
  • 一般的 server 都使用 linux,所以省去了很多开发兼容性的问题;
  • shell 厉害;
  • 占用空间比较小,可以安装在许多硬件上(TX2/NUC);
  • 运行速度比Windows快,运行程序时不像Windows需要调用其他许多东西,同样的程序Ubuntu上运行速度比Windows快10%左右;
  • 权限高,Ubuntu上不存在卸不掉的流氓软件,知道密码甚至可把Ubuntu整个删掉;
  • ……

跟其他 linux 相比:

  • UI 比较好看;
  • 文档比较多,用的人比较多,有问题可以一起讨论;
  • 针对 ubuntu 开发的软件比较多;
  • ……

关于ubuntu的建议

①在自己电脑安装Ubuntu时尽量多分配一些空间,用作平时学习建议至少50G。当然了,如果个人有开发软件的需求,或是跑大型项目、涉及很多图像视频识别时,应尽量分配更多空间,以便不时之需。

②安装的时候语言建议选择英文,可锻炼英语读写能力,也是因为之后的文件路径默认英文,使用中文路径容易出错。其实安装完成后可以修改语言,但要注意路径保持英文。

③基本命令要会,不用会太多,“增删改查”及一些常用命令就够了,另外记得安装完系统先换源 ubuntu更新源是什么意思 - 问答 - 亿速云 (yisu.com)
“增”可以用命令新建文件、文件夹;
“删”可以用命令删除文件、清空文件夹;
“改”可以用命令修改文件权限、移动文件;
“查”可以用命令查看文件夹中的内容;
还有一些脚本语言(shell),你起码可以用脚本让你的程序实现”开机自启动””程序意外终止后重启”;
其他还用很多需要掌握的,建议开始的时候时间较为充裕,尽量用命令,而不是GUI;

④当你配置完环境,装好程序,马上把你的系统转为镜像文件(虚拟机的话直接用快照功能即可),防止有一天“一切归0”

⑤最初上手可以安装Ubuntu16。因为16版本的教程比较多,当你熟悉后可以考虑使用18.04或者20.04(这两个版本相关的内容较少,如果报错你可能较难找到解决方法)

配置OpenCV

安装 OpenCV_contrib

OpenCV3.0以上的版本,把一些不稳定的函数放到了第三方库OpenCV_contrib中(比如sift,surf等),为了应用这些功能,我们需要将Contrib中的功能重新加入Opencv。关于OpenCV_contrib,可以参见官方说明 https://github.com/opencv/opencv_contrib/blob/master/README.md

配置方法

主要有两种方法:一种是使用CMake-gui这个图形化界面进行安装(适合对Ubuntu的命令不太熟悉的同学);另一种是用终端直接输入命令操作,可以参考其他博客,这里就不再讨论。

顺带讲下环境配置的问题:看教程是一部分,配置多了也要有自己的思考,比如:为什么要这么做?环境变量的作用是什么?这样才能在之后各种环境配置中更加流畅。

关于版本问题

虽然目前已经更新到Opencv4,但我们依然可以用Opencv3,为什么?因为RM比赛一定要考虑做出来机器的稳定性,老版本可能不是最先进的,但比较之下是更稳定、更成熟的,如果说创新决定了一个团队的上限,那么稳定性则决定了一个团队的下限。

安装CLion和PyCharm

CLion编写C++,PyCharm编写python(神经网络会用到),python 需要注意配置环境,个人觉得不需要安装Anaconda,直接安装Python>3.5,然后用pip配置环境(tensorflow或pytroch和opencv-py….)

软件安装不需要去找破解,直接注册学校的教育邮箱 https://blog.csdn.net/qq_40784315/article/details/116106252 ,然后绑定自己的 Jetbrains 账户即可免费使用。

学会使用cmake

不要求cmake使用的多么6,但至少可以做到:不用CLion也可以编译简单C++程序,会编写CLion中的CMakeLists.txt文件。

工业相机的选择

针对运动机器人和灯条识别,我们比赛用的工业相机一般选择较高帧率较低像素的配置。镜头焦距一般选用6或8mm。本届相机我们用的是Mindvision的,分辨率和帧率分别为1920*1200和165FPS,针对联盟赛,镜头焦距选的6mm(我们这批发过来的镜头尺寸明显比之前8mm大很多,但是老师那边代购说根据预算只能提供这款,下届视觉组可以提前写明需求买小尺寸的镜头,体积小重量轻显然对结构设计更有利)。

其他

若以后战队发展壮大,团队成员之间可能需要进行大量的文件传输,可以直接使用邮箱实现不同系统之间的传输,同时不用安装其他应用,不用考虑人在不在工作室,不用担心文件丢失。
学会使用各种学习资源:Baidu CSDN Bilibili Github
视觉组同学如果有梯子,完全可以在github上进行代码迭代管理,进一步提升团队协作效率。

————————————————————-先说这么多,之后想到再补————————————————————-