您正在阅读的是开发版本的文档。有关最新发布的版本,请访问 Jazzy.

使用 Python、XML 和 YAML 编写 ROS 2 启动文件

ROS 2 启动文件可以用 Python、XML 和 YAML 编写。本指南介绍了如何使用这些不同的格式来完成相同的任务,并对何时使用每种格式进行了讨论。

启动文件示例

下面是一个用 Python、XML 和 YAML 实现的启动文件。每个启动文件都执行以下操作:

  • 使用默认值设置命令行参数

  • 包含另一个启动文件

  • 在另一个命名空间中包含另一个启动文件

  • 启动节点并设置其命名空间

  • 启动一个节点,设置其名称空间,并在该节点中设置参数(使用参数)

  • 创建一个节点,将信息从一个主题重新映射到另一个主题

# example_launch.py

舶来品 os

 ament_index_python 舶来品 获取软件包共享目录

 启动 舶来品 启动说明
 launch.actions 舶来品 声明启动参数
 launch.actions 舶来品 群组行动
 launch.actions 舶来品 包含启动描述
 launch.launch_description_sources 舶来品 PythonLaunchDescriptionSource
 launch.substitutions 舶来品 启动配置
 launch.substitutions 舶来品 文本替换
 launch_ros.actions 舶来品 节点
 launch_ros.actions 舶来品 PushRosNamespace
 launch_xml.launch_description_sources 舶来品 XMLLaunchDescriptionSource
 launch_yaml.launch_description_sources 舶来品 YAMLLaunchDescriptionSource


捍卫 生成发射描述():

    # 可以通过命令行设置参数,也可以使用默认参数
    背景_r_启动参数 = 声明启动参数(
        "background_r";, 默认值=文本替换(文本="0";)
    )
    背景_g_launch_arg = 声明启动参数(
        "background_g";, 默认值=文本替换(文本="255";)
    )
    背景_b_启动参数 = 声明启动参数(
        "background_b";, 默认值=文本替换(文本="0";)
    )
    chatter_py_ns_launch_arg = 声明启动参数(
        "chatter_py_ns";, 默认值=文本替换(文本="chatter/py/ns";)
    )
    chatter_xml_ns_launch_arg = 声明启动参数(
        "chatter_xml_ns";, 默认值=文本替换(文本="chatter/xml/ns";)
    )
    chatter_yaml_ns_launch_arg = 声明启动参数(
        "chatter_yaml_ns";, 默认值=文本替换(文本="chatter/yaml/ns";)
    )

    # 加入另一个启动文件
    启动包含 = 包含启动描述(
        PythonLaunchDescriptionSource(
            os..加入(
                获取软件包共享目录('demo_nodes_cpp'),
                'launch/topics/talker_listener_launch.py';))
    )
    # 在 chatter_py_ns 命名空间中加入 Python 启动文件
    启动_py_include_with_namespace。 = 群组行动(
        行动=[
            # push_ros_namespace 用来设置包含节点的命名空间
            PushRosNamespace('chatter_py_ns'),
            包含启动描述(
                PythonLaunchDescriptionSource(
                    os..加入(
                        获取软件包共享目录('demo_nodes_cpp'),
                        'launch/topics/talker_listener_launch.py';))
            ),
        ]
    )

    # 在 chatter_xml_ns 命名空间中加入一个 xml 启动文件
    包含名称空间的启动_xml_include_with_namespace = 群组行动(
        行动=[
            # push_ros_namespace 用来设置包含节点的命名空间
            PushRosNamespace('chatter_xml_ns'),
            包含启动描述(
                XMLLaunchDescriptionSource(
                    os..加入(
                        获取软件包共享目录('demo_nodes_cpp'),
                        'launch/topics/talker_listener_launch.xml';))
            ),
        ]
    )

    # 在 chatter_yaml_ns 命名空间中加入 yaml 启动文件
    启动_yaml_include_with_namespace。 = 群组行动(
        行动=[
            # push_ros_namespace 用来设置包含节点的命名空间
            PushRosNamespace('chatter_yaml_ns'),
            包含启动描述(
                YAMLLaunchDescriptionSource(
                    os..加入(
                        获取软件包共享目录('demo_nodes_cpp'),
                        'launch/topics/talker_listener_launch.yaml';))
            ),
        ]
    )

    # 在 turtlesim1 命名空间中启动一个 turtlesim_node
    海龟模拟节点 = 节点(
        包装='turtlesim';,
        命名空间='turtlesim1';,
        可执行='turtlesim_node',
        名字='sim';
    )

    # 在 turtlesim2 命名空间中启动另一个 turtlesim_node
    # 并使用 args 设置参数
    有参数的节点 = 节点(
        包装='turtlesim';,
        命名空间='turtlesim2';,
        可执行='turtlesim_node',
        名字='sim';,
        参数=[{
            "background_r";: 启动配置('background_r'),
            "background_g";: 启动配置('background_g'),
            "background_b";: 启动配置('background_b'),
        }]
    )

    # 执行重新映射,使两只海龟都监听同一命令主题
    forward_turtlesim_commands_to_second_turtlesim_node = 节点(
        包装='turtlesim';,
        可执行='模仿';,
        名字='模仿';,
        重置=[
            ('/input/pose';, '/turtlesim1/turtle1/pose';),
            ('/output/cmd_vel';, '/turtlesim2/turtle1/cmd_vel';),
        ]
    )

    返回 启动说明([
        背景_r_启动参数,
        背景_g_launch_arg,
        背景_b_启动参数,
        chatter_py_ns_launch_arg,
        chatter_xml_ns_launch_arg,
        chatter_yaml_ns_launch_arg,
        启动包含,
        启动_py_include_with_namespace。,
        包含名称空间的启动_xml_include_with_namespace,
        启动_yaml_include_with_namespace。,
        海龟模拟节点,
        有参数的节点,
        forward_turtlesim_commands_to_second_turtlesim_node,
    ])

