ROS入门(二):launch文件解析

2023-05-16

ROS入门(二):launch文件解析

文章目录

  • ROS入门(二):launch文件解析
    • 一、launch文件的运行
    • 二、launch文件格式
      • 1、浏览顺序(Evaluation order)
      • 2、标签(Tag)
      • 3、替代参数(Substitution args)
      • 4、If和unless属性
    • 三、launch文件案例
      • 1、简单案例
      • 2、复杂案例
      • 3、参数服务器

一、launch文件的运行

许多ROS软件包都带有“启动文件”,即launch文件,launch文件是通过roslaunch功能包运行的,命令行格式如下:

$ roslaunch package_name file.launch

这些启动文件通常会为软件包提供一组节点,这些节点聚合了一些功能,通过roslaunch命令同时启动这些节点。

二、launch文件格式

launch文件采用XML格式书写。

1、浏览顺序(Evaluation order)

roslaunch浏览XML文件是一行一行运行的。按深度优先遍历进行处理:标签将按顺序进行浏览,标签值取最后的设定。因此,如果一个参数有多个设置,则将使用为该参数指定为最后一个值。

2、标签(Tag)

launch文件标签共有以下11种:
在这里插入图片描述

  • <launch>:该标签是任何roslaunch文件的根元素。 其唯一目的是充当其他元素的容器。
  • <node>:最常见的标签,用于启动和关闭节点。roslaunch不保证节点开始的顺序。所以无法从外部知道何时完全初始化节点,所有启动的代码都必须能够按任意顺序启动。

例子:

<node name="listener1" pkg="rospy_tutorials" type="listener.py" args="--test" respawn="true" />

使用rospy_tutorials功能包的listener.py可执行文件(带有命令行参数–test)启动 listener1节点。如果该节点死亡,它将自动重生。

  • <node>常用属性有:

①pkg =“ mypackage”。节点包。

②type =“ nodetype”。节点类型。

③name =“ nodename”。节点名称。

④args =“ arg1 arg2 arg3”(可选)。将参数传递给节点。

⑤machine =“机器名”(可选)。指定机器上启动节点。

⑥respawn =“ true”(可选,默认值:False)。如果退出,则自动重新启动该节点。

⑦respawn_delay =“ 30”(可选,默认值:0)。如果respawn为true,请在检测到节点故障之后等待respawn_delay的时间(单位s),然后再尝试重新启动。

⑧required =“ true”(可选)。如果节点死亡,则杀死整个roslaunch。

⑨ns =“ foo”(可选)。在“ foo”名称空间中启动节点。

⑩output=“log | screen”(可选)。如果为“ screen”,则来自该节点的stdout / stderr将被发送到屏幕。如果为’log’,则stdout / stderr输出将发送到$ ROS_HOME / log中的日志文件,并且stderr将继续发送到屏幕。默认值为“ log”。

  • <machine>:该标签声明了可以在其上运行ROS节点的计算机。 如果要在本地启动所有节点,则不需要此标记。 它主要用于声明远程计算机的SSH和ROS环境变量设置,但你也可以使用它来声明有关本地计算机的信息。具体属性请参考machine标签。
    https://link.zhihu.com/?target=http%3A//wiki.ros.org/roslaunch/XML/machine

  • <include>:该标签可以将另一个roslaunch XML文件导入当前文件。 它将被导入到文档的当前范围内,包括和标记。 除标记外,将导入引用文件中的所有内容:标签仅在顶级文件中服从。

    属性有:

    ①file=“$(find pkg-name)/path/filename.xml”。被包括的文件路径。

    ②ns=“foo” (可选)。在’foo’命名空间下导入文件。

    ③clear_params=“true | false” (可选,默认值:False)。启动前,删除的命名空间中的所有参数。 此功能非常危险,应谨慎使用。

    ④pass_all_args=“true | false” (可选,默认值:False)。如果为true,则将当前文件中设置的所有args添加到为处理包含的文件而创建的子文件中。 你可以执行此操作,而不是显式列出要传递的每个参数。

  • <remap>:节点重映射,用于改变节点订阅或发布的话题。

    有时,节点1发布消息1给话题1(你可能需要该特定消息),而后,消息1进入了节点2,而节点2发布了消息2到话题2,消息2中包括了消息1的内容,消息2也被另一节点3接收。 这时,你只需告诉新节点订阅话题2即可。 但是,你也可以进行重新映射,以便新节点在认为自己正在订阅话题2的时候,最终订阅了话题1。

    例子:

<remap from="/different_topic" to="/needed_topic"/>

现在,当此节点订阅话题/different_topic时,将重新映射使其实际上订阅了话题/needed_topic。 因此,发布到/needed_topic的消息最终也将发送到这个新节点。

  • <env>:该标签允许你在启动的节点上设置环境变量。 此标签只能在,,或标签的范围内使用。 在标签内使用它时,标记仅适用于之后声明的节点。 在Environment Variables中可以找到这些环境变量。

