迁移launch文件ROS 1ROS 2 [待校准@6189]
目录
本指南介绍了如何编写XMLlaunch文件以便于从ROS 1迁移。 [待校准@6190]
背景
对ROS 2launch系统及其Python API的描述可以在 Launch System tutorial 中找到。 [待校准@6192]
将标签从ROS 1迁移到ROS 2 [待校准@6193]
launch [待校准@6194]
[需手动修复的语法]``launch`` is根元素任何ROS 2launchXML文件。 [待校准@6196]
节点 [待校准@6197]
[需手动修复的语法]Launch是一个新节点。 [待校准@6199]
- 与ROS 1的区别: [待校准@6200]
type
attribute is nowexec
. [待校准@6201]ns
attribute is nownamespace
. [待校准@6202]以下属性不可用:
machine
、respawn_delay
、clear_params
。 [待校准@6203]
示例
<launch>
<node pkg="demo_nodes_cpp" exec="talker"/>
<node pkg="demo_nodes_cpp" exec="listener"/>
</launch>
参数 [待校准@6205]
用于将参数传递给节点。 [待校准@6207]
ROS 2中没有全局参数概念。因此,它只能嵌套在
node
标签中使用。ROS 2不支持某些属性:type
、textfile
、binfile
、executable
、command
。 [待校准@6208]
示例
<launch>
<node pkg="demo_nodes_cpp" exec="parameter_event">
<param name="foo" value="5"/>
</node>
</launch>
类型推理规则 [待校准@6209]
以下是一些如何编写参数的示例: [待校准@6210]
<node pkg="my_package" exec="my_executable" name="my_node">
<!--A string parameter with value "1"-->
<param name="a_string" value="'1'"/>
<!--A integer parameter with value 1-->
<param name="an_int" value="1"/>
<!--A float parameter with value 1.0-->
<param name="a_float" value="1.0"/>
<!--A string parameter with value "asd"-->
<param name="another_string" value="asd"/>
<!--Another string parameter, with value "asd"-->
<param name="string_with_same_value_as_above" value="'asd'"/>
<!--Another string parameter, with value "'asd'"-->
<param name="quoted_string" value="\'asd\'"/>
<!--A list of strings, with value ["asd", "bsd", "csd"]-->
<param name="list_of_strings" value="asd, bsd, csd" value-sep=", "/>
<!--A list of ints, with value [1, 2, 3]-->
<param name="list_of_ints" value="1,2,3" value-sep=","/>
<!--Another list of strings, with value ["1", "2", "3"]-->
<param name="another_list_of_strings" value="'1';'2';'3'" value-sep=";"/>
<!--A list of strings using an strange separator, with value ["1", "2", "3"]-->
<param name="strange_separator" value="'1'//'2'//'3'" value-sep="//"/>
</node>
参数分组 [待校准@6211]
在ROS 2中,允许嵌入 param
标签。例如: [待校准@6212]
<node pkg="my_package" exec="my_executable" name="my_node" ns="/an_absoulute_ns">
<param name="group1">
<param name="group2">
<param name="my_param" value="1"/>
</param>
<param name="another_param" value="2"/>
</param>
</node>
这将创建两个参数: [待校准@6213]
A
group1.group2.my_param
价值1
主办节点/an_absolute_ns/my_node
。 [待校准@6214]A
group1.another_param
价值2
主办节点/an_absolute_ns/my_node
。 [待校准@6215]
也可以使用完整参数名称: [待校准@6216]
<node pkg="my_package" exec="my_executable" name="my_node" ns="/an_absoulute_ns">
<param name="group1.group2.my_param" value="1"/>
<param name="group1.another_param" value="2"/>
</node>
rosparam [待校准@6217]
从yaml文件加载参数。 [待校准@6219]
已替换
from
属性param
标签。 [待校准@6220]
示例
<node pkg="my_package" exec="my_executable" name="my_node" ns="/an_absoulute_ns">
<param from="/path/to/file"/>
</node>
重新映射 [待校准@6221]
用于将重新映射规则传递给节点。 [待校准@6223]
它只能在
node
标签内使用。 [待校准@6224]
示例
<launch>
<node pkg="demo_nodes_cpp" exec="talker">
<remap from="chatter" to="my_topic"/>
</node>
<node pkg="demo_nodes_cpp" exec="listener">
<remap from="chatter" to="my_topic"/>
</node>
</launch>
包括 [待校准@6225]
允许包含另一个launch文件。 [待校准@6227]
- 与ROS 1的区别: [待校准@6200]
在ROS 1中可用,包含内容的范围。在ROS 2中,不是。Nest包括在
group
标签中,以确定它们的范围。 [待校准@6228][需手动修复的语法]``ns`` attribute is not supported. See example of
push-ros-namespace
tag的变通方法。 [待校准@6229]arg
tags nested in aninclude
tag don't support conditionals (if
orunless
). [待校准@6230]不支持嵌套的
env
标签。可以用set_env
和unset_env
代替。 [待校准@6231]不支持
clear_params
和pass_all_args
的属性。 [待校准@6232]
arg [待校准@6235]
arg
is used for declaring a launch argument, or to pass an argument when usinginclude
tags. [待校准@6237]- 与ROS 1的区别: [待校准@6200]
value
attribute is not allowed. Uselet
tag。 [待校准@6238]doc
is nowdescription
. [待校准@6239]当嵌套在
include
标签中时,if
和unless
的属性是不允许的。 [待校准@6240]
示例
<launch>
<arg name="topic_name" default="chatter"/>
<node pkg="demo_nodes_cpp" exec="talker">
<remap from="chatter" to="$(var topic_name)"/>
</node>
<node pkg="demo_nodes_cpp" exec="listener">
<remap from="chatter" to="$(var topic_name)"/>
</node>
</launch>
通过命令行传递参数 [待校准@6241]
环境 [待校准@6243]
设置环境变量。 [待校准@6245]
- 它已被
env
、set_env
和unset_env
取代: [待校准@6246] 不支持``env`` can only be used nested in a
node
orexecutable
tag.if
andunless
tags。 [待校准@6247]set_env
can be nested within the root taglaunch
or ingroup
tags. It accepts the same attributes asenv
, and alsoif
andunless
tags. [待校准@6248]unset_env
unsets an environment variable. It accepts aname
attribute和条件句。 [待校准@6249]
- 它已被
示例
<launch>
<set_env name="MY_ENV_VAR" value="MY_VALUE" if="CONDITION_A"/>
<set_env name="ANOTHER_ENV_VAR" value="ANOTHER_VALUE" unless="CONDITION_B"/>
<set_env name="SOME_ENV_VAR" value="SOME_VALUE"/>
<node pkg="MY_PACKAGE" exec="MY_EXECUTABLE" name="MY_NODE">
<env name="NODE_ENV_VAR" value="SOME_VALUE"/>
</node>
<unset_env name="MY_ENV_VAR" if="CONDITION_A"/>
<node pkg="ANOTHER_PACKAGE" exec="ANOTHER_EXECUTABLE" name="ANOTHER_NODE"/>
<unset_env name="ANOTHER_ENV_VAR" unless="CONDITION_B"/>
<unset_env name="SOME_ENV_VAR"/>
</launch>
组 [待校准@6250]
允许限制launch配置的范围。通常与
let
、include
和push-ros-namespace
标签一起使用。 [待校准@6252]- 与ROS 1的区别: [待校准@6200]
没有
ns
属性。请参阅新的push-ros-namespace
标签作为解决方法。 [待校准@6253]clear_params
attribute不可用。 [待校准@6254]它不接受
remap
或param
作为儿童的标签。 [待校准@6255]
示例
[需手动修复的语法]``launch-prefix`` configuration affects both executable
and node
tags' actions. This example will use time
as a prefix if use_time_prefix_in_talker
argument is 1
,仅供健谈者使用。 [待校准@6256]
<launch>
<arg name="use_time_prefix_in_talker" default="0"/>
<group>
<let name="launch-prefix" value="time" if="$(var use_time_prefix_in_talker)"/>
<node pkg="demo_nodes_cpp" exec="talker"/>
</group>
<node pkg="demo_nodes_cpp" exec="listener"/>
</launch>
机器 [待校准@6257]
目前不支持。 [待校准@6258]
测试 [待校准@6259]
目前不支持。 [待校准@6258]
ROS 2中的新标签 [待校准@6260]
set_env和unset_env [待校准@6261]
见 env 标签说明。 [待校准@6262]
push-ros-namespace [待校准@6263]
[需手动修复的语法]``include`` and group
tags don't accept an ns
attribute。此动作可用作解决方法: [待校准@6264]
<!-Other tags-->
<group>
<push-ros-namespace namespace="my_ns"/>
<!--Nodes here are namespaced with "my_ns".-->
<!--If there is an include action here, its nodes will also be namespaced.-->
<push-ros-namespace namespace="another_ns"/>
<!--Nodes here are namespaced with "another_ns/my_ns".-->
<push-ros-namespace namespace="/absolute_ns"/>
<!--Nodes here are namespaced with "/absolute_ns".-->
<!--The following node receives an absolute namespace, so it will ignore the others previously pushed.-->
<!--The full path of the node will be /asd/my_node.-->
<node pkg="my_pkg" exec="my_executable" name="my_node" ns="/asd"/>
</group>
<!--Nodes outside the group action won't be namespaced.-->
<!-Other tags-->
可执行文件 [待校准@6267]
它允许运行任何可执行文件。 [待校准@6268]
示例
<executable cmd="ls -las" cwd="/var/log" name="my_exec" launch-prefix="something" output="screen" shell="true">
<env name="LD_LIBRARY" value="/lib/some.so"/>
</executable>
替换包含标签 [待校准@6269]
为了将一个launch文件包含在一个命名空间下,如在ROS 1中,那么 include
标签必须嵌套在 group
标签中。 [待校准@6270]
<group>
<include file="another_launch_file"/>
</group>
然后,添加 push-ros-namespace
动作标签以指定命名空间,而不是使用 ns
属性: [待校准@6271]
<group>
<push-ros-namespace namespace="my_ns"/>
<include file="another_launch_file"/>
</group>
套料 include
标签下 group
标签只需指定命名空间 [待校准@6272]
替换 [待校准@6273]
关于ROS 1取代的文件可以在 roslaunch XML wiki 中找到。替换语法没有改变,即它仍然遵循 “$ (替换名称arg1 arg2 ...)” 模式。然而,w.r.t.有一些变化。ROS 1: [待校准@6274]
env
andoptenv
tags have been replaced by theenv
tag.$(env <NAME>)
will fail if the environment variable doesn't exist.$(env <NAME> '')
does the same as ROS 1's$(optenv <NAME>)
.$(env <NAME> <DEFAULT>)
does the same as ROS 1's$(env <NAME> <DEFAULT>)
or$(optenv <NAME> <DEFAULT>)
. [待校准@6275][需手动修复的语法]``find`` has been replaced with
find-pkg-share
(substituting the share directory of an installed package). Alternativelyfind-pkg-prefix
will返回已安装包的根目录。 [待校准@6276]有一种新的
exec-in-pkg
替代品。例如: “$ (执行pkg <package_name> <exec_name>)”。 [待校准@6277]有一种新的
find-exec
替代品。 [待校准@6278]arg
has been replaced withvar
. It looks at configurations defined either witharg
orlet
tag. [待校准@6279]eval
anddirname
substitutions没变。 [待校准@6280]不支持``anon`` substitution。 [待校准@6281]
类型推理规则 [待校准@6209]
在 param
标签的 Type inference rules
小节中显示的规则适用于任何属性。例如: [待校准@6282]
<!--Setting a string value to an attribute expecting an int will raise an error.-->
<tag1 attr-expecting-an-int="'1'"/>
<!--Correct version.-->
<tag1 attr-expecting-an-int="1"/>
<!--Setting an integer in an attribute expecting a string will raise an error.-->
<tag2 attr-expecting-a-str="1"/>
<!--Correct version.-->
<tag2 attr-expecting-a-str="'1'"/>
<!--Setting a list of strings in an attribute expecting a string will raise an error.-->
<tag3 attr-expecting-a-str="asd, bsd" str-attr-sep=", "/>
<!--Correct version.-->
<tag3 attr-expecting-a-str="don't use a separator"/>
一些属性接受多个类型,例如 value
属性 param
标签。通常情况下, int
(或 float
) 类型的参数也接受 str
,稍后将被替换,并通过动作试图转换为 int
(或 float
)。 [待校准@6283]