每当我们需要运行一个ROS节点或工具时,都需要打开一个新的终端运行一个命令。当系统中的节点数量不断增加时,每个节点一个终端的模式会变得非常麻烦。启动文件(Launch File)是ROS中一种同时启动多个节点的途径,还可以自动启动ROS Master节点管理器,可以实现每个节点的各种配置,为多个节点的操作提供了很大便利。
运行.launch文件命令
$ roslaunch package_name file.launch
launch文件实例:
<launch>
<node name="mbot_teleop" pkg="mbot_teleop" type="mbot_teleop.py" output="screen">
<param name="scale_linear" value="0.1" type="double"/>
<param name="scale_angular" value="0.4" type="double"/>
</node>
</launch>
一.launch文件的替代参数
1.指定包的相对路径。文件系统到包目录的路径将被内联的替换。
. $(find pkg)
例如:
$(find rospy)/manifest.xml
2.产生基于名称的匿名ID。名字本身是一个独特的标识符:不同的$(anon name)用法将创建相同的“匿名”的名字。主要用于“节点名称”属性中以创建匿名节点。ROS要求每个节点都有唯一的名字。
. $(anon name)
例如:
<node name="$(anon foo)" pkg="rospy_tutorials" type="talker.py"/>
3.计算由<arg>标签指定的值。
. $(arg foo)
在声明arg的同一启动文件中必须有对应的<arg>标签
例如:指定my_foo到foo参数
<param name="foo" value="$(arg my_foo)">
二.launch文件基本元素
1.<launch>
XML文件必须包含一个根元素,launch文件的根元素采用<launch>标签,它的唯一目的是作为其他元素的容器(文件中的其他内容都必须包含在这个标签中)。
<launch>
...
...
...
</launch>
2.<node>
启动文件的核心是启动ROS节点,采用<node>标签定义。语法如下:
<node pkg="package_name" type="executable_name" name="node_name"/>
pkg:定义节点所在的功能包名称;
type:定义节点的可执行文件名称;
name:定义节点运行的名称,将覆盖节点中init()赋予节点的名称。
以上是哪个是最常用的属性,在应用中我们还可能用到其他的一些属性:
output="screen":将节点的标准输出打印到终端屏幕,默认输出为日志文档。
resapwn="true":复位属性,该节点停止时,会自动重启,默认为false。
required="true":必要节点,当该节点终止时,launch文件中的其他节点也被终止。
ns="namespace":命名空间,为节点内的相对名称添加命名空间前缀。
args="arguments":节点需要的输入参数。
三.参数设置
launch文件支持参数设置的功能,类似于编程语言中的变量声明。
1.<param> ---代表parameter,是ros系统运行中的参数,存储在参数服务器中。
在launch文件中通过<param>元素加载parameter;launch文件执行后,parameter就加载到ROS的参数服务器上了。
使用方法:
<param name="namespace/param_name" value="param_value">
运行launch文件后,"namespace/param_name"这个parameter的值就设置为"param_value",并且加载到ROS参数服务器上了。
name="namespace/param_name":定义参数名。参数名中可以包含命名空间,但指定的全局名称应该避免。
value="param_value":定义参数的值。
其余属性:textfile
textfile="$(find package_name)/path/file.txt"
该文件的内容以字符串的形式读取和存储。该文件必须是本地可访问的。
2.<rosparam> ---加载多个参数
在很多复杂的系统中参数的数量很多,如果用<param>一个一个地设置会非常麻烦,ROS就提供了<rosparam>这种加载方式:
<rosparam file="$(find 2dnav_pr2)/config/costmap_common_params.yaml" command="load" ns="local_costmap"/>
<rosparam>可以帮助我们将一个YAML格式文件中的参数全部加载到ROS参数服务器中,需要设置command属性为“load”,还可以选择设置命名空间“ns”。
3.<arg>---代表argument
argument是另外一个概念,类似于launch文件内部的局部变量,仅限于launch文件使用,便于launch文件的重构,和ROS节点内部的实现没有关系。它可以通过指定值来创建更多能重复使用和配置的文件。arg声明是针对单一启动文件,就像是一种方法中的局部参数一样。必须明确传递arg值到被包含的文件中,就像在方法调用中一样。有三种调用格式:
(1)声明参数arg_name。arg_name既可以作为命令行参数传递,也可以通过<include>传递(如果被包含的话)
<arg name="arg_name"/>
(2)声明有默认值arg_value的arg_name。arg_name能被覆盖(通过命令行参数传递(顶层),也可以通过<include>传递(如果被包含的话))。
<arg name="arg_name" default="arg_value"/>
(3)声明有常值的arg_name。arg_name不能被重写。这种用法保证了启动文件内部的参数化
<arg name="arg_name" value="bar">
launch文件中需要使用到argument时,可以使用如下方式调用:
<param name="foo" value="$(arg arg_name"/>
<node name="node" pkg="package" type="type" args="$(arg arg_name)"/>
四.重映射机制---<remp>
ROS提供一种重映射的机制,简单来说就是取别名,类似于C++中的别名机制,我们不需要修改别人功能包的接口,只需要将接口名称重映射一下,取个别名,我们的系统就认识了(接口的数据类型必须相同)。launch文件中的<remap>标签可以帮我们实现这个重映射的功能。
<remp>标签允许通过名称映射参数到ROS节点,其适用于在其范围内随后的所有声明。用法如下:
<remap from="original_name" to="new_name"/>
from="original_name":定义需要映射的参数名称
to="new_name":定义目标名称
五.嵌套复用---<include>
在复杂的系统当中,launch文件往往有很多,这些launch文件之间也会存在依赖关系。如果需要直接复用一个已有launch文件中的内容,可以使用<include>标签包含其他launch文件,这和C语言中的include几乎是一样的。使用方式:
<include file="$(dirname)/other.launch"/>