~欢迎关注~
微信公众号:古月居(guyue_home)
新浪微博:古月春旭
知乎专栏:古月居
原文链接:知乎 | 如何学习ROS?

 

简而言之,学习ROS的关键是——多实践!

ROS是一个机器人研发中的重要工具,“学以致用”才是我们学习的最终目的:给学习赋能的就是实践!而实践就是不断进行知行合一的各种尝试!

现在关于ROS的资料已经非常多了,无论是图书、视频还是博客,都可以找到很多学习的资源,但是ROS的学习曲线还是有点陡峭,很多初学者还没来得及在ROS的世界走一走,就半路放弃回了头。

v2-9c2ef7f35eeff84c8f349a816791c30c_b

那么ROS该如何学习?如何实践?古月君尝试给各位提供一些参考思路。

一、 基础教程不可少

1.背景知识

ROS需要基于Ubuntu使用,涉及的编程语言主要是C++和Python,另外还需要对所研究的机器人理论有一定了解。

这些是对初学者背景知识的要求,但千万不要抱出一本《C++ primer》开始研读,这些知识都需要在实践中打磨,所以建议在网上找一些速成教程,花几天时间大概了解知识框架和重点即可。

2.ROS安装

ROS安装当然是开始动手的第一步,在Ubuntu官网下载镜像,根据百度指引完成系统的安装。

Get Ubuntu | Download | Ubuntu

接下来就是ROS的安装了,按照ROSwiki上的安装教程,完成桌面完整版的安装。

kinetic/Installation/Ubuntu - ROS Wiki

v2-eac9784039d3297b1dbd41c3a2df95ad_b

安装完毕之后运行一下“roscore”,如果没有问题,恭喜你,安装成功!

3.wiki基础教程

v2-2aa2bed4ba597ea5cae1e6f248541103_b

ROS wiki是ROS资源最丰富的地方,20新手教程非常详细,对代码都有解释,花一天时间把这些教程好好学习下。

ROS/Tutorials - ROS Wiki

结束新手教程后,相信你的小海龟例程也已经可以跑起来了,虽然你不一定明白为什么要有这只海龟的存在。

其实,小海龟背后几乎包含了所有ROS核心通信相关的原理,可以多花两天时间,配合《A Gentle Introduction to ROS》这本书,加深对这只小海龟的理解,熟悉ROS基础工具的使用,比如你可能会用到:rqt_graph、rostopic、rosservice、rosnode等。

4. 编程学习

ROS使用的编程语言主要是C++和python,所以也有针对这两种语言的功能支持包roscpp和rospy,看完上面的教程也可以看看这两种语言的基础教程。

rospy_tutorials - ROS Wiki

roscpp/Tutorials - ROS Wiki

努力学习完上面的这些内容,你至少应该明白ROS里面的节点和消息是干什么用的了吧,如果还没理解,那就再结合小海龟多试几次吧!

二、常用功能包知多少

ROS不仅为机器人开发提供了分布式通信框架,而且还提供了大量实用的组件工具,了解这些工具是后续使用它们的基础,这里列出部分常用的组件工具:

1. launch启动文件

到目前为止,每当运行一个ROS节点或工具时,都需要打开一个新的终端运行一个命令。当系统中的节点数量不断增加时,每个节点一个终端的模式会变得非常麻烦。

v2-2a177128b6daa145402986bb0008e49b_b

启动文件(Launch File)是ROS中一种同时启动多个节点的途径,还可以自动启动ROS Master节点管理器,而且可以实现每个节点的各种配置,为多个节点的操作提供了很大便利。

roslaunch/XML - ROS Wiki

ROS技术点滴 —— launch文件

2、tf

坐标变换是机器人系统中常用的基础功能,ROS中的坐标变换系统由TF功能包维护。

v2-031d6601936ce5172e5b3723399aca36_b

TF是一个让用户随时间跟踪多个坐标系的功能包,它使用树型数据结构,根据时间缓冲并维护多个坐标系之间的坐标变换关系,可以帮助开发者在任意时间,在坐标系间完成点、向量等坐标的变换。

