ROS学习之启动文件

摘要:
ROS学习的启动文件就像所有嵌入式设备和系统在启动时首先需要执行的文件一样。许多功能包,包括ROS核心包,都使用此功能将所有启动文件存储在统一的子目录中,通常称为launch。对于ROS启动文件,根元素由一对启动标记定义:<launch>…<launch<每个启动文件的其他元素应包含在这两个标记中。

ROS学习之启动文件

启动文件就好比我们所有的嵌入式设备、系统等在开机启动时首先要执行的文件。我们一般用启动文件来执行一些准备工作。还有一个更好的功能是它可以同时执行多个节点。笔者通过学习对启动文件做了简要的总结。

0.1创建启动文件

0.1.1结构

      和其他 ROS 文件一样,每一个启动文件都应该和一个特定的功能包关联起来。通常的命名方案是以.launch 作为启动文件的后缀。最简单的方法是把启动文件直接存储在功能包的根目录中。当查找启动文件的时候,roslaunch 工具会同时搜索每个功能包目录的子目录。包括 ROS 核心包在内的很多功能包都是利用这一特性,将所有启动文件统一存放在一个子目录中,该子目录通常取名为 launch。具体的结构可以参考下面所示

0.1.2基本元素

       最简单的启动文件由一个包含若干节点元素(node elements)的根元素(root element)组成。
       启动文件是 XML 文件,每个 XML 文件都必须要包插入根元素含一个根元素。对于 ROS 启动文件,根元素由一对 launch 标签定义:
<launch>
...
<launch>
         每个启动文件的其他元素都应该包含在这两个标签之内。启动节点任何启动文件的核心都是一系列的节点元素,每个节点元素指向一个需要启动的节点。节点元素的形式为:
<node
pkg=”package-name”
type=”executable-name”
name=”node-name”
/>

参数解释:

1)pkg给定的参数时程序包的名称。

2)type类型给定的时程序报的类型,和第一个参数配合固定到某个程序

3)name节点名称

4)output输出形式

    tips:查看节点日志文件使用roslaunch启动一组节点与使用rosrun单独启动每个节点的一个重要不同点是,在默认状态下,从启动文件启动节点的标准输出被重定向到一个日志文件中,而不是在控制台显示 * 。该日志文件的名称是:~/.ros/log/run_id/node_name-number-stout.log在对于某个单独的节点,只需在节点元素中配置 output 属性就可以达到控制台中输出信息该目的:output=”screen”

5)respawn请求复位参数

在启动了启动文件中所有的请求节点之后,roslaunch会监视每一个节点,记录哪一个节点是活跃的。对于每个节点,我们可以设置 respawn 属性为真,这样当节点停止的时候,roslaunch 会重新启动该节点。respawn=”true”这个功能是有意义的,比如在某个节点因为软件崩溃或硬件故障以及其他原因导致过早退出系统的时候会起到作用。

6)必要节点(required)

复位之外的另一种策略是将一个节点声明为必要节点。required=”true”当一个必要节点终止的时候,roslaunch 会终止所有其他活跃节点并退出。当出现(1)某个节点非常重要,此节点的故障会导致整个 ROS 会话的瘫痪; (2)节点即便设置了复位属性也不能很好地重启的时候,该需求属性的作用就会体现出来。

