概念:launch文件是一个XML格式的文件,可以启动本地和远程的多个节点,还可以在参数服务器中设置参数。
作用:简化节点的配置与启动,提高ROS程序的启动效率。
1.在功能包下添加include文件夹,在文件夹内新建xxx.launch文件,编辑launch文件
<launch>
<!--启动的节点-->
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
<!--键盘控制节点-->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</launch>
2.调用launch文件
$roslaunch 功能包名 xxx.launch
注意:roslaunch命令执行launch文件时,首先会判断是否启动了roscore,如果启动了,则不再启动,否则,会自动调用roscore
---------------------------------------------------------------------------------------------------------------------------------
launch文件标签之launch
<launch>标签是所有alunch文件的根标签,充当其他标签的容器
1.属性
deprecated=“弃用声明”
告知用户当前launch文件已经弃用,运行可以正常运行,只是会多一行红色”弃用声明“
2.子级标签
所有其他标签都是launch的子级
<launch deprecated="此文件已经过时,不建议使用!">
<!--启动的节点-->
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
<!--键盘控制节点-->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</launch>
---------------------------------------------------------------------------------------------------------------------------------launch文件标签之node
<node>标签用于指定ROS节点,是最常见的标签,需要注意的是:roslaunch命令不能保证按照node的声明顺序来启动节点(节点的启动是多进程的)。
1.属性
pkg=“包名” 节点所属的包
type="nodeType" 节点类型(与之相同名称的可执行文件)
name="nodeName" 节点名称(在ROS网络拓扑中节点的名称)
args="xxx xxx xxx"(可选) 将参数传递给节点
machine="机器名" 在指定机器上启动节点
respawn="true | false"(可选) 如果节点退出,是否自动重启,true会自动重启
respawn_delay="N"(可选) 如果respawn为true,那么延迟N秒后启动节点
required="true | false"(可选) 该节点是否必须,如果为true,那么如果该节点退出,将杀死整个roslaunch
ns="xxx"(可选) 在指定命名空间xxx中启动节点
clear_params="true | false"(可选) 在启动前,删除节点的私有空间的所有参数
output="log | screen"(可选) 日志发送目标,可以设置为log日志文件,或screen屏幕默认是log
2.子级标签
env环境变量设置
remap重映射节点名称
rosparam参数设置
param参数设置
<launch deprecated="此文件已经过时,不建议使用!">
<!--启动的节点-->
<!-- respawn="true" 节点关闭后自动重启-->
<!-- required="true" 节点退出后,关闭整个系统-->
<!-- ns="hello" 设置节点的命名空间-->
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
<!--键盘控制节点-->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</launch>
---------------------------------------------------------------------------------------------------------------------------------launch文件标签之include
include标签用于将另一个xml格式的launch文件导入到当前文件
1.属性
file="$(find 包名)/xxx/xxx.launch" 要包含的文件路径
ns="xxx”(可选) 在指定命名空间导入文件
2.子级标签
env环境变量设置
arg将参数传递给被包含的文件
<!--需要复用start_turtle.launch-->
<launch>
<!--包含-->
<include file="$(find launch01_basic)/launch/start_turtle.launch" />
<!--其他节点-->
</launch>
---------------------------------------------------------------------------------------------------------------------------------launch文件标签之remap
remap标签用于话题重命名
1.属性
from="xxx" 原始话题名称
to="yyy" 目标名称
<launch deprecated="此文件已经过时,不建议使用!">
<!--启动的节点-->
<!-- respawn="true" 节点关闭后自动重启-->
<!-- required="true" 节点退出后,关闭整个系统-->
<!-- ns="hello" 设置节点的命名空间-->
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" >
<remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
</node>
<!--键盘控制节点-->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</launch>
重命名后可以使用如下命令来控制乌龟运动
$rosrun teleop_twist_keyboard teleop_twist_keyboard.py
如果显示没有此功能包,可以通过如下命令进行下载
sudo apt-get install ros-noetic-teleop-twist-keyboard
注意:其中的noetic需要替换成自己相应的ROS版本
---------------------------------------------------------------------------------------------------------------------------------launch文件标签之param
<param>标签主要用于在参数服务器上设置参数,参数源可以在标签中通过value指定,也可以通过外部文件加载,在<node>标签中时,相当于私有命名空间。
1.属性
name="命名空间/参数名" 参数名称,可以包含命名空间
value="xxx"(可选) 定义参数值,如果此处省略,必须指定外部文件作为参数源
type=" str | int | double | bool | yaml "(可选) 指定参数类型,如果未指定,roslaunch会尝试确定参数类型,规则如下:
如果包含'.'的数字分析为浮点型,否则为整型;
"true"和"false"是bool值(不区分大小写);
其他是字符串;
<launch deprecated="此文件已经过时,不建议使用!">
<!--启动的节点-->
<!-- respawn="true" 节点关闭后自动重启-->
<!-- required="true" 节点退出后,关闭整个系统-->
<!-- ns="hello" 设置节点的命名空间-->
<!--param使用:向参数服务器设置参数-->
<!--格式1:launch下,node外-->
<param name="param_A" type="int" value="100"/>
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" >
<remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
<!--格式2:node下-->
<param name="param_B" type="double" value="3.14" />
</node>
<!--键盘控制节点-->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</launch>
---------------------------------------------------------------------------------------------------------------------------------launch文件标签之rosparam
<rosparam>标签可以从YAML文件导入参数,或将参数导出到YAML文件,也可以用来删除参数,<rosparam>标签在<node>标签中时被视为私有。
1.属性
command=" load | dump | delete "(可选,默认load) 加载、导出或删除参数
file="$(find xxx)/xxx/yyy..." 加载或导出到的yaml文件
param="参数名称"
ns="命名空间"(可选)
新建YAML文件,YAML文件内容如下
<launch deprecated="此文件已经过时,不建议使用!">
<!--启动的节点-->
<!-- respawn="true" 节点关闭后自动重启-->
<!-- required="true" 节点退出后,关闭整个系统-->
<!-- ns="hello" 设置节点的命名空间-->
<!--param使用:向参数服务器设置参数-->
<!--格式1:launch下,node外-->
<param name="param_A" type="int" value="100"/>
<!--rosparam使用:操作参数服务器数据-->
<!--格式1:launch下,node外-->
<rosparam command="load" file="$(find launch01_basic)/launch/params.yaml" />
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" >
<remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
<!--格式2:node下-->
<param name="param_B" type="double" value="3.14" />
<!--格式2:node下-->
<rosparam command="load" file="$(find launch01_basic)/launch/params.yaml" />
</node>
<!--键盘控制节点-->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</launch>
<launch>
<!--导出参数-->
<rosparam command="dump" file="$(find launch01_basic)/launch/params_out.yaml" />
<!--删除参数-->
<rosparam command="delete" param="bg_B" />
</launch>
注意:
YAML文件中:和数字中间需要有空格
<rosparam>如果与<node>在同一个launch文件中时,会先执行<rosparam>标签的内容。所以在导出时,会出现没有数据的现象。需要将<rosparam>单独放入一个launch文件,将其余launch文件运行结束后,再运行属于<rosparam>的launch文件
---------------------------------------------------------------------------------------------------------------------------------launch文件标签之group
<group>标签可以对节点分组,具有ns属性,可以让节点归属某个命名空间
1.属性
ns="命名空间"(可选)
clear_params=" true | false "(可选) 启动前,是否删除组名称空间的所有参数(慎用...此功能危险)
2.子级标签
除了launch标签外的其他标签
<launch>
<!--启动两对乌龟GUI与键盘控制节点-->
<group ns="first">
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</group>
<group ns="second">
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" />
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen" />
</group>
</launch>
---------------------------------------------------------------------------------------------------------------------------------launch文件标签之arg
<arg>标签是用于动态传参,类似于函数的参数,可以增强launch文件的灵活性
1.属性
name="参数名称"
default="默认值"(可选)
value="数值"(可选) 不可以于default并存
doc="描述" 参数说明
<launch>
<!--需求:演示arg的使用,需要设置多个参数,这些参数使用的是同一个值(小车的长度),怎么设置?-->
<!--
<param name="A" value="0.5" />
<param name="B" value="0.5" />
-->
<arg name="car_length" default="0.55" />
<param name="A" value="$(arg car_length)" />
<param name="B" value="$(arg car_length)" />
<param name="C" value="$(arg car_length)" />
</launch>
注意:
可以通过命令行直接修改数据,命令行$roslaunch 功能包名 launch文件文件名 arg名:=0.6,例如:$roslaunch launch01_basic arg.launch car_length:=0.6