ROS官方或者其他个人提供了很多package供大家使用,但是随着学习的深入,很多人可能想去修改这些package的源代码,ROS提供了一种称之为overlaying的机制。它允许ROS原有安装的package和你修改的package共存,譬如安装ROS的时候已经安装了用于二维SLAM的gmapping包,但是你要修改源代码,而又想保存好ROS原已安装的,ROS运行的时候还要能够找到你修改的那个package,而不是使用原装的,这时候overlaying机制就派上用场了。

该博客分为两部分:

(1) 用ros_tutorials package作为例子讲解overlaying机制的使用

(2) 如何overlaying gmapping包

这篇博客中我们将覆盖ros官方的ros_tutorials 包,如果你没用安装过这个包,请先进行如下准备工作:

1.安装ros_tutorials

  • $ sudo apt-get install ros-groovy-ros-tutorials

这个包中包含了ROS的一些教程,如用于仿真的渔龟turtlesim等。接下来我们看看这个包安装到了哪里?在终端中输入:

  • $ roscd rospy_tutorials
    $ pwd
/opt/ros/hydro/share/rospy_tutorials

可以看到这个package和大多数ROS原装的package一样,放在了ROS安装时的文件夹里。

我们自己如果想要改动这个代码该如何做呢?

ROS的overlaying机制华丽登场

在学习此篇博客的时候,博主猜想读者您应该熟练使用ROS做了一些工作了,这时候的你已经有了一个catkin工作空间(如LZ的 catkin_ws),在这个工作空间中(catkin_ws/src)已经有了很多你自己或者其他网友提供的package(如usb_cam,beginner_tutorials)。为了overlaying 工作的进行,博主强烈建议另外再新建一个catkin空间,专门用来做覆盖原始package的工作

  • $ mkdir -p ~/overlay_ws
    $ cd ~/overlay_ws

创建好以后(其实就只是建了个新文件夹),再新建/src文件夹,并使用wstool

  • $ mkdir -p ~/overlay_ws/src
    $ cd ~/overlay_ws/src
    $ wstool init

接下来,就是将ros_tutorials package复制到这个新的工作空间中(overlay_ws/src):

  • $ git clone git://github.com/ros/ros_tutorials.git
    $ wstool update

如图所示:

复制进来之后,按找以前学习的步奏应该就是使用catkin_make编译这个文件了。但是这里是要overlay,也就是覆盖原来的package,好让ROS运行的时候能够找到我们自己修改了的这个package。在做准备工作的时候,我们已经知道ros_tutorials 安装在ROS安装文件夹(/opt/ros/hydro)下。所以我们要先source一下这个环境,说明我们要覆盖的ros_tutorials在那个环境中:

  • $ source /opt/ros/hydro/setup.bash

注意:这一步其实没必要做,因为安装ROS的时候,我们已经把这句话写到了/.bashrc文件中,每次启动终端时会自动调用这句命令。不信的话,你可以使用gedit ~/.bashrc命令来打开在这个文件,看它的最后一行。但是,这里强调这一步是为了告诉你,有时候你要覆盖的package可能是在你自己的另一个catkin工作空间中(如catkin_ws),如你的工作空间catkin_ws中有一个自己的机器人驱动包robot_dirver,然后你也想在overlay_ws空间中覆盖他,进行一些修改再进行试验,那你就要使用如下的source来说明一下原有的package所在的环境了,更详细的请参考ROS官方wiki里的第四部分chaining catkin worksapces:

$ source ~/caktin_ws/devel/setup.bash

声明完你要覆盖的package所处的环境以后,就可以编译了

  • $ cd ~/overlay_ws/
    $ catkin_make

到此,所有的工作已经完成,接下来调用ros_tutorials这个包试试,

在使用这前,别忘了source overlay_ws这个工作空间:

  • $ source ~/overlay_ws/devel/setup.bash

接下来看看调用ros_tutorials包,ROS会调用哪个?

  • $ roscd rospy_tutorials
    $ pwd
