2019年RM江苏省赛总结

一 场地

江苏省赛在体育馆里。在很大的面积里,分成了真正比赛的区域和备场区,大家可以想象体育馆里,划了一片地,又划了另一片地,相互之间没有间隔,旁边可能就是其他队伍的地方,相互之间很拥挤。除了在比赛的时候,其他时间机器人都在手里面,可以下载程序,修改机器人。供电等等都很充足。

官方会提供大功率插排,用自己的插排引过来,

二 调试工具

首先必备的是USB-HUB,manifold充电器等

无线键鼠+小显示屏

这次比赛用的就是这套工具,无线键鼠是一套的,只需要一个2.4G的USB插口。小显示屏利用充电器供电,利用HDMI和manifold连接。

问题:

2.4G连接

可能是因为manifold和单片机信号线离太近,也有可能是遥控器的信号干扰。2.4G的连接块一会儿好用,一会儿特别卡,无论怎么动箭头都没有反应。当时我用一会儿键鼠,用一会儿树莓派的飞鼠,再一会儿自己笔记本上的鼠标。严重降低效率。在键盘没用的时候,只好使用网线连接manifold使用SSH,利用笔记本输入命令。

将USB的HUB接出来,信号会好一些

建议:

  1. 直接使用有线键鼠

    因为电力都提供充足,机器人也在手里,所以其实完全可以带着有线键鼠连接manifold,之前为什么不带有线呢?因为当时manifold在哨兵里的位置非常逼仄!当时根本没有连线的接口露出来。后来虽然将manifold放在了哨兵下面,但是利用海绵包了一圈,防止被流弹打中。(之后需要和机械商量一下)所以最终使用了无线的。

    (当时问了中央民族大学的视觉,人家的无线鼠标就很好用,所以应该不是遥控器的空中信号问题)

  2. 使用利用其他频率连接的键鼠

    如果确定是2.4G的问题,可以买一个其他频率的键鼠

  3. 使用大显示屏或小显示屏

    小显示屏的默认界面大小特别小,所以需要调节设置里面的display,把比例调高。最好是把每一次的设置都能够保存下来。我没做到,所以每次开机都需要重新设置分辨率。另外,小显示屏可以利用充电宝来供电。但是一定要注意时刻充电,不然用的时候可能要拿去充电。

    那么其实小显示屏可以用,便携性很好,但是如果可以拿的了大显示屏,我觉得完全可以拿过去。

有线键鼠+大显示屏

去其他地方比赛,能拿的都拿上。有线键鼠其实完全可以带着。显示屏方便调试

putty+Xming实现笔记本的图形界面显示

manifold的arm架构很坑爹,许多VNC的库不支持arm,最后找到了一个X11VNC,比较好用。

这个方案帮了很多忙。putty可以输入终端命令,xming可以显示终端命令所显示的任务(比如代码所显示的装甲板视频),只需要通过一根网线连接笔记本和manifold,利用笔记本的键鼠可以给manifold输入命令,利用xming把manifold显示的任务栏显示在笔记本的屏幕。

但是这种方法的缺点是:

  1. 速度慢

    如果把摄像头的画面显示在笔记本上,帧率很慢。远不如HDMI外接的屏幕。

    而且终端只能打开一个。(除非同时打开xshell和putty,可以打开两个路径的终端)那么切换就很费时间

  2. xming X11转发的有些界面是不完整的。比如用来调试摄像头参数的上位机:GDK-demo,在电脑上显示的画面就不全。想要调试参数就不全面。

但是,**这种方法一定要掌握!!!**因为当出现问题的时候,这种无线调试的方法就派的上用场!

比如,江苏赛,上交的队伍没带显示屏键鼠等等,利用自己的手机做热点(我连的网线,有线要更快),笔记本和manifold都连接热点,实现无线的SSH远程登录。来查看视频以及修改代码。

VNC+xrdp

相比putty+xming,VNC+xrdp可以利用一根网线将Ubuntu整个桌面投到笔记本屏幕上,可以同时打开多个图形界面。多个终端。缺点是比较卡。

有兴趣应该也调试出来!

具体怎么操作,我会写到博客上。

三 调车

除非是只想写代码,不想调车的人,否则去参加比赛一定需要需要掌握以下技术:

  1. 摄像头的参数及作用:曝光时间、Gamma、分辨率、constrants、增益
  2. 知道调摄像头参数时,要调到什么程度,什么情况下改什么参数
  3. open cv拍照以及录视频:调节拍照频率、调节录像帧率、从文件读写文件数达到不覆盖已储存文件的目的
  4. 驱动移植
  5. 与电控的交接

