视觉组 | 2022暑期学习建议


✦
#1 智能射击
1.共同负责步兵、英雄、哨兵、无人机自动瞄准功能的设计与调试;
2.开发、维护与优化华工机器人实验室视觉库;
3.与电控协作进行电控-视觉联调,包括但不限于云台响应、延迟测定等;
4.进行工业相机方案设计、选型、测试与性能评估。
✦
#2 智能算法
1.负责工程、飞镖系统的算法设计、研发、调试;
2.与电控协作进行电控-视觉联调,包括但不限于辅助姿态定位等;
3.进行相机方案设计、选型、测试与性能评估。
✦
#3 智能感知
1.负责雷达站的算法开发;
2.开发并维护激光雷达库;
3.管理并维护深度学习服务器;
4.探索和创新3D目标检测算法。
✦
#4 软件测试(新增方向)
1.熟悉华工机器人实验室视觉库底层设计、实现方式,并在必要时进行框架变更;
2.制定程序测试计划,编写测试工具、分析测试结果;
3.与视觉库相关负责人合作,提出各模块改进方案,并评估其合理性。

Tips
在计算机语言学习过程中,我们会遇到许多疑惑,所以在正文开始之前先推荐一个可以解决大多数问题的答疑网站(英文):https://stackoverflow.com/。

基础篇—必学
✦
#1 编程语言
C++是视觉组最常使用的编程语言。教材《C++程序设计基础(上)》通俗易懂,涵盖了大多数基础内容,按学校要求修完C++课程即可应对基本的算法编写。
结构、按位运算、类等章节虽然不是考试重点,但非常实用,建议详细学习。面向对象编程是重要的编程思想,大家要理解并运用封装、继承和多态。
此外,C++11的一些新特性、标准库STL以及C++多种设计模式能够给算法构建带来很大的便利。利用C++11的多线程机制进行并发编程的程序开发,熟练运用这些新特性也是视觉组的基本要求之一。
推荐学习资源:
1.C++语法推荐教材:《C++程序设计基础(上)》
2.标准库推荐学习链接:https://zh.cppreference.com/(中文)
3.C++11特性推荐专著:《深入理解C++11》
《深入理解》一书中,需要重点学习的章节包括:4.2 auto类型推导;4.5 基于范围的for循环;5.1 强类型枚举;5.2.1 & 5.2.2 智能指针;6.3 原子类型和原子操作;7.3 lambda函数。
✦
#2 编程语言python
Python是一门非常方便的编程语言。它有大量的现成库可供调用,可以提高视觉算法的开发速度。Python入门非常简单,希望你能掌握基本Python语法,及使用类对代码进行封装。
为了能够使用这些功能齐全的包,你需要学会配置Python的开发环境,使用pip安装和管理包,并且使用Anaconda管理虚拟环境。
推荐IDE:Pycharm(学生账户可下载专业版)
推荐学习链接:
1.廖雪峰Python教程:https://www.liaoxuefeng.com/wiki/1016959663602400
2.Anaconda管理Python环境:https://docs.anaconda.com/anaconda-cloud/user-guide/tutorials/
✦
#3 操作系统(Ubuntu)
Ubuntu是一个基于Linux的、开源的操作系统。我们下载并安装Ubuntu 20.04版本。
安装Ubuntu的一般方法有虚拟机安装、双系统、移动硬盘安装等。因过程麻烦、问题较多、难度较高,我们不推荐虚拟机安装。
我们推荐使用双系统安装,即Ubuntu与Windows共存。安装相对简单,且重启电脑即可切换系统。愿意买一块移动硬盘进行安装也是不错的选择。不占用原电脑硬盘容量,安装过程也更加简单。你还可以将其插入别人的电脑敲自己的代码,随时随地都能开心地工作,乃实验室赶进度最佳之选。
安装完Ubuntu后,各位需要熟悉Linux系统的一些基本命令行操作,如Ctrl+Alt+T打开一个终端,cd进入某个目录,sudo获取root权限,rm删除某个文件或文件夹等。初接触时可能觉得繁琐,但熟练运用后你会觉得特别便捷高效。(PS:面试时可能会考察相关操作。)
推荐学习链接:
1.Windows环境下Ubuntu usb系统盘制作教程:
https://tutorials.ubuntu.com/tutorial/tutorial-create-a-usb-stick-on-windows#0
2.系统安装教程:https://tutorials.ubuntu.com/tutorial/tutorial-install-ubuntu-desktop
3.linux常用命令行操作:https://www.cnblogs.com/banjinbaijiu/p/9140460.html
4.Ubuntu Tutorial:https://ubuntu.com/tutorials/command-line-for-beginners#1-overview

