ROS中的launch启动文件


launch启动文件

到目前为止,每当我们需要运行一个ROS节点或工具时,都需要打开一个新的终端运行一个命令。当系统中的节点数量不断增加时,“每个节点一个终端”的模式会变得非常麻烦。那么有没有一种方式可以一次性启动所有节点呢?答案当然是肯定的。

启动文件(Launch File)便是ROS中一种同时启动多个节点的途径,它还可以自动启动ROS Master节点管理器,并且可以实现每个节点的各种配置,为多个节点的操作提供很大便利。

1 基本元素

·首先来看一个简单的launch文件,对其产生初步的概念。

<launch>
    <node  pkg="turtlesim"  name="sim1"  type="turtlesim_node"/>
    <node  pkg="turtlesim"  name="sim2"  type="turtlesim_node"/>
</launch>

这是一个简单而完整的launch文件,采用XML的形式进行描述,包含一个根元素<launch>和两个节点元素<node>

1.1 <launch>

XML文件必须包含一个根元素,launch文件中的根元素采用标签定义,文件中的其他内容都必须包含在这个标签中:

<launch></launch>

1.2 <node>

启动文件的核心是启动ROS节点,采用<node>标签定义,语法如下:

<node  pkg="package-name"  type="executable-name"  name="node-name"  />

从上面的定义规则可以看出,在启动文件中启动一个节点需要三个属性:pkg、type和name。其中pkg定义节点所在的功能包名称,type定义节点的可执行文件名称,这两个属性等同于在终端中使用rosrun命令执行节点时的输入参数。name属性用来定义节点运行的名称,将覆盖节点中init()赋予节点的名称。这是三个最常用的属性,在某些情况下,我们还有可能用到以下属性。
·output=”screen”:将节点的标准输出打印到终端屏幕,默认输出为日志文档。
·respawn=”true”:复位属性,该节点停止时,会自动重启,默认为false。
·required=”true”:必要节点,当该节点终止时,launch文件中的其他节点也被终止。
·ns=”namespace”:命名空间,为节点内的相对名称添加命名空间前缀。
·args=”arguments”:节点需要的输入参数。
实际应用中的launch文件往往会更加复杂,使用的标签也会更多,如本书后续内容中一个启动机器人的launch文件如下:

<launch>
    <node  pkg="mrobot_bringup"  type="mrobot_bringup"  name="mrobot_bringup"  output=  "screen"  />
    <arg  name="urdf_file"  default="$(find  xacro)/xacro  --inorder  '$(find  mrobot_  description)/urdf/mrobot_with_rplidar.urdf.xacro'"  />
    <param  name="robot_description"  command="$(arg  urdf_file)"  />
    <node  name="joint_state_publisher"  pkg="joint_state_publisher"  type="joint_state_publisher"  />
    <node  pkg="robot_state_publisher"  type="robot_state_publisher"  name="state_publisher">
    <param  name="publish_frequency"  type="double"  value="5.0"  />
    </node>
    <node  name="base2laser"  pkg="tf"  type="static_transform_publisher"  args="0  0  0  0  0  0  1  /base_link  /laser  50"/>
    <node  pkg="robot_pose_ekf"  type="robot_pose_ekf"  name="robot_pose_ekf">
    <remap  from="robot_pose_ekf/odom_combined"  to="odom_combined"/>
    <param  name="freq"  value="10.0"/><param  name="sensor_timeout"  value="1.0"/>
    <param  name="publish_tf"  value="true"/><param  name="odom_used"  value="true"/>
    <param  name="imu_used"  value="false"/><param  name="vo_used"  value="false"/>
    <param  name="output_frame"  value="odom"/>
    </node>
    <include  file="$(find  mrobot_bringup)/launch/rplidar.launch"  />
</launch>

目前,我们只关注其中的标签元素,除了上面介绍的<launch><node>,这里还出现了<arg><param><remap>,这些都是常用的标签元素。

