我们都知道在使用ROS时,启动一个节点我们可以使用rosrun启动一个节点!但是如果要启动多个节点呢?是不是得一个个都得启动!是不是感觉特别麻烦和累赘!don't worry!ROS已经帮我们考虑好了!那就是launch 文件,我们可以在launch文件编写多个node节点,然后只需启动launch文件,就可以实现一键启动!
目录
一、launch文件快速使用
我们以turtlesim为例进行编写launch文件!
我们如果要启动一个turtle节点,如下:
rosrun turtlesim turtlesim_node
启动键盘节点,如下:
rosrun turtlesim turtle_teleop_key
需要两步!而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>
node pkg:功能包名
type:节点名
name:自定义名称
output:输出到屏幕
运行只需:
roslaunch launch_learning start_turtle.launch
launch_learning:功能包名
start_turtle.launch:launch文件名
注:启动launch文件就不需要启动roscore了!
二、launch文件一些配置
1、launch根标签设置
当我们的launch文件已经弃用或者过时,可以添加备注,让其他使用者知道弃用情况!
<launch deprecated = "该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>
在launch根标签加入 deprecated="该launch文件已经过时,建议不使用"
2、launch的node标签
①属性
- pkg:功能包名(常用)
- type:node节点名(常用)
- name:自定义节点名(常用)
- args:参数(将参数传递给节点)
- respawn:如果节点退出,是否自动重启(true/false)<这个在后续的激光雷达启动时十分有用,若异常断开,可以自动重连>(实用)
- respawn_delay="N"(若respawn为true,那么延迟N秒后启动节点)
- required:(true/false)若为true,如果该节点退出,将结束整个roslaunch
- ns="xxx" 添加命名空间namespace(目的是防止重名)
3、launch文件的include标签(常用)
我们都知道,不可能把所以launch代码都放在一块,显得十分臃肿,因此可以采用include标签进行代码复用!
- file="$(find 功能包名)/xxx/xxx.launch"
<launch>
<include file="$(find launch_learning)/launch/start_turtle.launch" />
</launch>
4、launch文件的remap标签(实用)
我们可以看到下图,启动turtle节点和turtle的键盘控制节点,然后启动键盘控制节点,我们发现新启动的键盘控制节点并不能控制小乌龟,原因在于话题名称不对应,一个是/cmd_vel 另一个是/turtle1/cmd_vel ,如果想要新启动的键盘控制节点控制小乌龟移动,那就可以采用remap进行话题重命名!
<launch>
<!-- 启动显示界面节点 -->
<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>
5、launch文件的param标签
- <param name ="xxx" type="xx" value="xx" />
<launch>
<param name="param_A" type="int" value="10"/>
<!-- 启动显示界面节点 -->
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" >
<param name="param_B" type="double" value="3.1415"/>
</node>
<!-- 启动键盘控制节点 -->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/>
</launch>
param放置的外置的区别是后者添加了命名空间
6、launch文件的rosparam
<rosparam>标签可以从yaml文件中导入参数,或者将参数导出到yaml文件
①导入参数
有点像param标签,但是区别在于rosparam可以导入yaml文件一次性导入参数!
<launch>
<rosparam command="load" file="$(find launch_learning)/launch/params.yaml" />
<!-- 启动显示界面节点 -->
<node pkg="turtlesim" type="turtlesim_node" name="my_turtle" output="screen" >
<rosparam command="load" file="$(find launch_learning)/launch/params.yaml" />
</node>
<!-- 启动键盘控制节点 -->
<node pkg="turtlesim" type="turtle_teleop_key" name="my_key" output="screen"/>
</launch>
②导出参数
<rosparam command="dump" file="$(find launch_learning)/launch/params_out.yaml" />
③删除参数(用的少)
<rosparam command="delete" param="bg_B" />
7、launch文件的group标签
我们都知道如果启动两个相同的节点,后一个节点会把前一个节点干掉!但如何两个都启动呢!那就需要使用group这个标签了!
<launch>
<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>
我们可以发现启动了两个小乌龟界面,话题也更新了两个不一样的命名空间的话题!这样就可以两个相同的节点同时启动了!
8、launch文件的arg标签
<launch>
<arg name="car_length" default="0.55" />
<arg name="car_width" default="0.6" />
<arg name="car_height" default="0.3" />
<param name="A" value="$(arg car_length)"/>
<param name="B" value="$(arg car_width)"/>
<param name="C" value="$(arg car_height)"/>
</launch>
如果在启动launch文件没有设置参数的话,就默认使用default的参数值
也可以在启动launch文件时设置参数,如下:
roslaunch launch_learning arg.launch car_length:=0.9 car_width:=0.1 car_height:=0.99