摄像头参数

曝光时间

调参最主要的一点是调节曝光时间,场地光强则曝光时间减少(减到2~6ms),光弱则曝光时候增加(>6ms),数字不是绝对的。和赛场上的很多人交流了一下,大部分人也仅限于简单调节曝光时间。

而且一定是要选择手动曝光将曝光时间固定,帧率会相对不那么飘。自动曝光之后的图像完全不能满足图像处理的需求。之后给大家看一下图像要处理成什么样子。能否用软件写一个自动调节曝光适应当前环境,并固定该合适曝光时间的东西呢?

还有一些队伍调节曝光并不是用软件调节,而是拧摄像头表面的光圈旋钮。光圈是一个用来控制光线透过镜头,进入机身内感光面光量的装置。所以注意区别,软件调节曝光时间,硬件光圈旋钮调节进光量,他们都可以调节曝光。如果场地光强太大,需要减少曝光,软件和硬件的区别是什么?哪一个更好?比赛的时候,我选择将光圈调到最大,调节软件的曝光时间。一方面我需要调大Gamma值,能让曝光时间较短时,比较暗的数字亮度提升,而提高Gamma却会让图像总体变暗。所以需要调大光圈。另一方面,调大光圈,进光量大,那么曝光时间可以调到更小,提高帧率。需要知道代码里曝光时间怎么调

Gamma

Gamma值的介绍,看一下江达的博客

另外,也需要做一下试验,亲自调Gamma试一试,看看是否确实如此。

增益

增益是摄像机传感器接收到原始景物的光后,在光电转换过程中,对原始的光进行调大或调小的过程。如果这时是增益调大了,我们的图象就会比实际的亮,相反就会更暗。如果传感器很小或质量不是很好,增益后就有很多的噪点。

在低亮度条件下应该完全打开镜头光圈,以获得清晰的图像。

一般增益直接64,因为实际调节,光线其实非常暗。有数字识别,些许噪点不足为惧。

光晕

之前利用代码识别蓝色装甲板有一个现象是偶尔无法识别。这个原因其实是摄像头在识别蓝色装甲板时,会出现严重的光晕。上网搜一下光晕,就理解了,蓝色灯条周围出现明显的蓝色光晕,灯条轮廓被破坏,当然无法判断是否是灯条了。

解决方案:清洁镜头(不盖镜头盖是个坏习惯),调节焦距,如果不用分类器可以降低成像亮度,即降低曝光

调节焦距有一定作用,最重要的是降低曝光。

分辨率

由于带宽的限制帧率和分辨率通常互相制约,想要高帧率分辨率就会低。软件需要将图像分辨率设置为640X480,但我实际拍照片发现上交代码拍出来的图片是752X480,之后需要调低一下。(上交的摄像头初始化做的不好)

焦距

不同焦距的镜头所呈现的视角是不一样的,焦距越大视角越窄。

工作距离和焦距往往结合起来考虑。一般地,可以采用这个思路:先明确系统的分辨率,结合CCD像素尺寸就能知道放大倍率,再结合空间结构约束就能知道大概的物像距离,进一步估算工业相机镜头的焦距。所以工业相机镜头的焦距是和工业相机镜头的工作距离、系统分辨率(及CCD像素尺寸)相关的。

所以需要根据预计距离,选择合适的焦距,一般6~8mm,

当蓝色装甲板不在焦距适合的距离上,会变模糊,产生光晕。此时需要调节焦距。

另外,此次江苏赛中,许多队伍的哨兵,隔着老远打死了对方补血点的补兵,和焦距不无关系。

如何调参数

调参数要调到什么程度呢?

总而言之,能够正确识别装甲板,却又受到外界干扰较小就是最好的了。

那么,其实显然是在场地的光照条件下,要尽量减少曝光量,这样能够正确看到装甲板的同时,还看不到其他物体。

看到装甲板

对比一下比赛场地和摄像机镜头拍到的图片,可以知道曝光调到多暗:

在这里插入图片描述

上面这张图片就是江苏省赛摄像头拍的,而场地对于人眼来说,是很明亮的,但我们不需要那么多明亮的东西,我们只需要识别到最清楚的装甲板。这张曝光是5ms,当时没敢给太低,但其他学校队伍有设置2ms曝光后,还能够准确识别的。

下面这张是场地图:
在这里插入图片描述

上面的场地其实很亮,所以可知曝光有多低!

清晰看到装甲板

