一个程序中可能需要启动多个节点,比如ROS内置的小乌龟程序,实现这个案例需要开启roscore节点、小乌龟可视化节点、键盘控制节点,显然是一个很繁琐的方法。对于这样的情况,官方给出的策略是使用launch文件,可以一次性开启多个ros节点。
这里通过launch文件;来实现小乌龟的案例。
1、选定功能包右击 ---> 添加 launch 文件夹
2、选定 launch 文件夹右击 ---> 添加 launch 文件
3、编辑 launch 文件内容
<launch>
<!--添加被执行的节点-->
<!--node pkg="功能包名" type="节点名" name="命个名"/-->
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_key" />
</launch>
a、<launch>
launch文件的根标签,每个launch文件都需要有这样一个根标签,并且文件的所有内容必须包含在这个标签内,只要i有这样一个根标签,运行launch文件时,就会开启roscore
<launch>
...
</launch>
b、<node>
使用launch文件的目的就是要开启多个节点,所以<node>标签是一个重点。
roslaunch 命令不能保证按照 node 的声明顺序来启动节点(节点的启动是多进程的)
<node pkg="功能包名" type="节点名(与之前的可执行文件名相同)" name="给节点命个名" args="参数1 参数2 参数3" output="log|screen"/>
pkg、type、name是三个最主要的参数。
除此之外,<node>还有其他的属性:
args=“xxx xxx xxx” | 将参数传递给节点 |
machine=“机器名” | 在指定机器上启动节点 |
respawn=“true | false” | 如果节点退出,是否自动重启 |
respawn_delay=" N" | 如果 respawn 为 true, 那么延迟 N 秒后启动节点 |
required=“true | false” | 该节点是否必须,如果为 true,那么如果该节点退出,将杀死整个 roslaunch |
ns=“xxx” | 在指定命名空间 xxx 中启动节点 |
clear_params=“true | false” | 在启动前,删除节点的私有空间的所有参数 |
output=“log | screen” | 日志发送目标,可以设置为 log 日志文件,或 screen 屏幕,默认是 log |
c、<include>
include
标签用于将另一个 xml 格式的 launch 文件导入到当前文件,实现复用
<include file="$(find 功能包名)/launch/xxx.launch" ns="xxx" />
- file=" " -> 要包含的文件路径
- ns=" " -> 在指定命名空间导入文件
d、<remap>
用于话题重命名,他是node的一个子级标签
<node pkg=" " type=" " name=" ">
<remap from="原始话题名" to="目标话题名" />
</node>
e、<param>
<param>
标签主要用于在参数服务器上设置参数,是node的一个子级标签,参数源可以在标签中通过 value 指定,也可以通过外部文件加载,在<node>
标签中时,相当于私有命名空间,设置的参数前面会加上这个命名空间。
<!--1、在launch内,node外-->
<param name="param_A" type="int" value="100" />
<!--2、在node内-->
<node pkg=" " type=" " name=" ">
<param name="param_B" type="double" value="1.234" />
</node>
f、<rosparam>
<rosparam>
标签也是node的一个子级标签,可以从 YAML 文件导入参数,或将参数导出到 YAML 文件,也可以用来删除参数,<rosparam>
标签在<node>
标签中时被视为私有。
<!--1、在launch内,node外-->
<rosparam command="load | dump | delete(可选)" file="xxx.yaml" />
<!--2、在node内-->
<node pkg=" " type=" " name=" ">
<rosparam command="load | dump | delete" file="xxx.yaml" />
</node>
g、<group>
<group>
标签可以对节点分组,具有 ns 属性,可以让节点归属某个命名空间。除了launch 标签外的其他标签都是他的子级标签。在不同的组可以实现启动相同的节点。
<group ns="first_group">
...
</group>
<group ns="second_group">
...
</group>
h、<arg>
<arg>
标签是用于动态传参,类似于函数的参数。
- 在launch文件文件中实现传参:
<arg name="car_length" default="0.5" />
<param name="car_A" value="$(arg car_length)" />
<param name="car_B" value="$(arg car_length)" />
<param name="car_C" value="$(arg car_length)" />
- 命令行调用launch传参:
roslaunch 功能包名 xxx.launch arg的name:=值
4、运行launch文件
//roslaunch 功能包名 ***.launch
roslaunch helloworld start_turtle.launch
此时,将光标点在终端,就可以实现用键盘上下左右控制小乌龟了。