对于ros中launch文件的解读

参考网址:
1
2
3

1.launch文件的使用方式

roslaunch package-name launch-file-name

注意:
1.在开始任何一个节点前,roslaunch 将会确定 roscore节点是否已经在运行,如果没有,自动启动它。不要与 rosrun命令 混淆,rosrun 只能启动一个节点。roslaunch 命令可以同时启动多个节点。
2.你也可以在使用 roslaunch 启动launch文件的时候没有package-name这部分。要想做到这一点,launch-file-name 文件需要写成绝对路径的形式。只要可以让 roslaunch 命令找到唯一的一个 launch 文件,你就可以不提供 package-name 部分。举例:

roslaunch ~/catkin_ws/src/beginner_turtorls/launch/xxx.launch

2.与launch相关的知识点

2.1 launch

其他的所有元素标签都要写在 <launch>...</launch> 便签之间。

<launch>
    ...
</launch>

2.2 node

2.2.1 node写法举例:

 <node pkg="package-name" type="executable-name name="node-name" />

注意:一定要在node的结尾加上反斜杠/

pkg和type它们与rosrun的两个命令行参数一样,它们分别是:程序包名字和可执行文件的名字name属性指定了一个节点的名字。这个节点程序会调用ros::init()函数内有一个这个节点的name参数,导致这个节点的name被改写,所以这个name属性容易被覆盖。

2.2.2 将标准信息显示在屏幕上

在 node 元素中使用 output 属性:

output="screen"

或者
node元素的output属性只能影响这个节点自己。除了output属性,我们可以使用roslaunch命令行工具的–screen 令行选项强制性的在终端的窗口中显示所有节点的输出信息。

roslaunch --screen package-name launch-file-name

2.2.3 请求重生

启动完所有请求启动的节点之后,roslaunch 监测每一个节点,让它们保持正常的运行状态。对于每一个节点(node),当它终止( terminates)时,我们可以要求 roslaunch 重新启动它,这就是 respawn 属性做的事情:

respawn="true"

2.2.4必需结点

让一个节点可以重生的另一种方法是:宣布这个节点是必需的(require):

required="true"

当一个必需的节点终止时,roslaunch会做出响应,终止其他所有的节点并退出它自己。这种行为机制是有用的。

2.2.5 让每一个节点在单独的终端窗口中启动它们自己

用 roslaunch 命令 的一个潜在的缺点:相比我们原来对每个节点在单独的终端使用 rosrun 命令启动的做法,roslaunch 则是让所有的节点共享同一个终端。 那些只需要生产简单的日志消息文件而不需要终端(console)输入的节点是容易管理的,而那些依赖终端输入的节点,比如 turtle_teleop_key 节点,它可能要优先的保留在独立的终端上。

庆幸的是,roslaunch 提供了一个简单的属性去实现这一点,在 node 元素里使用 launch-prefix 属性:

launch-prefix="command-prefix"

在例子launch文件中,我们给 teleoperation 节点使用了这个属性:

launch-prefix="xterm -e"

因为这个属性,启动这个 node 元素的 rosrun 命令大致相当于:

xterm -e rosrun turtlesim turtle_teleop_key

正如我们所知道的,xterm 命令会开一个新的终端窗口。 -e 参数告诉 xterm :执行其命令行剩余部分(rosrun turtlesim turtle_teleop_key)。

2.2.6 命名空间

在 node 元素中指定 ns 属性:

ns="namespace"

举例如下:

<launch>
    <node
    name="turtlesim_node "
    pkg="turtlesim"
    type="turtlesim_node "
    ns="sim1"
    />
    <node
    pkg="turtlesim"
    type="turtle_teleop_key "
    name="teleop_key"
    required="true"
    launch −prefix="xterm −e"
    ns="sim1"
    />
    <node
    name="turtlesim_node "
    pkg="turtlesim"
    type="turtlesim_node "
    ns="sim2"
    />
    <node
    pkg="a gitr "
    type="pubvel"
    name="velocity_publisher "
    ns="sim2"
    />
</launch>

在这里例子中,turtlesim 话题名字(turtle1/cmd_vel、turtle1/color_sensor 和 turtle1/pose)被从全局命名空间移动到/sim1和/sim2的单独命名空间里。

2.2.7 重映射名字

在启动一个节点的时候,有两种方法创建重映射:

在终端命令行中启动一个节点时,要重新给这个节点命名:给出一个节点原来的名字和新的名字,中间用:=分开。

original-name:=new-name

例如,在运行turtlesim实例时,我们现在想把发布姿态数据的话题/turtle1/pose名称改为:/tim,那么命令就是这样的:

rosrun turtlesim turtlesim_node turtle1/pose:=tim

在launch文件中重新命名:使用 remap 元素:

<remap from="original-name" to="new-name" />

如果这个 remap 是 launch 元素的一个child(子类),与 node 元素同一层级, 并在 launch 元素内的最顶层。那么这个 remapping 将会作用于后续所有的节点。

这个 remap 元素也可以作为 node 元素的一个child(子类)出现。下面这个就是使用模板:

<node node-attributes >
    <remap from="original-name" to="new-name" />
    . . .
</node>

例如:上面命令行命令如果在launch文件中,就是下面这个样子的:

<node pkg="turtlesim" type="turtlesim_node"
    name="turtlesim" >
    <remap from="turtle1/pose" to="tim" />
</node>                                                             

3 include

3.1 file 属性

包含(including)其他文件:

<include file="path-to-launch-file" />

这个 file 属性期望我们添加想要包含的文件的完整路径。但是大多数时候,include 元素使用一个 find 命令来搜索一个程序包,代替一个明确的完整路径:

<include file="$(find package-name)/launch-file-name" 

注意:roslaunch 命令 将会在程序包(package)的子目录里搜索launch文件。 include 元素必须要指定文件的特定路径,你可以使用 find 来找到这个程序包,但是却不能在这个程序包目录里面自动的找到某个子目录里有launch文件。

举例:

这样做是正确的:

<include file = "find learning_tutrols"/launch/start_demo.launch" / >

这样做是错误的:

<include file = "find learning_tutrols"/start_demo.launch" />

3.2 ns命名空间

include 元素也支持 ns 属性,可以让这个文件里的内容推送到一个命名空间里面:

<include file=". . . " ns="namespace" />

一般我们都会给 include 元素设置一个 ns 属性。

3.3 启动参数(Launch arguments)

为了帮助launch文件配置,roslaunch 支持 launch arguments(启动参数),也叫做 arguments 或者 args。它的功能有点像一个可执行程序的局部变量。它的优点是,你可以通过编写launch文件来避免编写重复代码。为少数的信息使用arguements,可以改变程序的运行。

给参数赋值的几种操作:

  • 在命令行中你可以这样做:给 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” />

4.创建组(group)

最后一个要介绍的launch文件特性就是,再来说说:group 元素,它提供了一个方便的方法来在一个大型的launch文件中组织节点。group元素可以达到两个目的:

1 . 组(group)可以把几个节点推送到同一个命名空间中。

<group ns="namespace" />
    . . .
</group>

2 . 组(groups)里面的每一个节点在启动的时候都会给定默认的命名空间。

如果一个已经被分组的节点有自己的 ns 属性,那么结果:被启动的节点的命名空间会出现嵌套的关系: /group-namespace/ns-namespace/node-name 。

3 . 组(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文件的配置变得非常的强大。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值