实际比赛中,步兵是运动的,云台也是运动的。或者步兵开启小陀螺。这个时候,拍摄到的视频很可能是模糊的。所以,调试的时候最好让云台运动时,观看视频。如果有模糊等现象时,首要解决方法是先调低曝光,将灯条的模糊现象解决掉。最次的方法才是降低云台速度。

录制视频

为了能够查看场地光线,判断能否识别装甲板,需要录制低帧率视频或者拍摄照片。为了不影响传输数据帧率,录制视频和拍摄视频的操作不能够太频繁。

既可以录制普通视频,也可以令摄像头标注一下图片中装甲板,再录制视频。这样就可以方便知道在真正的条件下是否识别到装甲板。

为了实现这个目的,需要掌握open cv的videoCapture、imwrite的函数使用方法,能够安装ffmpeg库,成功在代码中运行。或者掌握dji在2017年开源的摄像头驱动,RMVideoCapture。(上交的各个参数更改需要到不同文件修改宏定义,比利用驱动函数修改参数麻烦得多)

同时还需要掌握利用C++创建读取txt文件,在txt文件中设置数字,以达到进行多次断电上电操作后,代码能够拍摄其他照片和视频,却不会将原本保存的文件覆盖。

驱动移植

或者说是代码移植,如果想要运行别的学校的代码的话,肯定要能够把迈德威视的摄像头驱动移植到代码上。需要修改摄像机驱动以及串口号等等

电控交接

发弹

在训练的时候,一定要能够真正发弹,像在赛场上一样识别,旋转云台,发弹。

固定频率发送数据

对于单片机的PID控制,视觉这边需要开一个固定频率的串口线程,比如说:300Hz,如果帧率达到300Hz,有装甲板位置传送位置信息,没有则传送0,让云台不移动,但同时用标志位告诉单片机不需要移动。

随动与击打

视觉能够识别到8米以外的装甲板,但是能不能打中呢?在后期与电控的联调中,我们需要知道机器人击打的范围,在一定距离内云台随动,但是不发弹,在一定范围内,既发弹,又随动。

滤波

发送数据不要突变

(感觉还有好多,但是记不起来了)

四 注意事项

利用训练场

正式比赛之前有一个练习赛,练习赛注意拍视频,改成击打自己的机器人,试一试效果,回来根据光强改一下摄像头参数

与其他队员交流

有时间的话,一定要和各个队伍的视觉组成员交流一下,加微信等等,问问自己的问题。

熬夜通宵

比赛是连续好几天的,一天比完要进行一天的调试,根据当天的情况赶快加紧改进。所以肯定是要熬夜的,晚上3.4点休息,早上6.7点起。持续几天,大家要做好心理准备。

识别距离

上交代码在比较昏暗的场景下,对于近距离的装甲板识别效果不太好。调试时候需要注意一下。赛场上,真正利用视觉进行自瞄的距离,一般也在1米外。

分辨率

上交的代码分辨率是752X480,之后肯定要改成正好的640X480

其他

  1. 用电池供电的东西,随时充电

  2. 摄像头拧死前面的调节旋钮,可以有效防止焦距和光圈因为在保护壳里发生碰撞而改变。

五 接下来

帧率

提高帧率是接下来的目标重心。

目标是把视觉做到300fps。为什么要那么高的帧率?因为可以提升系统的实时性,一个现象就是可以更准确击打运动中的目标。用控制的观点看自瞄系统,摄像头是传感器,相当于系统反馈;云台电机是执行器。控制频率一般不能超过采样频率,否则系统要么震荡的厉害,要么只能把响应调的很慢。现在只能做到让系统慢的不那么厉害而已~

一帧图像0.333ms,如果灯光足够亮,把曝光调到2ms,那么代码的运行时间就必须达到0.12ms以下,上交代码是达不到这个帧率的。其他开源代码比如深大和北理珠,能够达到0.6ms。

此外,大家要知道,击打移动目标的时候,视觉组要能够根据己方和对方运动速度,计算敌方装甲板接下来的出现位置,也就是要做预测,考虑识别时间,子弹出去的时间等等。但是,如果帧率足够高,几乎不用做预测就可以进行击打,因为用来计算的时间太少了,是即时的目标检测。

测时间

想要知道代码的那一块,耗费时间最多,读取系统时钟,在代码的开始和结束阶段,做差值,输出。

GUI和代码编写

之前写代码一直用的是gedit或者vim,更改参数的时候也是直接在代码中更改,然后cmake ,make,下载代码看效果。这个过程其实很繁琐。

但是我们完全可以制作一个图形用户界面(Graphical User Interface,简称 GUI)然后在界面上随时修改参数,界面上随时显示更改后的图像。这样调参就很方便。

