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 系统的启动过程。