概念

ROS里面有一系列概念,作为初学者,最先接触的概念无非是node, package和workspace。

node

node是ROS里面最小的执行单位,你可以把node看成是一个main函数,当你启动一个node,就相当于启动了一个main函数,通常这个main函数会不停循环监听某个消息,或者执行一系列操作,直至你关闭它,或者执行完退出。

package

package是ROS里面最小的编译单位,也是ROS里面的搜索单位,你可以把package看成是一个有结构的文件夹,它包含多个node以及一些结构性质文件。ROS里面的node,是以package为单位进行编译的,一次编译package里面多个node。

通常一条ROS的node执行命令具有以下结构:

rosrun <package_name> <node_name>

即执行某个node的时候,要标识这个node是属于哪个package的,ROS会先通过package的名字检索到package,再通过node名字找这个package下对应的node去执行。

workspace

首先思考一个问题:package都被放在什么地方?

package存在于两个地方。一个是ROS库,即当你安装ROS的地方,通常在 opt/ros/<distro>/share/ (<distro>指你的ROS版本,如hydro, groovy)。另外一个地方,就是我们自己建的workspace了,我们自己的package,或者网上下载的别人的package都必须放在workspace里面编译,才可以使用。

workspace是ROS里面最小环境配置单位,你可以把workspace看成是一个有结构的文件夹,它包含多个package以及一些结构性质文件。一次将一个workspace配置进环境变量里面,你才能使用ROS命令执行与这个workspace里面的package相关的操作。

build system

前面提到的package和workspace都是有结构的,那么这些结构到底是怎么规定的呢?

这些结构,就是由build system(编译系统)规定的。当你运行workspace相关的命令,它会在一个你指定的空文件夹下面放很多功能性质的文件,并将这个空文件夹变成一个workspace。当你运行package相关的命令,它会在你指定的路径下面创建出package。

目前,ROS的build system有两种,一种叫做catkin,另外一种叫做rosbuild。利用不同的build system创建出来的workspace和package因此也分为两种。

rosbuild是ROS传统的编译系统,从最初沿用至今,但面临被抛弃的状态。因为catkin比rosbuild好很多。

source setup.bash

在workspace部分介绍了package存在的两个地方,那么,是不是我们打开terminal,就能使用ROS命令,系统就能找到那些package呢?

这里,就要了解 source setup.bash 的功能。 source setup.bash 就是执行 setup.bash 脚本,而这个脚本,就会在环境中配置一些数据。

通常我们安装完ROS后,要先 source /opt/ros/<distro>/setup.bash ,这条语句的目的就是将ROS相关的命令配置在当前terminal工作的环境中,我们在这个环境中就能使用ROS命令了,否则系统是无法知道ROS命令的存在的。同时,这条语句也会让ROS库中的package能够被找到。

例如catkin的就是 source ~/catkin_ws/devel/setup.bash ,rosbuild的就是 source ~/rosbuild_ws/setup.bash

overlay

再来思考一个问题:你有一个或者多个catkin workspace,同时你也有一个或者多个rosbuild workspace;而某个名字叫example_package的package在ROS库,在每个workspace里面都存在,当你运行 rosrun example_package example_package 的时候,到底会运行哪个位置的example_package呢?

这就关系到overlay的概念。overlay就是一种操作,可以让不同的workspace层层覆盖,最底层的是ROS库。通过这种覆盖关系,当寻找某个package的时候,ROS会先从顶层的workspace找,如果找不到再依次往下找。也可以看成是一个路径链条,当我们想把通过overlay链接起来的workspace和ROS库的路径配入环境的时候,我们只需要source overlay链条顶层的workspace的setup.bash脚本即可。

overlay rosbuild_ws->catkin_ws->ROS库

最常见的配置是一个rosbuild workspace和一个catkin workspace了(对应的文件夹分别为 rosbuild_wscatkin_ws )。因为有时候我们需要使用这两种workspace里面的package,而往往是自己的package优先于ROS库里面自带的package的。

[1]overlay catkin_ws->ROS库

mkdir -p ~/catkin_ws/src  #创建catkin_ws文件夹,以及src文件夹
cd ~/catkin_ws/src
catkin_init_workspace #在src路径下初始化catkin workspace,并指定src路径是package存放的路径
cd ~/catkin_ws/
catkin_make #在src路径下初始化catkin workspace,并指定src路径是package存放的路径;

Note:

上面的操作会自动overlay ROS库,即catkin_ws->ROS库。如果不需要再加入rosbuild workspace,则执行 echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc 就行了,跳过后面的所有步骤。

[2]overlay rosbuild_ws->catkin_ws

sudo apt-get install python-rosinstall

在新装的系统第一次运行rosbuild相关操作前,还要先安装一下rosinstall。

mkdir ~/rosbuild_ws
cd ~/rosbuild_ws
rosws init . ~/catkin_ws/devel #初始化rosbuild_ws并overlay前面创建的catkin workspace
mkdir ~/rosbuild_ws/sandbox
rosws set ~/rosbuild_ws/sandbox #创建文件夹sandbox并将其设置为package存放的文件夹。

[3]source setup.bash

echo "source ~/rosbuild_ws/setup.bash" >> ~/.bashrc
source ~/.bashrc

每次打开terminal,都将会执行 ~/.bashrc 脚本。因此,第一条语句将引号内的内容写入 ~/.bashrc 后,每次打开terminal,overlay顶层的rosbuild_ws的setup.bash都会被source,就不用我们手动source了。

检查overlay路径

echo $ROS_PACKAGE_PATH

