在 ROS 2 中,LaunchConfiguration
是在启动文件(Launch Files)中用于动态配置参数、节点选项等的一种机制。通过使用 LaunchConfiguration
,你可以在运行时或在启动文件中灵活地调整参数,而无需手动修改代码。
以下是详细讲解 LaunchConfiguration
的用法,包括概念、实例和最佳实践。
1. 基本概念
LaunchConfiguration
代表一个可以在启动文件中动态设置和引用的值。- 它与
DeclareLaunchArgument
配合使用,通过命令行或启动文件为参数赋值。 - 使用
LaunchConfiguration
的目的是让启动文件更加灵活,便于重用和管理。
2. 语法
- 声明一个参数:
DeclareLaunchArgument
。 - 引用一个参数:
LaunchConfiguration
。
声明参数
from launch.actions import DeclareLaunchArgument
DeclareLaunchArgument(
name='param_name', # 参数名
default_value='value', # 默认值
description='Description of this parameter' # 参数说明
)
引用参数
from launch.substitutions import LaunchConfiguration
LaunchConfiguration('param_name') # 引用名为 'param_name' 的参数
3. 典型示例
完整启动文件示例
假设我们要启动一个节点,同时让节点的参数通过命令行或启动文件传入:
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
def generate_launch_description():
# 1. 声明参数
arg_node_name = DeclareLaunchArgument(
name='node_name',
default_value='example_node',
description='The name of the node'
)
arg_param_file = DeclareLaunchArgument(
name='param_file',
default_value='default_params.yaml',
description='YAML file for node parameters'
)
# 2. 引用参数
node_name_config = LaunchConfiguration('node_name')
param_file_config = LaunchConfiguration('param_file')
# 3. 配置节点
example_node = Node(
package='example_package',
executable='example_executable',
name=node_name_config, # 使用 LaunchConfiguration 引用
parameters=[param_file_config] # 从 YAML 文件加载参数
)
# 4. 返回 LaunchDescription
return LaunchDescription([
arg_node_name,
arg_param_file,
example_node
])
4. 使用示例
4.1 命令行传参
启动上述文件时,可以通过 --ros-args
来传递参数值:
ros2 launch my_package my_launch_file.py node_name:=custom_name param_file:=my_params.yaml
这里:
node_name:=custom_name
将node_name
设置为custom_name
。param_file:=my_params.yaml
将参数文件替换为my_params.yaml
。
4.2 默认值
如果没有提供参数,LaunchConfiguration
将会使用在 DeclareLaunchArgument
中设置的默认值:
ros2 launch my_package my_launch_file.py
在这种情况下,node_name
的值将为 example_node
,param_file
为 default_params.yaml
。
5. 多个参数引用的应用
你可以将 LaunchConfiguration
与其他 ROS 2 启动功能结合使用,比如条件判断或多节点启动。
条件引用参数
例如,根据传入的参数来决定启动不同的节点:
from launch.conditions import IfCondition
node_a = Node(
package='example_package',
executable='node_a',
condition=IfCondition(LaunchConfiguration('use_node_a'))
)
node_b = Node(
package='example_package',
executable='node_b',
condition=IfCondition(LaunchConfiguration('use_node_b'))
)
参数作为其他配置的输入
LaunchConfiguration
也可用于动态生成路径或参数:
from launch.substitutions import PathJoinSubstitution
config_file = PathJoinSubstitution([
LaunchConfiguration('config_directory'),
'robot_config.yaml'
])
6. 总结
DeclareLaunchArgument
用于声明参数,指定默认值和描述。LaunchConfiguration
用于引用参数值。- 配合
Node
和其他启动功能,可以实现灵活的动态配置。 - 参数可以通过命令行传入,或者使用默认值。
7. 最佳实践
- 为启动文件中的所有可配置项使用
DeclareLaunchArgument
,提高启动文件的复用性。 - 在需要时添加详细的参数说明,帮助用户理解参数作用。
- 避免硬编码参数值,始终使用
LaunchConfiguration
和声明机制来管理参数。
这样,你的 ROS 2 启动文件就能更加模块化、动态化,并适合不同的部署环境。