概念

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. pandas的read_csv函数

    pd.read_csv(filepath_or_buffer, sep=',', delimiter=None, header='infer', names=None, index_col=None, ...

  2. golang web框架 beego 学习 (二) router and controller

    1 Router和Controller的常用配置 beego.Router("/user/admin", &controllers.UserController{}) // ...

  3. scala操作hbase案例

    案例取自streaming-app项目 package com.asiainfo.ocdc.streaming.tools import org.apache.hadoop.hbase.HBaseCo ...

  4. python3 string

    字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可.例如: var1 = 'Hello World!' var2 ...

  5. UVA408-水的深度的伪随机数

    题意: 公式sed(x) = (sed(x-1)+step)%mod,初始值sed(x)=0,输入step和mod,求解这个公式能不能生成0,1,2,3,4,5.....mod-1 解法:暴力枚举,直 ...

  6. aix-syslog

    收集网络内路由器的日志信息,同时把本地日志信息与路由器信息分开. /etc/syslog.conf我写成: ## 本地日志处理 *.notice;*.err;*.warn<tab>;< ...

  7. python读取excel,数字都是浮点型,日期格式是数字的解决办法

    excel文件内容: 读取excel: # coding=utf-8 import xlrd import sys reload(sys) sys.setdefaultencoding('utf-8' ...

  8. eclipse启动tomcat无法访问的解决方法

    转自:https://www.cnblogs.com/longshiyVip/p/4637680.html 问题:: tomcat在eclipse里面能正常启动,但在浏览器中访问http://loca ...

  9. 13.小结Action

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 在struts2中一个普通的java类只要有public String ex ...

  10. 5.mybatis实战教程(mybatis in action)之五:与spring3集成(附源码)

    转自:https://blog.csdn.net/nnn9223643/article/details/41962097 在 这一系列文章中,前面讲到纯粹用mybatis 连接数据库, 然后 进行增删 ...