当前大家学习ROS还是以自学为主,所以会走很多的弯路,目前所谓的大神们也都是这样过来的。基本上早期开发机器人大家都是各干各的,甚至是防着彼此,生怕别人把我们的代码、设计抄袭过去,这样其实大家就是在重复地造轮子,进行一些底层的无聊工作。
什么是ROS?这是个老生常谈的问题,这里用官网的定义来解释一下。ROS是一个适用于机器人的开源的元操作系统。它不是一个真正的操作系统,但它提供了操作系统应用的服务,包括硬件抽象,底层设备控制,常用函数的实现,进程间消息传递,以及包管理。它也提供用于获取、 编译、编写、和跨计算机运行代码所需的工具和库函数。 它主要采用的是松耦合点对点进程网络,目前主要支持的还是Ubuntu系统,Mac OS X支持,Windows目前有测试版本,但支持的并不很好,不推荐。
为什么学习ROS
首先,目前机器人开发,软件开发的比重越来越大,而软件开发的时候软件框架的选择,是软件架构设计中一个重要的决策,直接决定了软件开发的直接效率,以及后续功能的实现程度。
目前除了ROS,还有很多类似的机器人软件框架,包括Player、YARP、Orocos、CARMEN、Orca、MOOS,以及Microsoft Robotics Studio。
为什么使用ROS呢?我总结了下,ROS有四大优点:1、松散耦合的机制方便机器人软件框架的组织;2、最丰富的机器人功能库,方便快速搭建原型;3、非常便利的数据记录、分析、仿真工具,方便调试;4、学界和产业界的标准,方便学习和交流。 使用一句话总结,使用ROS,能够方便迅速地搭建好机器人原型。当然,它的性能不是最优的,但是这四条优点足以保障它在机器人操作系统里面的地位。
然后,ROS比较好的一点是使用了BSD许可证,这是一个非常宽松的开放许可证,允许在商业和闭源产品使用,这对于开发产品的创业公司是比较重要的一点。
ROS是最庞大的使用者群体,是事实上的机器人标准,这是麻省理工在一篇文章中给出的评论。然后在2016年ROS大会数据显示,目前在使用操作系统做开发的人员用户超过35万,其中活跃用户美国占第一位,中国占第二位。
在学术研究领域,基本上机器人算法都会给出ROS版本的源程序。最早在2009年ROS发布的“ROS: an open source Robot Operating System” 论文,目前已经被引用了2871次。
2016年官方支持ROS的机器人超过了100个。目前已经有很多机器人公司采用了ROS系统来开发一些应用于全新市场的产品,如ClearPath、Rethink、Unbounded、Neurala、Blue River、Big-i,最典型的就是Willow Garage的PR2机器人。投资机构也对创业公司给予了极大的支持,仅2015年相关风险投资机构就在基于ROS操作系统的机器人公司投资了超过1.5亿美元。Nvidia、博世、高通、英特尔、宝马以及大 疆等大公司也纷纷推出ROS接口。
这是ROS当前的代码统计量,总行数已经超过了1400万,超过2477名作者。代码语言以C++为主,63.98%的代码是用C++写的,排名第二的是python,占13.57% ,也就是说ROS基本上都是使用这两种语言,可以实现大部分的功能。
应该学什么
要想学ROS,应该从哪里入手,它的先后顺序是怎样的呢?ROS由四大部分构成,第一个是基础结构,这些通讯机制是如何实现的;第二个是工具,包括仿真工具、调试工具等;第三个是体现它功能的package;第四个就是社区,如何去上面下载、发布代码,和其他开发者交流学习。
入门的话,首先要了解这四点:设计思想,核心概念,核心模块,核心工具。
ROS设计思想
设计思想主要是分布式架构,将机器人的功能和软件,做成一个个节点,然后每个节点通过topic进行沟通,但你这些节点可以部署在同一台机器上,也可以部署在不同机器上,还可以部署在互联网上。
ROS核心概念
ROS的核心概念主要是这几个,首先是节点,然后是节点之间的通信和话题,通信的方式有两种,一个是刚刚讲的话题,一个是服务。那么,如何管理ROS的这些节点和话题之间的沟通呢?这就需要用到Master,也就是ROS管理器,它还维持了一个参数的服务。而怎么组织代码,就是通过功能包集与功能包。
节点是各自独立的可执行文件,能够通过话题、服务或参数,与服务器或其他进程(节点)通信。ROS通过使用节点的方式将代码和功能解耦,提高了系统容错能力和可维护性,使系统简化。同时,节点允许了ROS系统能够布置在任意多个机器上并同时运行。关于节点需要注意的事项,节点在系统中必须有唯一的名称;节点可以使用不同的库进行编写,如roscpp和rospy,其中roscpp基于C++,rospy基于Python。
节点之间通过topic机制进行通信,topic机制是一个一对多的Publish/Subscribe 模式: 同一个话题也可以有很多个订阅者,它的底层传输依靠的是TCP/IP,也可以是UDP。topic具体传输的message,具有一定的类型和数据结构,包括ROS提供的标准类型,和用户自定义类型。
除了topic,ROS还提供另一种一对一的机制,也就是Service/Client,当你需要直接与节点通信并获得应答时,将无法通过话题实现,这时需要使用该服务。
Master向ROS系统中其他节点提供命名和注册服务,跟踪和记录话题的发布者和订阅者,使ROS 节点之间能够相互查找。一旦节点找到了彼此,就能建立一种点对点的通信方式。
那么如何组织代码呢?这主要依靠功能包(Package) ,ROS中软件组织的基本形式,用于创建ROS程序。功能包包含源代码和功能包清单(Manifest) 。功能包清单提供关于功能包、许可信息、依赖关系、编译标志等的信息。功能包清单是一个manifests.xml文件,通过这个文件能够实现对功能包的管理。
核心模块
ROS核心模块包括通信结构基础、机器人特性功能以及工具集,通信结构基础包括消息传递、记录和回放消息、远程过程调用、分布式参数系统;机器人特性功能包括标准机器人消息,机器人几何库,机器人描述语言,抢占式远程过程调用,诊断,位资估计、定位与导航;工具集包括命令式工具、可视化工具以及图形化接口。
核心工具
ROS拥有很多第三方的核心工具的支持,或者说Package。我们比较常见的是右边这五个工具,Gazebo是一个三维仿真环境,OpenCV是大家非常熟悉的计算机视觉库,PCL是点云库,MoveIt!是机械臂的规划控制库,Industrial是工业上会用的库。左边有三维仿真环境,另外两个其中值得一提的是MRPT,是一个非常好的机器人编程工具箱。然后,如果对实时控制要求比较高的话,可以考虑最下边的The Orocos Project。
ROS常用命令工具包括rostopic (Topics)、rosservice (Services)、rosnode (Nodes)、rosparam (Parameters)、rosmsg (Messages)、rossrv (Services)和roswtf (General debugging) ,在这里就不详细展开了。
ROS用的最多的可视化工具是rqt(集成图像交互界面)和 rviz(3D 可视化工具)。
ROS具有非常强的数据存储/回放功能,也就是使用bag存储topic(例如现实中的传感器数据),以后调用bag的topic数据则不必每次都在现实中运行机器人,速度非常快。
ROS log系统记录软件运行相关信息,便于以后的调试。
怎么学
首先,我们在学校学的是指导主义,也就是传统的教学方式:老师讲,学生听,今天我在这儿其实也属于这种模式吧,而这种模式的缺点在于开环或是闭环周期过长。另一种是建造主义,通过动手来学习,然后你可以得到实时反馈,你学到的知识就能形成一个闭环。当然,你还是要摸索出一个套路,这样上手才能比较快。
学习步骤
当然,比较好的套路还是官网的那一套。首先按照官网的步骤安装ROS,这个过程不要轻易问问题,因为教程里讲得已经很明白了,大神们对这些问题也会比较鄙视,通常会笑而不语。另外,建议初学者一定要认真学完整20个初级教程!然后就此打住!那些中级教程就不要再看了,浏览下都有啥即可,以后遇到类似问题再回来看即可,这个时候你的重点就应该回到机器人学及其实践上了,那20个初级教程都是可以在电脑上编程学习的,但不涉及机器人学。
接下来就应该运行真实的机器人、解决真实的问题。有的小伙伴就会问,没有真实的机器人怎么办?当然也有办法,你可以在仿真环境里边运行。
仿真环境由易到难主要有这三个:Turtlesim、ArbotiX、Gazebo。Turtlesim是一个QT开发的2D轨迹显示界面,只能显示运动轨迹;ArbotiX是含有一个差速驱动机器人的rviz模拟器,机器人运动及topic数据的3D显示,但不包含物理学引擎;Gazebo是功能齐全的3D物理模拟器,不过缺点是非常重,对内存和显卡要求高,慎入!
ROS版本那么多,该用哪一个?
很多小伙伴会问,ROS版本那么多,该用哪一个? 目前,ROS是一年推出一个版本。通过下载统计,我们发现现在使用最多的还是Indigo,所以对于初学者,建议还是使用这个版本,因为这是目前使用人数最多、坑最少的版本。而如果Linux编程能力比较强的,可以使用Kinetic,它可以一直支持到2021年。然后,你在选择Ubuntu版本时,要与ROS版本需匹配。
命令行不熟悉怎么办? 有IDE
现在已经有很多IDE了,值得一提的是这个RoboWare Studio是我们中国团队开发的一个开源IDE,目前刚刚推出64位版本。最近我也和RoboWare Studio的王博士交流了一下,他表示之后会推出32位版本,包括Arm集成开发环境的,而且承诺是免费的,以后也会在适当的时候开源。
不熟悉Linux怎么办?
其实学习ROS并不难,而很多小伙伴遇到的问题在于对于Linux不熟悉。这个只能边用边学了,遇到问题也要善用搜索,基本上这些问题都能在搜索中找到答案。教程推荐这两个版本,一个是英文版本,一个中文版本。书的话,推荐《鸟哥的Linux私房菜》吧!
ROS和ROS2.0该学习哪个呢?
对于大众学习者、普通开发者、机器人算法开发者,在2017年仍推荐使用ROS。对于软件架构的学习者、强调实时性的开发者,建议关注ROS2.0 。另外,我在知乎上对于这个问题也有详细的回答,有兴趣的可以去看看。
Q&A 环节
Q:请问除了ROS还有其他哪些常用的实时嵌入式操作系统?
A:关于机器人目前操作系统哪家强这个问题,目前已经形成了各个阵营,我们最近会组织一场辩论。主要是现在服务机器人用安卓的比较多。实时系统的话,我建议不要用ROS,因为ROS设计对象是家用移动智能机器人,当初的设计就不是针对实时控制的,不过ROS 2.0已经加入了实时性这个特性,大家可以关注一下。
Q:硬件方面有什么要求呢?
A:刚才讲了ROS它具备操作系统的特性,其中一个特性就是对于硬件的抽象,如果你用ROS的话,你不用过多关注底层硬件的东西,因为大家都是按照标准来做好封装,你直接调用就OK,你主要的精力还是放在机器人系统的设计和算法的开发上。
Q:您觉得ROS在目前火热的自动驾驶领域应用前景如何?
A:据我所知,自动驾驶领域一些大企业也是用ROS开发的,它的最终产品不一定是基于ROS,但是研发阶段我相信是会用到的,据所了解确实有一些是在用的。
Q:ROS未来能不能发展成完全替代Linux和Window?
A:ROS不会替代Linux和Window,它根本就是两回事儿。Linux和Window是一个基本的操作系统,ROS是完全针对机器人的上层架构,它可以依赖于Linux和Window,当然2.0开始,也开始独立地去工作。所以,你要搞清楚,哪些是ROS可以做,哪些是它不擅长的领域。
Q:像美国刚刚搞的蜂群无人机,在ROS上是否能实现?
A:目前用ROS开发不是很好实现,如果用ROS 2.0,应该是可以的。因为ROS它用在分布式系统上,一个比较大的问题是需要一个Master,分布式系统是不需要Master的,所以如果你非要用ROS的话,就有点别扭。而ROS 2.0是没有中心节点的,是没有Master的,完全分布式架构,那应该适用于多机器人的应用场景。