概况:
.launch文件是ROS中用于同时启动多个节点的重要文件,在大型的ROS项目中使用频繁。
1.group标签定义命名空间
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
在这里我们创建了两个节点分组并以’命名空间(namespace)’标签来区分,其中一个名为turtulesim1,另一个名为turtlesim2,两个组里面都使用相同的turtlesim节点并命名为’sim’。 这样可以让我们同时启动两个turtlesim模拟器而不会产生命名冲突。(当然如果直接用不同的命名也是可以的,比如一个叫sim_1,一个叫sim_2,这样也可以同时多次启动同一节点).
1. if 或unless 属性
组(groups)可以通过 判别条件 来启用或禁用节点(nodes):
<group if="0-or-1" />
. . .
</group>
如果 if 属性的值是 1 , 标签内封闭的元素(elements)会被包含。如果 if 属性 值是 0 ,则 标签内包含的元素会被忽略。 unless 属性的工作方式类似 if 属性,但是含义颠倒:
<group unless="1-or-0" />
. . .
</group>
当然了,通常我们不会给这些属性使用简单的 0 或 1 这样的赋值。建议:结合 arg 的 $() 技术,它们会将你的launch文件的配置变得非常的强大。
2、Node标签
任何一个launch文件的重点都是:节点(node)元素的集合。启动的每一个节点(node)都要有自己独一无二的名字(name)。如果node(节点)元素有children,就需要显式标签来定义,children比如是:remap 元素或者 param 元素。
显式关闭标签的形式:
<node pkg="" type="" name=""></node>
pkg 和 type 它们分别是:程序包名字和可执行文件的名字。 ros::init() 函数 提供的 name 信息将会全面的覆盖命名信息(launch文件中node标签里面的name 属性)
拓展属性:
output = “screen”
Q: 如何将标准输出信息显示在终端(console)上?
A: 在 node 元素中使用 output 属性:
output=”screen”
respawn=”true”
启动完所有请求启动的节点之后,roslaunch 监测每一个节点,让它们保持正常的运行状态。对于每一个节点,当它终止时,我们可以要求 roslaunch 重新启动它.
required=”true”
当一个必需的节点终止时,roslaunch会做出响应,终止其他所有的节点并退出它自己。
注意: 由于 required 属性和 respawn 属性的含义,所以如果你给单个的一个节点同时设置了这2个属性,roslaunch 命令会抱怨。所以不要这样设置。
launch-prefix = “command-prefix”
roslaunch 命令 的一个潜在的缺点:相比我们原来对每个节点在单独的终端使用 rosrun 命令启动的做法,roslaunch 则是让所有的节点共享同一个终端。 那些只需要生产简单的日志消息文件而不需要终端(console)输入的节点是容易管理的,而那些依赖终端输入的节点,比如 turtle_teleop_key 节点,它可能要优先的保留在独立的终端上。
在例子launch文件中,我们给 teleoperation 节点使用了这个属性:launch-prefix=”xterm -e”.因为这个属性,启动这个 node 元素的 rosrun 命令大致相当于:xterm -e rosrun turtlesim turtle_teleop_key.
xterm 命令会开一个新的终端窗口。 -e 参数告诉 xterm :执行其命令行剩余部分(rosrun turtlesim turtle_teleop_key)。
ns = “namespace”
在例子launch文件中,使用这个属性创建了两个无关的 turtlesim 模拟器。
turtlesim 话题名字(turtle1/cmd_vel、turtle1/color_sensor 和 turtle1/pose )被从全局命名空间移动 到 /sim1 和 /sim2 的单独命名空间里。
args属性
传递参数到节点. 个人理解,arg参数只在launch文件中合法(相当于局部变量),不直接传给节点,所以需 要通过node中的args属性进行传递.
3、remap标签
在launch文件中重新命名:使用 remap 元素:
<remap from="original-name" to="new-name" />
如果这个 remap 是 launch 元素的一个child(子类),与 node 元素同一层级, 并在 launch 元素内的最顶层。那么这个 remapping 将会作用于后续所有的节点。
4、include标签
1. file属性
<include file="path-to-launch-file" />
包含其他文件.这个 file属性期望我们添加想要包含的文件的完整路径。但是大多数时候,include 元素使用一个 find 命令来搜索一个程序包,代替一个明确的完整路径:
2.ns属性
include 元素也支持 ns 属性,可以让这个文件里的内容推送到一个命名空间里面:
<include file=". . . " ns="namespace" />
一般我们都会给 include 元素设置一个 ns 属性。
5、arg标签
在launch文件中,要声明一个参数的存在,我们使用arg元素:
<arg name="arg-name" />
声明里面只有一个 name 是起不上什么作用的,这就像是你在程序中定义了一个 int 类型的变量,但 是你并没有使用它一样。(你至少还需要给 arg 元素分配 default 属性或 value 属性)
- 给arg赋值
在launch文件中使用的每一个argument必须给它分配一个 value(赋值)。有以下两种实现方法:
在命令行中你可以这样做:给 roslaunch 提供一个 value :
roslaunch package-name launch-file-name arg-name:=arg-value
另外,在launch文件中,你可以提供一个 value(赋值) 作为 arg 声明的一部分,使用下面的两种语法之一就可以:<arg name="arg-name" default="arg-value" /> <arg name="arg-name" value="arg-value" />
这两种语法的唯一不同是:命令行可以覆盖default的值,但是不能覆盖 value 。在例子launch文件 中,use_sim3 节点的 default 值为 0,所以它可以通过命令行改变值,就像下面这样:
$ roslaunch agitr triplesim.launch use_sim3:=1
如果我们修改了这个例子launch文件:使用value替换default。那么上面这个命令执行的时候会出 现错误,因为使用 value属性 配置的argument的值是不允许改变的。 - 获取argument的数值
$(arg arg-name)
$() 这个符号出现的任何地方,roslaunch命令都将会把它替换成给定argument 的值(value)。
- 关于argument的继承 在argument的传递上有一个限制,就是argument不能传递给 include 元素里包含的子launch文件 使用。这个问题非常重要,因为这个 argument 就像是一个局部变量,它不能被包含的launch文件 所 “继承” 。
扩展说明:
https://blog.csdn.net/qq_33444963/article/details/77893881