警告

您正在阅读的 ROS 2 文档版本已达到 EOL(生命周期结束),不再受官方支持。如果您想了解最新信息,请访问 Jazzy.

将启动文件从 ROS 1 移植到 ROS 2

本指南介绍如何编写 XML 启动文件,以便从 ROS 1.0 轻松迁移到 ROS 2.0。

背景介绍

有关 ROS 2 启动系统及其 Python 应用程序接口的介绍,请参阅 发射系统教程.

将标签从 ROS 1 移植到 ROS 2

启动

网站

  • 可用于 ROS 1.

  • 启动一个新节点。

  • 与 ROS 的区别 1:

    • 类型 属性现在是 执行.

    • ns 属性现在是 命名空间.

    • 以下属性不可用: 机械, 重生延迟, 清除参数.

示例

启动>;
   节点 pkg="demo_nodes_cpp"; exec=健谈;/>;
   节点 pkg="demo_nodes_cpp"; exec="listener";/>;
</launch>;

停止

  • 可用于 ROS 1.

  • 用于向节点传递参数。

  • ROS 2 中没有全局参数的概念。 网站 标签。ROS 2 不支持某些属性: 类型, 文本文件, binfile, 可执行, 指挥部.

示例

启动>;
   节点 pkg="demo_nodes_cpp"; exec="parameter_event";>;
      参数 名称"foo"; value="5";/>;
   </node>;
</launch>;

类型推断规则

下面是一些如何编写参数的示例:

节点 pkg="my_package"; exec="my_executable"; 名称"我的节点";>;
   <!--一个字符串参数,其值为 "1"-->;
   参数 名称"a_string"; value="'1'"/>;
   <!--一个值为 1 的整数参数-->;
   参数 名称"an_int"; value=1";/>;
   <!--数值为 1.0 的浮点参数-->;
   参数 名称"a_float"; value="1.0";/>;
   <!--一个字符串参数,其值为 "asd"-->;
   参数 名称"another_string"; value="asd";/>;
   <!--另一个字符串参数,值为 "asd"-->;
   参数 名称"string_with_same_value_as_above"; value="'asd'"/>;
   <!--另一个字符串参数,值为 "'asd'"-->;
   参数 名称"quoted_string"; value="\'asd\'"/>;
   <!--字符串列表,值为 ["asd"、"bsd"、"csd"]-->;
   参数 名称"list_of_strings"; value=ASD、BSD、CSD; value-sep=",";/>;
   <!--一个 ints 列表,值为 [1、2、3]-->;
   参数 名称"list_of_ints"; value="1、2、3"; value-sep=",";/>;
   <!--另一个字符串列表,值为 ["1"、"2"、"3"]-->;
   参数 名称"another_list_of_strings"; value="'1';'2';'3'" value-sep=";";/>;
   <!--使用奇怪分隔符的字符串列表,值为 ["1"、"2"、"3"]-->;
   参数 名称"strange_separator"; value="'1'//'2'//'3'" value-sep="//";/>;
</node>;

参数分组

在 ROS 2、 停止 标记允许嵌套。例如

节点 pkg="my_package"; exec="my_executable"; 名称"我的节点"; ns="/an_absoulute_ns";>;
   参数 名称"group1";>;
      参数 名称"group2";>;
         参数 名称"my_param"; value=1";/>;
      参数;
      参数 名称"another_param"; value="2";/>;
   参数;
</node>;

这将创建两个参数:

  • A group1.group2.my_param 价值 1,由节点托管 /an_absolute_ns/my_node.

  • A group1.another_param 价值 2 由节点托管 /an_absolute_ns/my_node.

也可以使用完整的参数名:

节点 pkg="my_package"; exec="my_executable"; 名称"我的节点"; ns="/an_absoulute_ns";>;
   参数 名称"group1.group2.my_param"; value=1";/>;
   参数 名称"group1.another_param"; value="2";/>;
</node>;

rosparam

  • 可用于 ROS 1.

  • 从 yaml 文件加载参数。

  • 它已被一个 中的属性 停止 标签

示例

节点 pkg="my_package"; exec="my_executable"; 名称"我的节点"; ns="/an_absoulute_ns";>;
   参数 从="/path/to/file";/>;
</node>;

