一、概念
Launch文件是ROS提供的,可以同时运行多个nodes的文件。Launch文件以一种特殊的XML格式编写,在ROS packages中使用广泛。相较于rosrun, rosrun只能运行一个node, roslaunch可以同时运行多个node,而且roslaunch运行前会检测rosmaster是否启动,如果没启动则自动启动。
二、新建launch文件
launch文件一般以.launch后缀作为文件名,放在package的launch文件夹下, Launch文件是XML文件。
三、launch文件中标签
3.1 launch标签
每个XML文件必须有一个root element。而launch文件的root element由一对launch 标签定义。
<launch>
...
</launch>
Launch文件中的其他elements必须都在这一对tags之间。
launch标签中有一个属性:deprecated="弃用声明",可用来告知用户当前的launch文件已经弃用
3.2 node标签
launch文件的核心是一系列node elements,每个node element启动一个node。node element如下:
<node pkg=”package_name” type=”executable_name” name=”node_name”/>
每个node节点都是一个rosrun。并且每个node节点中都必须包含pkg,type,name三个属性,还可以包含output,respawn,required,ns等属性。
1.属性
pkg="包名" 节点所属的包
-
type="nodeType" 节点类型(与之相同名称的可执行文件名,即如果是py文件则 文件名.py,如果是cpp文件直接写编译后生成的可执行文件即可)
-
name="nodeName"
节点名称(在 ROS 网络拓扑中节点的名称)
-
args="xxx xxx xxx" (可选) :将参数传递给节点
-
machine="机器名" : 在指定机器上启动节点
-
respawn="true | false" (可选):如果节点退出,是否自动重启
-
respawn_delay=" N" (可选):如果 respawn 为 true, 那么延迟 N 秒后启动节点
-
required="true | false" (可选):该节点是否必须,如果为 true,那么如果该节点退出,将杀死整个 roslaunch
-
ns="xxx" (可选):在指定命名空间 xxx 中启动节点,命名空间即ros网络拓扑中节点前缀,这样做有助于避免节点重复
-
output="log | screen" (可选):日志发送目标,可以设置为 log 日志文件,或 screen 屏幕,默认是 log
2.子级标签
-
env 环境变量设置
-
remap 重映射节点名称
-
rosparam 参数设置
-
param 参数设置
关于子级标签使用后边会一起介绍
3.3 include标签
include标签可以导入另一个launch文件到当前文件,类似于C语言的头文件包含。
用法如下:
1.属性
-
file="$(find 包名)/xxx/xxx.launch":要包含的文件路径
-
ns="xxx" (可选):在指定命名空间导入文件
具体用法:
<include file="$(find pckname)/launch/filename.launch" />
2.子级标签
-
env 环境变量设置
-
arg 将参数传递给被包含的文件
3.4 remap标签
重映射:用于话题的重命名,有的时候无论是ros系统提供的话题还是自己定义的话题,话题名称已经固定了。同时ros系统或者自己定义的订阅者,需要订阅名称也已经写完了。但有的时候会出现订阅者订阅的话题和发布者发布的话题名称不一致的情况,这个时候就可以用remap进行话题名称重映射。你可以选择将发布者发布的话题名称重映射也可以选择将订阅者订阅的话题进行重映射。
1.属性
-
from="xxx":原始话题名称
-
to="yyy":目标名称
<remap from=:"着命名空间的话题名" to ="新话题名"
2. 子级标签
无
例如
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen">
<remap from "/turtle/cmd" to="/cmd_vel"/>
</node>
1,当remap和node平行时,from和to可以为launch文件中任意节点。
2,当remap处于节点内部时,from必须为当前节点所定义的内容,to可以是launch文件中任意节点。
3.5 param 标签
<param>
标签主要用于在参数服务器上设置参数
1.属性
-
name="命名空间/参数名"
参数名称,可以包含命名空间
-
value="xxx" (可选)
定义参数值,如果此处省略,必须指定外部文件作为参数源
-
type="str | int | double | bool | yaml" (可选)
指定参数类型,如果未指定,roslaunch 会尝试确定参数类型,规则如下:
-
如果包含 '.' 的数字解析未浮点型,否则为整型
-
"true" 和 "false" 是 bool 值(不区分大小写)
-
其他是字符串
-
2.子级标签
- 无
param标签可以在node标签使用也可以在node标签外使用,但是需要注意的是如果在node标签内使用param设置参数,则声明的参数是私有命名空间中的参数。(私有命名空间的参数有什么特殊的吗?别的节点不能改?)
<launch>
<param name=param_A" type="int" value="4" />
<node pkg="turtlesim tyoe="turtlesim_node" name="my_turtle" output="screen">
<param name=param_B" type="double" value="3.14" />
</node>
<node pkg="turtlesim tyoe="turtle_teleop_key" name="my_key" output="screen"/>
</launch>
3.6 rosparam 标签
<param>
标签主要用于在参数服务器上设置参数,<rosparam>
标签可以从 YAML 文件导入参数,或将参数导出到 YAML 文件,也可以用来删除参数,<rosparam>
标签在<node>
标签中时被视为私有。
1.属性
-
command="load | dump | delete" (可选,默认 load)
加载、导出或删除参数
-
file="$(find xxxxx)/xxx/yyy...."
加载或导出到的 yaml 文件
-
param="参数名称"
-
ns="命名空间" (可选)
2.子级标签
- 无
例1 从.yaml文件中加载参数
<launch>
<param name=param_A" type="int" value="4" />
<rosparam command="load" file="$(find launch_basic)/launch/params.yaml"/>
<node pkg="turtlesim tyoe="turtlesim_node" name="my_turtle" output="screen">
<param name=param_B" type="double" value="3.14" />
<rosparam command="load" file="$(find launch_basic)/launch/params.yaml"/>
</node>
<node pkg="turtlesim tyoe="turtle_teleop_key" name="my_key" output="screen"/>
</launch>
rosparam标签可以在node标签内使用也可以在node标签外使用,但是需要注意的是如果在node标签内使用rosparam设置参数,则声明的参数是私有命名空间中的参数。
例2 将当前活跃参数导出到.yaml文件
需要注意的是,rosparam无论是在node的标签内还是在node标签外,ros系统都会先执行该标签。因此如果你想导出当前系统中活跃的参数,你需要再建立一个.launch文件。
<rosparam command="dump" file="$(find pckname)/launch/params_out.yaml"/>
例3 删除当前活跃的参数
<rosparam command=""delete" param="参数名" />
3.7 group 标签
<group>
标签可以对节点分组,具有 ns 属性,可以让节点归属某个命名空间
1.属性
-
ns="名称空间" (可选)
-
clear_params="true | false" (可选)
启动前,是否删除组名称空间的所有参数(慎用....此功能危险)
2.子级标签
- 除了launch 标签外的其他标签
<launch>
<group ns="first">
<node pkg="turtlrsim" type="turtlesim_node" name="my_turtle" output="screen"/>
<node pkg="turtlrsim" type="turtle_teleop_key" name="my_key" output="screen"/>
</group>
<group ns="second">
<node pkg="turtlrsim" type="turtlesim_node" name="my_turtle" output="screen"/>
<node pkg="turtlrsim" type="turtle_teleop_key" name="my_key" output="screen"/>
</group>
可以看到两个分组中node节点一模一样,但是运行时不会报错,因为命名空间不一样。
3.8 arg 标签
<arg>
标签是用于动态传参,类似于函数宏定义,可以增强launch文件的灵活性
1.属性
-
name="参数名称"
-
default="默认值" (可选)
-
value="数值" (可选) :不可以与 default 并存
-
doc="描述":参数说明
2.子级标签
- 无
比如有一个长度参数,好几个变量都用。那这个时候我就可以宏定义一下,之后再为变量赋值的时候直接调用这个宏参数即可。
四、运行launch文件
运行前先source一下:source devel/setup.bash
然后运行如下指令:
roslaunch pckname filename.launch
参考:4.2.8 launch文件标签之arg · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程