<env>属性有:

①name=“environment-variable-name”。您正在设置的环境变量的名称。

②value=“environment-variable-value”。设置环境变量的值。

  • <param>:该标签定义要在参数服务器上设置的参数。你可以将标记放在标记内,在这种情况下,该参数被视为私有参数。

例子:

<param name="publish_frequency" type="double" value="10.0" />
属性有:

①name=“namespace/name”。参数名称。 命名空间可以包含在参数名称中,但应避免使用全局指定的名称。

②value=“value” (可选)。定义参数的值。 如果省略此属性,则必须指定binfile,textfile或command。

③type=“str | int | double | bool | yaml” (可选)。指定参数的类型。 如果未指定类型,roslaunch将尝试自动确定类型。

④textfile=“$(find pkg-name)/path/file.txt” (可选)。文件的内容将被读取并存储为字符串。 该文件必须是本地可访问的。

⑤binfile=“$(find pkg-name)/path/file” (可选)。文件的内容将作为一个base64编码的XML-RPC二进制对象读取和存储。该文件必须在本地可访问。

⑥command=“ ( f i n d p k g − n a m e ) / e x e ′ (find pkg-name)/exe ' (findpkgname)/exe(find pkg-name)/arg.txt’” (可选)。命令的输出将被读取并存储为字符串。由于XML转义的要求,这里需要使用单引号对文件参数进行引用。

  • <rosparam>:该标签允许使用rosparam YAML文件从ROS参数服务器加载和转储参数。 它也可以用来删除参数。 可以将标记放在标记内,在这种情况下,该参数被视为私有名称。

注意:delete和dump命令需要在load命令之前,以及其他任何参数上传到参数服务器之前运行。

<rosparam>属性有:

①command=“load | dump | delete” (可选,默认值:load)。

②file=“$(find pkg-name)/path/foo.yaml” 。rosparam文件的名称,使用load or dump命令时指定参数文件)。

③param=“param-name”。参数名称。

④ns=“namespace” (可选)。将参数范围限定到指定的名称空间。

⑤subst_value=true | false (可选)。允许在YAML文本中使用替代参数。

<group>:该标签有利益将设置应用到一组节点。 它具有ns属性,可让您将节点放入单独的名称空间。
<test>:该标签在语法上与<node>标签相似。它们都指定要运行的ROS节点,但是<test>标签指示该节点实际上是要运行的测试节点。有关这些测试节点的更多信息,请参见rostest文档。

https://link.zhihu.com/?target=http%3A//wiki.ros.org/rostest

  • <arg>:该标签允许在命令行、多个文件中传递参数。

<arg>使用方式:

①。声明foo变量。foo必须作为命令行参数或通过传递参数值。

②。用默认值声明foo。可以通过命令行参数或通过传递来覆盖foo。

③。声明具有恒定值的foo。foo的值不能被覆盖。

<arg>属性有:

①name=“arg_name”。参数名称。

②default=“default value” (可选)。参数的默认值。不能与value属性同时使用。

③value=“value” (可选)。设定参数值。不能与默认属性结合使用。

④doc=“description for this arg” (可选)。参数说明。

3、替代参数(Substitution args)

launch文件支持替代参数,roslaunch将在启动节点之前对其进行解析。当前支持的替代参数有:

$(env ENVIRONMENT_VARIABLE):用环境变量替换变量的值。如果未设置环境变量,则启动将失败。此值不能被<env>标记覆盖。
$(optenv ENVIRONMENT_VARIABLE):如果设置了环境变量的值,则替换该值。若提供default_value,则在未设置环境变量的情况下使用default_value。若未提供default_value,则将使用空字符串。default_value可以是多个单词,并用空格分隔。

例如:

<param name="foo" value="$(optenv NUM_CPUS 1)" />
<param name="foo" value="$(optenv CONFIG_PATH /home/marvin/ros_workspace)" />
<param name="foo" value="$(optenv VARIABLE ros rocks)" />

NUM_CPUS的default_value为1;VARIABLE的default_value为ros和rocks。

$(find pkg):指定相对于软件包的路径。

例如:查找rospy子目录下的manifest.xml文件。

$(find rospy)/manifest.xml

$(anon name):根据名称生成匿名id,id不能重名。

例如:

<node name="$(anon foo)" pkg="rospy_tutorials" type="talker.py" />

    $(eval <expression>):用于计算任意复杂的python表达式。

例如:

<param name="circumference" value="$(eval 2.* 3.1415 * arg('radius'))"/>

$(dirname):返回启动文件所在目录的绝对路径。例如:

file指向当前launch文件所在目录下的other.launch文件。