2 参数设置

为了方便设置和修改,launch文件支持参数设置的功能,类似于编程语言中的变量声明。关于参数设置的标签元素有两个:<param><arg>,一个代表parameter,另一个代表argument。这两个标签元素翻译成中文都是“参数”的意思,但是这两个“参数”的意义是完全不同的。

2.1 <param>

parameter是ROS系统运行中的参数,存储在参数服务器中。在launch文件中通过元素加载parameter;launch文件执行后,parameter就加载到ROS的参数服务器上了。每个活跃的节点都可以通过ros::param::get()接口来获取parameter的值,用户也可以在终端中通过rosparam命令获得parameter的值。
<param>的使用方法如下:

<param  name="output_frame"  value="odom"/>

运行launch文件后,output_frame这个parameter的值就设置为odom,并且加载到ROS参数服务器上了。但是在很多复杂的系统中参数的数量很多,如果这样一个一个地设置会非常麻烦,ROS也为我们提供了另外一种类似的参数(<rosparam>)加载方式:

<rosparam  file="$(find  2dnav_pr2)/config/costmap_common_params.yaml"  command="load"  ns="local_costmap"  />

<rosparam>可以帮助我们将一个YAML格式文件中的参数全部加载到ROS参数服务器中,需要设置command属性为“load”,还可以选择设置命名空间“ns”。

2.2<arg>

argument是另外一个概念,类似于launch文件内部的局部变量,仅限于launch文件使用,便于launch文件的重构,与ROS节点内部的实现没有关系。
设置argument使用<arg>标签元素,语法如下:

<arg  name="arg-name"  default=  "arg-value"/>

launch文件中需要使用到argument时,可以使用如下方式调用:

<param  name="foo"  value="$(arg  arg-name)"  />
<node  name="node"  pkg="package"  type="type  "  args="$(arg  arg-name)"  />

3 重映射机制

ROS的设计目标是提高代码的复用率,所以ROS社区中的很多功能包我们都可以拿来直接使用,而不需要关注功能包的内部实现。那么问题来了,别人的功能包的接口不一定和我们的系统兼容呀?
ROS提供一种重映射的机制,简单来说就是取别名,类似于C++中的别名机制,我们不需要修改别人的功能包的接口,只需要将接口名称重映射一下,取一个别名,我们的系统就认识了(接口的数据类型必须相同)。launch文件中的<remap>标签可以帮助我们实现这个重映射功能。
比如turtlebot的键盘控制节点发布的速度控制指令话题可能是/turtlebot/cmd_vel,但是我们自己的机器人订阅的速度控制话题是/cmd_vel,这时使用就可以轻松解决问题,将/turtlebot/cmd_vel重映射为/cmd_vel,我们的机器人就可以接收到速度控制指令了:

<remap  from="/turtlebot/cmd_vel"  to="/cmd_vel"/>

重映射机制在ROS中的使用非常广泛,也非常重要,方法不止这一种,也可以在终端中实现重映射。

4 嵌套复用

在复杂的系统中,launch文件往往有很多,这些launch文件之间也会存在依赖关系。如果要直接复用一个已有launch文件中的内容,可以使用<include>标签包含其他launch文件,这与C语言中的include几乎是一样的。

<include  file="$(dirname)/other.launch"  />

launch是ROS框架中非常实用、灵活的功能,它类似于一种高级编程语言,可以帮助我们管理启动系统时的方方面面。在使用ROS的过程中,很多情况下我们并不需要编写大量代码,仅需要使用已有的功能包,编辑一下launch文件就可以完成很多机器人功能。
本节仅介绍了launch中最为常用的一些标签元素,还有更多高级的标签元素可以通过访问roslaunch/XML - ROS Wiki来学习。

参考文献:

[1] ROS机器人开发实践,古月居


文章作者: CaoDong street
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 CaoDong street !
  目录