迁移launch文件ROS 1ROS 2 [待校准@6189]

本指南介绍了如何编写XMLlaunch文件以便于从ROS 1迁移。 [待校准@6190]

背景

对ROS 2launch系统及其Python API的描述可以在 Launch System tutorial 中找到。 [待校准@6192]

将标签从ROS 1迁移到ROS 2 [待校准@6193]

launch [待校准@6194]

节点 [待校准@6197]

示例

<launch>
   <node pkg="demo_nodes_cpp" exec="talker"/>
   <node pkg="demo_nodes_cpp" exec="listener"/>
</launch>

参数 [待校准@6205]

  • Available in ROS 1.

  • 用于将参数传递给节点。 [待校准@6207]

  • ROS 2中没有全局参数概念。因此,它只能嵌套在 node 标签中使用。ROS 2不支持某些属性: typetextfilebinfileexecutablecommand[待校准@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]

示例

<node pkg="my_package" exec="my_executable" name="my_node" ns="/an_absoulute_ns">
   <param from="/path/to/file"/>
</node>

重新映射 [待校准@6221]

示例

<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]

arg [待校准@6235]

示例

<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]

ROS 2 launch tutorial[待校准@6242]

环境 [待校准@6243]

示例

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

[待校准@6265]

这是用值属性替换 arg 标签。 [待校准@6266]

<let var="foo" value="asd"/>

可执行文件 [待校准@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 and optenv tags have been replaced by the env 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). Alternatively find-pkg-prefix will返回已安装包的根目录。 [待校准@6276]

  • 有一种新的 exec-in-pkg 替代品。例如: “$ (执行pkg <package_name> <exec_name>)”。 [待校准@6277]

  • 有一种新的 find-exec 替代品。 [待校准@6278]

  • arg has been replaced with var. It looks at configurations defined either with arg or let tag. [待校准@6279]

  • eval and dirname 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]