首页 > 代码库 > 1、第二章中的概念

1、第二章中的概念

1、功能包/软件包

在ROS中,所有软件都被组织为软件包的形式,称为ROS软件包或功能包,有时也简称包。ROS软件包是一组用于实现特定功能的相关文件的集合,包括可执行文件和其他支持文件。如,前面使用的两个可执行文件turtlesim_node和turtle_teleop_key都属于turlesim包。

毫不夸张地说,所有的 ROS 软件都是一个软件包或其他软件包的一部分

一些命令:
a、查看软件包列表和定位软件包,使用如下命令,可以获取所有已安装的ROS软件包列表清单:

rospack list

技术分享

每个程序包由一个清单文件(文件名为package.xml)定义。该文件定义关于包的一些细节,包括其名称、版本、维护者和依赖关系。包含package.xml文件的目录被称为软件包目录(其实,这也是ROS软件包的定义:任何ROS能找到且包含package.xml文件的目录就是软件包目录。)这个目录存储所在软件包的大部分文件

技术分享

技术分享

要寻找一个软件包的目录,使用rospack find命令:

rospack find package-name

技术分享

查看软件包:要查看软件包目录下的文件,使用如下命令:

rosls package-name

技术分享

如果想“访问”某软件包目录,可以将当前目录切换至此软件包目录,使用如下命令:

技术分享

技术分享

技术分享

技术分享

2、节点管理器(The Master)

ROS 的一个基本目标是使机器人专家设计的很多称为节点(node)的几乎相对独立的小程序能够同时运行。为此,这些节点必须能够彼此通信。ROS 中实现通信的关键部分就是 ROS 节点管理器。

要启动节点管理器,使用如下命令: roscore

节点管理器应该在使用 ROS 的全部时间内持续运行。一个合理的工作流程是在一个终端启动 roscore, 然后打开其他终端运行其他程序。当结束时, 可以通过在 roscore 终端键入 Ctrl-C停止节点管理器。

技术分享

技术分享

3、节点(Nodes)

一旦启动roscore后,便可以运行ROS程序了。ROS程序的运行实例被称为节点(node)。

技术分享

在 turtlesim 的例子中,我们创建了两个节点第一个节点是可执行文件turtlesim_node的实例化。 这个节点负责创建turtlesim窗口和模拟海龟的运动。 第二节点是可执行文件 turtle_teleop_key的实例化

启动节点:

启动节点(也称为运行ROS程序)的基本命令是rosrun:

rosrun package-name executable-name

可以看到,rosrun 命令有两个参数,其中第一个参数是功能包的名称,第二个参数是该软件包中的可执行文件的名称。

技术分享

查看节点列表ROS提供了一些方法来获取任意时间运行节点的信息。要获得运行节点列表,使用如下命令:

rosnode list

技术分享

rosout 节点是一个特殊的节点,通过 roscore 自动启动。

技术分享

技术分享

技术分享

技术分享

技术分享

查看节点:要获得特定节点的信息,使用如下命令:

rosnode info node-name

技术分享

技术分享

终止节点 要终止节点,使用如下命令:
rosnode kill node-name

技术分享

4、话题和消息

ROS节点之间进行通信所利用的最重要的机制就是消息传递。在ROS中,消息有组织地存放在话题里消息传递的理念是当一个节点想要分享信息时,它就会发布(publish)消息到对应的一个或者多个话题;当一个节点想要接收信息时,它就会订阅(subscribe)它所需要的一个或者多个话题ROS节点管理器负责确保发布节点和订阅节点能找到对方;而且消息是直接地从发布节点传递到订阅节点,中间并不经过节点管理器转交。

a) 查看节点构成的计算图

在 ROS 系统中查看节点之间的发布-订阅关系的最简单方式就是在终端输入如下命令:

rqt_graph

技术分享

在该图中,椭圆形表示节点有向边表示其两端节点间的发布-订阅关系。该计算图告诉我们, /teleop_turtle节点话题/turtle1/cmd_vel发布消息,而/turtlesim节点订阅了这些消息(“cmd_vel”是“command velocity”的缩写。)。

从上图中并没有看到rosout节点在图中。这是因为,在默认情况下,rqt_graph 隐藏了其认为只在调试过程中使用的节点。你可以通过取消“Hide debug”选项来禁止这个特性,图 2.3 展示了这个结果。

技术分享

请注意 rqt_graph 本身就是一个节点。

技术分享

技术分享

技术分享

b)消息和消息类型

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

另一个例子是 geometry_msgs/Twist,书中将多次使用这种消息类型。该消息类型对应/turtle1/cmd_vel 话题,而且要稍微复杂一些:

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

技术分享

你很有可能已经开始设想,为了自动测试你的程序,编写
一种脚本将 rostopic echo 和 rostopic pub 结合起来作为“记
录”和“回放”消息的方式。如果是这样的话,你会对 rosbag
工具感兴趣 (第 9 章) , 该工具是上述想法的更加完善的实现。

技术分享

技术分享

4、一个更复杂的例子

技术分享

技术分享

2.8.1 话题通信的多对多机制

远程操作节点 C 发布的每条消息都会传送给 A 和
B 两个仿真节点。 同样的, D 节点发布的消息也会传送给 A 和 B。
当这些消息到达仿真节点时,海龟将会相应地移动,而不管这条
消息是哪个节点发布的。此处要强调的是,基于话题和消息的通
信机制是多对多的,即多个发布者和多个订阅者可以共享同一个话题。

2.8.2 节点之间的松耦合关系

每个节点都不需要显式知道其他节点的存在与否;它们的唯
一交互方式是间接地发生在基于话题和消息的通信层。这种节点
之间的独立性,以及其支持的任务可分解特性(即复杂任务分解
成可重用的小模块) ,是 ROS 最关键的设计特性之一。

此外,ROS 为更加直接的一对一通信提供了一种称为服务
(services)的机制。

5、问题检查

技术分享

 

1、第二章中的概念