< >
Home » ROS2与launch入门教程 » ROS2与launch入门教程-如何迁移ROS1的launch文件到ROS2

ROS2与launch入门教程-如何迁移ROS1的launch文件到ROS2

ROS2与launch入门教程-如何迁移ROS1的launch文件到ROS2

说明:

  • 介绍如何编写 XML 启动文件以便从 ROS 1 轻松迁移。

###将标签从 ROS 1 迁移到 ROS 2###

launch标签

  • 在 ROS 1 中可用。
  • launch 是任何 ROS 2 启动 XML 文件的根元素。

node标签

  • 在 ROS 1 中可用。
  • 启动一个新节点。
  • 与 ROS 1 的区别:
    • type 属性现在是 exec。
    • ns 属性现在是命名空间。
    • 以下属性不可用:machine、respawn_delay、clear_params。
  • 示例:
<launch>
   <node pkg="demo_nodes_cpp" exec="talker"/>
   <node pkg="demo_nodes_cpp" exec="listener"/>
</launch>

param标签

  • 在 ROS 1 中可用。
  • 用于将参数传递给节点。
  • ROS 2 中没有全局参数的概念,因此只能嵌套在node标签中使用。
  • ROS 2 不支持某些属性:type, textfile, binfile, executable, command。
  • 示例1:
<launch>
   <node pkg="demo_nodes_cpp" exec="parameter_event">
      <param name="foo" value="5"/>
   </node>
</launch>
  • 示例1:
<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>

参数分组

  • 在 ROS 2 中,允许嵌套 param 标签。
  • 例如:
<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>
  • 这将创建两个参数:

    • 一个值为 1 的 group1.group2.my_param,由节点 /an_absolute_ns/my_node 托管。
    • 由节点 /an_absolute_ns/my_node 托管的值为 2 的 group1.another_param。
  • 也可以使用完整的参数名称:

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

  • 在 ROS 1 中可用。
  • 从 yaml 文件加载参数。
  • 它已被 param 标记中的 from 属性替换。
  • 示例:
<node pkg="my_package" exec="my_executable" name="my_node" ns="/an_absoulute_ns">
   <param from="/path/to/file"/>
</node>

remap标签

  • 在 ROS 1 中可用。
  • 用于将重映射规则传递给节点。
  • 它只能在节点标签中使用。
  • 示例:
<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>

include标签:

  • 在 ROS 1 中可用。
  • 允许包含另一个启动文件。
  • 与 ROS 1 的区别:
    • 在 ROS 1 中可用,包含的内容是有范围的。 在 ROS 2 中,它不是。 Nest 包含在组标签中以限定它们的范围。
    • 不支持 ns 属性。 有关解决方法,请参见 push_ros_namespace 标记的示例。
    • 嵌套在包含标签中的 arg 标签不支持条件(如果或除非)。
    • 不支持嵌套的 env 标签。 可以使用 set_env 和 unset_env 代替。
    • 不支持 clear_params 和 pass_all_args 属性。

arg标签

  • 在 ROS 1 中可用。
  • arg 用于声明启动参数,或在使用包含标签时传递参数。
  • 与 ROS 1 的区别:
    • 不允许使用 value 属性。 为此使用 let 标签。
    • doc 现在是描述。
    • 当嵌套在包含标签中时,不允许使用 if 和 unless 属性。
      - 示例:
<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>

 - 通过命令行传递参数

env标签

  • 在 ROS 1 中可用。
  • 设置环境变量。
  • 它已被 env、set_env 和 unset_env 取代:
    • env 只能嵌套在节点或可执行标签中使用。 不支持 if 和 unless 标签。
    • set_env 可以嵌套在根标签启动或组标签中。 它接受与 env 相同的属性,以及 if 和 unless 标记。
    • unset_env 取消设置环境变量。 它接受名称属性和条件。
      - 示例:
<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>

group标签

  • 在 ROS 1 中可用。
  • 允许限制启动配置的范围。 通常与 let、include 和 push_ros_namespace 标签一起使用。
  • 与 ROS 1 的区别:
    • 没有 ns 属性。 请参阅新的 push_ros_namespace 标记作为解决方法。
    • clear_params 属性不可用。
    • 它不接受 remap 或 param 标签作为子标签。
      - launch-prefix配置会影响executable和node标签的操作。
      - 如果 use_time_prefix_in_talker 参数为 1,此示例将使用时间作为前缀,仅适用于说话者。
      - 示例:








machine标签

  • 不再支持

test标签

  • 不再支持

###ROS 2 中的新标签###

set_env and unset_env标签

  • 查看env标签

push_ros_namespace标签

  • include 和 group 标签不接受 ns 属性。
  • 此操作可用作解决方法:
  • 示例:
<!-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-->

let标签

  • 它是用 value 属性替换 arg 标签。
  • 示例:
<let var="foo" value="asd"/>

executable标签

  • 它允许运行任何可执行文件
  • 示例:
<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>

替换包含标签

  • 为了在 ROS 1 中的命名空间下包含启动文件,那么包含标签必须嵌套在组标签中。
<group>
   <include file="another_launch_file"/>
</group>
  • 然后,不使用 ns 属性,而是添加 push_ros_namespace 操作标签来指定命名空间:
<group>
   <push_ros_namespace namespace="my_ns"/>
   <include file="another_launch_file"/>
</group>
  • 只有在指定命名空间时才需要在group标签下嵌套include标签

Substitutions标签

  • 有关 ROS 1 替换的文档可以在 roslaunch XML wiki 中找到。
  • 替换语法没有改变,即它仍然遵循 $(substitution-name arg1 arg2 ...) 模式。
  • 然而,有一些变化w.r.t ROS 1:
    • env 和 optenv 标签已被 env 标签取代。 如果环境变量不存在,$(env ) 将失败。 $(env '') 与 ROS 1 的 $(optenv ) 相同。 $(env ) 与 ROS 1 的 $(env ) 或 $(optenv ) 相同。
    • find 已替换为 find-pkg-share(替换已安装包的共享目录)。 或者 find-pkg-prefix 将返回已安装包的根目录。
    • 有一个新的 exec-in-pkg 替换。 例如:$(exec-in-pkg <package_name> <exec_name>)。
    • 有一个新的 find-exec 替换。
    • arg 已替换为 var。 它查看使用 arg 或 let 标记定义的配置。
    • eval 和 dirname 替换没有改变。
    • 不支持匿名替换。

类型推理规则

  • param 标记的类型推断规则小节中显示的规则适用于任何属性。
  • 例如:
<!--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"/>
  • 某些属性接受多个类型,例如 param 标记的 value 属性。
  • 通常 int(或 float)类型的参数也接受 str,稍后将替换它并尝试通过操作转换为 int(或 float)。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与launch入门教程