~/overlay_ws/src/ros_tutorials/rospy_tutorials

这个时候结果很明显,但是ROS原装的那个/opt/ros/hydro里的那个ros_tutorials也还存在,如果你不想调用自己修改了的,而去用原装的package那怎么做?

很简单,只要不使用source overlay_ws,而是使用source /opt/ros...就行,总结起来如下:

$ source /opt/ros/hydf/setup.bash
$ roscd rospy_tutorials
$ pwd
/opt/ros/hydro/share/rospy_tutorials

$ source ~/overlay_ws/devel/setup.bash
$ roscd rospy_tutorials
$ pwd
/home/<user>/overlay_ws/src/ros_tutorials/rospy_tutorials
       以上博文记录了如何覆盖简单的package,内容绝大部分都来自ROS官方wiki,LZ只是加入了一些简单的理解。
那如何覆盖gmapping?

其实覆盖gmapping包步奏和上面的没有区别,这里主要是理清gmapping包中迷惑大家的地方。如果你去gmapping的ROS wiki官方页面,你会发现有两个包gmapping和openslam_gmapping,如下图所示:

这很容易让初学者迷惑,为啥有两个?

这是由于gmapping算法实现的正宗源代码是来自开源项目openslam,ROS的开发者提供了gmapping包和openslam_gmapping包,他们作用各不相同。其中openslam_gmapping是gmapping创始者Grisetti开发的对外开放的gmapping库,里面有各种函数和接口供使用者调用。而ROS中的gmapping包是ROS开发者调用openslam_gmapping 中的函数而完成gmapping的所有功能(包括读取数据(scan,odom),处理数据(粒子滤波,scan match 等),发布数据(map,tf关系等) ),openslam_gmapping包可以理解为opencv,gmapping包可以理解为用opencv中函数实现的一个机器视觉工程。

因此要修改真正的gmapping算法,应该去修改openslam_gmapping中的东西。当然也许你也只是想改改gmapping包而不去修改SLAM原算法,譬如将gmapping得到的最优粒子的轨迹记录到txt中等。所以在overlay gmapping时,同时把两个包都覆盖:

openslam_gmapping包的地址:https://github.com/rosperception/openslam_gmapping

gmapping包的地址: https://github.com/ros-perception/slam_gmapping

打开一个新的终端,输入如下命令:

$ cd ~/overlay_ws/src
$ git clone https://github.com/rosperception/openslam_gmapping.git
$ git clone https://github.com/ros-perception/slam_gmapping.git
$ wstool update
$ source /opt/ros/hydro/setup.bash
$ cd ~/overlay_ws
$ catkin_make

编译完以后,没有错误,就可以按自己需要对gmapping代码进行修改了,只是每次要是想调用自己修改的gmapping代码,要记得source一下overlay_ws工作环境,然后再调用就行了。

