XML语法提要
roslaunch文件的本质是xml文件,首先要简单了解一些xml相关语法:
1、标签必须闭合
<launch> </launch> //成对的标签闭合,中间可以写内容 <node XXXX /> //当没有中间内容需要写时,也可使用自闭合标签,此时仍然可以为标签添加属性,XXXX内容就代表属性部分
2、使用注释
<!-- 这就是注释 -->
<launch> 标签
<launch>标签是所有roslaunch文件的根元素。它写在最外层,目的是作为其他元素的容器。其中可以包含多种元素标签:
——————————————常用———————————-
<node> 启动节点
<include> 包含其他的roslaunch文件
<param> 对参数服务器进行参数设置
<arg> launch文件内部使用的参数
<remap> 声明映射名
<group> 共享一个名称空间或重新映射组封闭元素
<rosparam> 使用rosparam文件启动设置ROS参数
常用元素标签
1、<node> 启动节点,这是最常用的标签
<node name ="base_controller" pkg="base_controller" type = "base_controller" > </node>
name是给这个节点起的名字,pkg是工作空间中节点包的名称,type是包中需要运行的具体节点,其指向的文件必须有对应的可执行文件。
2、<include>包含其它launch文件,被包含的launch文件将会被一同启动。
<include file="$(find rbx1_nav)/launch/gmapping.launch"/>
3、<param> 对参数服务器进行参数设置,示例如下
<node name ="laser_scan" pkg="laser_scan_publisher_tutorial" type = "laser_scan_publisher"> <param name ="scan" value = "laser" /> </node>
laser_scan_publisher这个节点程序设置了一个可让用户更改的参数,为了传递这个参数,使用<param>标签,name是参数在程序内部的名称,value是给对应参数赋值。
4、<remap> 声明映射名,示例如下
<node pkg="turtlebot_teleop" type="turtlebot_teleop_key" name="turtlebot_teleop_keyboard" output="screen"> <param name="scale_linear" value="0.1" type="double"/> <param name="scale_angular" value="0.4" type="double"/> <remap from="turtlebot_teleop_keyboard/cmd_vel" to="cmd_vel" /> </node>
上述代码启动了一个turtlebot_teleop节点,该节点原本发布了一个消息叫做turtlebot_teleop_keyboard/cmd_vel, 其实这个话题与cmd_vel话题中的消息类型是完全一样的,因为能够发送cmd_vel话题的节点太多了,为了区分,程序设计时使用了节点名称+话题名的方式,此时为了方便订阅,需要将这种话题做一次重映射,使用<remap>标签将turtlebot_teleop_keyboard/cmd_vel话题映射为cmd_vel话题,这样,其他要订阅该话题的节点只需订阅cmd_vel话题即可。
5、<rosparam> 使用rosparam文件启动设置ROS参数,示例如下
<node pkg="move_base" type="move_base" respawn="false" name="move_base" output="screen" clear_params="true"> <rosparam file="$(find rbx1_nav)/config/fake/costmap_common_params.yaml" command="load" ns="global_costmap" /> <rosparam file="$(find rbx1_nav)/config/fake/costmap_common_params.yaml" command="load" ns="local_costmap" /> <rosparam file="$(find rbx1_nav)/config/fake/local_costmap_params.yaml" command="load" /> <rosparam file="$(find rbx1_nav)/config/fake/global_costmap_params.yaml" command="load" /> <rosparam file="$(find rbx1_nav)/config/fake/base_local_planner_params.yaml" command="load" /> </node>
当参数特别多时,全部写在launch文件里就不方便了,为此,可以通过加载文件来传递参数,上述代码从4个文件加载了参数,其中costmap_common_params.yaml文件中的参数值被传递到两个不同的命名空间中。
6、<arg> launch文件内部参数,启动参数。
<arg>这个标签与上述<param>标签翻译完全一致,都是“参数”,但<param>所设置的参数是可以在ros参数服务器中查看并设置的,而<arg>只是当前launch文件所使用的内部参数,外部不可见。
比如,gmapping.launch中有这样一句:
<launch> <arg name="scan_topic" default="scan" /> ………… </launch>
其中,scan_topic这个参数就是说,使用roslaunch启动这个launch文件时,可以传递一个参数,该参数可以让用户指定一个话题名称,如果用户传递了话题参数,则新的话题参数将取代scan,若果没传递参数,scan_topic取默认值scan,你可以这样写:
roslaunch ~/文件路径/gmapping.launch scan_topic:=abc
此时,<arg>标签往往与&(arg scan_topic)相配合使用,该launch文件中凡是出现&(arg scan_topic)的地方,均会被替换为abc,即完成了用户向launch文件传递,比如下面这一句:
<remap from="scan" to="$(arg scan_topic)"/>
上述代码是gmapping.launch中的语句,若用户传递了自定义的参数,则scan会被映射为指定的话题名称,使得gmapping接收的激光话题名称为用户指定的名称。
7、<group>分组标签。
启动节点多了可以分分组,不同组可以使用不同的命名空间,使得节点参数不冲突。该标签套在<node>标签外。
<node>中常用的属性
属性是写在标签里的,比如
<node name ="base_controller" pkg="base_controller" type = "base_controller"> </node>
pkg =“mypackage” 是catkin空间中节点的名称。
type =“nodetype” 节点下的程序名称,必须有一个具有相同名称相应的可执行文件,catkin编译后可自动产生该可执行文件。
name =“nodename” 用户给该节点起的名称。
respawn =“true” 如果节点退出,则自动重新启动节点。
output=“screen”; 将对应node的输出信息打印在屏幕上,如果不写这一句,所有程序中的输出将存在home/.ros/log目录下。
若想显示所有nodes的输出,启动launch文件时还可以添加–screen参数
`roslaunch --screen package_name launch_file_name //此时所有输出会显示在终端
小提示
使用roslaunch时,是不用启动roscore,roscore自动启动(见下图)。
原文链接:https://blog.csdn.net/lingchen2348/article/details/79661114