从RoboMaster AI挑战赛到移动机器人系统的入坑指南

从RoboMaster AI挑战赛到移动机器人系统的入坑指南

在今年1月底,我们开源了RoboRTS框架,一方面是为了让RoboMaster AI挑战赛的参赛队伍们可以有一套易用的针对于RoboMaster机器人平台的上层框架,另一方面也是希望为更多科研工作者在移动机器人算法研究上提供一个通用性的硬件和软件的解决方案。自框架开源以来,我们基于感知,规划,控制和决策四大方面,一直在不断地优化和细化整套框架。

RoboRTS开源框架

在2018年ICRA RoboMaster AI挑战赛中,我们团队将其应用在了RoboMaster AI挑战赛的官方机器人上,与所有参赛队自主研发的机器人,在铺设不同功能机关道具的5m x 8m场地内,进行全自动的2v2对战。在2018年RoboMaster大学生夏令营中,营员们也基于这套系统框架进行了全自动弹药箱搜寻、夹取,以及自主对战等任务的开发。但是在与很多参赛队员和夏令营营员交流的过程中,我们发现许多同学面对这样一个综合性比较强的系统十分迷茫,并不知道应该从哪里入手去高效率地学习和调试整个系统。因此在今年RoboMaster AI挑战赛后,我们决定重新设计一套基于RoboMaster步兵机器人的模块化机器人硬件平台,同时在接下来维护和迭代RoboRTS框架的过程中,优化协议调用和调试接口,完善说明文档,并针对性地推出一系列的基础教程,方便对于RoboRTS框架以及RoboMaster移动机器人平台相关工程和理论知识的学习。

下图是当前整个框架平台的基本构架简图

整个框架主要由两个大部分组成,嵌入式STM32微控制器平台端搭载了RTOS,承担了实时需求高的对机器人的控制,对传感器数据的预处理和转发,以及与比赛相关数据转发的任务,而上层机载电脑则负责算力需求更高的环境感知,运动规划和决策调度的功能。二者通过串口,基于一套特定协议来进行通信和交互,这一部分也被我们封装成sdk的形式。因此整套框架的核心就在于感知,规划,决策和控制理论算法研究,以及各个硬件模块之间,不同进程之间,不同线程之间的通信,数据收发和处理的系统性工程问题。

在未来阅读我们的教程与文档,并通过RoboRTS框架对RoboMaster机器人平台进行开发之前,还需要提前学习一些先修知识。这篇文章主要提供给大家一些需要学习的知识点,尤其是必备的一些工程上的方法,以及对应的网络资料,给大家作为参考。

下图是RoboRTS框架所涉及的知识简图,左侧主要是理论知识相关,右侧为工程上需要了解的工具。


开发环境 Ubuntu

大部分的机器人软件系统都是基于Linux开发的,RoboRTS框架也不例外。我们主要的开发环境是Ubuntu 16.04,因此对于初学者来说,有必要去了解一些基础的linux下的生存技能。在这里安利一下CMU的一个很基础的小课程GPI,覆盖了包括shell基础、vim、bash、git等等linux下的必备生存技能,非常贴心。而对于更进阶的技能,就需要在实践中不断学习了,需要你活学活用man、google、stackoverflow等等。

编程语言 C++ / Python

RoboRTS框架基本是由C++编写的,假如你希望在此框架上进行自己应用的开发,或者进一步优化我们的框架,就需要比较熟练使用C++语言。对于C++的入门,建议从《C++ Primer》一书入手,多加实践练习,不断回顾。对C++进阶的学习可以参考Milo Yip的书单。由于RoboRTS框架是基于ROS开发的,因此你也可以使用Python通过rospy开发外部应用。

编译工具链 CMake

将代码变成可执行文件的过程,可以叫做“编译”。当你的工程涉及多个部分的代码时,就要考虑其相互间的依赖关系、编译的先后顺序,而决定这些的过程,可以称为“构建”。大多数的初学者都会尝试过编写Makefile搭配make来实现。而当工程逐渐变得庞大,就需要构建系统能更加抽象的表达整个构建的过程。这也是我们使用CMake构建系统的理由之一。对于CMake的学习,推荐学习现代CMake的用法 An Introduction to Modern CMake,里面包含了为什么使用CMake、CMake的基础用法、以及Modern CMake的实践,由浅入深,相信认真学习后会有所收获。

机器人操作系统 ROS

关于如何学习ROS(机器人操作系统)已经是一个老生常谈的话题了,为什么要使用ROS呢?ROS是世界上最大的机器人软件开发平台,得益于其开源性和社区性,我们可以很容易找到基于ROS的高水平开源算法来快速实现在自己的硬件平台上,那么ROS到底提供了我们怎样的方便?从本质上看,ROS其实是一套“通信架构”+“代码管理框架”+“实用工具包”的组合体。在通信上,其节点间的序列化和反序列化的消息通信机制一定程度上解决了进程之间通信的问题;而代码管理上,也提供了方便的节点、包和工作区管理功能,让我们很容易层级化进程、模块和仓库的关系;同时,ROS提供的可视化工具让使用者更高效的调试。

