ROS中launch文件编写

http://wiki.ros.org/roslaunch

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. 属性和属性之间用空格分隔。
  2. <父标签 属性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” (可选)

如果 respawntrue, 那么延迟 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

这是因为/fangtest_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命令。

roslaunch env
ROS 节点环境变量

1. 属性

name=“环境变量名称”

环境变量的名称。

value=“环境变量值”

将环境变量设置为的值。

  • 17
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值