ROS笔记(一)xxx.launch文件详解

.launch文件是ROS中用于同时启动多个节点的重要文件,在大型的ROS项目中使用频繁,所以掌握其主要元素与属性对ROS系统的应用至关重要:

  • launch标签(元素)说明
  • launch拓展说明
  • parameter说明

1. 标签(元素)说明

- 以launch标签开头以表明是launch文件.

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

- node标签

任何一个launch文件的重点都是:节点(node)元素的集合。启动的每一个节点(node)都要有自己独一无二的名字(name)。如果node(节点)元素有children,就需要显式标签来定义,children比如是:remap 元素或者 param 元素。
显式关闭标签的形式:

 <node pkg="" type="" name=""></node>

pkg 和 type 它们分别是:程序包名字和可执行文件的名字。 ros::init() 函数 提供的 name 信息将会全面的覆盖命名信息(launch文件中node标签里面的name 属性)
拓展属性:

  1. output = “screen”
    Q: 如何将标准输出信息显示在终端(console)上?
    A: 在 node 元素中使用 output 属性:
    output=”screen”
  2. respawn=”true”
    启动完所有请求启动的节点之后,roslaunch 监测每一个节点,让它们保持正常的运行状态。对于每一个节点,当它终止时,我们可以要求 roslaunch 重新启动它.
  3. required=”true”
    当一个必需的节点终止时,roslaunch会做出响应,终止其他所有的节点并退出它自己。
    注意: 由于 required 属性和 respawn 属性的含义,所以如果你给单个的一个节点同时设置了这2个属性,roslaunch 命令会抱怨。所以不要这样设置。
  4. 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)。
  5. ns = “namespace”
    在例子launch文件中,使用这个属性创建了两个无关的 turtlesim 模拟器。
    turtlesim 话题名字(turtle1/cmd_vel、turtle1/color_sensor 和 turtle1/pose )被从全局命名空间移动 到 /sim1 和 /sim2 的单独命名空间里。
  6. args属性
    传递参数到节点. 个人理解,arg参数只在launch文件中合法(相当于局部变量),不直接传给节点,所以需 要通过node中的args属性进行传递.

- remap标签

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

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

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

- include标签

  1. file属性

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

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

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

    这样做是正确的:

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

    这样做是错误的:

    <include file = "find learning_tutrols"/start_demo.launch" />
  2. ns属性
    include 元素也支持 ns 属性,可以让这个文件里的内容推送到一个命名空间里面:

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

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

- arg标签

在launch文件中,要声明一个参数的存在,我们使用arg元素:

<arg name="arg-name" />

声明里面只有一个 name 是起不上什么作用的,这就像是你在程序中定义了一个 int 类型的变量,但 是你并没有使用它一样。(你至少还需要给 arg 元素分配 default 属性或 value 属性)

  1. 给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的值是不允许改变的。
  2. 获取argument的数值

    $(arg arg-name)

    $() 这个符号出现的任何地方,roslaunch命令都将会把它替换成给定argument 的值(value)。
  3. 关于argument的继承
    在argument的传递上有一个限制,就是argument不能传递给 include 元素里包含的子launch文件 使用。这个问题非常重要,因为这个 argument 就像是一个局部变量,它不能被包含的launch文件 所 “继承” 。
    解决这个问题的方法:在 include 元素中插入 arg 元素作为 include 元素的子类(children),就像是这样:

    <include file="path-to-launch-file">
    <arg name="arg-name" value="arg-value"/>
    . . .
    </include>

    注意,这里的 arg 元素不同于我们已经知道的 arg 声明,在 inchude 标签内的arguments是给包含 (included) 的launch文件提供的arguments,不是为本launch文件提供的。
    一种常见的情况是,被包含(included)的launch文件和本launch文件会有共同的参数。在这种情况下,我们希望这些值(values)永远不变。像这样的元素,在这两个地方使用相同的argument name (参数名),要这样做:

    <arg name="arg-name" value="$(arg arg-name)" />

    在这种情况下,第一个 arg-name 和往常一样。第二个 arg-name 是launch文件中提供的。结果是,这两个launch文件中给定的argument具有相同的值(value)。

拓展说明

  • 使用 roslaunch 命令 和 使用 rosrun 命令 单独运行每个节点之间的重要区别
    默认情况下,roslaunch 命令 从启动节点开始,标准输出信息会重定向到一个日志文件中,而不会像 rosrun 命令那样,将 log 信息显示在终端(console)上.
    日志文件所在路径: ∼/.ros/log/run_id/node_name-number-stdout.log
    Q: 如何将标准输出信息显示在终端(console)上?
    A: 在 node 元素中使用 output 属性:
    output=”screen”
    带这个属性启动的节点会将标准输出信息显示在终端的窗口中,而不会保存在日志文件中。这也 解释 了为什么这个带有output=”screen”的节点(node) 的日志文件在上面日志文件列表中丢失的原因。
    扩展: node 元素的 output 属性只能影响这个节点自己。除了 output 属性,我们可以使用 roslaunch命令行工具的 –screen 命令行选项强制性的在终端的窗口中显示所有节点的输出信息。
$ roslaunch --screen package-name launch-file-name
  • 重映射名字
    在启动一个节点的时候,有两种方法创建重映射:
    在终端命令行中启动一个节点时,要重新给这个节点命名:给出一个节点原来的名字和新的名字, 中间用:=分开。 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>
  • argument和parameter有区别
    尽管术语argument和parameter在许多计算机环境中稍微可以互换使用,它们的含义在ROS中有很大的不同。Parameters(参数)在一个运行的ROS系统中是变量(values),它被存储在parameter服务器中,活动(或者叫:运行)的节点通过ros::param::get()函数访问它,并且用户可以通过 rosparam 命令行工具使用它。相比之下,arguments只有在launch文件里合法,它们的值不是直接提供给节点。

