ROS学习笔记(十):常用功能模块之launch启动文件

1. 评估顺序

roslaunch一次评估XML文件。 包含按深度优先遍历顺序进行处理。 标签将按顺序评估,最后的设置将获胜。 因此,如果一个参数有多个设置,将使用为该参数指定的最后一个值。依赖覆盖行为可能很脆弱。 无法保证正确指定替代(例如,如果在包含的文件中更改了参数名称)。 相反,建议使用$(arg)/ 设置来执行覆盖行为。

2.替代参数

Roslaunch标签属性可以使用替换args,roslaunch将在启动节点之前解析这些参数。 当前支持的替代参数为:

  • $(env ENVIRONMENT_VARIABLE)
    替代当前环境替换变量的值。 如果未设置环境变量,启动将失败。 此值不能被标记覆盖。

  • $(optenv ENVIRONMENT_VARIABLE) $(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)" />
  • $(find pkg)
    例如 $(find rospy)/manifest.xml。 指定程序包相对路径。 包目录的文件系统路径将被内联替换。 强烈建议使用包相对路径,因为硬编码路径会阻止启动配置的可移植性。 正斜杠和反斜杠将解析为本地文件系统约定。

  • $(anon name)

例如 $(anon rviz-1)。 根据名称生成匿名ID。 名称本身是一个唯一的标识符:$(anon foo)的多次使用将创建相同的“匿名”名称。 这用于名称属性,以便使用匿名名称创建节点,因为ROS要求节点具有唯一的名称。 例如:

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

将会产生一个错误,即有两个具有相同名称的。

  • $(arg foo)
    $(arg foo) 计算为标记指定的值。 在声明arg的同一启动文件中必须有相应的标记。

例如:

 <param name="foo" value="$(arg my_foo)" />

将my_foo参数分配给foo参数。

例如:

<node name="add_two_ints_server" pkg="beginner_tutorials" type="add_two_ints_server" />
<node name="add_two_ints_client" pkg="beginner_tutorials" type="add_two_ints_client" args="$(arg a) $(arg b)" />

将通过<add_two_ints>示例启动服务器和客户端,并传递参数a和b作为参数。 生成的启动项目可以如下调用:

roslaunch beginner_tutorials launch_file.launch a:=1 b:=5
  • $(eval )
    $(eval )允许评估任意复杂的python表达式。

  • $(dirname)

$(dirname)返回出现它的启动文件目录的绝对路径。 可以将其与eval和if /除非/除非基于安装路径来修改行为一起使用,否则仅是方便用于相对于当前文件而不是相对于软件包根目录引用启动文件或yaml文件(如$(find PKG))。

3.if and unless attributes

所有标签都支持if和unless属性,这些属性基于值的评估包含或不包含标签。 “ 1”和“ true”被视为真实值。 “ 0”和“ false”被视为错误值。 其他值将出错。
if=value (optional)
If value evaluates to true, include tag and its contents.
unless=value (optional)
Unless value evaluates to true (这意味着value的值为false), include tag and its contents.

<group if="$(arg foo)">
  <!-- stuff that will only be evaluated if foo is true -->
</group>

<param name="foo" value="bar" unless="$(arg foo)" />  <!-- This param won't be set when "unless" condition is met -->

4.Tag Reference

  • <launch>:标记是任何roslaunch文件的根元素。 其唯一目的是充当其他元素的容器
  • <node>:node标记指定您希望启动的ROS节点。 这是最常见的roslaunch标签,因为它支持最重要的功能:提升和降低节点。roslaunch不保证节点开始的顺序。这是有意的:无法从外部知道何时完全初始化节点,因此所有启动的代码都必须能够按任意顺序启动。
  • <machine>:声明了可以在其上运行ROS节点的计算机。 如果要在本地启动所有节点,则不需要此标记。 它主要用于声明远程计算机的SSH和ROS环境变量设置,尽管您也可以使用它来声明有关本地计算机的信息。
  • <include>:标记使您可以将另一个roslaunch XML文件导入当前文件。 它将被导入到文档的当前范围内,包括和标记。 除标记外,将导入包含文件中的所有内容:标记仅在顶级文件中服从。
  • <remap>:与直接设置的args属性相比,允许以更结构化的方式将名称重映射参数传递给要启动的ROS节点。简单来说就是取别名,类似于C++中的别名机制,我们不需要修改别人功能包的接口,只需要将接口名称重映射一下,取个别名。
  • <env>:为节点设置环境变量
  • <param>:定义要在参数服务器上设置的参数。 您可以指定文本文件,binfile或命令属性来代替参数值来设置参数的值。 可以将标记放在标记内,在这种情况下,该参数被视为私有参数。
  • <rosparam>:标记允许使用rosparam YAML文件从ROS参数服务器加载和转储参数。 它也可以用来删除参数。 可以将标记放在标记内,在这种情况下,该参数被视为私有名称。
  • <group>:使将设置应用于一组节点更加容易。 它具有ns属性,可让您将节点组推入单独的名称空间。 您也可以使用标记在整个组中应用重新映射设置。
  • <test>:在语法上与标记相似。 它们都指定要运行的ROS节点,但是标记指示该节点实际上是要运行的测试节点。
  • <arg>:允许您通过指定通过命令行传递的值,通过传递的值或为更高级别的文件声明的值来创建更多可重用和可配置的启动文件。 Args不是全局的。 arg声明特定于单个启动文件,非常类似于方法中的本地参数。 您必须像在方法调用中一样,将arg值显式传递给包含的文件。

5.示例.launch XML配置文件

5.1最小的例子

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

5.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>

5.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>

猜你喜欢

转载自blog.csdn.net/qq_42910179/article/details/106970173