一 launch file 介绍
在运行ros程序时我们往往需要在不同终端启动多个不同的节点,这会让人有些沮丧。幸运的是,ROS 提供了一个同时启动节点管理器(master)和多个节点的途径,即使用启动文件(launch file)。事实上,在 ROS 功能包中,启动文件的使用是非常普遍的。任何包含两个或两个以上节点的系统都可以利用启动文件来指定和配置需要使用的节点。其基本思想是在一个XML格式的文件内将需要同时启动的一组节点罗列出来。
二 启动文件的基本组成
1. 最简单的启动文件
最简单的启动文件由一个包含若干节点(<node />)的根元素(<launch /launch>)组成,如下
<?xml version="1.0"?>
<!-- 根元素起始 -->
<launch>
<!-- 节点起始 -->
<node
pkg="turtlesim"
type="turtlesim_node"
name="turtle"
ns="sim1"
/>
<!-- 节点结束 -->
<!-- 节点起始 -->
<node
pkg="turtlesim"
type="turtle_teleop_key"
name="teleop"
ns="sim1"
launch-prefix="xterm -e">
</node>
<!-- 节点结束 -->
<!-- 节点起始 -->
<node
pkg="turtlesim"
type="turtlesim_node"
name="turtle"
ns="sim2"
/>
<!-- 节点结束 -->
<!-- 节点起始 -->
<node
pkg="turtlesim"
type="turtle_teleop_key"
name="teleop"
launch-prefix="xterm -e"
ns="sim2">
</node>
<!-- 节点结束 -->
</launch>
<!-- 根元素结束 -->
新建一个.launch文件,内容复制过去之后直接使用命令roslaunch example.launch
即可运行,结果如下:
2. 节点元素的属性
每个节点元素由三个必须的属性:
- pkg
该节点属于哪个包,相当于rosrun命令后面的第一个参数 - type
可执行文件的名字,rosrun命令的第二个参数 - name
该节点的名字,相当于代码中ros::int的命名信息,有了它代码中的名称会被覆盖。
其他属性:
- output
将标准输出显示在屏幕上而不是记录在日志中 - respawn
请求复位,当该属性的值为respawn="true"
时,roslaunch会在该节点崩溃时重新启动该节点 - required
必要节点,当该值为required="true"
时,roslaunch会在该节点终止时终止其他活跃节点。 - 启动前缀
在启动命令加上前缀。例如当其设置为launch-prefix="xterm -e"
时,效果类似于xterm -e rosrun X X
。也就是为该节点保留独立的终端。 - ns
在命名空间中启动节点。 - 重映射
使用方法remap from="original-name(turtle/pose)"to"new-name(tim)"
- 包含其他文件
include file="path to launch file"
在启动文件中包含其他启动文件的内容(包括所有的节点和参数),可使用如下命令使路径更为简单include file="($find package-name)/launch-file-name"
- 启动参数(launch arguments)
为了使启动文件便于配置,roslaunch还支持启动参数,有时也简称为参数甚至args,其功能有点像可执行程序中的局部变量。
声明参数:arg name="arg-name"
然而这样的声明并不是必须的(除非你想要给它赋值或设置为默认值,见后续内容),但是这是一个好的做法,因为这样能使读者比较清楚启动文件需要哪些参数
参数赋值:
roslaunch package-name launch-file-name arg-name:=arg-value
<arg name=”arg-name” default=”arg-value”/>
<arg name=”arg-name” value=”arg-value”/>
获取参数:一旦参数值被声明并且被赋值,你就可以利用下面的arg 替换(arg substitution)语法来使用该参数值了:$(arg arg-name)每个该替换出现的地方,roslaunch 都将它替换成参数值。在示例中,我们在 group 元素中的 if 属性使用了一次 use_sim3 参数。 - 创建组
待续