视觉教程第一弹:视觉综述

视觉教程第一弹:视觉综述

机械是血肉,电控是大脑,视觉是灵魂。

在RoboMaster的比赛中,视觉主要发挥的作用有一下几点:

  • 识别敌方装甲板,自动控制子弹准确命中。
  • 识别场地BUFF,自动控制子弹准确命中。
  • 识别基地引导灯,自动控制飞镖飞行姿态,准确命中基地。(20赛季新加入的元素:飞镖)
  • 识别敌方飞镖,自动击落敌方飞镖,难度较大。(20赛季新加入的元素:飞镖)

以上几点都是射击控制类的应用,类似FPS游戏中的锁头挂。

  • 识别弹药箱,自动控制工程车取得弹丸。
  • 识别敌方车辆位置,为队伍提供上帝视角。(20赛季新加入的元素:雷达站)
  • 在车辆后方安装摄像头,识别背后的敌方单位,防止操作手被偷屁股。(类似的,还可在侧面装摄像头)

以上几点则是辅助类的应用


由于视觉是一个偏向软件的方向,这意味着只要有一台电脑,几乎可以完成视觉相关的绝大多数任务;同时视觉每年需求变化不大,网上开源资料多,所以,绝大多数队伍都做出一个能用的视觉,这并不是一个十分困难的任务。

因此,我们做视觉的目标绝不仅仅是能用,而是能在较为复杂环境下,快速而稳定的识别目标,同时准确命中。一定要取得比手动操作更为优秀的效果才是合格的视觉应用。

这里就提到了几个关键点:

  • 代码鲁棒性好。
  • 运算速度快。
  • 识别效果转化为控制效果。

有的人可能不清楚,什么叫识别效果转化为控制效果?以射击类的应用为例,识别到后,要能够准确命中

说到这里,就不得不说到,视觉识别的结果是如何转化为子弹命中的。一般情况下,我们的数据流是这样的:

摄像头采集图像—>视觉算法识别—>串口发送数据到单片机控制板—>单片机控制相应电机—>弹仓拨盘转动带动子弹射出—>子弹在空中飞行—>命中目标

可以看到,从数据产生到命中,中间经历了很多个环节,这导致了大量的延迟。如果敌方处于运动状态,无法命中基本是可想而知的。

还有的人可能觉得,控制已经不是视觉的范畴了,这些事情应该有其他人(如电控)来完成。但实际情况下,整个车辆是一个大系统,没有哪个模块能单独存在,只有统一在一起进行测试和调参,才能取得良好效果。这意味着控制类的事情往往都是和视觉脱离不开的,所以视觉部并不仅仅做视觉识别,也可以叫做算法部


说了这么多,那想做好视觉都可能需要哪些知识呢?这里我把我认为的各类必须和非必须知识罗列一下:

  • 编程语言:C++(必须)、Python(非必须)
  • 编程能力or技巧:多线程(必须)、C++进阶(非必须)、可视化(非必须)
  • 各类编程库:
    • OpenCV(必须)
    • Eigen(矩阵运算库,非必须,但推荐掌握)
    • Boost(C++扩展库,非必须)
    • QT(C++GUI库,同时集成各类常用功能,非必须)
    • Pytorch/TensorFlow/Caffe/Keras(深度学习训练,非必须。如果想用,推荐使用Pytorch,极其不推荐TensorFlow)
    • TensorRT/TVM/OpenVINO(深度学习部署,非必须。如果想用,N卡推荐TensorRT)
    • ROS/ROS2(分布式环境,非必须,不太推荐使用在RoboMaster的视觉应用中。如果想用,推荐ROS2)
  • 嵌入式开发(非必须)
  • Linux基本使用,如:命令行、包管理、自启动(必须,建议使用Ubuntu18.04)
  • CMake基本使用(非必须,但推荐掌握)
  • git和github基本使用(非必须,但推荐掌握)
  • 相机硬件相关知识,如:选型,图像采集方式,各种性能参数(必须)
  • 相机软件相关知识,如:成像模型,调参方式(必须)
  • 坐标变换(非必须,但推荐掌握)
  • 陀螺仪(非必须,但推荐掌握)
  • 各类滤波算法或优化算法(非必须,但推荐掌握)

作者:唐欣阳,github主页:传送门