ROS学习-roslaunch_xml
这个页面描述了用于roslaunch
的.launch
文件的XML
格式. 有关roslaunch
的背景、功能和相关工具, 请先访问roslaunch
页面.
- env ENVIRONMENT_VARIABLE
- optenv ENVIRONMENT_VARIABLE / optenv ENVIRONMENT_VARIABLE default_value
- find pkg
- anon name
- arg varible_name
- eval expression
文件解析顺序
roslaunch
以单程的方式解析 XML 格式文件, include
是以深度优先的方式解析内容, 而标签Tag
以串行的方式处理, 所以一个参数的最后一次设置被认定为有效值. 也就是说在. launch
文件中同样的设置可能存在多处, 比如在开头定义了一个变量, 遵循着尽量节省空间的想法, 在后面的定义中又对这个变量进行了重新赋值, 以便重新利用, 在这种情况下, 在整个launch
文件解析完成后, 最终进行的那次设置是有效的, 但也并不保证一定有效, 不排除在其它的文件中对变量进行了重命名, 所以推荐使用$(arg)/<arg>
的方式进行覆写.
置换参数
roslaunch
标签属性可以使用置换参数, roslaunch
将在启动节点之前解析这些置换参数. 目前支持的置换参数是:
$(env ENVIRONMENT_VARIABLE)
其中的$
是一个置换处理标志, 类似shell
中的$
. 从当前环境变量替换变量的值. 如果没有设置环境变量, 启动将失败. 该值不能被<env>
标签覆盖. –就是说用环境变量ENVIRONMENT_VARIABLE
设置的值来替换目标值. 例子:
1 | <param name="variable_name" value="$(env NUM_CPUS)" /> |
param
是launch
文件参数定义的标签, name
属性表示定义的变量名称, value
属性表示对定义变量进行赋值或替代. 类似于variable_name=$(env NUM_CPUS)
. 如果没有设置环境变量NUM_CPUS
, roslaunch
启动时将报错.
$(optenv ENVIRONMENT_VARIABLE)
和$(optenv ENVIRONMENT_VARIABLE default_value)
和上条的区别在于, optenv
表示这是一个可选的环境变量(optional environment
). 假如没有设置环境变量ENVIRONMENT_VARIABLE
, 若提供了default_value
值, 则, 则用default_value
替代目标变量, 若没有提供该值, 则用空字符串表示(roslaunch
启动时, 不会报错). default_value
的值可以是包含被空格分隔的多字符.
1 | <!-- 若设置了环境变量 NUM_CPUS, 则 foo = $NUM_CPUS, 否则 foo = "1". 如果没有默认值 1, 那么 foo = "". --> |
$(find pkg)
查找包路径. 例如$(find rospy)/manifest.xml
指定包相对路径。包目录的完整文件路径将被内联替换。强烈建议使用包相对路径,因为硬编码路径会限制启动配置的可移植性。前斜杠和后斜杠将按惯例被解析为本地文件系统。
$(anon name)
产生基于名称的匿名 ID, 主要用于节点名称属性中创建匿名节点, 并检查是否有相同的匿名名字, 因为 ROS 中名字作为标识符要求具有唯一性. 其中的 anon 是 anonymous 的简写. 例如:
1 | <node name="$(anon talk_01)" pkg="rospy_tutorials" type="talker.py" /> |
则会产生错误, 因为系统检测到了两个节点具有相同的匿名名字.
$(arg varible_name)
解析由<arg>
标签指定的变量值. 必须在声明arg
的同一启动文件中有对应的<arg>
标签。 例如:
1 | <param name="foo" value="$(arg my_foo)" /> |
将my_foo
的值赋给参数foo
. 这样在解析my_foo
的值的时候才能正常进行. 就如同你在表达式中用一个变量进行计算, 你必须在计算之前就已经定义过这个变量才可以. 再如:
1 | <node name="add_two_ints_server" pkg="beginner_tutorials" type="add_two_ints_server" /> |
其中的$(arg a)
和$(arg b)
则是对节点所需要的变量进行声明, 这样你在对节点进行参数传递的时候就可以用以下代码进行:roslaunch beginner_tutorials launch_file.launch a:=1 b:=5
$(eval <expression>)
New in Kinetic
允许计算任意复杂的python
表达式. 例如:
1 | <param name="circumference" value="$(eval 2. * 3. 1415 * arg('radius'))"/> |
会根据给定的radius
进行计算后将结果赋给circumference
. 作为限制, $(eval)
的作用范围要跨越表示整个表达式的字符串, 如果在其中插入其它属性是不可行的. 例如:
1 | <param name="a_name" value="$(arg r_dis) $(eval 6*7) bar"/> |
是不可行的. 为了弥补这个限制,所有的替换命令都可以作为函数在 eval 中使用:
"$(eval arg('sth') + env('PATH') + 'bar' + find('pkg'))"
为了方便起见,参数也是隐式解析的,即以下两个表达式是相同的:
"$(eval arg('foo'))"
"$(eval foo)"
IF
和 UNLESS
属性
所有的标签都支持if
和unless
属性, 此类属性是基于计算的值包含或是排除一个标签的内容.
if = value (optional)
如果 value 的值为真则包含标签及内容.
unless = value (optional)
如果值为假, 则包括此内容.
1 | <group if="$(arg foo)"> |
参考标签
<launch>
<launch>
标签为所有 roslaunch 文件的根标签, 可以将其理解为所有其它标签的容器. 以下为<launch>
标签与其它标签的关系:
1 | <launch> |
<node>
用来启动节点, 但不保证节点的启动顺序.
属性
1 | pkg="mypackage" |
元素
1 | <node> |
<param>
用于在参数服务器中定义参数. 其属性参数如下所示:
1 | name="namespace/name" |
例子
1 | <!-- 在参数服务器中定义名称为:publish_frequency, 类型为:double, 值为:10.0 的变量. --> |
1 | <!-- 如果是加载 YAML 文件可以用以下代码,其中的 file 属性要指定路径和文件名. --> |
<rosparam>
支持从YAML
文件读取与卸载参数.
属性
1 | <!-- rosparam的命令, 可以指定 加载|卸载|删除 对应的参数. --> |
例子
1 | <!-- 加载.yaml文件 --> |
<remap>
用来通过名称进行参数之间的映射. 其属性如下:
属性
1 | from="original-name" |
例子
1 | <remap from="chatter" to="hello"/> |
<machine>
<machine>
标签声明一台可以运行ROS
节点的机器。如果在本地启动所有节点,则不需要此标签。它主要用于声明远程机器的SSH
和ROS
环境变量设置,不过您也可以使用它来声明关于本地机器的信息。
属性
1 | name="machine-name" |
例子
下面的示例显示如何配置节点“footalker”来运行另一台机器。它使用 Fuerte 附带的默认的 env-loader 文件。注:**Basic (ROS Fuerte and later) using env-loader
**
1 | <launch> |
下面是一个 ev -loader 脚本示例。如果你想使用不同的环境配置, 将/opt/ros/fuerte/setup.sh 替换为另外的安装文件:
1 |
|
此外,如果要从rosws
工作空间中加载源:
1 |
|
<include>
<include>
标记允许您将另一个roslaunch XML
文件导入当前文件。它将被导入到当前的文档范围,包括<group>
和<remap>
标签。除了<master>
标记外,include
文件中的所有内容都将被导入。<master>
标签仅在顶级文件中被遵守。
属性
1 | file="$(find pkg-name)/path/filename.xml" |
元素
1 | <include> |
<env>
此标签用来设置将要启动的节点的环境变量, 其可以在<launch>
, <include>
, <node>
和<machine>
标签中使用. 当在<launch>
中使用时, <env>
标签作用于其后声明的所有节点. 但是用此标签声明的环境变量对于$(env …)
不可见, 所以并不能用$(env …)
对其它变量的值进行置换, 所以<env>
标签不能用来参数化 launch 文件.
属性
1 | name="environment-variable-name" |
<test>
<test>
标签在语法上类似于<node>
标签, 都是指定一个ROS
节点运行, 但是<test>
标签表明当前要运行的节点是一个测试节点.
<test>
与<node>
具有大部分相同的属性, 但以下内容是不同的:
- 没有 respawn 属性 (测试节点必须要被终止, 所以它们没有重启属性)
- 没有输出属性, 因为测试节点有其输出记录机制.
- Machine 属性被忽略.
属性
1 | pkg="mypackage" |
例子
1 | <test test-name="test" pkg="mypkg" type="test. py" time-limit="10. 0" args="--test1 --test2" /> |
元素
1 | <test> |
<arg>
<arg>
标签允许通过命令行、<include>
标签或者更上层的文件传递指定的值,用来创建可以重用或者可配置的的launch
文件. 但<arg>
标签是非全局的, 一个声明只针对一个launch
文件, 如同局部变量一样。如果要在一个包含文件include file
中使用, 则必须要显式的值传递.
<arg>
可以通过以下三种方式使用:
1 | <arg name="foo" /> |
属性
1 | name="arg_name" |
例子
- 传递一个参数到包含文件中
my_file.launch
:
1 | <include file="included.launch"> |
included.launch
:
1 | <launch> |
则当运行my_file.launch
文件时, hoge
参数会从my_file.launch
的<include>
标签中传递进入included.launch
文件中, 产生一个变量名为param
, 值为fuga
的变量. 但是由于<arg>
定义的为一个文件内部的局部变量(类似于类内的私有变量), 无法从更高一级或外部进行访问, 即不能通过命令行进行赋值, 所以, 当运行:
roslaunch %YOUR_ROS_PKG% my_file.launch hoge:=my_value
时, hoge
的值还是原来设定的fuga
值, 而不管你在局部的<arg>
属性中是用value
属性还是default
属性. 如果想用自己的定义值在命令行中进行覆盖, 则<arg>
标签要使用更高一层级的default
属性指定my_file.launch
如下所示:
1 | <!-- 即定义一个更高一层次的<arg>标签来执行值传递, 从更高一层级传递到局部再传递到included.launch文件中. --> |
- 通过命令行传递变量
roslaunch
使用与ROS
映射参数相同的语法来指定arg
值
1 | $ roslaunch my_file.launch hoge:=my_value (.launch file is available at the current dir) |
<group>
可以对一组节点进行设置, 并且可以通过 ns 属性将一组节点放到一个隔离开的命名空间中.
属性
1 | ns="namespace" (optional) |
元素
1 | <group> |
launch 文件的例子
一个简单的例子
1 | <launch> |
一个复杂一点的例子
1 | <launch> |
设置参数
1 | <launch> |
参考链接:
本文标题:ROS学习-roslaunch_xml
文章作者:xwnb
发布时间:2019-10-22
最后更新:2023-04-17
原始链接:https://xwnb.github.io/posts/73359715/
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!并保留本声明。感谢您的阅读和支持!
分享