最近没啥可写博客了的,而且自己的毕业设计刚好是ROS的SLAM+MoveIt相关的,怕写的太多论文查重没法通过。

最近有小伙伴联系到我,问了我八个ROS问题,我觉得很有意义,所以在这里给大家整理一下供大家一起学习。

大家在学习有困惑可以发送问题给我(1692697820@qq.com),我会找时间整理并回复大家。也欢迎大家在“泡泡”里面进行提问~

这里我们来讲解第五个问题,如何将别人提供的功能包化为己用?如何成为一个合格的调包侠?需要哪些基础?


这个问题,首先你要理解一个功能包的组成。

一个完整的功能包应该具备以上的组成,但是在实际应用的情况下,我们就按照自己的需要来进行添加。功能我觉得可以分为两部分,第一种是ROS官方的功能包,我们可以在Wiki、社区等找到相关的资料、教程及使用;第二种则是我们自己开发设计的功能包,我们可以分享出去给他人使用,可能会有README说明文档,但是绝大多数情况下是没有。

不管是官方的功能包还是非官方的功能包,我们都要学着去分析这个功能包。下面是我的一些经验分享。

如果你拿到的功能包是一个有着优秀开发规范的作者写的,那么你可以根据功能包的名字大概就可以知道这个功能包可以做什么(写代码不讲武德的人很多)。可能是一段文字描述,或者你根据名字的意思去进行猜测,一定要大胆的去猜,错了也没关系!

在拿到功能包之后,你要做的第一件事情是去阅读CMakeList.txt和package.xml两个文件,它们可以提供很多有效的信息,运气好的情况下,你可以通过package.xml文件加上作者的QQ或者微信。package.xml文件是一个“功能包清单描述“文件,我们可以在这里知道功能的编译工具是什么、编译依赖有哪些、编译输出依赖有哪些、运行依赖有哪些;CMakeList.txt是一个编译配置文件,我们可以知道这个功能包自定义的话题msg、服务srv、动作action和配置cfg,看看是否有自定义的编译库输出,如果这个功能包有用C++写的代码,我们可以分析这部分是怎么样的一个编译链接关系,再往下我们可以分析出来有没有安装项、测试项、文档说明项等等信息,这部分的信息可以让你明白当前功能包是怎么构建的。可能你不熟悉package.xml和CMakeList.txt文件,我这里有一篇博客,希望能为你提供帮助。关于package.xml和CMakeList.txt的解读

然后就是我们去看看src和scripts两个文件夹里面的代码,ROS-I的src文件夹下存放的是C++代码,scripts文件夹下存放的是Python代码。msg文件夹、srv文件夹和action文件夹我们简单看下就好,其实里面没有多少东西。mesh文件夹和urdf文件夹的话在一些仿真功能包里面经常会有,尝试着自己去阅读下urdf文件和xacro文件,特别是由Gazebo控制器插件的这部分,阅读这部分你可以得知 在仿真下的一部分话题、坐标等信息。include文件夹我用的也不多,我写的ROS代码还是以Python居多,C++写的就算涉及.h文件的部分,我也基本放在相同路径下(就是src,和.cpp在一块)。launch文件是一个好东西,我们经常从launch文件启动这个功能包实现功能,launch文件阅读也很重要,这里我也总结了一下launch文件常用的一部分。

大家可以自行来验证下,一定要大胆的猜!不要怕猜错。

config文件夹是个很神奇的东西,放的内容特别杂,可能是你的参数配置文件、也可能是你的RVIZ启动配置文件、更有可能是.cfg配置文件,总之它可能会涵盖param、rviz、cfg等等多个内容,这个得看开发者的开发习惯。

我们在分析了功能包组成之后,紧跟着就要根据自己的猜想来尝试启动,在这个过程当中很可能会出现环境依赖缺失、环境依赖错误、环境依赖不匹配的状况,这就到了考验你Linux系统功底的时候,平常多写Bug、多帮解决Bug的优势就会体现出来,很高效。

启动之后我们可以rosnode、rostopic、rosserver、rosparam等等根据情况执行list、info、echo等等操作,看看都是有什么牛鬼蛇神组成的。这里要结合自己的猜想来进行验证,看看自己的猜想是否正确。如果可以,尝试”杀掉“一部分节点、话题、服务等等,改成手动的方式来进一步进行验证。

rqt_graph和rqt_node是很好的工具,在这里我们可以很清晰分析出”数据是怎么走的“。如果是模型功能包的话,roswtf和rqt_tf_tree可以帮助你快速的分析tf关系。如果你能完成到这一步,这个功能包差不多你研究的很透彻了已经。这个过程最艰辛的一步,我觉得是要去阅读src文件夹和scripts文件夹下的内容,很多时候只能靠猜测去分析、去理解。

使用ROS进行开发 = 调用/修改现有的功能包 + 自己开发的功能包

我们,要去支配工具,而不是去适应工具!你的思想、你的逻辑、你的理解才是核心。Ctrl C + Ctrl V没有什么被看不起的。

随着时间的迁移,你会慢慢发现你写的代码永远比不上开源的大牛们!所以放弃抵抗、拥抱开源吧!