parameter说明

All parameters are “owned” by the parameter server rather than by any particular node. This means that parameters—even those created with private names—will continue to exist even after the node they’re intended for has terminated.

在C++文件中,set或者get处理parameter参数
r o s : : param : : s e t ( ” background_r ” , 2 5 5 ) ;
b o o l ok = r o s : : param : : g e t (PARAM_NAME, maxVel ) ;
在launch文件中设置parameter,使用param标签:

<param name="param-name" value="param-value" />

group标签中的param标签的作用等同于rosparam set命令.
node标签中的param标签设置为该节点的子元素.

Parameter names given in param elements that are children of node elements are always resolved as private names, regardless of whether they begin with ∼ or even / .

在launch文件中也支持等同与rosparam load 功能的rosparam标签
用于一次性加载大量的参数

<rosparam command="load" file="path-to-param-file" />

这里的file是.yaml类型.

ROS笔记(一)xxx.launch文件详解相关推荐

  1. Mybatis复习笔记3:映射文件详解

    映射文件详解 参数处理(#和$的区别) #{}:可以获取map中的值或者实体对象属性的值: ${}:可以获取map中的值或者实体对象属性的值: select * from person where i ...

  2. 【c++】——汇编后生成的xxx.o文件详解

    文章目录 1.目标文件的格式 2.目标文件概述 3.深入挖掘test.o 3.1 .text段 3.2 .data段和.rdata段 3.3 bss段 3.4 其他段 4.ELF文件结构描述 4.1 ...

  3. ROS入门笔记(七):详解ROS文件系统

    ROS入门笔记(七):详解ROS文件系统 文章目录 01 Catkin编译系统 1.1 Catkin特点 1.2 Catkin工作原理 1.3 使用`catkin_make`进行编译 02 Catki ...

  4. UCOSII 移植文件详解——笔记

    1.滴答定时器 SysTick 滴答定时器是一个24位的倒计数定时器,当计数到0时,将从RELOAD寄存器中自动重装载定时器初值,只要不关闭SysTick使能位,就将永久不息. SysTick的最大使 ...

  5. [置顶] ros的navigation之———gmapping应用详解(in ros)

    gmapping是一个比较完善的地图构建开源包,使用激光和里程计的数据来生成二维地图.  博主最近也一直在使用gmapping,在前期着实被它卡了好久,因为好多东西不明白(原谅我是ros小白).  现 ...

  6. JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  7. 2接口详解_TS入门笔记2——TS接口进阶详解

    TS入门笔记--TS接口进阶详解 一.为什么需要接口? let obj:object; // 定义了一个只能保存对象的变量 // obj = 1; // obj = "123"; ...

  8. red hat linux yum,Red Hat Enterprise Linux(RHEL)中yum的repo文件详解

    Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定的服务器自动下载 ...

  9. MANIFEST.MF文件详解

    文章目录 一. 一般属性 二. 应用程序相关属性 三. 小程序(Applet)相关属性 四. 扩展标识属性 五. 包扩展属性 六. 签名相关属性 七.自定义属性 JAR 文件是什么? META-INF ...

  10. IP地址和子网划分学习笔记之《IP地址详解》

    在学习IP地址和子网划分前,必须对进制计数有一定了解,尤其是二进制和十进制之间的相互转换,对于我们掌握IP地址和子网的划分非常有帮助,可参看如下目录详文. IP地址和子网划分学习笔记相关篇章: 1.I ...

最新文章

  1. 比特币现金BCH今日事件
  2. 零成本学Arduino单片机之入门
  3. 群晖nas怎么上传整个文件夹_你为什么需要一台NAS(第二期)
  4. MFC动态调用DLL
  5. C语言%.2f四舍五入
  6. JScharts快速入门
  7. java client和servers_“java -server”和“java -client”之间的真正区别?
  8. C导出接口与C++导出接口对比
  9. 1024程序员节 | 近300本python电子书推荐
  10. Android修炼之道—布局优化( 100 喵喵币)
  11. Mapbox使用之glyphs(字体符号)
  12. 蒟蒻的笔记本二、tarjan
  13. Google学术搜索镜像网站搜集
  14. office2020与2016版的不同_Office2016与Office2019,这两个版本有些什么区别
  15. [蓝桥杯]横向打印二叉树 Python满分解法
  16. 用C语言写藏头诗或藏尾诗
  17. HCIA/HCIP使用eNSP模拟STP实验与STP根桥、根端口、指定端口选举方法
  18. Python学习(九)Python缩进规则
  19. 软件工程与计算II-20-软件交付
  20. 如何计算一只股票收盘价比开盘价上涨多少?并筛选出上升上涨超过5%的股票

热门文章

  1. C++根据三个点坐标计算夹角
  2. Unity游戏热更新
  3. Discuz门户模板乱码解决方案
  4. 41-牛栏-最短路径
  5. 云服务器复现PointRCNN代码踩坑总结
  6. 使用C++实现n阶行列式的计算
  7. gwas snp 和_2型糖尿病GWAS关联SNP对miRNA-mRNA互作的影响分析
  8. Opencv python 直方图处理
  9. reactor项目Maven配置
  10. 史丰收速算|2014年蓝桥杯B组题解析第四题-fishers