✦
#4 代码管理工具Git
在整个赛季中,你需要与多人合作编写大量代码。反复更改代码很容易产生混乱,此时学会使用强大的版本管理工具Git便显得格外重要。
使用Git,你可以看到自己和队友每次修改的内容,出现问题时也可以退回到任意一次修改之前。代码会被实时推送到云端服务器仓库中,即使电脑惨遭弹丸攻击,代码也会安然无恙。

多人协作Git仓库示例
前期学习中,建议先熟练Git命令行操作,再尝试使用Gitkraken等图形化工具,这会让你对Git的管理方法和常见问题(如合并和冲突)有充分的理解。
推荐学习链接:
1.Git命令行操作:https://git-scm.com/book/zh/v2
2.Gitkraken官网:https://www.gitkraken.com/
3.常用代码托管平台:【码云】https://gitee.com/;【github】https://github.com/
✦
#5 编译调试工具
在Windows下,Visual Studio等IDE已经为你准备好了全套环境,但在Ubuntu下,这些都需要你自己配置。
常见的编译器是GCC,常见的调试器是GDB。编译器需要Makefile文件来配置系统环境,但Makefile文件的编写颇为困难。在实际使用中,我们通常编写CMakeList文件,再由CMake自动生成Makefile文件。
通常,Linux初学者会使用命令行工具Vim或Gedit来进行文本编辑,再使用终端命令进行编译运行调试,但这样的开发效率其实十分低下。我们推荐使用VSCode作为代码编辑器,其插件丰富,使用非常方便,毫不逊色于Windows系统中的Visual Studio。
推荐学习链接:
1.Cmake(全英,时间充裕可看):https://www.ibm.com/developerworks/cn/linux/l-cn-cmake/index.html
2.VSCode学习:https://code.visualstudio.com/docs/languages/cpp
✦
#6 通信与系统服务
我们使用串口(SerialPort)进行电控与视觉之间的数据通信,本段后附有超详细的Ubuntu与嵌入式系统的串口通信教程。
安装在机器人里的电脑需要程序开机自启动,这里给大家介绍一个方法——系统服务(Systemd)。其设计目标是为系统的启动和管理提供完整解决方案。你需要了解如何写简单的.service文件,如何设置系统服务开始、停止和查看服务的状态。
推荐学习链接:
1.超详细的Ubuntu与嵌入式系统的串口通信教程:http://xanthium.in/Serial-Port-Programming-on-Linux
2.Systemd入门教程1:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
3.Systemd入门教程2:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

算法篇—必学
✦
#1 OpenCV
视觉图像处理是视觉组最常见的工作内容,基于OpenCV开源视觉库进行图像处理是重点的学习内容。
它是当前最具影响力的计算机视觉开源库。官网资料相当完整,包括Online Documentation、Tutorials、User Q&A forum,都非常棒。
官网Tutorials中有详细的安装教程。我们建议在你的Windows和Ubuntu上都安装好OpenCV(4.5及以上版本)。OpenCV最推荐的学习资料还是官网文档,其内容详尽、更新速度快。
PS.大家需要尽快适应阅读英文资料,因为后面开发中遇到的一些问题很难用中文查到。
推荐学习书籍:《学习OpenCV3》《OpenCV4.0快速入门》
进入OpenCV 4.0时代后,蝴蝶书(《学习OpenCV3》)中的部分内容依然适合入门者阅读,关于OpenCV 4.0的内容也可以购买《OpenCV 4.0快速入门》这类书籍进行查阅。
多多使用其实是最好的学习方法。我们更推荐遇到问题的时候再去查找相关资料,完成视觉组面试前的实战任务,也是快速的OpenCV学习方法。

