ros2 launch 常用python模块详细使用范例
ros2 laulnch 常用python模块详细使用范例
from launch import LaunchDescription
from launch.actions import GroupAction, DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
from launch_ros.actions import PushROSNamespace, Node, IncludeLaunchDescription
from launch_ros.substitutions import FindPackageShare
详细解释一段ROS 2启动文件中的Python代码,包括每个导入的模块的功能、语法和详细范例。首先,我需要回忆每个模块的作用,然后结合代码中的具体用法进行解释。
首先,用户提供的代码片段导入了多个模块,包括launch、launch_ros中的类和函数。我需要逐一解释每个模块和类的功能,以及它们在启动文件中的使用方式。
首先,LaunchDescription是ROS 2启动文件的核心类,用于描述启动过程中要执行的动作。GroupAction用于将多个动作分组,通常用于组织启动文件中的不同部分。DeclareLaunchArgument用于声明启动参数,允许在运行时传递参数。LaunchConfiguration用于获取这些参数的值。PathJoinSubstitution用于路径拼接,特别是在跨包引用资源时。PushROSNamespace用于设置ROS命名空间,确保节点在正确的命名空间下运行。Node和IncludeLaunchDescription分别用于启动节点和包含其他启动文件。FindPackageShare用于查找包的共享目录,常用于定位配置文件或启动文件。
接下来,我需要详细解释每个模块的具体功能、语法和提供范例。例如,DeclareLaunchArgument的用法,如何声明参数并设置默认值。LaunchConfiguration如何引用这些参数。GroupAction如何将多个动作组合在一起,比如同时设置命名空间和包含其他启动文件。
还需要注意这些模块之间的协作方式,比如在GroupAction中使用PushROSNamespace和IncludeLaunchDescription,实现命名空间的自动应用。此外,PathJoinSubstitution和FindPackageShare的组合使用,用于定位其他包中的资源文件,如配置文件或启动文件。
在解释过程中,需要结合用户提供的代码示例,说明每个部分的具体作用。例如,在顶层启动文件中,如何通过GroupAction组织不同子系统的启动,使用PushROSNamespace设置命名空间,并通过IncludeLaunchDescription包含其他启动文件。同时,参数如何通过DeclareLaunchArgument声明,并通过LaunchConfiguration在节点配置中使用。
还需要考虑最佳实践,比如如何组织大型项目的启动文件,使用模块化设计,参数化配置,以及动态加载等特性。例如,使用顶层启动文件包含多个子启动文件,每个子启动文件负责一个子系统,如感知、控制、导航等。参数存储在YAML文件中,通过路径引用加载,实现参数的集中管理和覆盖。
最后,需要确保解释清晰,涵盖每个模块的功能、语法和详细范例,帮助用户全面理解ROS 2启动文件的编写方法。
以下是对代码中导入的ROS 2启动系统核心模块的详细解析,包含功能说明、语法规则和实战范例:
1. from launch import LaunchDescription
功能:ROS 2启动文件的核心容器类,用于描述启动时需执行的所有动作序列。
语法:
ld = LaunchDescription([Action1(),Action2(),...
])
范例:
from launch import LaunchDescriptiondef generate_launch_description():return LaunchDescription([DeclareLaunchArgument('speed'),Node(package='controller', executable='velocity_controller')])
2. from launch.actions import GroupAction
功能:将多个启动动作分组执行,常用于组织逻辑相关的动作块。
语法:
GroupAction([Action1(),Action2()
])
范例:
GroupAction([PushROSNamespace('camera'),Node(package='image_pipeline', executable='camera_node')
])
3. from launch.actions import DeclareLaunchArgument
功能:声明可配置的启动参数,支持运行时动态修改。
语法:
DeclareLaunchArgument('param_name', default_value='default',description='参数描述'
)
范例:
DeclareLaunchArgument('resolution',default_value='640x480',description='相机分辨率'
)
4. from launch.substitutions import LaunchConfiguration
功能:获取通过DeclareLaunchArgument声明的参数值。
语法:
LaunchConfiguration('param_name')
范例:
Node(parameters=[{'resolution': LaunchConfiguration('resolution')}]
)
5. from launch.substitutions import PathJoinSubstitution
功能:安全拼接文件路径,支持跨包资源引用。
语法:
PathJoinSubstitution([FindPackageShare('pkg_name'),'subdir','file.yaml'
])
范例:
parameters=[PathJoinSubstitution([FindPackageShare('navigation'),'config','nav_params.yaml'
])]
6. from launch_ros.actions import PushROSNamespace
功能:为后续节点设置ROS命名空间,解决多节点命名冲突。
语法:
PushROSNamespace('namespace')
范例:
GroupAction([PushROSNamespace('lidar'),Node(executable='lidar_driver') # 自动进入/lidar命名空间
])
7. from launch_ros.actions import Node
功能:启动ROS 2节点,支持参数、重映射和命名空间配置。
语法:
Node(package='pkg_name',executable='node_name',name='node_name', # 可覆盖默认名称namespace='ns',parameters=[{...}],remappings=[('old_topic', 'new_topic')]
)
范例:
Node(package='turtlesim',executable='turtlesim_node',name='sim1',parameters=[{'bg_r': 200}],remappings=[('/image', '/camera/image_raw')]
)
8. from launch_ros.actions import IncludeLaunchDescription
功能:包含其他启动文件,实现模块化启动。
语法:
IncludeLaunchDescription(PythonLaunchDescription([...]),launch_arguments={'arg': 'value'}.items()
)
范例:
IncludeLaunchDescription(PathJoinSubstitution([FindPackageShare('perception'),'launch/lidar.py']),launch_arguments={'sensor': 'velodyne'}.items()
)
9. from launch_ros.substitutions import FindPackageShare
功能:定位ROS 2包的共享目录(含launch/config文件)。
语法:
FindPackageShare('pkg_name')
范例:
rviz_config = PathJoinSubstitution([FindPackageShare('navigation'),'rviz','nav.rviz'
])
完整实战案例:多机器人控制系统
from launch import LaunchDescription
from launch.actions import GroupAction, DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration, PathJoinSubstitution
from launch_ros.actions import PushROSNamespace, Node, IncludeLaunchDescription
from launch_ros.substitutions import FindPackageSharedef generate_launch_description():# 声明全局参数robot_model = DeclareLaunchArgument('robot_model', default_value='model_A',description='机器人硬件型号')return LaunchDescription([robot_model,# 摄像头子系统(带命名空间)GroupAction([PushROSNamespace('camera'),Node(package='image_pipeline',executable='camera_node',parameters=[{'fps': LaunchConfiguration('cam_fps', default=30)}])]),# 包含激光雷达启动文件(带参数传递)IncludeLaunchDescription(PathJoinSubstitution([FindPackageShare('lidar_driver'),'launch','lidar.py']),launch_arguments={'sensor_type': 'Velodyne'}.items()),# 机器人控制节点(参数文件加载)Node(package='control',executable='pid_controller',parameters=[PathJoinSubstitution([FindPackageShare('control'),'config',f'{LaunchConfiguration("robot_model")}_params.yaml'])]),# RViz可视化(跨包配置文件)Node(package='rviz2',executable='rviz2',arguments=['-d', FindPackageShare('control') / 'rviz/control.rviz'])])
最佳实践建议
- 模块化设计:通过
IncludeLaunchDescription实现功能模块解耦 - 参数化配置:使用
DeclareLaunchArgument和YAML文件实现动态配置 - 命名空间管理:通过
PushROSNamespace避免多节点冲突 - 资源定位:
FindPackageShare+PathJoinSubstitution实现跨包资源访问 - 条件加载:结合
IfCondition实现按需加载功能模块
通过组合这些核心组件,可构建出灵活可扩展的ROS 2启动系统,适用于从单机器人到多机器人集群的各种复杂场景。
