http://wiki.ros.org/roslaunch/XML
目录
1. launch文件说明
编写:
在src/包名/
下创建launch
目录,然后再这里编写.launch
文件。launch
文件是XML
格式。
对于每个标签,都包括属性和子标签。
编写格式:
<父标签 属性1=值1 属性2=值2>
<子标签1 属性1=值1 属性2=值2 />
<子标签2 属性1=值1 属性2=值2 />
<子标签3 属性1=值1 属性2=值2>
<子标签3的子标签 属性1=值1 属性2=值2>
...
</子标签3>
...
</父标签>
其中
- 属性和属性之间用空格分隔。
<父标签 属性1=值1 属性2=值2> </父标签>
是表示一个标签单元,也可以写成<父标签 属性1=值1 属性2=值2 />
。不同点是第一种可以允许添加子标签。
使用:
roslaunch 包名 xxx.launch
注意:
roslaunch
命令执行launch
文件时,首先会判断是否启动了 roscore
,如果启动了,则不再启动,否则,会自动调用 roscore
。
2. launch 标签
<launch>
标签是所有 launch
文件的根标签,充当其他标签的容器。
2.1. 属性
deprecated
作用是:告知用户当前 launch 文件已经弃用。
<launch deprecated="过时不建议使用!">
</launch>
2.2. 子标签
<launch>
标签是根标签,所以其他标签都是子标签。
3. node标签
<node>
标签用于指定 ROS 节点,是最常见的标签。
需要注意的是: roslaunch
命令不能保证按照 node
的声明顺序来启动节点(因为节点的启动是多进程的)。
3.1. 属性
pkg=“包名”
想要启动的节点所属的功能包。
rosrun xxx xx
中的xxx
与这里的pkg
对应。
type=“nodeType”
节点类型(与之相同名称的可执行文件)
rosrun xxx xx
中的xx
与这里的type
对应。
name=“nodeName”
节点名称(在 ROS 网络拓扑中节点的名称)。
ros::init(argc, argv, nodename);
中的nodename
会被这里的定义的name
覆盖掉。
args=“xxx xxx xxx” (可选)
将参数传递给节点,不同参数之间是空格。
rosrun xxx xx p1 p2
中的p1 p2
和这里的args
对应。
machine=“机器名”
在指定机器上启动节点,分布式启动节点。需要注意的是machine
是通过标签来定义的,传入node
的属性时通过name
属性的值传入。
http://wiki.ros.org/roslaunch/XML/machine
respawn=“true | false” (可选)
如果节点退出,是否自动重启(对于某些重要的功能要自动重启)。
respawn_delay=“N” (可选)
如果 respawn
为 true
, 那么延迟 N 秒后启动节点,注意是要写成"N"
。
required=“true | false” (可选)
该节点是否必须,如果为 true
, 那么如果该节点退出,将杀死整个 roslaunch
,整个系统都关闭。
ns=“xxx” (可选)
在指定命名空间 xxx 中启动节点。很明显它是为了解决节点重名问题的。
需要注意的是,如果某个node
启动时指定了ns
,那么这个node
下的属性都会被放入到这个ns
下。
例如:
在没有指定ns
时,我的两个节点通过话题/fang
来通信,rat_graph
如下:
当我启动test_pub
对应节点时指定了ns="hello"
,那么rat_graph
如下:
这时看不到话题/fang
,使用rostopic list
可以看到:
/fang
/hello/fang
/rosout
/rosout_agg
这是因为/fang
是test_sub
接受的,
/hello/fang
是/hello/test_pub
发布的,
这两者没能建立通信。
一种方案就是启动test_sub
对应节点时也指定ns="hello"
。此时rat_graph
如下:
这样操作可以将这个节点以及对应的话题、服务、参数等都放入了ns="hello"
这个命名空间,减少了可能发生重名的问题。
还有其他方案比如使用 remap 重映射名称
clear_params=“true | false” (可选)
在启动前,删除节点的私有空间的所有参数。一般别用。
output=“log | screen” (可选)
日志发送目标,可以设置为 log
日志文件,或 screen
屏幕,默认是 log
(日志文件)。
3.2. 子标签
env 环境变量设置
remap 重映射名称
rosparam 参数设置
param 参数设置
4. include标签
include标签用于将另一个 xml 格式的 launch 文件导入到当前文件。
4.1. 属性
file=“$(find 包名)/xxx/xxx.launch”
要包含的文件路径。
ns=“xxx” (可选)
在指定命名空间导入文件。
例如
<launch>
<include file="$(find launch01_basic)/launch/start_turtle.launch" ns="test1"/>
<include file="$(find launch01_basic)/launch/start_turtle.launch" ns="test2"/>
</launch>
4.2. 子标签
env 环境变量设置
arg 将参数传递给被包含的文件
5. remap标签
用于重映射名称。
能在代码里被定义的名称都可以被重映射。
例如:节点名、话题名、服务名、参数名等。
5.1. 属性
from=“xxx”
原始名称
to=“yyy”
目标名称
例如:
<launch>
<node pkg="plumbing_pub_sub" type="demo01_pub" name="test_pub" output="screen" ns="hello">
<remap from="/hello/fang" to="/fang" />
</node>
<node pkg="plumbing_pub_sub" type="demo02_sub" name="test_sub" output="screen" />
</launch>
将test_pub
启动后加入到了hello
的命名空间,话题/fang
也变为了/hello/fang
。
使用<remap from="/hello/fang" to="/fang" />
可以将其重新映射回来。
6. param标签
<param>
标签主要用于在参数服务器上设置参数,参数源可以在标签中通过 value
指定,也可以通过外部文件加载,在<node>
标签中时,相当于私有命名空间。
6.1. 属性
name=“命名空间/参数名”
参数名称,可以包含命名空间
value=“xxx” (可选)
定义参数值,如果此处省略,必须指定外部文件作为参数源
type=“str | int | double | bool | yaml” (可选)
指定参数类型,如果未指定,roslaunch 会尝试确定参数类型,规则如下:
1. 如是是数字,包含 '.' 时会被解析为浮点型,否则为整型。
2. "true" 和 "false" 是bool类型(不区分大小写)。
3. 其他是字符串str类型。
4. yaml类型是加载yaml文件。
http://wiki.ros.org/roslaunch/XML/param
例如:
<launch>
<param name="paramA" type="int" value="100" />
<node pkg="plumbing_pub_sub" type="demo01_pub" name="test_pub" output="screen">
<param name="paramB" type="double" value="3.14" />
</node>
<node pkg="plumbing_pub_sub" type="demo02_sub" name="test_sub" output="screen" />
</launch>
通过rosparam list
查看:
/paramA
/test_pub/paramB
这里paramB
在<node>
里定义,所以 paramB
相当于 test_pub
私有空间中的参数(只是这么称呼,并不是真的私有)。
7. rosparam标签
7.1. 属性
<rosparam>
标签可以从YAML
文件导入参数,或将参数导出到YAML
文件,也可以用来删除参数,<rosparam>
标签在<node>
标签中时被视为私有。
<rosparam>
标签也可以用来定义指定参数param
的值,它能提供的类型更多。
command=“load | dump | delete” (可选,默认 load)
加载、导出或删除参数。
使用dump
导出时,因为launch
文件中执行顺序的原因可能不能将所有参数都导出,所以可以自己再编写一个launch
文件在启动所有节点后再导出到yaml文件。
file=“$(find xxxxx)/xxx/yyy…”
加载或导出到的 yaml
文件。
param=“参数名称”
ns=“命名空间” (可选)
例如:
1.从文件导入:
<rosparam command="load" file="$(find plumbing_pub_sub)/launch/params.yaml" />
其中params.yaml
内容为:
bg_R: 100
bg_G: 50
bg_B: 255
2.导出到文件:
使用dump
导出时,因为launch
文件中执行顺序的原因可能不能将所有参数都导出,所以可以自己再编写一个launch
文件在启动所有节点后再导出到yaml文件。
<rosparam command="dump" file="$(find plumbing_pub_sub)/launch/params.yaml" />
3.删除或者增加参数:
<rosparam command="delete" param="my/param" />
<rosparam param="a_list">[1, 2, 3, 4]</rosparam>
<rosparam>
a: 1
b: 2
</rosparam>
http://wiki.ros.org/roslaunch/XML/rosparam
8. group标签
顾名思义,就是分组。
8.1. 属性
ns=“名称空间” (可选)
clear_params=“true | false” (可选)
启动前,是否删除组名称空间的所有参数(慎用…此功能危险)。
8.2. 子标签
除了launch
标签外的其他标签。
用例:
<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>
9. arg标签
<arg>
标签是用于动态传参,类似于函数的参数,可以增强launch
文件的灵活性。
适用于多个变量都用同一值的情况。
9.1. 属性
name=“参数名称”
default=“默认值” (可选)
value=“数值” (可选)
不可以与 default 并存。
doc=“描述”
参数说明
用例:
<launch>
<arg name="length" default="0.5" />
<param name="A" value="$(arg length)" />
<param name="B" value="$(arg length)" />
<param name="C" value="$(arg length)" />
</launch>
用终端指定
roslaunch arg.launch length:=值
需要注意的是,只有launch
文件中对参数length
没有定义value
属性才可以使用此方法指定值,如果已经定义了value
属性,那么会报错。
10. env标签
<env>
标记允许在启动的节点上设置环境变量,有点像linux的export
命令。
1. 属性
name=“环境变量名称”
环境变量的名称。
value=“环境变量值”
将环境变量设置为的值。