✦
#2 数学基础
机器人的眼睛是相机。相机的作用就是将三维的真实世界投影到二维的图像数据中。我们需要在算法中利用降维的数据进行识别处理,使得机器人对三维世界具有一定的感知。
那么如何将三维世界降维到二维平面,又如何从二维平面反推到三维世界呢?这便是线性代数的一个重要应用——坐标变换(映射)。三维世界,我们一般称为世界坐标系(或笛卡尔坐标系),而相机图像的二维平面,一般称为像素坐标系。
如果考虑图像的深度信息、视角大小,我们就可以获得相机的三维坐标系。通过一些固定点在不同坐标系中的坐标,我们便可以通过旋转、平移变换获得坐标系之间的相对位姿,进而获得机器人的位姿。
数学基础在坐标变换中有很深的应用价值,在特征提取、数据处理(如卡尔曼滤波)中也有重要的应用。
在计算线性代数中的常用运算时,Eigen库是你提高计算速度的好帮手。这个库有丰富的接口来让你进行欧拉角、四元数、旋转矩阵、矩阵求逆等运算。此外,还方便地可以与OpenCV中的数据类型进行相互转换。
推荐学习链接:
1.视觉SLAM十四讲:https://www.bilibili.com/video/BV16t411g7FR
2.3Blue1Brown线性代数教程:https://b23.tv/jqyxkkm


拓展篇-深度学习-二选一
RM2020赛季推出的新兵种“雷达站”使得基于深度学习技术的机器人识别、定位算法成为视觉组算法开发的一个重点方向。
✦
#1 深度学习框架
我们推荐使用Pytorch或Tensorflow作为深度学习框架。如果你的笔记本电脑没有显卡或者显存较少,可以尝试安装CPU版本,来对框架中的基本数据类型、各种类型的网络层接口进行简单的了解。学有余力的同学可以尝试使用RM开源的DJI_ROCO数据集进行机器人识别和分类,尝试实现下图的识别效果。
推荐学习链接:
1.Pytorch中文文档:https://pytorch-cn.readthedocs.io/zh/latest/
2.DJI_ROCO数据集:https://terra-1-g.djicdn.com/b2a076471c6c4b72b574a977334d3e05/resources/DJI%20ROCO.zip

✦
#2 神经网络
采用神经网络搭建模型做图像推理,可以有效提高识别的容错率。
首先,你需要搭建一个神经网络的框架。其次,将自己的任务和网络结构相结合,并做优化。如何设计网络的结构是门学问,既要保证速度,又要保证泛化性等。
然后,开始调整超参数,即深度学习程序员口中的调参。这种调参跟最终网络模型的效果之间有一种微妙的关系,达不到预期效果时,不深入学习往往难以分析出问题所在,但如果你掌握相关知识,就能快速定位症结。
接着,把推理模型部署在设备中。这里面也大有学问:部署的快速性、准确性,电脑硬件资源的分配,以及经济性等,都是需要考虑的点。
✦
#3 目标检测
2022赛季中,我们也在目标检测方向进行了一些探索,对这方面有所了解也是面试加分项哦。
首先,你需要学习深度学习基础知识,重点学习基本概念术语,不同情况下损失函数的设计。然后尝试目标检测,跑通基础的YOLO模型。最后设计简单的四点模型,这里可以参考yolov5face项目。
这是一项充满挑战的任务。希望大家努力学习,学会利用各种渠道搜索学习资源。
如果你对目标检测、强化学习、小样本学习等算法有一定的经验或具有浓厚的兴趣,欢迎带上你的作品来参加视觉组雷达站研发组的面试!
✦
#4 智能决策
对于雷达站的开发,我们不仅着眼于目标检测,更期待有更多的潜能开发。本赛季也有对激光雷达进行一定程度的探索,需要负责对激光雷达库的开发与维护。因此,我们也在智能决策等方向进行了一些探索。非常欢迎对智能决策有所了解的同学加入我们实验室。
推荐学习链接:
1.行为树学习:https://www.behaviac.com/concepts/
2.人机对抗门户:http://turingai.ia.ac.cn/

拓展篇-ROS-二选一
ROS是一种编写机器人软件程序的高度灵活性软件架构,它对于视觉组的意义在于“一套标准和一堆工具”。
✦
#1 “一套标准”
ROS中有一个概念叫“计算图”,这是ROS用于处理数据的一种点对点的网络形式,即由一个master根节点管理下层的一系列节点。拥有了计算图这个特性,我们可以非常方便且安全地通过编写多个节点的代码来实现多进程编程(注意区别于多线程)。这种独特的编程方式也是ROS标准的一部分。
除了多进程编程的标准以外,ROS标准还提供了一系列的通用数据类型,例如点云、图像,用于描述机器人运动的速度姿态等等。如今许多厂商生产的硬件都支持ROS,比如一些激光雷达、深度相机、双目相机之类的传感器等。厂家提供现成的节点读取硬件数据,我们只要读取它的节点就可以获得ROS标准数据类型。不用接触底层,更换设备也很方便。

