使用 ROS 2 launch 启动可组合节点

组合教程 中,您了解了可组合节点以及如何从命令行使用它们。 在 启动教程 中,您了解了启动文件以及如何使用它们来管理多个节点。

本指南将结合上述两个主题,教您如何为可组合节点编写启动文件。

设置

有关安装 ROS 2 的详细信息,请参阅 安装说明

如果您已从软件包安装了 ROS 2,请确保已安装 ros-rolling-image-tools

如果您下载了存档或从源代码构建了 ROS 2,它将已成为安装的一部分。

启动文件示例

下面是一个启动文件,它以 Python、XML 和 YAML 启动可组合节点。

启动文件都执行以下操作:

  • 使用重新映射、自定义参数和额外参数实例化 cam2image 可组合节点

  • 使用重新映射、自定义参数和额外参数实例化 showimage 可组合节点

import launch
from launch_ros.actions import ComposableNodeContainer
from launch_ros.descriptions import ComposableNode


def generate_launch_description():
    """Generate launch description with multiple components."""
    container = ComposableNodeContainer(
            name='image_container',
            namespace='',
            package='rclcpp_components',
            executable='component_container',
            composable_node_descriptions=[
                ComposableNode(
                    package='image_tools',
                    plugin='image_tools::Cam2Image',
                    name='cam2image',
                    remappings=[('/image', '/burgerimage')],
                    parameters=[{'width': 320, 'height': 240, 'burger_mode': True, 'history': 'keep_last'}],
                    extra_arguments=[{'use_intra_process_comms': True}]),
                ComposableNode(
                    package='image_tools',
                    plugin='image_tools::ShowImage',
                    name='showimage',
                    remappings=[('/image', '/burgerimage')],
                    parameters=[{'history': 'keep_last'}],
                    extra_arguments=[{'use_intra_process_comms': True}])
            ],
            output='both',
    )

    return launch.LaunchDescription([container])

将可组合节点加载到现有容器中

有时可以通过其他启动文件或命令行启动容器。 在这种情况下,您需要将组件添加到现有容器中。 为此,您可以使用“LoadComposableNodes”将组件加载到给定容器中。 以下示例启动与上述相同的节点。

from launch import LaunchDescription
from launch_ros.actions import LoadComposableNodes, Node
from launch_ros.descriptions import ComposableNode

def generate_launch_description():
    container = Node(
        name='image_container',
        package='rclcpp_components',
        executable='component_container',
        output='both',
    )

    load_composable_nodes = LoadComposableNodes(
        target_container='image_container',
        composable_node_descriptions=[
            ComposableNode(
                 package='image_tools',
                plugin='image_tools::Cam2Image',
                name='cam2image',
                remappings=[('/image', '/burgerimage')],
                parameters=[{'width': 320, 'height': 240, 'burger_mode': True, 'history': 'keep_last'}],
                extra_arguments=[{'use_intra_process_comms': True}],
            ),
            ComposableNode(
                package='image_tools',
                plugin='image_tools::ShowImage',
                name='showimage',
                remappings=[('/image', '/burgerimage')],
                parameters=[{'history': 'keep_last'}],
                extra_arguments=[{'use_intra_process_comms': True}]
            ),
        ],
    )

    return LaunchDescription([container, load_composable_nodes])

从命令行使用 Launch 文件

上述任何启动文件都可以使用“ros2 launch”运行。 将数据复制到本地文件中,然后运行:


ros2 launch <path_to_launch_file>

进程内通信

以上所有示例都使用额外参数来设置节点之间的进程内通信。 有关进程内通信的更多信息,请参阅:doc:进程内通信教程

Python、XML 或 YAML:我应该使用哪一个?

有关更多信息,请参阅:doc:使用 Python、XML 和 YAML 生成 ROS 2 启动文件 中的讨论。