4、If和unless属性

所有标签都支持if和unless属性,这些属性基于值的评估包含或不包含在标签内。 “ 1”和“ true”被视为真实值。 “ 0”和“ false”被视为错误值。 其他值将出错。

if=value (optional):如果value评估为true,则包含标记及其内容。
unless=value (optional):如果value的值为false,则包含标记及其内容。

例子:

<group if="$(arg foo)">
  <!-- 此处的代码仅当foo为true时才被读取 -->
</group>

<param name="foo" value="bar" unless="$(arg foo)" /> <!-- 满足unless条件时不会设置此参数 -->

三、launch文件案例

1、简单案例

以下案例具备最基本的启动文件配置。它启动一个单独的“talker”节点,该节点是“rospy_tutorials”软件包的一部分。 该节点将使用当前配置的ROS环境(即ROS_ROOT等)在本地计算机上启动。

<launch>
  <node name="talker" pkg="rospy_tutorials" type="talker" />
</launch>

2、复杂案例

<launch>
  <!-- local machine already has a definition by default.
       This tag overrides the default definition with
       specific ROS_ROOT and ROS_PACKAGE_PATH values -->
  <machine name="local_alt" address="localhost" default="true" ros-root="/u/user/ros/ros/" ros-package-path="/u/user/ros/ros-pkg" />
  <!-- a basic listener node -->
  <node name="listener-1" pkg="rospy_tutorials" type="listener" />
  <!-- pass args to the listener node -->
  <node name="listener-2" pkg="rospy_tutorials" type="listener" args="-foo arg2" />
  <!-- a respawn-able listener node -->
  <node name="listener-3" pkg="rospy_tutorials" type="listener" respawn="true" />
  <!-- start listener node in the 'wg1' namespace -->
  <node ns="wg1" name="listener-wg1" pkg="rospy_tutorials" type="listener" respawn="true" />
  <!-- start a group of nodes in the 'wg2' namespace -->
  <group ns="wg2">
    <!-- remap applies to all future statements in this scope. -->
    <remap from="chatter" to="hello"/>
    <node pkg="rospy_tutorials" type="listener" name="listener" args="--test" respawn="true" />
    <node pkg="rospy_tutorials" type="talker" name="talker">
      <!-- set a private parameter for the node -->
      <param name="talker_1_param" value="a value" />
      <!-- nodes can have their own remap args -->
      <remap from="chatter" to="hello-1"/>
      <!-- you can set environment variables for a node -->
      <env name="ENV_EXAMPLE" value="some value" />
    </node>
  </group>
</launch>

3、参数服务器

你可以在参数服务器上设置参数,这些参数将在启动任何节点之前存储在参数服务器上。

如果值是明确的,则可以省略type属性。支持的类型为str,int,double,bool。 您还可以使用textfile或binfile属性来指定文件的内容。

<launch>
  <param name="somestring1" value="bar" />
  <!-- force to string instead of integer -->
  <param name="somestring2" value="10" type="str" />

  <param name="someinteger1" value="1" type="int" />
  <param name="someinteger2" value="2" />

  <param name="somefloat1" value="3.14159" type="double" />
  <param name="somefloat2" value="3.0" />

  <!-- you can set parameters in child namespaces -->
  <param name="wg/childparam" value="a child namespace parameter" />

  <!-- upload the contents of a file to the server -->
  <param name="configfile" textfile="$(find roslaunch)/example.xml" />
  <!-- upload the contents of a file as base64 binary to the server -->
  <param name="binaryfile" binfile="$(find roslaunch)/example.xml" />

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

ROS入门(二):launch文件解析 的相关文章