首先,就是要去学会使用其通讯机制。这部分的学习其实一本书就足够了,A Gentle Introduction To ROS中文版)。这本书可以保证你对ROS有一个最基本的认识,其内容也覆盖了上面知识导图中的通信机制(topic、service)、编译工具链(catkin)、参数机制(rosparam)等等。此外,在RoboRTS中有大量使用actionlib机制(适用于需要周期性反馈的节点间通信),这也是ROS中委托反馈过程任务中经常使用的机制,例如导航过程。关于actionlib的使用,此书还没有覆盖到,需要通过ROS Wiki 进行进阶的学习。

在一个机器人系统中,你会面对诸多坐标变换问题,例如传感器与机器人底盘间、底盘和云台间,机器人与地图间、机器人与机器人间的坐标关系。这时你就会用到ROS中不可忽视的坐标变换工具(tf)。它使用树型的数据结构,根据时间戳缓存并维护多个参考系之间的坐标变换关系,方便你在不同参考系之间进行转换。对于tf的学习建议从tutorial开始,若想对其深入的理解就必须要进一步结合实际的开发。

在你调试机器人的时候,一般会在自己的PC上进行开发,再部署到机器人的机载电脑上进行调试,这时ROS的网络通信的优势就体现出来了,你可以根据Wiki上简单的几步教程就完成相关的网络配置,而ROS还拥有非常丰富实用的可视化工具(如rvizrqt_plotrqt_graph)等等,让你在面对复杂的机器人系统时也能直观的观察其表现、发现其中的问题。这些实用的工具都值得初学者去跟着tutorial学习,同时做一些小demo。我们在后续的教程中,也会对涉及到的一些ROS相关的内容进行更深入的讲解。

数学基础

在ROS体系中,最为珍贵的就是其大量开源的ROS包,很多封装好的ROS包就像一个个黑盒子,你可以利用它们快速跑出各种各样的demo。虽然跑demo效果酷炫,但你的好奇心可能会驱使你想去了解其中的本质,想去真正深入的学习Robotics理论知识。而这时,你会需要一个十分扎实的数学基础,来让你更好的去理解各种算法的数学本质。应用最多、最普遍的就是线性代数和概率论相关的知识,以下是一些可以作为参考的资料。

线性代数:线性代数可以参考硕哥 @YY硕 推荐的两本书,《Linear Algebra Done Right》和《Linear Algebra Done Wrong》,用于系统的学习线性代数。如果更希望以课程的形式学习的话,推荐Gilbert Strang教授的公开课《麻省理工公开课:线性代数》。这里也推荐一些容易理解的读物: 理解矩阵神奇的矩阵和《线性代数的几何意义》。

概率论:概率论是研究随机性和不确定性的科学,由于环境、传感器噪音的存在,使得机器人的感知问题成为一个不确定性问题,一般来说机器人姿态估计、地图重建、目标检测、目标识别等算法都会涉及到贝叶斯估计、最大似然估计相关理论。这部分可以参考《Probabilistic Robotics》的基础知识部分、《Uncertainty in Deep Learning》、《Deep Learning》第三章。如果大家有更好、更系统的学习资料,也欢迎大家补充。

随着你对机器人理论算法的深入,你还会遇到凸优化、图论、拓扑学、信息论、微分几何等通用但大学阶段一般不会深入学习的数学问题,比如轨迹规划和深度学习都会涉及到非线性优化问题,利用同伦与同调的拓扑性质也可以对路径规划算法中的优化进行简化和加速,通过相对熵来对比预测分布和真实分布的一致性,常用于优化算法,而在动态调整蒙特卡洛定位算法的粒子数目中也有应用。这部分属于进阶的数学知识,在此只是提供参考,掌握非一日之功,需要慢慢消化。

Robotics 理论知识

机器人属于比较综合的学科,涉及到环境感知、智能决策、导航规划、运动控制等多个领域,不过也不要畏惧,入门机器人也不会太难

当你已经拥有一定的数学基础,就可以真正试着去深入一些ROS包的内部,比如最经典的ROS Navigation Stack,其奥秘基本都包含于《Probabilistic Robotics》(建议看英文原版)这本书中。这本书几乎不需要先修知识,由浅入深,几乎涵盖2D环境下的移动机器人系统方方面面,非常经典 。假如你觉得光靠读书十分晦涩,可以试着去看Sebastian Thrun的 Artificial Intelligence For Robotics课程或Wolfram Burgard的Introduction to Mobile Robotics课程。

