~欢迎关注~
微信公众号:古月居(guyue_home)
新浪微博:古月春旭
知乎专栏:古月居
原文链接:知乎 | 如何学习ROS?
简而言之,学习ROS的关键是——多实践!
ROS是一个机器人研发中的重要工具,“学以致用”才是我们学习的最终目的:给学习赋能的就是实践!而实践就是不断进行知行合一的各种尝试!
现在关于ROS的资料已经非常多了,无论是图书、视频还是博客,都可以找到很多学习的资源,但是ROS的学习曲线还是有点陡峭,很多初学者还没来得及在ROS的世界走一走,就半路放弃回了头。
那么ROS该如何学习?如何实践?古月君尝试给各位提供一些参考思路。
一、 基础教程不可少
1.背景知识
ROS需要基于Ubuntu使用,涉及的编程语言主要是C++和Python,另外还需要对所研究的机器人理论有一定了解。
这些是对初学者背景知识的要求,但千万不要抱出一本《C++ primer》开始研读,这些知识都需要在实践中打磨,所以建议在网上找一些速成教程,花几天时间大概了解知识框架和重点即可。
2.ROS安装
ROS安装当然是开始动手的第一步,在Ubuntu官网下载镜像,根据百度指引完成系统的安装。
接下来就是ROS的安装了,按照ROSwiki上的安装教程,完成桌面完整版的安装。
安装完毕之后运行一下“roscore”,如果没有问题,恭喜你,安装成功!
3.wiki基础教程
ROS wiki是ROS资源最丰富的地方,20新手教程非常详细,对代码都有解释,花一天时间把这些教程好好学习下。
结束新手教程后,相信你的小海龟例程也已经可以跑起来了,虽然你不一定明白为什么要有这只海龟的存在。
其实,小海龟背后几乎包含了所有ROS核心通信相关的原理,可以多花两天时间,配合《A Gentle Introduction to ROS》这本书,加深对这只小海龟的理解,熟悉ROS基础工具的使用,比如你可能会用到:rqt_graph、rostopic、rosservice、rosnode等。
4. 编程学习
ROS使用的编程语言主要是C++和python,所以也有针对这两种语言的功能支持包roscpp和rospy,看完上面的教程也可以看看这两种语言的基础教程。
努力学习完上面的这些内容,你至少应该明白ROS里面的节点和消息是干什么用的了吧,如果还没理解,那就再结合小海龟多试几次吧!
二、常用功能包知多少
ROS不仅为机器人开发提供了分布式通信框架,而且还提供了大量实用的组件工具,了解这些工具是后续使用它们的基础,这里列出部分常用的组件工具:
1. launch启动文件
到目前为止,每当运行一个ROS节点或工具时,都需要打开一个新的终端运行一个命令。当系统中的节点数量不断增加时,每个节点一个终端的模式会变得非常麻烦。
启动文件(Launch File)是ROS中一种同时启动多个节点的途径,还可以自动启动ROS Master节点管理器,而且可以实现每个节点的各种配置,为多个节点的操作提供了很大便利。
2、tf
坐标变换是机器人系统中常用的基础功能,ROS中的坐标变换系统由TF功能包维护。
TF是一个让用户随时间跟踪多个坐标系的功能包,它使用树型数据结构,根据时间缓冲并维护多个坐标系之间的坐标变换关系,可以帮助开发者在任意时间,在坐标系间完成点、向量等坐标的变换。
3.rviz
rviz是ROS中一款强大的3D可视化工具,在后面可是要频繁用到的。
我们可以在里面创建自己的机器人,并且看到机器人动起来,还可以创建地图,显示3D点云等等,总之,想在ROS中显示的东东都可以在这里显示出来。
当然这些显示都是通过消息的订阅来完成的,机器人通过ROS发布数据,rviz订阅消息接收数据,然后显示,这些数据也是有一定的数据格式。
4.urdf
上面的机器人模型是不是很酷,在rviz中,这样的机器人模型是通过urdf文件描述的。
URDF(Unified Robot Description Format,统一机器人描述格式)是ROS中一个非常重要的机器人模型描述格式,后续的开发中也将频繁用到。
5.gazebo
gazebo是一款功能强大的三维物理仿真平台,其中的机器人模型与rviz使用的模型相同,但是需要在模型中加入机器人和周围环境的物理属性,例如质量、摩擦系数、弹性系数等。机器人的传感器信息也可以通过插件的形式加入仿真环境,以可视化的方式进行显示。
更多功能和工具还需要我们在不断的学习过程中熟悉,比如action、plugin、smach等等。
三、仿真操作很重要
以上都是ROS的基本功能和使用方法,了解之后的关键还是要进入实践阶段,综合应用以上功能,完成机器人的开发。
这一步我们可以不用真实机器人,从以上提到的ROS教程中选一本,包括配套的源代码,按照书上的操作,一步一步实现,其中必然会遇到很多问题,灵活应用google是正道。
实现之后当然不是结束,挑选自己感兴趣或者需要研究的章节,一定要把这些源码的实现原理搞明白,仔细研究每一个节点、launch、config文件是如何实现并完成配置的,最好自己动手调试一下,熟悉之前提到的各种工具的使用方法。
除了书本上的内容,这里也给大家推荐几款常用的机器人,都配有仿真环境和使用说明,挑选一款搞明白即可,其他都是大同小异。
1.turtlebot
TurtleBot可以说是ROS中最为重要的机器人之一,它伴随ROS一同成长,一直都作为ROS开发前沿的机器人,几乎每个版本的ROS测试都会以TurtleBot为主,包括ROS2也率先在TurtleBot上进行了大量测试。
所以TurtleBot是ROS支持度最好的机器人之一,可以在ROS社区中获得大量关于TurtleBot的相关资源,很多功能包都能直接复用到我们自己的移动机器人平台上,绝对是使用ROS开发移动机器人的重要资源。
2.Husky
这款机器人是室外轮式移动机器人,同样有丰富的学习资料:
3.Universal Robots
Universal Robots(优傲机器人)是一家引领协作机器人全新细分市场的先驱企业,近几年在机械臂领域用的非常多,对于ROS的支持也比较友好。
4.PR2
PR2是ROS中元老级的机器人平台,所有软件代码依托于ROS,并且全部在ROS社区中开放源代码,为我们学习、应用ROS提供了丰富的资源。
四、真实机器人跑起来
相信你已经迫不及待的想找一台真实机器人练练手啦,如果你所在的实验室或者公司有相关的机器人给你玩,千万不要放过这个机会,SLAM、navigation、Image、MoveIt全都跑起来!!!
这里先用ROS已有的功能包把需要的功能实现了,然后肯定会发现结果不令人满意,此时再来分析是哪个部分的原因,可以进入下边的第五个步骤。
如果周围没有这样的环境,也不要灰心,仿真环境可以满足你绝大部分的需求,如果实在手痒痒,那还是败个家吧,淘宝上的ROS机器人很丰富,选择一款适合自己的,为了梦想还是值得的。比如下图就是古月君自己买来搭建的移动机器人,总花费不超过2000大洋。
还有很多心灵手巧的小伙伴,可以自己买各种原材料攒一台机器人出来,这个挑战更大,需要自己实现很多嵌入式底层方面的驱动和控制功能,ROS在这部分没有太多指导,需要大家参考一些嵌入式开发和电机控制相关的资料。
五、回归初心是正道
经过九九八十一难来到这里,说明你已经“衣带渐宽终不悔,为伊消得人憔悴”啦!
相信你一定和我一样,遇到并解决过类似下边的问题:
1. 一个launch文件敲下去,终端里各种红色的错误飞出来,无数包和节点找不到
2. 机器人还没跑起来,tf相关的错误已经搞的晕头转向
3. slam过程中机器人飘的厉害,地图和真实环境相去甚远
4. 导航的时候满地打转,机器人已经不知道何去何从
5. 机械臂运动规划略显随意,同样的路径点每次走出的轨迹却不一致
……
这些问题大部分原因是和ROS配置相关的。
回想一下我们最开始为什么要学习ROS,是为了研究slam、研究导航、研究运动规划、研究人工智能等,但是我们好像花了很多时间在配置环境、写launch、改yaml参数,和开始的目标有点偏离了,自己的研究并没有多大进展。
所以到这里,是时候好好想想自己的初心了,ROS你已经比较熟悉,千万不要满足于用ROS已有的功能包调试出一个八九不离十的效果就可以了。
ROS是一个工具,可以帮助我们快速搭建起机器人应用的原型,接下来我们的重点应该集中在你自己的研究上,做slam的就来实现自己的算法和gmapping对比,做navigation的就来优化move_base的导航效果,做运动规划的就用自己的规划算法替换ompl。
在这个过程中,下边这些书应该是我们参考的重点(优先选择英文原版):
正确认识和使用ROS,或许是我们在学习路上要不断精进的一项内功。它已经成为很多机器人开发者的一种生活方式,每当遇到机器人问题,都会想到用google搜索关键词“ROS + 问题”,找到资源后就是试用、学习、消化、重造。但ROS并不完美,问题还非常多,也不代表机器人开发的全部。
好啦,洋洋洒洒说了这么多,如果你还不明白怎样学习ROS,那我也只能把看家的秘诀告诉你了!
《ROS机器人开发实践》+ 关注“古月居”,就O啦!
更多内容欢迎关注:
微信公众号:古月居 (guyue_home)
新浪微博:古月春旭
知乎专栏:古月居