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

2023-05-16

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类型.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS笔记(一)xxx.launch文件详解 的相关文章

  • Ubuntu安装ROS

    原文链接 https blog csdn net qq 44830040 article details 106049992 这也是我在ubuntu里面安装ROS的第N次 以前每次安装过程都忘记总结了 导致每次安装ROS都浪费了很多的时间用
  • Ubuntu16.04及ROS Kinetic环境下安装使用RealSense SR300

    Ubuntu16 04及ROS Kinetic环境下安装使用RealSense SR300 1 准备条件 需要安装Ubuntu16 04及ROS Kinetic 2 安装驱动 安装realsense的驱动流程可以根据Github上的官方推荐
  • 安装完成后启动应用程序,并开启UAC

    我一直在使用 WIX Windows Installer XML 技术为我们的产品构建一个安装程序 如果安装后选中该复选框 则预期的行为是启动产品 这已经工作了一段时间了 但我们最近发现 Win 7 和 Vista 的 UAC 正在阻止该应
  • Xcode 错误:无法启动 [目录] -- 无效的主机字符串:'localhost'

    我正在尝试在命令行工具中运行以下代码 import
  • 仅开始活动一次

    我希望我的应用程序仅在应用程序第一次启动时启动活动 有人知道吗 我发现了这个 但它只显示黑屏 public class WhatsNew extends Activity public static final String PREFS N
  • 将 CUDA 添加到 ROS 包

    我想在 ros 包中使用 cuda 有人给我一个简单的例子吗 我尝试使用 cuda 函数构建一个静态库并将该库添加到我的包中 但总是出现链接错误 未定义的引用 cuda 我已经构建了一个可执行文件而不是库并且它可以工作 请帮忙 我自己找到了
  • 应用程序特定信息:应用程序未能及时启动(iOS)?

    这是我的一份崩溃报告的顶部 Apple 是否规定了应用程序启动超时限制 如果是这样 有什么常见的解决方法吗 Elapsed total CPU time seconds 13 700 user 8 580 system 5 120 67 C
  • 不使用ros编译roscpp(使用g++)

    我正在尝试在不使用ROS其余部分的情况下编译roscpp 我只需要订阅一个节点 但该节点拥有使用旧版本ROS的节点 并且由于编译问题 我无法将我的程序与他的程序集成 我从git下载了源代码 https github com ros ros
  • 我的代码的 Boost 更新问题

    我最近将 boost 更新到 1 59 并安装在 usr local 中 我的系统默认安装在 usr 并且是1 46 我使用的是ubuntu 12 04 我的代码库使用 ROS Hydro 机器人操作系统 我有一个相当大的代码库 在更新之前
  • 当 USB 连接时,如何从终端启动任何 iPhone 应用程序?

    在这种情况下 我被困在需要从终端启动任何 iPhone 应用程序的部分 很明显它是USB连接的 谁能帮我吗 我本人通过投入大量时间得到了我的问题的答案 首次获取标识符 ideviceinstaller l 其次复制您要启动的应用程序的标识符
  • ROS安装错误(Ubuntu 16.04中的ROS Kinetic)

    中列出的步骤顺序http wiki ros org kinetic Installat 已被关注 尝试在Ubuntu 16 04中安装ROSkinetic 输入以下命令时出错 sudo apt get install ros kinetic
  • android - 启动另一个应用程序的活动以获取其结果

    我有两个应用程序 A 和 B 我从 A 启动 B 以获取结果 使用以下代码 Intent fmIntent getPackageManager getLaunchIntentForPackage com example B fmIntent
  • ROS 从 python 节点发布数组

    我是 ros python 的新手 我正在尝试从 python ros 节点发布一个一维数组 我使用 Int32MultiArray 但我无法理解多数组中布局的概念 谁能给我解释一下吗 或者还有其他方式发布数组吗 Thanks usr bi
  • 如何订阅“/scan”主题、修改消息并发布到新主题?

    我想通过订阅message ranges来改进turtlebot3的LDS 01传感器 通过应用一些算法修改messange ranges并将其发布到新主题 如下所示 但是当我运行编码时出现错误 错误是 遇到溢出的情况 错误是 运行时警告
  • 如何再次启动外部 JavaFX 程序?即使 JavaFX 程序以 Platform.Exit 结束,Launch 也会阻止这种情况发生

    从我的 MainProject Java 8 开始 我启动了一个 JavaFX 8 类 public void startFX if isRestartPrintModul true fxMain init else setRestartP
  • eclipse 烦恼:调试和启动工具栏不可用

    我正在运行 Windows XP 和 Eclipse 4 2 2 Build id M20130204 1200 并且我丢失了调试和启动工具栏 我尝试过 Windows gt 重置透视 原始值 和窗口 gt 自定义透视 工具栏可见性和命令组
  • ROS中spin和rate.sleep的区别

    我是 ROS 新手 正在尝试了解这个强大的工具 我很困惑spin and rate sleep功能 谁能帮助我了解这两个功能之间的区别以及何时使用每个功能 ros spin and ros spinOnce 负责处理通信事件 例如到达的消息
  • Android开放电话应用

    我只想打开 Android 设备的电话应用程序 我不想向该应用程序提供电话号码 只是想打开它 我正在使用手机应用程序的包名称来打开它 因为我可以使用下面的代码通过该包名称打开任何我想要的应用程序 Intent launchIntent ge
  • 如何使用一个凉亭同时创建两个地图?

    如下图所示 现在我的gazebo正在运行2个slam gmapping包 首先是 turtlebot slam gmapping 发布到 map 主题 第二个是 slam gmapping 发布到与第一个相同的 map 主题 我想创建一个新
  • 安装 ROS 时 Cmake 未检测到 boost-python

    我一直在尝试在我的 Mac 上安装 ROS 并根据不同版本的 boost 使用不同的库解决了错误 然而 似乎有一个库甚至没有检测到 boost python 这是我得到的错误 CMake Error at usr local share c

