四时宝库

程序员的知识宝库

ROS2 launch file: Actions 介绍_ros2 rcl

GroupAction

在 ROS 2 的 Launch 框架里,GroupAction 是一个很有用的类,用于将多个启动动作组合成一个逻辑组。下面详细解释 GroupAction 的功能、使用场景和示例。

功能

GroupAction 主要作用是把多个启动动作(如 Node、IncludeLaunchDescription 等)组合起来,对这些动作进行统一管理,能为组内的动作设置一些公共属性,例如命名空间、参数、重映射规则等。

使用场景

  • 命名空间管理:当你需要给一组节点设置相同的命名空间时,可使用 GroupAction 统一设置。
  • 参数共享:若多个节点需要使用相同的参数,可通过 GroupAction 为整个组设置参数。
  • 重映射规则:要为一组节点应用相同的话题或服务重映射规则,GroupAction 能简化操作。

示例

结合你当前编辑的 camera.launch.py 文件,代码里使用 GroupAction 将多个相机节点组合在一起:

camera.launch.py # 这是copy wheeltec 例子
def generate_launch_description():
    ld = LaunchDescription()

    parser = argparse.ArgumentParser(description='usb_cam demo')
    parser.add_argument('-n', '--node-name', dest='node_name', type=str,
                        help='name for device', default='usb_cam')

    camera_nodes = [
        Node(
            package='usb_cam', executable='usb_cam_node_exe', output='screen',
            name=camera.name,
            namespace=camera.namespace,
            parameters=[camera.param_path],
            remappings=camera.remappings
        )
        for camera in CAMERAS
    ]

    # 使用 GroupAction 将多个相机节点组合成一个组
    camera_group = GroupAction(camera_nodes)

    ld.add_action(camera_group)
    return ld

参数说明

GroupAction 构造函数还能接受一些额外参数,用于设置组内动作的公共属性,示例如下:

python

Apply

from launch import LaunchDescription
from launch.actions import GroupAction
from launch_ros.actions import Node
from launch.substitutions import LaunchConfiguration

def generate_launch_description():
    # 创建一个组,设置公共命名空间和参数
    group = GroupAction(
        actions=[
            Node(
                package='your_package',
                executable='node1',
                name='node1'
            ),
            Node(
                package='your_package',
                executable='node2',
                name='node2'
            )
        ],
        namespace='my_namespace',
        parameters=[{'param1': 'value1'}],
        remappings=[('/topic1', '/new_topic1')]
    )

    ld = LaunchDescription([group])
    return ld

在这个例子中:

  • namespace:为组内所有节点设置统一的命名空间。
  • parameters:为组内所有节点设置统一的参数。
  • remappings:为组内所有节点设置统一的话题或服务重映射规则。

总结

GroupAction 提供了一种方便的方式来管理多个启动动作,能统一设置公共属性,让代码更简洁,便于维护和管理。

其它Actions

在 ROS 2 的 launch 包中,除了 GroupAction 外,还有多种不同用途的 Action 类,下面为你分类介绍常见的 Action 及其作用。

其它节点

1.Node

用于启动一个 ROS 2 节点。

example.launch.py
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    node = Node(
        package='demo_nodes_cpp',
        executable='talker',
        name='custom_talker'
    )
    return LaunchDescription([node])

2.IncludeLaunchDescription

用于包含其他的 Launch 文件,实现 Launch 文件的复用。

example.launch.py
from launch import LaunchDescription
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource
from ament_index_python.packages import get_package_share_directory

def generate_launch_description():
    pkg_share = get_package_share_directory('your_package')
    launch_file_path = pkg_share + '/launch/another.launch.py'
    include_launch = IncludeLaunchDescription(
        PythonLaunchDescriptionSource(launch_file_path)
    )
    return LaunchDescription([include_launch])

条件控制相关

1.IfCondition和UnlessCondition

根据条件决定是否执行某个动作。

example.launch.py
from launch import LaunchDescription
from launch.actions import IfCondition, Node
from launch.substitutions import LaunchConfiguration

def generate_launch_description():
    launch_config = LaunchConfiguration('start_node', default='True')
    node = Node(
        package='demo_nodes_cpp',
        executable='talker',
        name='talker',
        condition=IfCondition(launch_config)
    )
    return LaunchDescription([node])

2.RegisterEventHandler

注册事件处理器,当特定事件发生时执行相应动作。

example.launch.py
from launch import LaunchDescription
from launch.actions import RegisterEventHandler
from launch.event_handlers import OnProcessExit
from launch_ros.actions import Node

def generate_launch_description():
    node1 = Node(
        package='demo_nodes_cpp',
        executable='talker',
        name='talker'
    )
    node2 = Node(
        package='demo_nodes_cpp',
        executable='listener',
        name='listener'
    )
    event_handler = RegisterEventHandler(
        OnProcessExit(
            target_action=node1,
            on_exit=[node2]
        )
    )
    return LaunchDescription([node1, event_handler])

参数和环境变量相关

1.SetLaunchConfiguration

设置启动配置参数,后续可通过 LaunchConfiguration 获取。

example.launch.py
from launch import LaunchDescription
from launch.actions import SetLaunchConfiguration
from launch.substitutions import LaunchConfiguration
from launch_ros.actions import Node

def generate_launch_description():
    set_config = SetLaunchConfiguration('param_name', 'param_value')
    node = Node(
        package='your_package',
        executable='your_executable',
        parameters=[{'param_name': LaunchConfiguration('param_name')}]
    )
    return LaunchDescription([set_config, node])

2.SetEnvironmentVariable

设置环境变量。

example.launch.py
from launch import LaunchDescription
from launch.actions import SetEnvironmentVariable
from launch_ros.actions import Node

def generate_launch_description():
    set_env = SetEnvironmentVariable(name='ROS_LOG_DIR', value='/tmp/ros_logs')
    node = Node(
        package='demo_nodes_cpp',
        executable='talker',
        name='talker'
    )
    return LaunchDescription([set_env, node])

命令执行相关

1.ExecuteProcess

执行外部命令。

example.launch.py
from launch import LaunchDescription
from launch.actions import ExecuteProcess

def generate_launch_description():
    process = ExecuteProcess(
        cmd=['ls', '-l'],
        output='screen'
    )
    return LaunchDescription([process])

以上只是 launch 包中部分常见的 Action 类,它们能满足不同场景下的启动需求,帮助你更灵活地管理 ROS 2 系统的启动过程。

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接