launch在ros仿真开发中是非常的,凡是文件名以 .launch 为后缀都能用 roslaunch 命令启动。相比于逐个打开节点,launch更像是一键启动,只要打开一个文件就能启动、连接所有的节点、话题、服务器等。
xml语法格式如下:
第一行可写不可写一般写上xml文件的声明,因为launch文件的本质也是xml文件,所以在用编译器或者记事本打开的时候编译器会自动识别到这是xml文件(编译器识别不出launch文件是什么样的格式),若没有加的话可以手动更改显示语法。
<?xml version="1.0"?>
后面的段落开始要严格按照xml格式书写如下:
<!--这是一段注释(开头结尾必须都有双减号)-->
<tag1>
<tag2>
<...>
</tag2>
<...>
<tag3>
<...>
</tag3>
<tag4>
<tag5>
<...>
</tag5>
</tag4>
<tag6 ... ... />
</tag1>
xml中以成对出现的标签:<tag>
和</tag>
,或是<tag/>
构成,类似于c语言的{}和python的缩进(xml中的缩进是为了方便阅读不是语法必须的)。
而在launch中有如下几种常用的标签:
<launch>
<!--节点启动标签-->
<node>
<...>
</node>
<!--重映射节点-->
<remap>
<...>
</remap>
<!--启动其他的launch文件,类似c语言的头文件-->
<include>
<...>
</include>
<!--变量赋初值-->
<arg>
<...>
</arg>
<!--变量的替换-->
<param>
<...>
</param>
<rosparam>
<...>
</rosparam>
<group>
<...>
</group>
</launch>
标题内容:
node
node中有如下几个比较常用的值:
<node pkg="pack_name" type="executable_file" name="node_name"/>
<node pkg="pack_name2" type="executable_file2" name="node_name2"/>
pkg:节点所在功能包名称
type:功能包中的可执行文件
name:功能包名字(每个功能包名字都不一样)
还有几个较为少用的值
<node
pkg=""
type=""
name=""
respawn="true"
required="true"
launch-prefix="xterm -e"
output="screen"
ns="some_namespace">
</node>
respawn:若该节点关闭,是否自动重新启动。
required:若该节点关闭,是否关闭其他节点。
launch-prefix:是否开启新新的终端执行,有的节点信息比较重要,为了使其不和其他节点混到一起去,在单独是终端中显示。
output:输出到屏幕上。
ns:将 node 归入不同的 namespace。
remap
<remap from="origin" to="new" />
节点的重映射,方便同一个 node 文件被应用到不同的环境中,用 remap 从外部修改一下 topic 即可,不需要改变源文件。
include
<!--按文件路径寻找目标文件-->
<include file="path-to-launch-file" />
<!--按功能包名字寻找目标文件-->
<include file="$(find package-name)/launch-file-name" />
从格式语句能很明显的看出include就是用来启动其他文件的标签。一般使用的是第二种格式,用find寻找功能包,清晰明了方便阅读并且方便移植。
arg
arg标签用于声明变量和给变量赋值
<!--声明一个变量名为num,但是没有赋值-->
<arg name="num"/>
变量的赋值有两种,一种是默认值(初值),后续可以修改,另一种是固定值,不可修改:
<!--声明一个变量名为num,并赋予初值(默认值)为1,可以通过命令行或者后面的语句修改-->
<arg name="num" default="1"/>
<!--声明一个变量名为num,并赋予固定值为1,后续不可修改-->
<arg name="num" value="1"/>
param
param标签用于在参数服务器中定义一些参数。可以是bool值、文本文件、二进制文件等。
<param name="param_name" type="type1" value="val"/>
<!--type一般可以省略,系统会自动判断-->
可以直接把要赋予的值放在param标签里,也可以调用arg标签声明的变量的值:
<!--先设置默认值-->
<arg name="gui" default="true" />
<!--直接通过变量名调用-->
<param name="use_gui" value="$(arg gui)"/>
<param name="gui" value="ture"/>
<!--写入一个bool类型的变量-->
<param name="param_name" textfile="$(find pkg)/path/file"/>
<!--读取 file 存成 string-->
<param name="param_name" command="$(find pkg)/exe '$(find pkg)/arg.txt'"/>
<param name="param" type="yaml" command="cat '$(find pkg)/*.yaml'"/>
<!--从yaml文件和txt文件中读取变量-->
rosparam
rosparam和param很类似,也是在参数服务器中定义变量值,不同的是rosparam允许批量操作和删除:
<rosparam command="load" file="$(find rosparam)/example.yaml" />
<!--load : 从 YAML 文件中加载一批 param-->
<rosparam command="delete" param="myparam" />
<!--delete: 删除某个 param-->
<!--其他赋值操作-->
<rosparam param="param">[1,2,3,4]</rosparam>
<rosparam>
a: 1
b: 2
</rosparam>
group
用于将一组节点推送到一个单独的命名空间中。
<group ns="wg2">
<remap from="chatter" to="talker"/>
<!--对该 group 中后续所有 node 都有效-->
<node ... />
<node ... >
<remap from="chatter" to="talker1"/>
<!--各个 node 中可以重新设置 remap-->
</node>
</group>
ns:声明命名空间
if
在launch中比较常用的逻辑判断的有if标签
<arg name="num" default="true"/>
<if test="$(arg num)">
<include file="path-to-launch-file" />
</if>
<!--如果num的值为真,就运行一个文件-->
<arg name="num" default="true"/>
<include if="$(arg num)"
file="path-to-launch-file" >
</include>
以上就是笔者整理的launch(xml)文件的一些笔记的全部内容了。(第一次写可能不是很全(狗头保命))。