• ROS学习之启动文件


    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)”>

  • 相关阅读:
    ME51N&nbsp;ME52N创建修改采购申请…
    修改数据库表&nbsp;字段参考的数据…
    python 变量赋值,引用,初始化问题
    python 在eclipse中的中文问题
    python全局变量在 函数中 修改
    正则表达式
    matlab 笔记
    python class self thread join __init__.py
    Quora, Yahoo Answer
    分区,grub,boot.cfg,
  • 原文地址:https://www.cnblogs.com/flyingjun/p/8833377.html
Copyright © 2020-2023  润新知