确认是否显示了下面4个路径:

/home/<user>/rosbuild_ws/sandbox:/home/<user>/catkin_ws/src:/opt/ros/<distro>/share:/opt/ros/<distro>/stacks

如果不全,说明之前的overlay出了问题。再进一步做检查:

gedit ~/rosbuild_ws/.rosinstall

看看有没有下面的内容:

- setup-file: {local-name: /home/<user>/catkin_ws/devel/setup.sh}   #被overlay的catkin workspace路径
- other: {local-name: sandbox} #该rosbuild workspace的package存放目录。

更多的overlay概念,可以参考 [catkin_workspace_overlaying][using_rosbuild_with_catkin]

ROS两种workspace :overlay rosbuild_ws->catkin_ws->ROS库,的更多相关文章

  1. stm32库函数建工程和使用Keil自带库建工程有没有区别?发现了同样的程序在两种情况下keil自带库可以运行的情况,不知是什么原因

    我使用库函数建的工程(非Keil自带库),为了实现SPI对Si24r1芯片数据的读写,以验证stm32是否可以和si24r1能够正常通信,发现使用库函数建的工程程序不能通过,读出来的数据和写的数据不一 ...

  2. 上拉刷新和下拉刷新的两种方法(包括使用第三方库MJRefresh)

    一.使用苹果原生的方法 1.下拉刷新 2.上拉刷新 (1 首先要新建一个footer得XIB文件,当然同时包括对应的控制器文件,例如在XIB文件中可以如下拖拉对应的控件 (2 然后在代码文件中写一个实 ...

  3. Linux共享库两种加载方式简述

      Linux共享库两种加载方式简述  动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...

  4. ROS知识(3)----功能包package编译的两种方式

    ROS的包编译有两种方法(我知道的),一种是用rosmake,这种方法简单:另一种是用catkin_make,这种方法更方便包的管理和开发.这两种方法都是先建立工作空间workspace(类似于vs下 ...

  5. 相机标定 matlab opencv ROS三种方法标定步骤(1)

    一 . 理解摄像机模型,网上有很多讲解的十分详细,在这里我只是记录我的整合出来的资料和我的部分理解 计算机视觉领域中常见的三个坐标系:图像坐标系,相机坐标系,世界坐标系,实际上就是要用矩阵来表 示各个 ...

  6. ROS笔记1 安装及创建一个ROS Package

    安装 跟着官方的安装指引来就行了.安装前要先确定自己的ros版本和ubuntu版本.这二者是一一对应的. http://wiki.ros.org/ROS/Installation 主要是package ...

  7. ROS Learning-011 beginner_Tutorials (编程) 编写 ROS 话题版的 Hello World 程序(Python版)

    ROS Indigo beginner_Tutorials-10 编写 ROS 话题版的 Hello World 程序(Python版) 我使用的虚拟机软件:VMware Workstation 11 ...

  8. Eclipse将引用了第三方jar包的Java项目打包成jar文件的两种方法

    方案一:用Eclipse自带的Export功能 步骤1:准备主清单文件 “MANIFEST.MF”, 由于是打包引用了第三方jar包的Java项目,故需要自定义配置文件MANIFEST.MF,在该项目 ...

  9. C#中的两种debug方法

    这篇文章主要介绍了C#中的两种debug方法介绍,本文讲解了代码用 #if DEBUG 包裹.利用宏定义两种方法,需要的朋友可以参考下   第一种:需要把调试方法改成debug代码用 #if DEBU ...

随机推荐

  1. tornado.gen 模块解析

    转自:http://strawhatfy.github.io/2015/07/22/Tornado.gen/ 引言 注:正文中引用的 Tornado 代码除特别说明外,都默认引用自 Tornado 4 ...

  2. Web API 源码剖析之全局配置

    Web API 源码剖析之全局配置 Web API  均指Asp.net Web API .本节讲述的是基于Web API 系统在寄宿于IIS. 本节主要讲述Web API全局配置.它是如何优雅的实现 ...

  3. Distill详述「可微图像参数化」:神经网络可视化和风格迁移利器!

    近日,期刊平台 Distill 发布了谷歌研究人员的一篇文章,介绍一个适用于神经网络可视化和风格迁移的强大工具:可微图像参数化.这篇文章从多个方面介绍了该工具. 图像分类神经网络拥有卓越的图像生成能力 ...

  4. 开发组件:Systemd

    Systemd 入门教程:命令篇 http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html

  5. MyBatis 中#与$的区别

    今天在工作中有个点击排序的功能调试了许久,终寻因,总结之.  需求是这样的,页面有个table,有一列的上下箭头可点击并排序.对于这种需求,我的mybatis.xml的sql配置写成了如下: < ...

  6. bootstrap file input 多图片上传编辑THINKPHP5

    {layout name="layout" title="文章添加" /} <form id="defaultForm" role=& ...

  7. 获取DataView行数据

      1.  dv.Table.Rows[0]["price"].ToString();这种方法虽然很长,但意思很清晰. 2.  dv[0]["price"].T ...

  8. FDConnection

    FDConnection 利用FDConnection获取信息,不用放query控件也可以.   FDConnection1.GetTableNames('', '', '', List);   FD ...

  9. nginx访问静态文件配置

    通过nginx访问静态文件配置,均是在server模块中配置,有两种方式: 1.alias 通过alias关键字,重定义路径,如 server{     listen 7001;     server ...

  10. C++11中std::forward的使用 (转)

    std::forward argument: Returns an rvalue reference to arg if arg is not an lvalue reference; If arg ...