重映射

  • 可用于 ROS 1.

  • 用于将重映射规则传递给节点。

  • 它只能在 网站 标签

示例

启动>;
   节点 pkg="demo_nodes_cpp"; exec=健谈;>;
      重新映射 从=唠叨"; 至="my_topic";/>;
   </node>;
   节点 pkg="demo_nodes_cpp"; exec="listener";>;
      重新映射 从=唠叨"; 至="my_topic";/>;
   </node>;
</launch>;

包括

  • 可用于 ROS 1.

  • 允许包含另一个启动文件。

  • 与 ROS 的区别 1:

    • 在 ROS 1 中,包含的内容是有范围的。而在 ROS 2 中则没有。Nest 包含在 标记来确定它们的范围。

    • ns 属性不支持。参见示例 push-ros-namespace 标签的变通方法。

    • 雅格 标记嵌套在 包括 标记不支持条件式 (如果除非).

    • 不支持嵌套的 环境 标签 set_envunset_env 来代替。

    • 两者 清除参数传递所有参数 属性不支持。

实例

参见 替换包含标记.

雅格

  • 可用于 ROS 1.

  • 雅格 用于声明启动参数,或在使用 包括 标签

  • 与 ROS 的区别 1:

    • 价值 属性。使用 告诉 标签。

    • 文件 现在是 描述.

    • 嵌套在 包括 标签 如果除非 属性是不允许的。

示例

启动>;
   <arg 名称"topic_name"; 默认值=唠叨";/>;
   节点 pkg="demo_nodes_cpp"; exec=健谈;>;
      重新映射 从=唠叨"; 至="$(var topic_name)";/>;
   </node>;
   节点 pkg="demo_nodes_cpp"; exec="listener";>;
      重新映射 从=唠叨"; 至="$(var topic_name)";/>;
   </node>;
</launch>;

向启动文件传递参数

在上述 XML 启动文件中 topic_name 默认为 唠叨但也可以通过命令行进行配置。假设上述启动配置是在一个名为 mylaunch.xml通过以下启动方式,可以使用不同的主题名称:

玫瑰2 启动 mylaunch.xml topic_name:=自定义主题名称

中提供了有关传递命令行参数的其他信息。 使用替代品.

环境

  • 可用于 ROS 1.

  • 设置环境变量。

  • 取而代之的是 环境, set_envunset_env:

    • 环境 只能嵌套在 网站可执行 标签 如果除非 标记不支持。

    • set_env 可以嵌套在根标签内 启动 或在 标记。它接受的属性与 环境如果除非 标签

    • unset_env 取消设置一个环境变量。它接受 名字 属性和条件。

示例

启动>;
   <set_env 名称"MY_ENV_VAR"; value="MY_VALUE"; 如果="CONDITION_A";/>;
   <set_env 名称"ANOTHER_ENV_VAR"; value="ANOTHER_VALUE"; 除非="CONDITION_B";/>;
   <set_env 名称"SOME_ENV_VAR"; value="SOME_VALUE";/>;
   节点 pkg="MY_PACKAGE"; exec="MY_EXECUTABLE"; 名称"MY_NODE";>;
      <env 名称"NODE_ENV_VAR"; value="SOME_VALUE";/>;
   </node>;
   <unset_env 名称"MY_ENV_VAR"; 如果="CONDITION_A";/>;
   节点 pkg="ANOTHER_PACKAGE"; exec="ANOTHER_EXECUTABLE"; 名称"ANOTHER_NODE";/>;
   <unset_env 名称"ANOTHER_ENV_VAR"; 除非="CONDITION_B";/>;
   <unset_env 名称"SOME_ENV_VAR";/>;
</launch>;

  • 可用于 ROS 1.

  • 允许限制发射配置的范围。通常与 告诉, 包括push-ros-namespace 标签

  • 与 ROS 的区别 1:

    • 没有 ns 属性。请参见新的 push-ros-namespace 标签作为一种变通办法。

    • 清除参数 属性不可用。

    • 它不接受 重映射 也不 停止 标签作为子标签。

示例

启动前缀 配置同时影响 可执行网站 标签的操作。本例将使用 时间 作为前缀,如果 在对话者中使用时间前缀 论点是 1只对说话的人有效。