掌握了这些基础后,你对机器人的框架、脉络就会有简单的认识,此时应该选定一个感兴趣的方向扎实深入研究下去,我们针对每个方向简单写一些介绍,并推荐几本图书或课程作为参考,方便大家索引。

  • 状态估计:在状态估计领域,不得不提的一本书就是《State Estimation For Robotics》了,其内容涵盖了状态估计(线性高斯系统、非线性高斯系统)、三维空间运动、和相关的应用。这本书的理论非常深刻实用,也非常严谨。但数学公式非常之多,需要有一定扎实数学基础。可能只有认真跟着书里面的公式推导,才会有很大的收获。而对于初学者,可以通过《Probabilistic Robotics》学习到基础的知识,做一些小的应用出来。
  • 计算机视觉(CV):《Learning OpenCV 3》 是比较好的入门图书,该书不仅讲解了一些图像处理简单原理,也有代码实现,初学者也快利用OpenCV快速实现一些demo,验证一些想法,想深入了解原理可以参考Richard Szeliski的著作《Computer Vision Algorithms and Applications》。Udacity上的计算机视觉课程也是一个不错的学习材料。如果以后的发展方向是VO、VSLAM等等,《Multiple View Geometry in Computer Vision》这本书也是非常必要的。
  • 深度学习(DL):近几年DL在目标检测、目标识别、语义分割、语音识别等多个领域都有比较好的应用,网上的教程也非常多,对于ICRA AI挑战赛来说比较关键的是目标检测与识别,这里推荐一下Goodfellow的《Deep Learning》前几章基础知识部分,deeplearning.ai的课程和Stanford经典课程cs231n,入门后主要就是读paper了,DL还处于快速发展的阶段,每一周都会release很多paper,可以通过rss订阅arxiv中感兴趣的topic,实时追踪领域最新动态。
  • 运动规划:运动规划部分建议从基于图搜索的算法进行入手,对其有一定了解后,可以用代码实现图的建立、图的搜索等。而后可以尝试阅读《Motion Planning》了解运动规划在机器人上面的应用,以及一些传统planning算法。后续还可以继续阅读《Planning Algorithm》,这本书的planning比较宏观,涉及的内容比上一本书要广许多,适合作为进阶的阅读材料。同时运动规划中的trajectory planning也会涉及到与凸优化相关知识,具体的应用可以参照paper《Trajectory modification considering dynamic constraints of autonomous robots》。
  • 智能决策:关于决策研究涵盖了工业和游戏广泛应用到的传统智能决策方法,例如状态机,决策树,行为树等,直接搜索每个对应方法的核心逻辑,横向对比每种方法的优劣,就可以很快上手,相关资料可以参见游戏AI的一些设计。智能决策的理论演变主要是基于马尔科夫决策过程,发展到近年来火热的端到端基于学习和优化的方法,例如深度强化学习,这方面的学习推荐《Reinforcement Learning:An Introduction》和David Silver的强化学习课程

而对于RoboRTS使用的部分算法以及每一个模块的详细分析和用法,我们将更新在之后发布的教程中。

关于RoboRTS的未来

我们团队开发RoboRTS框架的初衷在于让更多的人参与到机器人在不同规则场景下的智能决策研究,因此为了适配这样一套系统研究,综合现有成熟的RoboMaster平台,我们对未来RoboRTS有如下的框架规划:

其中包括了四大模块:

  1. 自动移动机器人平台
  2. 裁判系统平台
  3. 游戏仿真平台
  4. 学习训练平台

当前我们所做的工作主要集中在第一部分上。我们根据上一代机器人平台发布以来的一些反馈,会在今年年末的时候重新推出新一代的硬件平台,提供给未来ICRA挑战赛的参赛队员以及感兴趣的科研人员。新一代的平台的机械结构会更加模块化,便于安装和快拆,也适配更多种类的传感器,让学生和科研人员可以更加专注于算法层面的问题,免去许多嵌入式控制、机械设计层面的烦恼。为了让更多学生更方便的调试算法,我们将协议接口部分抽象出来作为独立的SDK,完善调试的工具链,针对各个模块的技术文档和教程的工作也在进行之中。

与此同时,为了更好的进行多机器人协同和比赛信息共享,我们将比赛中成熟稳定的裁判系统和自动平台融入起来,提供通信更加稳定的信息共享和指令控制,这方面的工作也在近期计划之中。

游戏模拟器对于学习训练的意义是不言而喻的,现实和虚拟世界中的机器人、环境以及传感器的建模和渲染仍然有一定的距离,这方面的工作我们还在摸索之中。

由于整个系统的跨学科交叉性非常大,仅靠一己之力是完全无法完成的。在这个项目上,我们希望建立一个开放的平台供RoboMaster赛队和对此有兴趣的跨专业的同学们以及科研工作者们共同交流与协作,分享新奇的脑洞,展示有趣的功能,亦或是记录一下踩过的坑,来共同推动整个项目的进程。

机器人的发展和普及,既需要踏实深入的算法理论研究,也需要贴近实际,关心人机交互的工程应用。希望借助RoboMaster这个平台,以及我们所做的一点点工程上的实践,能够吸引更多的人参与到机器人系统和算法的研究上。

编辑于 2018-09-18

文章被以下专栏收录