一、定义
Launch文件:通过XML文件实现多节点的配置和启动(可自动启动ROSMaster)

二、常用语法
1. 根标签
<launch> - launch文件中的根元素采用<launch>标签定义
<launch>表示开始;<launch>表示结束;
2. 启动节点
<node pkg = "package-name"type="executable-name" name="node-name" />
- pkg:节点所在的功能包名称
- type:节点的可执行文件名称
- name:节点运行时的名称
- output、respwan、required、args
output 用来控制某个节点是不是要把他的日志信息打印到当前终端。
respawn用来控制节点,如果启动运行突然挂掉,需不需要重启。
required代表该节点是否必须要求启动。
ns代表命名空间

3. 参数设置
-
<param>/<rosparam> (设置ROS系统运行中的参数,存储到参数服务器中;存储一个参数)
<param name = "output_frame" value="odom"/>
- name: 参数名
- value: 参数值
-
加载参数文件中的多个参数
<rosparam file="params.yaml" command="load" ns="params"/> -
<arg> (launch文件内部的局部变量,仅限于launch文件使用)
<arg name="arg-name" default="arg-value"/>
- name: 参数名
- value: 参数值
调用
<param name="foo" value="$(arg arg-name)"/>
这里通过$(arg arg-name)直接调用arg参数对应的value
<node name="node" pkg="package" type="type" args="$(arg arg-name)"/>
通过$(arg arg-name)调用arg参数的name
4. 重映射(<remap>)
重映射ROS计算图资源的命名。
<remap from="/turtlebot/cmd_vel"to="/cmd_vel"/>
- from: 原命名
- to:映射之后的命名
(把/turtlebot/cmd_vel重命名为/cmd_vel)(原来的名字就没有了!)
5. 嵌套(<include>)
包含其他launch文件,类似C语言中头文件的包含。
<include file="$(dirname)/other.launch"/>
- file:包含的其他launch文件路径
三、例子
在工作空间下创建一个learning_launch的功能包,再在里面创建一个以launch命名的文件夹,用来存放launch文件。

1. simple.launch
接下来我们看一个见到那的simple.launch文件

(可以将显示由文本改为XML格式,这样会有高亮显示)
这个launch包含两个节点,类型分别为我们之前在learning_topic创建的文件

接下来我们进行编译并运行
catkin_make
运行luanch文件
roslaunch learning_launch simple.launch
运行结果如下:

可以发现,一个launch文件可以运行多个节点。
2. turtlesim_parameter_config.launch
内容如下:
<launch>
<param name="/turtle_number" value="2"/>
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
<param name="turtle_name1" value="Tom"/>
<param name="turtle_name2" value="Jerry"/>
<rosparam file="$(find learning_launch)/config/param.yaml" command="load"/>
</node>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" output="screen"/>
</launch>
这个launch文件包含了小乌龟和键盘控制节点。
这个文件需要导入参数文件,因此我们再导入参数文件。
接下来我们运行该launch文件
roslaunch learning_launch turtlesim_parameter_config.launch

运行结果如下:
我们再查看一下我们加载的参数:
rosparam list
我们可以发现,参数写在外面和里面的区别:
- 写在外面的参数命令直接就是自己本身的名字;写在里面的参数的命名需要加上前面的节点名 。
- A和B,C和D的区别在于,因为C和D前面加了group,因此命名也需要加上group
3. start_tf_demo_c++.launch
launch文件代码如下:
<launch>
<!-- Turtlesim Node-->
<node pkg="turtlesim" type="turtlesim_node" name="sim"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>
<node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle1" name="turtle1_tf_broadcaster" />
<node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle2" name="turtle2_tf_broadcaster" />
<node pkg="learning_tf" type="turtle_tf_listener" name="listener" />
</launch>
第一个启动我们的海龟仿真器;第二个启动键盘控制;再运行之前我们写的广播器;最后启动我们之前写的监听文件。
运行结果如下:

此时我们可以发现,一个launch文件即可全部运行我们之间写的文件;且launch文件不需要运行roscore。
4. turtlesim_remap.launch
文件代码如下:
<launch>
<include file="$(find learning_launch)/launch/simple.launch" />
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
<remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
</node>
</launch>
(include包含另外一个launch文件(simple.launch);在运行仿真器节点;然后将话题名重命名)
运行结果如下:

此时我们可以发现,话题名已经被重命名(原来的话题名已不存在)。