随机推荐

  • 在 Ubuntu 中安装 VSCode

    在 Ubuntu 中安装 VSCode 如果想要通过 ubuntu 安装 vscode 有三种方式 xff0c 可以通过应用中心下载 xff0c 也可以通过安装包下载 xff0c 以及指令安装 方式一 xff1a 首先在 ubuntu 桌面
  • 常用命名规范分类:匈牙利命名法、下划线命名法、驼峰命名法、帕斯卡命名法

    目录 1 匈牙利命名法 xff08 Hungarian xff09 变量属性 2 下划线命名法 xff08 UnderScoreCase xff09 3 驼峰命名法 xff08 小驼峰命名法 xff09 xff08 Camel xff09
  • keil5无法跳转自己要查询的函数

    之前用keil5的时候想要查询函数的意思 xff0c 去跳转结果给我报错 xff0c 出现这个报错信息 原因是编译的时候没有勾选这个按钮 xff1a 勾选上之后重新编译就不会报错了
  • Linux 安装 Node.js | NPM

    超级简单 yum y install nodejs 验证安装 安装node js 会自动一起安装npm 注意 python V 是大写字母V 错写为小写会进入python的编辑模式 执行exit 退出 执行node 启动node终端 两次C
  • 树莓派连接不上WIFi,VNC失效,SSH失效

    笔记 xff1a 树莓派连接不上wifi的解决方法 xff1a 1 xff0c usb连接手机 xff0c 手机设置中搜索 xff0c usb共享网络 xff0c 然后代开usb连接网络 2 xff0c 右键树莓派wifi标志符 xff0c
  • C++中类的运算符重载教程(一),内附完整代码与解析

    目录 xff1a 一 xff1a 加号运算符重载 对 43 重载函数的理解 xff1a xff08 个人理解 xff0c 仅供参考 xff09 二 xff1a 左移运算符的重载 对 lt lt 重载函数的理解 xff08 个人理解 xff0
  • 关于ros中pcl_ros和ros链接问题Makefile:140的一种解决方案

    本人在ros学习pcl和slam过程中 xff0c 使用catkin make进行编译 xff0c 最终只报了错误Makefile 140和make j4 l4错误 xff0c 诸如此类错误 xff0c 多为链接过程出现问题 坑多日 xff
  • rosbag播放过程ctrl+z暂停后继续播放的方法

    rviz 43 rosbag播放暂停与继续播放 rosbag播放暂停的方式可以在rosbag运行窗口 space按键进行控制 该方法用于进程管理的学习扩展 问题描述 xff1a rosbag包播放过程ctrl 43 z暂停播放恢复播放方法
  • github上docker镜像创建容器

    docker介绍 三个概念 1 镜像 xff1a 类似于模版 xff0c 在没有添加实例化前不能使用 2 容器 xff1a 镜像实例化 3 docker xff1a 放容器的一个载体 总结 xff1a docker就像一艘船 xff0c 上
  • vi/vim基本命令

    目录 打开创建文档模式介绍显示行号增删改查光标移动文档操作 打开创建文档 span class token function vim span hello txt 打开已存在hello txt文档或者创建一个不存在的hello txt文档
  • 关于leetcode刷题详细介绍

    虽然刷题一直饱受诟病 xff0c 不过不可否认刷题确实能锻炼我们的编程能力 xff0c 相信每个认真刷题的人都会有体会 现在提供在线编程评测的平台有很多 xff0c 比较有名的有 hihocoder xff0c LintCode xff0c
  • leetcode:13罗马数字转整数c++

    思路分析 两种情况 1 不同的罗马数字都是从左到右依次相加 2 不同的就是末尾数是4和9的情况 xff0c 也就是IV VIV xff08 if xff09 代码框架 整体过程 从题目中字符和数字的对应关系 xff0c 不难想到数据结构un
  • leetcode:20有效的括号——stack

    思路分析 题目匹配的情况有两中 xff1a 和 xff08 xff09 匹配成功的思路是每个 或者其他右包围结构都是和最近的 或者其他左包围结构匹配 最近 匹配的思想应该使用stack结构对数据进行操作 代码框架 1 遍历整个string
  • leetcode:21合并两个有序连表——slist

    思路分析 链表 xff1a 头节点为空 xff0c 每个节点有一个指针 xff0c 指向下一个节点的地址 俩链表节点之间比较 xff0c 用遍历 96 96 for xff0c 因为是list xff0c 可以直接通过迭代器 xff08 指
  • leetcode:53最大子数组和

    思路分析 有2个变量是一直变化的 1 最大集合的第一个元素 2 存放最大的变量 0 变量初始化 span class token keyword int span res span class token operator 61 span
  • Ubuntu安装docker及出现问题解决

    Ubuntu安装docker及出现问题解决 文章目录 Ubuntu安装docker及出现问题解决一 安装docker二 解决docker安装成功后 xff0c docker命令无法正常使用的问题 一 安装docker docker的安装可参
  • stl大全

    什么是STL xff1f 大佬 xff1a 为什么C 43 43 比C更受人欢迎呢 xff1f 除了C 43 43 的编译令人感到更舒适 xff0c C 43 43 的标准模板库 xff08 STL xff09 也占了很重要的原因 当你还在
  • input 图片上传

    使用 在vue项目中使用input上传图片给后台时 xff0c 需要对图片文件流和请求头进行一些处理 1 获取上传图片文件流 span class token tag span class token tag span class toke
  • Unix环境高级编程代码(实时更新)

    实例1 3 列出一个目录中所有文件 xff08 ls c xff09 include 34 apue h 34 include lt dirent h gt int main int argc char argv DIR dp struct
  • ROS入门(二):launch文件解析

    ROS入门 xff08 二 xff09 xff1a launch文件解析 文章目录 ROS入门 xff08 二 xff09 xff1a launch文件解析一 launch文件的运行二 launch文件格式1 浏览顺序 xff08 Eval