从命令行使用启动文件

启动

运行上述任何启动文件时,都可以使用 玫瑰2 启动.要在本地试用它们,可以创建一个新软件包并使用

ros2 启动 <package_name> <launch_file_name>;

或通过指定启动文件的路径直接运行该文件

ros2 launch <path_to_launch_file>;

设置参数

要设置传递给启动文件的参数,应使用 key:=value 语法。例如,您可以设置 背景_r 方法如下

ros2 launch <package_name> <launch_file_name> background_r:=255

ros2 launch <path_to_launch_file> background_r:=255

控制海龟

要测试重映射是否有效,可以在另一个终端运行以下命令来控制海龟:

ros2 run turtlesim turtle_teleop_key --ros-args --remap __ns:=/turtlesim1

Python、XML 或 YAML:我应该使用哪种语言?

备注

ROS 1 中的启动文件是用 XML 编写的,因此对于来自 ROS 1 的用户来说,XML 可能是最熟悉不过的了。 要了解有哪些变化,可以访问 迁移启动文件.

对于大多数应用程序来说,选择哪种 ROS 2 启动格式取决于开发人员的偏好。不过,如果你的启动文件需要有 XML 或 YAML 无法实现的灵活性,你可以使用 Python 来编写启动文件。由于以下两个原因,使用 Python 编写 ROS 2 启动文件更为灵活:

  • Python 是一种脚本语言,因此您可以在启动文件中使用这种语言及其库。

  • ros2/launch (一般发射功能)和 ros2/launch_ros (ROS 2 的特定启动功能)是用 Python 编写的,因此您可以访问 XML 和 YAML 可能无法显示的较低级别的启动功能。

尽管如此,用 Python 编写的启动文件可能比 XML 或 YAML 编写的文件更复杂、更冗长。