ROS文件系统

ROS文件系统中的两个最基本的概念:Package和Manifest,即包和清单文件。

(1)Package是组织ROS代码的最基本单位,每一个Package都可以包括库文件,可执行文件,脚本及其它的一些文件。

(2)Manifest文件是对Package的相关信息的一个描述。他提供了Package之间的依赖性,以及一个包的元信息,比如版本、维护着和许可证等信息。

catkin 编译构建系统的功能包 ——编译产生的可执行文件并未存放在功能包目录下,而是存放在一个单独的标准化目录层次结构中。对于使用 apt-get 安装的功能包,其所在根目录为/opt/ros/indigo。可执行文件存储在这个根目录下的 lib 子目录里。同样,在自动生成的头文件存储在 include 子目录下。当有需要时,ROS通过搜索 CMAKE_PREFIX_PATH 环境变量列出的目录,这个环境变量由 setup.bash 自动设置。

注意:你有可能在一些文档中看到功能包集( stack)的概念。功能包集是紧密相关的功能包的集合。从ROS的 groovy版本开始,功能包集的概念被逐步淘汰,取而代之的是元功能包( metapackages),元功能包像其他功能包一样有功能包清单,但其目录下没有其他的功能包,而功能包集则将其包含的功能包存放在其目录下。

 

节点管理器(The Master)

ROS 的一个基本目标是使机器人的很多节点node(可执行文件,几乎相对独立的小程序)能够同时运行。为此,这些节点必须能够彼此通信。ROS 中实现通信的关键部分就是ROS 节点管理器。要启动节点管理器,使用如下命令:roscore  。节点管理器应该在使用 ROS 的全部时间内持续运行。一个合理的工作流程是在一个终端启动roscore,然后打开其他终端运行其他程序。当结束时可以通过在 roscore 终端键入Ctrl-C 停止节点管理器。如果roscore 被终止,当前运行的其他节点将无法建立新的连接,即使 稍后重启 roscore 也无济于事。
roslaunch 是个启动文件,其目的是一次性启动多个节点。每一个启动文件都应该和一个特定的功能包关联起来。通常的命名方案是以.launch 作为启动文件的后缀。这是一个自适应工具,如果启动多节点时没有节点管理器运行,它会自动启动节点管理器;如果已经有一个节点 管理器在运行,则会使用已有的。rosrun 一次只能启动 一个节点,而 roslaunch 可以同时启动多个节点。一般launch文件会放在功能包的根目录中。
以后会专门讲一下roslaunch  http://www.cnblogs.com/zjiaxing/p/5542614.html
 

节点(Nodes)

一旦启动roscore后,便可以运行ROS程序了。 ROS程序的运行实例被称为节点(node) ,例如 rosrun turtlesim turtlesim_node  这个节点是可执行文件 turtlesim_node 的实例化,负责创建 turtlesim窗口和模拟海龟的运动。可以看出rosrun 命令有两个参数,其中第一个参数是功能包的名称,第二个参数是该软件包中的可执行文件的名称。还要注意的是通过节点管理器注册成为 ROS 节点发生在程序的内部,而不是通过 rosrun 命令。
启动roscore后运行rosnode list 可以看到出现节点/ rosout  。rosout 节点是一个特殊的节点,通过 roscore 自动启动。其作用有点类似于控制台程序中使用的标准输出(即 std::cout)。
/rosout也是话题,所有的节点发布都向话题/rosout 发布消息,该话题由同名的 /rosout 节点订阅。这个话题的作用是用来生成各个节点的文本日志消息。在某些地方/rosout 既指节点又指话题。但 ROS 并不会这种重复的名字而混淆,因为 ROS 会根据上下文来推测我们讨论的是/rosout节点,还是/rosout话题。
举个例子来说明也许会更好,这个例子将在话题和消息里说明。
 
读者还要注意的是rosrun 命令中可执行文件的名称与节点名称并不一定相同。节点名称是在代码中命名的例如ros::init (argc, argv, "odom");而可执行文件名称是在CMakeLists.txt中命名的。但可以使用 rosrun 命令显式设置节点的名称,语法如下:rosrun package-name executable-name _ _name:=node-name 这种方法将使用 node-name 参数给出的名称覆盖节点的默认名。因为 ROS 中要求每个节点有不同的名称,因此该方法很重要尤其是移植程序中。
 
话题和消息
ROS节点之间进行通信所利用的最重要的机制就是消息传递。在ROS中,消息有组织地存放在话题里。消息传递的理念是:当一个节点想要分享信息时,它就会发布(publish)消息到对应的一个或者多个话题;当一个节点想要接收信息时,它就会订阅(subscribe)它所需要的一个或者多个话题。ROS节点管理器负责确保发布节点和订阅节点能找到对方;而且消息是直接地从发布节点传递到订阅节点,中间并不经过节点管理器转交。

查看节点构成的计算图:先介绍个工具rqt_graph,要查看节点之间的连接关系,恐怕将其表示为图形是最便于查看的。在ROS 系统中查看节点之间的发布-订阅关系的最简单方式就是在终端输入如下令:rqt_graph。r 代表ROS,qt 指的是用来实现这个可视化程序的Qt 图形界面(GUI)工具包。