0.2命名空间内启动节点
间内启动节点
在上一篇文章中,我们谈到计算机图源命名,我们看到 ROS 支持相对名称,相对名称用到了默认命名空间的概念。对一个节点设置默认命名空间——这个过程通常叫做压入(pushing down)命名空间——的通常方法是使用一个启动文件,并对其节点元素配置命名空间(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"

            />
 </launch>            

0.3启动文件其他元素

0.3.1包含其他文件

        如果想在启动文件中包含其他启动文件的内容(包括所有的节点和参数),可以使用包含(include)元素 9 :<include file=”path-to-launch-file”>此处 file 属性的值应该是我们想包含的文件的完整路径。由于直接输入路径信息很繁琐且容易出错,大多数包含元素都使用查找(find)命令搜索功能包的位置来替代直接输入路径:<include file=”$(find package-name)/launch-file-name”>

       包含元素同样支持命名空间属性,可以将内容压入一个指定的命名空间中去:<include file=”...” ns=”namespace”/>

0.3.2启动参数

          为了使启动文件便于配置,roslaunch还支持启动参数,有时也简称为参数甚至args,其功能有点像可执行程序中的局部变量。这样做的优点是通过设置参数来描述节点在不同ROS会话中运行时可能需要改变的一小部分,从而避免代码重复。

<arg name=”arg-name” default=”arg-value”/>
<arg name=”arg-name” value=”arg-value”/>
           两者的唯一区别在于命令行参数可以覆盖默认值 default,但是不能覆盖参数值 value。

           获取参数值 一旦参数值被声明并且被赋值,你就可以利用下面的arg 替换(arg substitution)语法来使用该参数值了:$(arg arg-name)每个该替换出现的地方,roslaunch 都将它替换成参数值。在示例中,我们在 group 元素中的 if 属性使用了一次 use_sim3 参数(稍后将会介绍 if 和 group)。

<launch>
    <include
         file ="$( find agitr )/doublesim . launch"
   />
   <arg
          name="use_sim3"
          default ="0"
   />
   <group ns="sim3" if ="$( arg use_sim3 )" >
        <node
              name="turtlesim_node"
           pkg="turtlesim "
           type="turtlesim_node"
               />
            <node
               pkg="turtlesim "
              type="turtle_teleop_key"
                 name="teleop_key"
                required="true "
                 launch−prefix="xterm −e"
               />
    </group>
</launch>

 0.3.3向包括的启动文件中发送参数值

     目前已介绍的参数设定技巧的局限在于,它并未提供任何方法将参数传递到通过包含元素导入的次级启动文件中去。这一点很重要,因为像局部变量一样,参数仅定义在对其进行声明的启动文件中,而不能被包含的启动文件“继承”。该问题的解决方案就是将 arg 元素为一个包含元素的子元素,如下所示:
<incluce file=”path–to-launch-file”>
<arg name=”arg-name” value=”arg-value”/>
...
</include>
      请注意,该 arg 元素的用法和之前我们看到的 arg 声明是不同的。在 include 标签之间的参数是属于被包含文件的,而不是它们出现的启动文件。因为目的是为被包括的启动文件设置响应的参数值,所以该处需要使用 value 属性。一种常见的情况是两个启动文件(包含文件和被包含文件)有一些共同的参数,在这种情况下,我们希望参数在传递的时候不会改变。这样的元素在两个地方使用相同的参数名:
<arg name=”arg-name” value=”$(arg arg-name)”>

免责声明:文章转载自《ROS学习之启动文件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇多线程系列之生产者和消费者问题Unity Shader之模板测试下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

npm和package.json那些不为常人所知的小秘密

此文已由作者黄锴授权网易云社区发布。 欢迎访问网易云社区,了解更多网易技术产品运营经验。 强大的命令功能 如果你没使用过script,那你可算是从来没手动编辑过package.json。script作为package.json里最强大的功能,它赋予你新增脚本的能力。特别是从npm@2.0.0 之后,你可以用自定义参数执行脚本。甚至有人宣言,有了npm你可...

Angular引入第三方库

 原文已经写的很好了。原文链接: https://blog.csdn.net/yuzhiqiang_1993/article/details/71215232        加上2点给自己用,引入bootstrap样式,需要在angular-cli.json的styles中引入。        安装的类型描述文件@types/jquery在node_mod...

nodejs入门

目录: 一、关于nodejs   Node.js (http://nodejs.org/)是一个基于Chrome JavaScript 运行时建立的一个平台, 用来方便地搭建快速的, 易于扩展的网络应用。Node.js 借助事件驱动, 非阻塞 I/O 模型变得轻量和高效, 非常适合 run across distributed devices 的 data...

node后台koa2项目,如何发布到服务器?入门学习

1、安装Xshell软件,远程管理软件   Xshell 是一个强大的远程管理软件,它支持SSH,TELNET 协议。Xshell可以在Windows下访问远端服务器、路由器、网络机顶盒等,类似的常用软件还有putty,以及Windows下的Telnet。   https://baijiahao.baidu.com/s?id=162771233568524...

node中的url和path模块

//path模块 1.Node.js path 模块提供了一些用于处理文件路径的小工具,我们可以通过以下方式引入该模块: var path = require("path") 2.常用方法 ================path.join([...paths]) path.join() 方法使用平台特定的分隔符把全部给定的 path 片段连接到一起,并...

NodeJS使用npm和cnpm高速下载

Npm配置 //设置registry npm config set registry https://registry.npm.taobao.org //查看registry npm config get registry //查看配置列表 npm config list //查看所有的默认配置 npm config ls -l //查看安装的module...