ROS : 修改ROS源代码(overlaying package)

2023-05-16

       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/



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS : 修改ROS源代码(overlaying package) 的相关文章

  • R 并行中的错误:checkForRemoteErrors(val) 中的错误:2 个节点产生错误;第一个错误:无法打开连接

    我写了一个函数来并行运行R 但它似乎不起作用 代码是 rm list ls square lt function x library Iso y ufit x lmode lt 2 x lt c 1 length x type b 2 re
  • 使用 install.packages 安装软件包时 RStudio 崩溃

    我正在尝试在 RStudio 中安装软件包 但无法做到这一点 安装软件包失败 但出现错误或警告 我之前在安装 texlive full 时遇到了问题 并且可能对我的 etc apt sources list d 文件做了一些尴尬的事情 我遇
  • 意图启动新活动非常慢:(

    我有一段 Intent 代码 Intent i new Intent i setAction Intent ACTION MAIN i addCategory Intent CATEGORY LAUNCHER i setFlags Inte
  • LOCAL_MODULE_TAGS有什么用?

    我想更新包中的 Android mk 文件以构建新包 但我不明白该文件的目的是什么LOCAL MODULE TAGS is 什么是LOCAL MODULE TAGS do 更正 不再建议使用用户标签 反而 Add LOCAL MODULE
  • UNIX 中 Java“包不存在”错误

    我的项目目录结构是这样的 ProjectName coursesRegistration src coursesRegistration util当我做 import coursesRegistration util FileProcess
  • Nuget 包有什么意义?

    也许我在这里做错了什么或者表达了纯粹的无知 但我真的看不出 Nuget 包有什么好处 我最近决定安装一些 Nuget 包来替换我的应用程序中的静态 DLL 当我检查包创建的文件夹时 它们似乎包含许多不同版本的 DLL 所有这些都嵌套在一系列
  • 构建预配置的 debian 包

    我正在尝试构建一个 debian 软件包 它会自动配置我的所有计算机以使用相同的配置文件和设置 例如 我尝试设置诸如 alter etc default hostapd conf 之类的内容 我目前正在通过使用 dh install 将文件
  • 在我的包的子包中运行 python 脚本

    无法弄清楚正确 python 2 x 首选方式进行相对导入 以便我可以将测试脚本放在一个子包中 并使这些测试脚本能够测试我的库 farm testpad testpad py Traceback most recent call last
  • 如何在 Octave 中永久加载包?

    我在 Windows vista 上使用 Octave 我在代码中使用 4 个包 但是每次我重新启动八度音程时 我都必须从命令行手动加载 pkg load 有没有办法永久加载它们 以便每当 Octave 启动时它都会在其路径中找到它们 当
  • R:从包中覆盖函数的正确方法是什么?

    我使用的是 R 包 其中有 2 个函数 f1 和 f2 其中 f2 调用 f1 我想覆盖函数f1 由于 R 2 15 和包中命名空间的强制使用 如果我只是获取新函数 它确实可以在全局环境中使用 即 只需在控制台中调用 f1 x 即可返回新结
  • 导入 matplotlib 时 numpy 的版本错误

    When I import matplotlib 我没有收到任何错误 但是当我 import matplotlib pyplot I get RuntimeError module compiled against API version
  • Delphi:如果我在项目中使用包,为什么“使用调试 DCU”会变得无效?

    我正在构建一个使用 JVCL 插件系统的项目 该系统依赖于运行时 Delphi 包 自从我将它添加到我的项目中后 调试就变成了一场噩梦 因为我不再能够单步跟踪源代码任何 VCL 或 RTL 单元 它们在调试器中都被标记为灰点 当相关函数出现
  • 使用 CMake 链接 .s 文件

    我有一个我想使用的 c 函数 但它是用Intel编译器而不是gnu C编译器 我在用着cmake构建程序 我实际上正在使用ROS因此rosmake但基础是cmake所以我认为这更多是一个 cmake 问题而不是ROS问题 假设使用构建的文件
  • 重命名 APK 内的包名称

    我创建了一个AIR app目前市场上有这种产品 要更新应用程序 显然我必须保留相同的包名称 我的第一个版本是使用以下方式打包的Eclipse使用 ADT 插件 现在可以使用AIR 3 0 本机扩展 ANE 当我第一次开发该应用程序时不可用
  • ROS中spin和rate.sleep的区别

    我是 ROS 新手 正在尝试了解这个强大的工具 我很困惑spin and rate sleep功能 谁能帮助我了解这两个功能之间的区别以及何时使用每个功能 ros spin and ros spinOnce 负责处理通信事件 例如到达的消息
  • 在eclipse中的另一个项目中使用一个项目的包

    如何在定义包的主项目之外使用包的类 例如 假设 people 包中有一个属于 ProjectOne 的 Employee 类 假设另一个具有相同功能的项目 ProjectTwo 需要 Employee 我应该在那里做什么 在 Package
  • 如何/在哪里发布 Python 包

    如果一个人创建了一个有用的 Python 包 那么如何 在哪里发布 宣传它以供其他人使用 我已经把它放到了 github 上 但几周后谷歌也没有找到它 包装整洁完整 我制作它供我个人使用 不与其他人分享将是一种耻辱 这是 PyPI 指南 h
  • go:找到模块但不包含包

    我正在尝试安装 go 的网络包 但收到 不包含包错误 终端截图 我咨询过 go 模块 latest 已找到但不包含包 https stackoverflow com questions 62974985 go module latest f
  • 无法在Python中打开html5lib

    我刚刚使用 Windows 命令提示符安装了适用于 Python 的 html5lib 该软件包安装在这里 File C Python27 lib site packages html5lib 但是 如果我尝试导入 html5lib usr
  • 安装 ROS 时 Cmake 未检测到 boost-python

    我一直在尝试在我的 Mac 上安装 ROS 并根据不同版本的 boost 使用不同的库解决了错误 然而 似乎有一个库甚至没有检测到 boost python 这是我得到的错误 CMake Error at usr local share c

随机推荐

  • JLink Commander调试方法

    JLink Commander调试方法 1 背景 目前开发中常用的调试手段主要有串口 IO口输出作为调试方式 目前串口的限制较多 xff0c 有些硬件不太方便接串口或者一些实时的数据 xff0c 当时没有接串口则无法实时获取调试信息 IO调
  • 物联网安全系列 - 非对称加密算法 ECDH

    非对称加密算法 ECDH 背景 之前的章节讲到了对称加密算法AES xff0c 发送方和接收方需要使用相同的密钥进行通讯 xff0c 但是发送方怎么将密钥安全的发送给接收方 xff1f 这是一个问题 密钥分配问题 对称加密算法中 xff0c
  • 【开源】一款PyQT+Pyserial开发的串口调试工具

    开源 PyQT 43 Pyserial开发的串口调试工具 串口调试工具是我们做嵌入式开发常用的工具 xff0c 市面上已经有很多串口调试工具了 xff0c 博主写这款串口调试工具一方面是为了学习Python PyQT Pyserial 相关
  • 【Matter】解密Matter协议(一)--- 什么是Matter协议?

    1 什么是Matter协议 xff1f 目前的智能家居行业使用解决方案众多 xff0c 相互之间隔离严重 xff0c 有WiFi 蓝牙 ZigBee 蜂窝或者有线等等不同通讯协议的设备 不仅不同协议之间的设备不能互通 xff0c 而且连相同
  • 【蓝牙系列】蓝牙5.4到底更新了什么?(1)--- PAwR

    蓝牙系列 蓝牙5 4到底更新了什么 xff08 1 xff09 PAwR 一 背景 蓝牙技术联盟最近发布了蓝牙5 4的核心规范 xff0c 蓝牙5 4规范的主要改进之一就是实现了单个接入点与数千个终端节点进行双向无连接通信 xff0c 这一
  • UP Squared Board,工业级创新开发板,为您的物联网应用注入升级能量

    研扬科技自推出UP Board xff08 世界首创 Intel 平台信用卡大小开发板 xff09 以来 xff0c 便成功于业界打开名号 xff0c 后续 xff0c 研扬持续开发 UP 系列产品 xff0c 至今 xff0c 除了 UP
  • 【蓝牙系列】蓝牙5.4到底更新了什么(2)

    蓝牙系列 蓝牙5 4到底更新了什么 xff08 2 xff09 一 背景 上一篇文章讲了蓝牙5 4的PAwR特征 xff0c 非常适合应用在电子货架标签 xff08 ESL xff09 领域 xff0c 但是实际应用场景中看 xff0c 只
  • 【转载】【Nordic博文分享系列】详解Zephyr设备树(DeviceTree)与驱动模型

    详解Zephyr设备树 xff08 DeviceTree xff09 与驱动模型 转载自nordic半导体微信公众号 1 前言 Nordic最新的开发包NCS xff08 nRF Connect SDK xff09 相对于原来的nRF5 S
  • 感受一下SPL06气压计+APM三阶互补的高度融合

    不得不说 xff0c spl06气压计很强 xff0c 原始数据也比较干净 xff0c 短时间可以保持在30cm内浮动 xff0c 滤波后在10cm内浮动 就是这么夸张 使用APM的三阶互补滤波融合出 高度 xff0c 速度 xff0c 效
  • 6种串口协议的实现

    串口协议开发 以下解析范式都是采用数据队列的形似来存储 xff0c 并且根据设备运行速度差异 xff0c 还需增加数据包队列来存储解析完毕的数据包 1 范式一 固定长度 无校验 0x6B 20字节 0xB6 上面数据中有一个帧头0x6B x
  • html页面实时刷新显示服务器数据

    在上一篇中我说到浏览器和服务器交互数据 xff0c 是实现了服务器发数据给浏览器 xff0c 并在页面上显示 xff0c 但是是通过按钮点击刷新的 xff0c 而且数据是和html页面一起发过来的 xff0c 在这里我是数据放到页面数组里
  • 平衡小车之家客服真差

    我同事送了我一台直流电机平衡车 xff0c 然后同事又买了一台步进电机平衡车 都是在平衡小车之家买的 xff0c 好好看看下面的图片 最近在研究同事的步进平衡小车 xff0c 然后跑去问一下客服步进电机的参数 xff0c 一看我说 xff0
  • C++编译流程

    C 43 43 编译流程 C C 43 43 是编译型高级语言 xff0c 程序要执行 xff0c 必须要有编译器和链接器 编译过程分为四步 xff1a 预处理 编译 汇编 链接 1 预处理 读取源代码并对其中的以 开头的指令和特殊符号进行
  • 卡尔曼滤波 -- 从推导到应用(一)

    前言 卡尔曼滤波器是在估计线性系统状态的过程中 xff0c 以 最小均方误差为目的而推导出的几个递推数学等式 也可以从贝叶斯推断的角度来推导 本文将分为两部分 xff1a 第一部分 xff0c 结合例子 xff0c 从最小均方误差的角度 x
  • 卡尔曼滤波 -- 从推导到应用(二)

    该文是自我总结性文章 xff0c 有纰漏 xff0c 请指出 xff0c 谢谢 白巧克力 这部分主要是通过对第一部分中提到的匀加速小车模型进行位移预测 先来看看状态方程能建立准确的时候 xff0c 状态方程见第一部分分割线以后内容 xff0
  • LQR 的直观推导及简单应用

    本文主要介绍LQR的直观推导 xff0c 说明LQR目标函数J选择的直观含义以及简单介绍矩阵Q R的选取 xff0c 最后总结LQR控制器的设计步奏 xff0c 并将其应用在一个简单的倒立摆例子上 假设有一个线性系统能用状态向量的形式表示成
  • STM32学习路线-长图

    最近好好整理了一下学习STM32的路程 xff0c 做成了一个长图 xff1a STM32学习路线 xff0c 供初学者们参考一下
  • ROS 教程之 vision: 摄像头标定camera calibration

    在上一个ROS教程视觉文章中 xff0c 我们使用usb cam包读入并发布了图像消息 xff0c 但是图像没有被标定 xff0c 因此存在畸变 ROS官方提供了用于单目或者双目标定的camera calibration包 这个包是使用op
  • ROS 基础: 在同一个节点里订阅和发布消息

    在一些应用中 xff0c 可能有的人需要在同一个节点中实现订阅一个消息 xff0c 然后在该消息的回调函数中处理一下这些数据后再发布到另一个topic上 ROS answers中也有人有相同的疑问 xff0c 这里贴出Martin Peri
  • ROS : 修改ROS源代码(overlaying package)

    ROS官方或者其他个人提供了很多package供大家使用 xff0c 但是随着学习的深入 xff0c 很多人可能想去修改这些package的源代码 xff0c ROS提供了一种称之为overlaying的机制 它允许 ROS原有安装的pac