tf - ROS Wiki

ROS探索总结(十八)--重读tf - 古月居

ROS探索总结(二十二)--设置机器人的tf变换 - 古月居

3.rviz

v2-8f06542cede71ee77a281972092fffa7_b

rviz是ROS中一款强大的3D可视化工具,在后面可是要频繁用到的。

rviz - ROS Wiki

ROS技术点滴 —— Rviz三维可视化平台

我们可以在里面创建自己的机器人,并且看到机器人动起来,还可以创建地图,显示3D点云等等,总之,想在ROS中显示的东东都可以在这里显示出来。

当然这些显示都是通过消息的订阅来完成的,机器人通过ROS发布数据,rviz订阅消息接收数据,然后显示,这些数据也是有一定的数据格式。

rviz/DisplayTypes - ROS Wiki

4.urdf

v2-bfcffe4f1ec4a797aaa170ab3e84cff4_b

上面的机器人模型是不是很酷,在rviz中,这样的机器人模型是通过urdf文件描述的。

URDF(Unified Robot Description Format,统一机器人描述格式)是ROS中一个非常重要的机器人模型描述格式,后续的开发中也将频繁用到。

urdf - ROS Wiki

ROS探索总结(二十三)--解读URDF - 古月居

5.gazebo

v2-19d4e15b665ad7201d1d5e6177238c3c_b

gazebo是一款功能强大的三维物理仿真平台,其中的机器人模型与rviz使用的模型相同,但是需要在模型中加入机器人和周围环境的物理属性,例如质量、摩擦系数、弹性系数等。机器人的传感器信息也可以通过插件的形式加入仿真环境,以可视化的方式进行显示。

simulator_gazebo/Tutorials - ROS Wiki

ROS技术点滴 —— Gazebo物理仿真平台

ROS技术点滴 —— gazebo中的常用插件

更多功能和工具还需要我们在不断的学习过程中熟悉,比如action、plugin、smach等等。

三、仿真操作很重要

以上都是ROS的基本功能和使用方法,了解之后的关键还是要进入实践阶段,综合应用以上功能,完成机器人的开发。

这一步我们可以不用真实机器人,从以上提到的ROS教程中选一本,包括配套的源代码,按照书上的操作,一步一步实现,其中必然会遇到很多问题,灵活应用google是正道。

实现之后当然不是结束,挑选自己感兴趣或者需要研究的章节,一定要把这些源码的实现原理搞明白,仔细研究每一个节点、launch、config文件是如何实现并完成配置的,最好自己动手调试一下,熟悉之前提到的各种工具的使用方法。

除了书本上的内容,这里也给大家推荐几款常用的机器人,都配有仿真环境和使用说明,挑选一款搞明白即可,其他都是大同小异。

1.turtlebot

v2-1c99b6fc364ca7b81e814ab102db499b_b

TurtleBot可以说是ROS中最为重要的机器人之一,它伴随ROS一同成长,一直都作为ROS开发前沿的机器人,几乎每个版本的ROS测试都会以TurtleBot为主,包括ROS2也率先在TurtleBot上进行了大量测试。

所以TurtleBot是ROS支持度最好的机器人之一,可以在ROS社区中获得大量关于TurtleBot的相关资源,很多功能包都能直接复用到我们自己的移动机器人平台上,绝对是使用ROS开发移动机器人的重要资源。

Robots/TurtleBot - ROS Wiki

ROS机器人实例 —— TurtleBot

2.Husky

v2-0320ccd7c24b765986c2fe9f79fc22b4_b

这款机器人是室外轮式移动机器人,同样有丰富的学习资料:

Robots/Husky - ROS Wiki

3.Universal Robots

v2-a8440bb769588600e4fb337d1a2c4834_b

Universal Robots(优傲机器人)是一家引领协作机器人全新细分市场的先驱企业,近几年在机械臂领域用的非常多,对于ROS的支持也比较友好。