✦
#2 “一堆工具”
ROS提供了大量的工具,如:用于检测每个节点的发布频率和信息类型的许多命令行工具,可视化工具rviz,用于数据可视化的rqt_plot,用于仿真的gazebo,用于标定相机内参的工具等等。
以上所说的都是ROS内置工具。进一步学习后,你会发现很多GitHub上的开源工具都是依赖ROS开发的,比如由港科大开源、用于标定imu的imu_utils,以及可以用于imu和相机联合标定的工具kalibr等。
✦
#3 学习建议
ROS需要在Linux系统下安装,因此你需要先安装Ubuntu或其他Linux系统。实验室统一使用Ubuntu 20.04作为开发环境,因此需要安装适用于Ubuntu的ROS。需要注意的是,ROS与Ubuntu的版本是一一对应的,比如Ubuntu 20.04对应的是ROS-Noetic。我们在后面提供了官网安装教程以供参考,大家也可以自行寻找其他教程。
安装好之后,就可以着手学习啦。ROS Wiki是应用最广、公认最好的ROS入门工具,也推荐大家从此出发学习。在了解完ROS的基本概念后,我们推荐阅读三本书籍,来帮助你从入门走到项目实践,系统地学习ROS整个框架。当然,阅读的前提是你具备ROS、GNU/Linux和编程概念的基本知识。
不必担心学习路上无资料可寻,ROS社区的建设非常好,网上也有大量博客可作学习参考。
ROS的工程特性决定了一定要在项目中才能更好地被习得。大家只有不断在ROS中尝试新的传感器、新的算法、甚至尝试新的框架,才能对ROS有更深入的理解。因此在安装完ROS后,你可以自己动手实现一个简单的两个节点间的通讯。
✦
#4 学习途径
1.ROS-Noetic安装:http://wiki.ros.org/noetic/Installation
2.ROS Wiki:http://wiki.ros.org/
3.入门阅读 Effective Robotics Programming with ROS - Third Edition:http://wiki.ros.org/Effective_Robotics_Programming_with_ROS-Third_Edition
4.进阶阅读 Mastering ROS for Robotics Programming:http://wiki.ros.org/Books/MasteringROSforRoboticsProgramming
5.项目实践 ROS Robotics Projects:http://wiki.ros.org/ROS_Robotics_Projects

小贴士
以上学习建议中,基础篇与算法篇为必学项,而拓展篇则是选学项,大家可以根据兴趣选择其中一项进行学习。
实践是检验理论的一个重要手段,招新面试时,我们会考核大家实践任务的完成情况及提前学习内容的掌握情况,大家一定要用心完成。详情等待后续招新推文通知。
如有疑问,欢迎大家扫描以下二维码,加入实验室招新qq群进行交流:


竞赛组&项目组分流须知
实验室的技术开发分两个大组——竞赛组和项目组,每个大组下分设电控组,机械组与视觉组。竞赛组主要参与RoboMaster机甲大师赛,而项目组主要参加华为嵌入式大赛、ROBOCON、全国大学生机械创新设计大赛等团队规模相对较小的比赛。
加入竞赛组,可以感受到大型团队里协作配合的氛围,并且基于较为完善的培养体系,能够系统地学习和掌握开发机器人所需的知识。同时会负责从零到一开发机器人,并在机器人交流和对抗中,不断迭代和完善机器人,成为一名追求极致的工程师。
相比于竞赛组,项目组更注重理论的探索和学习,因此仿真的运用会更加频繁和必要。因为参加的比赛规模较小,并且比赛规则每年变动较大,因此队员开发的自由度较大,更加考验队员的创新能力,以及设计的鲁棒性。
两大组别在机械、电控、视觉三个方面的学习和考核要求一致。在前期,两大组的新队员会统一培训培养,后期则会按照报名和面试结果进行分流。
文案 / 视觉组
编辑 / 李晓欣
美工 / 胡钰滢
审核 / 徐心卓 赵曦
阅读 2134