启动>;
   <arg 名称"use_time_prefix_in_talker"; 默认值="0";/>;
   组>;
       名称"launch-prefix"; value="时间"; 如果="$(var use_time_prefix_in_talker)";/>;
      节点 pkg="demo_nodes_cpp"; exec=健谈;/>;
   </group>;
   节点 pkg="demo_nodes_cpp"; exec="listener";/>;
</launch>;

机械

目前还不支持。

测试

目前还不支持。

ROS 2 中的新标签

set_env 和 unset_env

参见 环境 标签说明。

push-ros-namespace

包括 标记不接受 ns 属性。该操作可作为一种变通方法:

其他标签-->;
组>;
   <push-ros-namespace namespace="my_ns";/>;
   <!--此处的节点以"my_ns"命名;
   <!--如果此处有包含操作,其节点也将被命名;
   <push-ros-namespace namespace="another_ns";/>;
   <!--此处的节点以"another_ns/my_ns"命名;
   <push-ros-namespace namespace="/absolute_ns";/>;
   <!--此处的节点以 "/absolute_ns" 命名;
   <!--下面的节点接收的是绝对命名空间,因此它将忽略之前推送的其他节点;
   <!--节点的完整路径将是 /asd/my_node.-->;
   节点 pkg="my_pkg"; exec="my_executable"; 名称"我的节点"; ns="/asd";/>;
</group>;
<!--组操作之外的节点不会被命名;
其他标签-->;

告诉

它取代了 雅格 标签的值属性。

 名称"foo"; value="asd";/>;

可执行

它允许运行任何可执行文件。

示例

可执行 cmd="ls -las"; cwd="/var/log"; 名称"my_exec"; launch-prefix=一些东西"; 输出="屏幕"; 壳="true";>;
   <env 名称"LD_LIBRARY"; value="/lib/some.so";/>;
</executable>;

替换包含标记

为了在 命名空间包括 标记必须嵌套在 标签

组>;
   包括 file="another_launch_file";/>;
</group>;

然后,不要使用 ns 属性,添加 push-ros-namespace action 标签来指定命名空间:

组>;
   <push-ros-namespace namespace="my_ns";/>;
   包括 file="another_launch_file";/>;
</group>;

筑巢 包括 标记下的 标记仅在指定命名空间时才需要

替换

有关 ROS 1 的替换文件,请参见 roslaunch XML 维基百科.替换语法没有改变,即仍然沿用了 $(substitution-name 参数1 参数2 ...) 模式。不过,ROS 1 也有一些变化:

  • 环境optenv 标记已被 环境 标签 $(env <NAME>) 会失败。 $(env <名称>; '') 与 ROS 1 的作用相同 $(optenv <NAME>). $(env <名称>; <DEFAULT>) 与 ROS 1 的作用相同 $(env <名称>; <DEFAULT>)$(optenv <名称>; <DEFAULT>).

  • 找到 改为 find-pkg-share (代替已安装软件包的共享目录)。或者 find-pkg-prefix 将返回已安装软件包的根目录。

  • 有一个新的 执行单元 例如 $(exec-in-pkg <package_name>; <exec_name>).

  • 有一个新的 查找执行 换人。

  • 雅格 改为 变异.它会查看用 雅格告诉 标签

  • 评估dirname 替补没有变化。

  • 当然 不支持替换。

类型推断规则

中显示的规则 类型 推论 规则 分节 停止 标记适用于任何属性。例如

<!--为预期为 int 的属性设置字符串值会引发错误;
标签1 attr-expecting-an-int="'1'"/>;
<!--正确版本;
标签1 attr-expecting-an-int=1";/>;
<!--在预期为字符串的属性中设置整数将引发错误;
标签2 attr-expecting-a-str=1";/>;
<!--正确版本;
标签2 attr-expecting-a-str="'1'"/>;
<!--在预期为字符串的属性中设置字符串列表将引发错误;
标签3 attr-expecting-a-str="asd, bsd"; str-attr-sep=",";/>;
<!--正确版本;
标签3 attr-expecting-a-str="不要使用分隔符";/>;

有些属性接受不止一种类型,例如 价值 的属性 停止 标签。通常情况下,参数类型为 int (或 浮动) 也接受一个 字符串,随后将被替换并尝试转换为 int (或 浮动)的行动。