ROS2-017-ROS2工具:启动文件 launch 的系统实现
2025/4/29...大约 4 分钟
简介
有关 launch 文件的介绍,可以参考上一篇内容
壹、Python 实现语法
以下介绍在 Python 中 launch 文件 的相关语法:
1. Node-节点设置
在 使用 Python 实现的 launch 文件 中,被执行的节点需要统一封装为 launch_ros.actions.Node
对象,并通过 LaunchDescription()
函数创建特定包装对象以进行返回。以下将会针对统一封装的 Node
对象内的参数进行逐一说明。
假设该launch文件所在功能包名为 “package_for_launch_01”,该 launch 文件编写如下:
from launch import LaunchDescription
from launch_ros.actions import Node
# 获取功能包下 share 目录路径------
from ament_index_python.packages import get_package_share_directory
import os
def generate_launch_description():
# 节点配置示例
turtle1 = Node(
# 可执行程序
executable="turtlesim_node",
# 包名
package="turtlesim",
# 设置节点是否会自动重启 (这里设置为True)
respawn=True,
# 覆盖节点名称
name="t1",
# 设置命名空间
namespace="/robot1",
# 进程显示名称(在ps/top中可见)
exec_name="turtle_sim",
# 参数配置
parameters=[
{"background_r": 255, "background_g": 0, "background_b": 0}, # 字典传参
os.path.join(get_package_share_directory("package_for_launch_01"), "config", "custom_params.yaml" ) # YAML文件传参 (常用,建议采用)
],
# 重映射配置
remappings=[
("/turtle1/cmd_vel", "/robot1/cmd_vel"), # 话题重映射
("/turtle1/pose", "/robot1/pose")
],
# ROS专用参数
ros_arguments=[
"--log-level", "debug", # 设置日志级别
"--ros-args", "-p", "use_sim_time:=true" # 覆盖参数(需显式添加--ros-args)
],
# 普通命令行参数
arguments=[
"--custom-flag", # 自定义标志
"--config", "/path/to/non_ros_config.json"
]
)
return LaunchDescription([turtle1])
其中:
- executable:可执行程序
- package:被执行程序所属功能包的名称
- respawn:设置节点是否会自动重启 (针对特殊节点,如需要在出现异常被关闭之后自动重启的节点,可以使用)
- name:设置节点名称,可以用于解决重名问题
- namespace:设置命名空间,可以用于解决重名问题
- exec_name:设置程序运行时命令行左侧所显示的对应标签
- remappings:用于实现话题重映射
- parameters
- ros_arguments
- arguments
"parameters"/"ros_arguments"/"arguments"之间的区别
在上述创建 Node
对象的初始函数中,有以下三个名称中包含“参数”意思的参数,它们的意思分别为:
- parameters:节点在运行时,其自身需要读取的参数,可以理解为类似给 一般调用函数 所传入的 “参数”
- ros_arguments:节点在运行时,ROS2底层系统 需要读取的 ROS 专用参数(例如节点重命名、命名空间、参数文件加载等)。
- arguments:节点在运行时,可执行文件 需要读取的 与 ROS 本身无关 的普通应用级命令行参数(例如自定义配置文件路径、调试标志等)
具体而言,这三个参数实际有以下区别:
- parameters:
- 节点自身 需要读取的参数,通常用于给节点传参
- 其支持直接定义字典(如
{"key": value}
)或指定 YAML/JSON 文件路径进行传参(更常用); - 其可通过底层自动生成
--params-file
参数并触发 ROS 中间件解析; - 参数可通过
ros2 param
命令或 ROS 服务进行动态修改,且其支持类型推断(例如自动识别整数、浮点数、字符串等)。
- ros_arguments:
- ROS2底层系统 需要读取的 ROS 专用参数,通常亦用于覆盖原本给节点的传参以进行调试
- 若在命令行中等效执行,该参数内传递值会被包装在
--ros-args
标志之后,使 ROS 中间件可以强制解析这些参数; - 支持 ROS 参数语法(如
--log-level
,__ns
,--remap
等)。
- arguments:
- 可执行文件 需要读取的普通应用级命令行参数,与 ROS 本身无关
- 参数会被直接追加到节点命令行的末尾;
- 不会触发 ROS 参数解析器(
rclcpp::init
)的特殊处理。
列成表格即为如下区别:
特性 | parameters | ros_arguments | arguments |
---|---|---|---|
作用域 | 节点运行时自用参数 | ROS2 底层系统内 ROS 中间件配置 | 外部环境-可执行文件 进程级命令行参数 |
一般配置用途 | 节点运行时自用算法参数、控制参数等 | 重映射话题、命名空间、日志级别 | 指定配置文件、调试模式 |
动态可修改性 | ✅ (通过 ROS 接口) | ❌ (启动时固定) | ❌ (启动时固定) |
典型语法 | {"key": value} 或 params.yaml | ["--remap", "old:=new"] | ["--config", "my_config.txt"] |
底层标志 | --params-file | --ros-args | 无特殊标志 |
优先级规则 | 低于 ros_arguments | 较高,低于ROS命令行参数 | 独立作用域 |
实际节点传参时优先级 | 推荐最先使用 | 仅在需要覆盖参数时使用 | 无需使用 |
因此在实践中,一般建议:
- 优先使用
parameters
管理节点运行时配置(类型安全、支持动态调整); - 仅在 需要覆盖参数时 使用
ros_arguments
; - 避免在
arguments
中传递 ROS 相关参数(易导致解析失败)。
2. ExecuteProcess- ROS 执行指令设置
在 使用 Python 实现的 launch 文件 中,为了针对 ROS2 命令等外部进程进行封装,以实现部份功能的简化调用执行,需要使用被统一封装为 launch.actions.ExecuteProcess
的对象,并通过 LaunchDescription()
函数创建特定包装对象以进行返回。
以下将会针对统一封装的 ExecuteProcess
对象内的参数进行逐一说明。