universal_robot - ROS Wiki

ROS机器人实例 —— Universal Robots

4.PR2

v2-2785972e8870eb9fad00cb005523531b_b

PR2是ROS中元老级的机器人平台,所有软件代码依托于ROS,并且全部在ROS社区中开放源代码,为我们学习、应用ROS提供了丰富的资源。

Robots/PR2 - ROS Wiki

ROS机器人实例 —— PR2

四、真实机器人跑起来

相信你已经迫不及待的想找一台真实机器人练练手啦,如果你所在的实验室或者公司有相关的机器人给你玩,千万不要放过这个机会,SLAM、navigation、Image、MoveIt全都跑起来!!!

这里先用ROS已有的功能包把需要的功能实现了,然后肯定会发现结果不令人满意,此时再来分析是哪个部分的原因,可以进入下边的第五个步骤。

如果周围没有这样的环境,也不要灰心,仿真环境可以满足你绝大部分的需求,如果实在手痒痒,那还是败个家吧,淘宝上的ROS机器人很丰富,选择一款适合自己的,为了梦想还是值得的。比如下图就是古月君自己买来搭建的移动机器人,总花费不超过2000大洋。

v2-68ef78ea39bc18078b494d2528d2afc0_b

还有很多心灵手巧的小伙伴,可以自己买各种原材料攒一台机器人出来,这个挑战更大,需要自己实现很多嵌入式底层方面的驱动和控制功能,ROS在这部分没有太多指导,需要大家参考一些嵌入式开发和电机控制相关的资料。

ROS机器人实例 —— HRMRP

五、回归初心是正道

经过九九八十一难来到这里,说明你已经“衣带渐宽终不悔,为伊消得人憔悴”啦!

相信你一定和我一样,遇到并解决过类似下边的问题:

1. 一个launch文件敲下去,终端里各种红色的错误飞出来,无数包和节点找不到

2. 机器人还没跑起来,tf相关的错误已经搞的晕头转向

3. slam过程中机器人飘的厉害,地图和真实环境相去甚远

4. 导航的时候满地打转,机器人已经不知道何去何从

5. 机械臂运动规划略显随意,同样的路径点每次走出的轨迹却不一致

......

这些问题大部分原因是和ROS配置相关的。

回想一下我们最开始为什么要学习ROS,是为了研究slam、研究导航、研究运动规划、研究人工智能等,但是我们好像花了很多时间在配置环境、写launch、改yaml参数,和开始的目标有点偏离了,自己的研究并没有多大进展。

所以到这里,是时候好好想想自己的初心了,ROS你已经比较熟悉,千万不要满足于用ROS已有的功能包调试出一个八九不离十的效果就可以了。

ROS是一个工具,可以帮助我们快速搭建起机器人应用的原型,接下来我们的重点应该集中在你自己的研究上,做slam的就来实现自己的算法和gmapping对比,做navigation的就来优化move_base的导航效果,做运动规划的就用自己的规划算法替换ompl。

在这个过程中,下边这些书应该是我们参考的重点(优先选择英文原版):

v2-26356994916a468ba0b88a0845311c17_b

正确认识和使用ROS,或许是我们在学习路上要不断精进的一项内功。它已经成为很多机器人开发者的一种生活方式,每当遇到机器人问题,都会想到用google搜索关键词“ROS + 问题”,找到资源后就是试用、学习、消化、重造。但ROS并不完美,问题还非常多,也不代表机器人开发的全部。

v2-f9d87bda7ca6da906cc09eebfa291c99_b

好啦,洋洋洒洒说了这么多,如果你还不明白怎样学习ROS,那我也只能把看家的秘诀告诉你了!

 

v2-b5bc6fc3b324a894009bc8d90b9a4513_b

《ROS机器人开发实践》+ 关注“古月居”,就O啦!

 

更多内容欢迎关注:

微信公众号:古月居 (guyue_home)

新浪微博:古月春旭

知乎专栏:古月居