另外,我们一直没有一个专用的编程软件。之前用过VS code,但是不支持arm的C/C++插件,导致在变量之间跳转困难。而vim+cscope+ctags等方法来配置一个方便的IDE很是麻烦(之前鼓捣出来,发现效果远不如专门的IDE)。其他如codeblocks、clion、qtcreator等IDE是其他学校的队伍使用的。另外,我们所有人都要摒弃Windows,专注linux的IDE开发,原因看东南大学视觉组的经验贴

建议下载qtcreator,图形化的界面,而且方便跳转,更改代码。

qv412

另外,还有一个linux上的库:qv412,支持对各个品牌摄像头的参数调节。通过这个工具可以很方便地调节摄像头的参数。如果你想在程序运行时调节摄像头曝光,只要打开这个工具,就可以直接修改摄像头的曝光、Gamma等参数,几乎达到了我对于一个GUi的要求,之后打算用一下试一试。

安装方便,具体看下面的链接:

江达一

开源代码和分享

开源代码是一定要多看的,上交的代码还不够好。另外,Robomaster论坛的经验贴有时间也要看一看,第一次比赛,很多事情都没经验。看经验贴能有帮助。

经验贴

东南大学2018年视觉总结

江达的十一篇教程

华南虎RoboMaster 2018赛季展望

南洋理工RM机器学习介绍

论坛总结

RM圆桌

开源代码必看

  1. 大连交大:自瞄很厉害
  2. 深大:对于实时性比较好
  3. 北理珠:实时性极好,加入roi后0.3ms一帧。空中机器人识别比赛第一名
  4. 东南:注释好,详细

其他任务

一些任务,大家有空的话,可以挑几个感兴趣的,选关键词,上网搜索,学习学习,实践实践。

  1. CUDA和Tensor RT

    有一位大佬说是把open cv的库挪到GPu上,发现在GPU和CPU内存切换的时间和在GPU上运算的时间差不多,所以咱们如果要利用manifold的GPu,要想好到底要做什么东西。把机器学习、CNN分类器这种耗费资源的东西挪到GPU上才会有比较明显的提升。

  2. 机械需求

    需要向机械提需求,机器人上的manifold和摄像头需要更好的安装。摄像头的外壳做大一点,现在里面有两个螺丝钉顶着摄像头,摄像头进出不方便,需要整个卸下来。而且外壳做成了接插的形式,拆卸也不方便。摄像头的固定也不对,总是滑下来,镜头顶着前面的亚克力板。建议在现有基础上,扩大外壳,利用相机本身的安装孔,使用螺丝钉固定。或者外包3D打印件,通过3D打印件固定。

    对于manifold,最主要的是留出电控和manifold的各种接口,地方大点儿

  3. 看摄像头使用指南(迈德威视官网,技术文档里)。了解,精通摄像机的各种参数以及如何调节

  4. 购买:清洗镜头的工具(不戴镜头盖,容易变脏)、相机自身的长的小螺丝钉、

  5. v4l2库的安装

    在arm架构上的qtcreator比较难安装,如果v4l2可行,能够极大提高生产力。

  6. resize ROI

    识别到装甲板后,缩小拍摄照片的范围,resize,这部分北理珠很好

  7. cmake工程

    cmake,makefilelist。需要一个很懂构建cmake工程的人,来写第一版自己的代码

  8. OLED,SPI显示

    利用manifold自带的接口,做一个OLed的显示,即时显示机器人状态

  9. 使用gnome开机自启动

  10. 固定速率,串口发送数据

  11. resize装甲板区域,北理珠和上交的代码,在上交代码上实现

  12. 拍视频

  13. qt,编译cmake工程。用qt软件,cmakelist怎么编写

  14. VNC,SSH

和其他视觉组的交流

这里是和其他队伍的视觉组交流后得到的一些杂思:

自瞄打谁

自瞄能打哨兵是最关键的。面对面互相试探,步兵之间,准一点不准一点也打不死人。像大交自瞄这么好,最后上交也顶的住,只要战术得当不去送。但哨兵如果只靠手瞄打,推起来太慢。哨兵一定要有能够预测的自瞄。

英雄主要靠自瞄,因为英雄射速低伤害高,比较难操作。英雄配了妙算2有GPU,可以做全图搜索。

文档管理

就是给代码写注释,维护代码。但是基本上能够做到的学校不多,而且咱们现在还没有一个成型的代码,等明年应该会有用。

版本控制

版本控制做的人也不多,有用到的用的是码云,还有git。