(转载请注明作者和出处:http://blog.csdn.net/heyijia0327 未经允许请勿用于商业用途)

reference:

1. http://wiki.ros.org/catkin/Tutorials/workspace_overlaying

2. http://answers.ros.org/question/120771/gmapping-pacakage-overlaying-with-catkin-workspaces/

3. http://answers.ros.org/question/123756/how-to-modify-the-slam_gmapping-node-on-a-turtlebot/

ROS : 修改ROS源代码(overlaying package)相关推荐

  1. ROS修改pkg名和node名教程

    修改pkg名   有的时候最开始起了一个功能包package名,但后来要进行修改.修改package名,需要改两步然后重新catkin_make即可 操作如下:   再回到工作空间执行catkin_m ...

  2. 教你如何修改ROS机器人工作空间文件夹名字

    如何修改ROS机器人工作空间文件夹名字 1:直接选择你想修改的工作空间的文件夹,重命名修改你想要的名字. 我这里就去掉下划线! 2: 使用VS打开这个工作空间,进行编译! 有错误: 错误原因:当然工作 ...

  3. UBUNTU ROS 编译后无法rosrun package文件(已解决)

    UBUNTU ROS 编译后无法rosrun package文件(已解决) 很多原因是tab不到那个package,所以要在bashrc文件中输入文件路径 解决方法 ,打开终端 输入: gedit . ...

  4. 【ROS】ROS常用命令

    [ROS]ROS常用命令 一.前言 二.常用命令 2.1 ROS shell 命令 2.2 ROS执行命令 2.2.1 `roscore` [选项] 2.2.2 rosrun:运行ROS节点 2.2. ...

  5. 【ros】ROS架构

    立足不同的角度,对ROS架构的描述也是不同的,一般我们可以从设计者.维护者.系统结构与自身结构4个角度来描述ROS结构: 1.设计者 ROS设计者将ROS表述为"ROS = Plumbing ...

  6. ROS基本概念 文件系统 创建ROS软件包 ROS中的一些命令

    ROS基本概念 文件系统 创建ROS软件包 ROS中的一些命令 ROS是什么 ROS文件系统 文件系统工具:rospack.roscd.rosls 创建ROS 软件包 catkin是什么 创建和构建一 ...

  7. ROS:ROS是什么

    目录 一.ROS简介 二.ROS可以做些什么 三.ROS特征 四.ROS特点 4.1点对点设计 4.2不依赖编程语言 4.3精简与集成 4.4便于测试 4.5开源 4.6强大的库与社区 五.ROS的发 ...

  8. ROS入门-5.认识ROS及ROS的基本概念

    一.认识ROS 二.ROS的基本概念 通信机制 node,每个节点,每个节点是在整个机器人系统当中完成一个具体功能的这样一个进程:每个node使用语言也可能不一样,比如一个c++,一个python,这 ...

  9. 【ROS】ros入门21讲(下)

    前言:上文讲了话题的通信机制,接下来是ROS的第二种重要通信机制-服务. [ROS]ros学习21讲(上) 客户端请求,相当于开关,一次开,再一次关,控制运动的状态.服务端应答. 目录 ROS 七:客 ...

最新文章

  1. 中国各地高考难度地图:上大学最难的省份是哪里!?
  2. ​模型优化漫谈:BERT的初始标准差为什么是0.02?
  3. java http请求原理_浅谈Spring Cloud zuul http请求转发原理
  4. 关于CSDN官方对博文点赞漏洞的处理(Cookie劫持攻击)
  5. java返回泛型_Java泛型从泛型方法返回持有者对象
  6. Python学习指南高清PDF版,速存!24小时后删除
  7. linux下内存的统计和内存泄露问题的定位-转
  8. jsf如何与数据库连接_JSF身份验证登录注销数据库示例
  9. php怎么重命名文件,phpstorm如何进行文件或者文件夹重命名
  10. Matlab 三角函数输入
  11. 如何用AutoRunner录制IE脚本录制
  12. iOS ipa包解析
  13. weka,FP,priori
  14. AOD452场效应管MOS管
  15. isp,iap,sw-jtag
  16. Echarts CPU监控 (折线仪表盘,图例混搭)
  17. wcs系统安全保护功能
  18. 除了打通各类知识平台的激励系统,他们还想做国际领先的区块链技术社区
  19. 前员工爆料百度百伯夭折内幕:烧钱3亿只会挖人复制
  20. 找不到JVM是什么原因

热门文章

  1. python解决urllib发送请求报错:urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED].....>
  2. python二维平面上依次得到(0,0)距离相等的点(x,y)坐标,并打印距离
  3. pythonapi异步_Python-FastAPI异步博客开发记录--异步篇
  4. 2018.12.11——全局变量与局部变量
  5. java和js实现电话号码部分隐藏
  6. 根据word模版导入word中用户填写的数据
  7. 洛谷P1080 国王游戏
  8. 解决QQ未启用状态,QQ留言图标未启用
  9. 部署LNMP架构及其应用
  10. .net中的压力测试