在该图中,椭圆形表示节点,有向边表示其两端节点间的发布-订阅关系。该计算图告诉们,/teleop_turtle节点向话题/turtle1/cmd_vel发布消,而/turtlesim 节点订阅了这些消息(“cmd_vel”是“command velocity”的缩写)。但是其中省略了调试节点,包括 rosout 节点,这是因为在默认情况下,rqt_graph 隐藏了其认为只在调试过程中使用的节点。你可以通过取消“Hide debug”选项来禁止这个特性,下图是完整的:

 
请注意 rqt_graph 本身就是一个节点。所有的节点发布都向话题/rosout 发布消息,该话题由同名的 /rosout 节点订阅。正如之前讲过的,这个话题的作用是用来生成各个节点的文本日志消息,此处的名称/rosout 既指节点又指话题。但 ROS 并不会因这种重复的名字而混淆,因为 ROS 会根据上下文来推测我们讨论是/rosout 节点还是/rosout 话题。
与ROS服务不同,ROS 节点通常设计成了只管发布它们有用的信息,而不需要担心是否有其他节点来订阅
这些消息。这样有助于减少各个节点之间的耦合度。
 
 
 

由浅到深理解ROS(2)的更多相关文章

  1. 由浅到深理解ROS(1)

    ROS机器人操作系统 ( Robot Operating System 或简称 ROS),可以帮助提高机器人软件的开发效率.ROS能够提供类似传统操作系统的诸多功能,如硬件抽象.底层设备控制.常用功能 ...

  2. 由浅到深理解ROS(5)- launch启动文件的理解与编写

    ROS提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file).事实上,在ROS功能包中,启动文件的使用是非常普遍的.任何包含两个或两个以上节点的系统都可 ...

  3. 由浅到深理解ROS(4)

    消息和消息类型 节点能相互传递消息,节点之间通信也是基于消息.消息类型也就是数据类型数据类型,理解消息的类型很重要,因为它决定了消息的内容.也就是说,一个话题的消息类型能告诉你该话题中每个消息携带了哪 ...

  4. 由浅到深理解ROS(3)-命名空间

    全局命名空间: /rosout前面的反斜杠“/”表明该节点名称属于全局命名空间.之所以叫做全局名称因为它们在任何地方(包括代码.命令行工具.图形界面工具等的任何地方)都可以使用.无论这些名称用作众多命 ...

  5. 由浅到深理解java反射

    1.基础概念 class类: 1.1java是面向对象的,但是在java中存在两种东西不是面向对象的 一种是普通的数据类型,这也是封装数据类存在的原因. 二种是静态静态成员. 1.2所以我们首先要理解 ...

  6. JavaScript基础知识从浅入深理解(一)

    JavaScript的简介 javascript是一门动态弱类型的解释型编程语言,增强页面动态效果,实现页面与用户之间的实时动态的交互. javascript是由三部分组成:ECMAScript.DO ...

  7. Stage3d 由浅到深理解AGAL的管线vertex shader和fragment shader || 简易教程 学习心得 AGAL 非常非常好的入门文章

    Everyday Stage3D (一) Everyday Stage3D (二) Triangle Everyday Stage3D (三) AGAL的基本概念 Everyday Stage3D ( ...

  8. 从浅入深——理解JSONP的实现原理

    由于浏览器的安全性限制,不允许AJAX访问 协议不同.域名不同.端口号不同的 数据接口,浏览器认为这种访问不安全: 可以通过动态创建script标签的形式,把script标签的src属性,指向数据接口 ...

  9. 浅入深出之Java集合框架(下)

    Java中的集合框架(下) 由于Java中的集合框架的内容比较多,在这里分为三个部分介绍Java的集合框架,内容是从浅到深,哈哈这篇其实也还是基础,惊不惊喜意不意外 ̄▽ ̄ 写文真的好累,懒得写了.. ...

随机推荐

  1. 【java初学者】理解,从面向过程 到 面向对象,面向接口,面向切面

    http://blog.csdn.net/ssh159/article/details/52516986

  2. 【spring data jpa】spring data jpa的in查询

    如下: List<Dealer> findDealersByTidAndUidIn(String tid,List<String> uidList); 在dao层里面直接写这个 ...

  3. wp8手机浏览器项目

    项目需求如下: 1.页面布局 最上方为搜索/网址框 中间为网页显示区,默认主页为百度搜索 最下方为功能栏,分别有后退,前进,窗口和更多功能 在更多功能中有 分享给好友 发送网址到桌面 查看历史记录等 ...

  4. CKEditor+SWFUpload实现功能较为强大的编辑器(三)---后台接收图片流程

    在前台配置完CKEditor和SWFUpload之后就可以满足基本的需求了 在这里,我配置的接收异步上传的图片的页面为upload.ashx 在这个ashx中对上传的图片处理的流程如下: contex ...

  5. Python从2.7.5升级到3.6.5

    Python从2.7.5升级到3.6.5学习了:https://blog.csdn.net/liang19890820/article/details/51079633 wget https://ww ...

  6. Cache和Buffer的区别(转载)

    1. Cache:缓存区,是高速缓存,是位于CPU和主内存之间的容量较小但速度很快的存储器,因为CPU的速度远远高于主内存的速度,CPU从内存中读取数据需等待很长的时间,而  Cache保存着CPU刚 ...

  7. linux驱动current,引用当前进程,及task_struct(转)

    尽管内核模块不象应用程序一样顺序执行, 内核做的大部分动作是代表一个特定进程的. 内核代码可以引用当前进程, 通过存取全局项 current, 它在 <asm/current.h> 中定义 ...

  8. JavaScript 屏蔽退格键

    document.onkeydown = function(){//屏蔽Backspace键 if (event.keyCode==8){ event.keyCode=0; event.returnV ...

  9. 代码设置UIButton文字、图片位置

    假设有按钮rButton的 imageEdgeInsets和contentEdgeInsets可以设置按钮的标题和图片的位置,如下代码,设置标题居右 NSString * rBtnTitle = @& ...

  10. List of CentOS Mirrors

    From:https://www.centos.org/download/mirrors/ CentOS welcomes new mirror sites. If you are consideri ...