一、基本元素
首先看一个简单的launch文件:
<launch>
<node pkg="turtlesim" name="sim1" type="turtlesim_node"/>
<node pkg="turtlesim" name="sim2" type="turtlesim_node"/>
</launch>
1、<launch>
XML文件必须要包含一个根元素,launch中的根元素采用<launch>标签定义。
2、<node>
启动文件的核心是启动ros节点,采用node标签定义:
pkg表示包的名称,name表示运行节点的名称,type表示可执行文件名称。
上面三个属性使我们最常用到的属性,在某些情况下,我们还会用到以下属性:
output = "screen" //将节点的输出打印到屏幕终端,默认输出为日志文档。
launch-prefix = "gnome-terminal -e" //为该节点保留一个独立的终端
respawn = "true" //复位属性,该节点停止时,会自动重启,默认为false。
required = "true" //必要节点,该节点终止时,launch文件中的其他节点也会被终止。
ns = "namespace" //命名空间,为节点内的相对名称添加命名空间前缀。
args = "arguments" //节点需要的输入参数
二、参数设置
1、<param>
parameter是ROS系统运行中的参数,存储在参数服务器中。launch文件中通过<param>元素加载parameter;launch文件执行后,parameter就加载到了ROS的参数服务器上。每个活跃的节点都可以通过ros::param::get()接口来获取parameter的值,用户也可以在终端通过rosparam命令获得parameter的值。
<param>方法使用如下:
<param name="my_value" value="1.0"/>
这样就把参数值为1.0 的参数my_value放入了ros参数服务器。
获取该参数可以使用ros::param::get()接口,也可以使用:
nodehandle.param<double>("my_value", my_value_,1.1);来获取
注意参数依次为:参数类型,参数服务器中参数名称,定义的存放参数的名称,默认值
但是在很多复杂的系统中参数的数量很多,如果这样一个一个地设置非常麻烦,ROS提供了另外一种类似的参数加载方式:
<rosparam file="/my_param.yaml" command="load"/>
需要设置command属性为load;
2、<arg>
argument是另外一个概念,类似于launch文件内部的局部变量,仅限于launch文件使用,便于launch文件的重构,和ROS内部节点实现没有关系。语法如下:
<arg name="my_value" default="1.0"/>
如果在launch文件内部需要使用到argument的时候,调用方法如下:
<arg name="my_value" default="1.0"/>
<param name="param_name" value="$(arg my_value)"/>
<node pkg="my_pkg" name="my_name" type="my_type" args="$(arg my_value)"/>
三、重映射机制
ROS的设计目标是提高代码的复用率,ROS社区中很多功能包可以拿过来直接使用,而不需要关心功能包的内部实现。那么问题就来了,别人功能包的接口和我们的系统不一定兼容?
ROS提供了一种重映射机制,简单来说就是起别名,类似于C++的别名机制,我们不需要修改别人功能包的接口,只需要将接口名称重映射一下,起个别名,系统就认识了。
例如:turtlebot键盘控制节点,发布的速度控制指令话题可能是/turtlebot/cmd_vel,但是我们自己的机器人订阅的话题是/cmd_vel,这时候<remap>就可以轻松解决问题,把/turtlebot/cmd_vel重映射为/cmd_vel,我们的机器人就可以接受速度控制指令了。
<remap from="/turtlebot/cmd_vel" to="/cmd_vel"/>
重映射机制在ROS中使用十分广泛,方法不止这一种,也可以在终端rosrun中实现重映射。
四、嵌套复用
简单点说,就是在一个launch文件中启动别的launch文件,使用<include>标签
<include file="/other.launch"/>