PS:终于决定发一篇轻水的文,参见百科自己翻译的,因为是意译的,所以可能会有不准确。共同讨论吧
tag
标签是所有ROS控制文件(roslaunch)的根元素。它的根本目的是扮演一个其他元素的容器。
1.属性
deprecated="弃用的消息"
警告用户ROS控制文件已经弃用
2.元素
控制一个节点
给参数服务器设置一个参数
声明一个名字重映射
向用户声明一个控制机
用一个ROS参数文件给控制台设置ROS参数
包括的其他ROS控制文件
给控制节点指明环境变量
控制一个测试节点
声明一个变量
封闭组元素来共享命名空间或重映射
原文自:
ROSlaunch/XML
Tips:XML可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
本教程介绍在roslaunch.launch files中使用XML的格式。本教程和roslaunch有大大的关联,所以,如果你没有看上文的roslaunch教程,请先看上面的*^_^*
1.求值次序(What the heck!这个词真不知道怎么翻更加准确了,原文是Evaluation order :p)
roslaunch的求值XML文件是单次执行的。包含进程的深度优先算法。标签被连续求值然后然后使用最后的设置。因此,如果参数有复杂的设置,将只使用最后一次的参数设置值。
依赖于覆盖行为是非常不稳定的方法。因此无法保证最后一次覆盖值是正确的(栗子:如果一个头文件中的参数字改变了)。因此推荐执行覆盖行为时使用$(arg)/来设置。
2.替换参数(substitution args)
Roslaunch标签属性可以用来替代参数,以便于roslaunch能够优先解决控制中的节点。当前支持替换的参数是:
$(env ENVIRONMENT_VARIABLE)
· 从当前环境替换一个变量的值。如果环境变量未设值set,launch就失败了。值将不能通过标签覆盖。
$(optenv ENVIRONMENT_VARIABLE) $(optenv ENVIRONMENT_VARIABLE 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)
· e.g. $(find rospy)/manifest.xml. 指定一个包依赖路径,文件系统的包路径将被内联取代。使用的相对路径来指定包便于不同平台的系统移植。方便本地系统文件的解析。
$(anon name)
· e.g. $(anon rviz-1). 据名生成匿名ID,命名本身是唯一标识符(念biao zhi fu):重复使用$(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) 会计算制定的标签值。所以在launch file中必须有对应的声明标签。
· 栗子:
-
<param name="foo" value="$(arg my_foo)" />
· 将给分配foo 参数my_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)" />
将用 同时控制服务器和客户端栗子,作为传参值a和b,工程控制结果可这样调用:
-
roslaunch beginner_tutorials launch_file.launch a:=1 b:=5
当前替换变量在本地机上处理。就是说,环境变量和ROS包会在你的当前环境中被设值set,即便是远程控制的进程。
3.if和unless属性
所有标签都可以用if和unless,包括根据求值的得到结果的标签。1为真,0为假,其他返回值错误。
· if=value (optional)
· if是计算值是否为真,包括标签和它的内容。
unless=value (optional)
· Unless 是计算值是否为真,包括标签和它的内容。
栗子:
4.Tag Reference
·
·
·
·
·
·
·
·
·
·
·
5.Example .launch XML 配置文件
NOTE: 依例, roslaunch XML files 会被命名为 extension .launch。栗子: example.launch.
5.1的小栗子^_^
下面这个栗子show了一个最小的控制配置脚本。 它控制了'rospy_tutorials' 包中的单一的“talker”节点部分。这个节点会控制本地机使用ROS当前环境变量的配置。(尤其是. ROS_ROOT, 等...)。
-
<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设置参数
也可以在参数服务器上设置参数啊。这些参数会在节点控制使用之前被存储在参数服务器上。
如果值是明确的,你可以忽略它的属性类型。支持的类型包括str,int,double,bool。你也可以指明文件内容来替代用文本文件的二进制文件属性。
栗子:
-
<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>
字幕君立志一个人就是一只字幕组
原文自:以上。
因为现在没有自己写工程,手头也之有少量可供参考的工程。根据这些,的总结规律是:
参考类似HTML。
首先,所有以为开始结束符。
Then,用Tag描述名字分组类型等基本信息。
后面看了程序有感悟了再加
阅读(7375) | 评论(0) | 转发(0) |