ROS 提高篇 之 Launch 深入研究 - 01 — 启动文件的编程 — ROS 的 XML语法简介
我使用的虚拟机软件:VMware Workstation 11
使用的Ubuntu系统:Ubuntu 14.04.4 LTS
ROS 版本:ROS Indigo
注意:
1 . ROS 提高篇这个专栏的教学有门槛。
2 . 如果你没有学习前面的教程,请想学习前面的 beginner_Tutorials 和 learning_tf 的ROS 相关教程。
1 . 前言
在之前的 beginner_Tutorials 教程里面,我们已经初步学习了 Launch文件 要如何编写。但是那篇博客只是简单的讲解了一些 Launch 文件里面比较常用的几个 标签如何使用。
这一篇博客和接下来的几篇博客,我们将详细的讲解 Launch 文件要如何编写。
使用 launch文件,我们可以一次性配置并且运行很多节点。
至今,如果你按照我们的教程(ROS Learning)学习到这里,想必你一定运行了许多的例子。你可能会对在许多的终端中运行不同的节点感到麻烦,并且你会因为不了解我们运行过的例子中的 launch文件 都做了什么事情会感到困扰。我们在ROS Learning教程中 的 beginner_Tutorials 和 learning_tf 的ROS 相关教程 中已经学习简单的 launch启动脚本 如何编写,现在的你所知道的launch文件的编写技巧已经无法满足你现在想编写更复杂更大型的launch启动脚本文件了。所以这一篇博客和接下来的几篇博客,我们会详细的讲 launch文件 的技巧,当你学完这几篇的博客,你会具备编写大型launch启动脚本的能力。
说了一堆废话,接下来进入正题。
2 . 使用launch启动脚本文件:
<launch>
<node
pkg="turtlesim"
type="turtlesim_node "
name="turtlesim "
respawn="true "
/>
<node
pkg="turtlesim"
type="turtle_teleop_key "
name="teleop_key"
required="true"
launch−prefix="xterm −e"
/>
<node
pkg="agitr"
type="subpose"
name="pose_subscriber"
output="screen"
/>
</launch>
roslaunch 是如何允许我们一次启动多个节点”?
基本的实现思想是列表,在一个指定的XML格式,一组节点需要在同一时间被启动。你会很熟悉下面的列表,它展示启动了海龟(turtlesim)模拟器的一个简单的launch文件。
再我们深入研究launch文件的格式的细节前,让我们看看这些文件都是如何使用的:
roslaunch
命令的使用格式:
# roslaunch package-name launch-file-name
在 编写简单的启动脚本文件 的博客中最后的小练习中,我们自己编写了一个launch文件,如果一切工作正常的话,这个命令将会启动3个节点。在开始任何一个节点前,roslaunch
将会确定 roscore节点 是否已经在运行,如果没有,自动启动它。
注意: 要小心,不要与
rosrun
命令 混淆,rosrun
只能启动一个节点。roslaunch
命令可以同时启动多个节点。
扩展 :你也可以在使用 roslaunch
启动launch文件的时候没有package-name
这部分。要想做到这一定,launch-file-name
文件需要写成绝对路径的形式。只要可以让 roalaunch
命令找到唯一的一个 launch
文件,你就可以不提供 package-name
部分。举例:
$ roslaunch ~/catkin_ws/src/beginner_turtorls/launch/xxx.launch
关于
roslaunch
的一个重要的事实,这个事实很容易被忽略,就是在launch文件中的所有节点几乎被同一时间启动。结果,我们不能确定这些节点初始化的顺序。好在 ROS节点 不关系彼此的启动顺序。为什么?
这个行为体现了ROS哲学:每一个节点与其他的节点都应该尽可能的独立、不相关。
如果你想请求 roslaunch
命令 请求详细输出( Requesting verbosity )信息的话。就像其他的命令行工具一样,roslaunch
也有请求详细输出的选项。在你进行调试程序的时候,使用 -v
参数对你是有帮助的,你可以看到 roslaunch
是如何解读你的 launch文件 的详细解释。
# roslaunch -v package-name launch-file-name
3 . 创建launch启动脚本文件:
3-1 . 基本的成分:
3-1-1 . <launch>
最简单的启动文件是由一个包含了几个节点元素的根元素(root element)组成。
根元素:launch文件是XML文档,每一个XML文档必须有且只有一个跟元素(root element)。对于ROS launch文件,根元素(root element)是由一对 launch
标签定义的。
<launch>
...
</launch>
其他的所有元素标签都要写在 <launch>...</launch>
便签之间。
3-1-2 . <node>
启动的节点:任何一个launch文件的重点都是:节点(node)元素的集合。启动的每一个节点(node)都要有自己独一无二的名字(name)。一个节点(node)元素看上去就像下面这个样子:
<node
pkg="package-name"
type="executable-name"
name="node-name"
/>
注意: 在节点(node)标签的末尾加上’ /
‘斜杠是重要的,并且也容易被忘记。’ /
’ 表明:这里不会再有”</node>
“出现,并且node元素定义完成。
XML解析器非常严格,如果你忘记了加’ /
‘,你要对这样的错误做好准备:
Invalid roslaunch XML syntax: mismatched tag
你也可以写成显式关闭标签的形式:
<node