随机推荐

  • mysql导入数据报错ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it

    参考 xff1a https blog csdn net u011677147 article details 64129606 参考 xff1a http blog itpub net 31015730 viewspace 2152273
  • 第五章

    一 master节点生成密钥 发送至所有node节点 span class token punctuation span root localhost span class token punctuation span span class
  • linux中的&符号

    很好的文章 xff0c 文件描述符那个一直不是很懂 xff1a https www linux com blog learn 2019 2 ampersands and file descriptors bash https www lin
  • 三剑客20190714

    最后wordpress项目 xff1a main yml root 64 jenkins wordpress playbooks cat roles wordpress tasks main yml name Update yum depe
  • office2019中不包含onenote2016

    office2019中不包含onenote office2019中不包含onenote xff0c 而windows自带的onenote界面又大改 xff0c 完全不适应 xff0c 如何下载onenote2016 一 进入onenote下
  • kubernetes 1.15.1 高可用部署 -- 从零开始

    kubernetes 1 15 1 高可用部署 从零开始 晚点开始部署
  • prometheus和node_exporter部署

    监控体系 前面一篇文章对prometheus作了简单的入门了解 xff0c 在安装prometheus和node exporter之前先对监控体系做一下梳理 xff0c 更直观的讲可以分为iaas paas xff0c saas三个维度来说
  • ROS的一些基础的知识,自用

    零散小知识 先参考这个博客 再参考这个博客总结的知识点 查看当前所以发布的话题名 rostopic list 让ros一直调用回调函数 xff0c ros spin如下的代码无效函数 ros span class token operato
  • TMS320F28377X芯片can通信心得笔记(2)——流程细节

    一 xff0c 前言 补充上一篇文章 TMS320F28377X芯片can通信心得笔记 xff0c 之前一直找不到清晰又压缩的方式把图片缩小 二 xff0c 补充流程如图片和部分代码 带颜色 和带 号部分为中断配置 1 CAN配置部分代码
  • IDEA创建一个servlet项目

    1 File gt project gt java project 选中web application 如果选择java Enterprise可以免去后期导入servlet api jar包和配置Tomcat xff0c 但是需要在proj
  • STM32系列单片机的标准外设库、HAL库和LL库的区别和介绍

    本文转载自CSDN博客 xff1a ZCShouEXP xff0c 点击此处跳转至原博客 STM32 Embedded Software 工作以来一直使用意法半导体 xff08 ST xff09 的STM32系列MCU xff0c ST为开
  • Github的wiki编写

    全球最大的wiki xff0c 应该就是维基百科吧 xff0c 其实百度百科 xff0c csdn写博客等等也是wiki 不久前自己接触了Github wiki的编写 xff0c 因此做个记录吧 模式一般选择Markdown xff0c 因
  • EGOPlanner—Prometheus代码阅读笔记汇总

    Prometheusv2中的EGOSwarm代码阅读笔记 xff0c 个人学习用 目前还有部分代码没看明白 xff0c 欢迎大家交流 xff01 主要参考资料 xff1a Fast Planner 代码解读参考资料整理 EGO Swarm代
  • UAVControl—Prometheus代码阅读笔记【二】——节点实现

    Prometheusv2中的uav control代码阅读笔记 xff0c 个人学习用 内容正在补充中 xff0c 欢迎大家交流 xff01 代码来源 xff1a https github com amov lab Prometheus 二
  • 记录Ubuntu server不能输入中文的全记录--没有解决(最后靠装的桌面版+x11vnc解决)

    1 网上查到的资料都是针对桌面版本的 xff0c 所以先安装了一个vnc桌面 xff0c 至少右击可以看到包含了系统属性 参考链接 xff1a https blog csdn net wayway0554 article details 8
  • int 和 Integer的区别

    int 和 Integer的区别 分析intIntegerint 与 Integer 的区别相同值下的 int 和 Integer 的比较结果 分析 int int 是java的基本数据类型 Integer Integer 继承了Objec
  • C/C++ 使用信号量控制线程运行顺序

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • C++ 问题整理

    说一下C 43 43 和C的区别 设计思想上 xff1a C 43 43 是面向对象的语言 xff0c 而 C 是面向过程的结构化编程语言 C 43 43 具有封装 继承和多态三种特性 C 43 43 支持范式编程 xff0c 比如模板类
  • 职业向导 - 面试题目汇总(嵌入式篇)

    自己踩的坑 存储类操作系统类总线类工具实用类基本电路知识类计算机语言类 存储类 SDRAM SRAM DRAM PSRAM xff0c NOR Flash Nand Flash不同 TablesChineseFull NameSDRAMab
  • ROS笔记(一)xxx.launch文件详解

    ROS笔记 一 xxx launch文件详解 launch文件是ROS中用于同时启动多个节点的重要文件 在大型的ROS项目中使用频繁 所以掌握其主要元素与属性对ROS系统的应用至关重要 xff1a launch标签 元素 说明launch拓