ROS2学习(14)------ ROS2Launch 多节点启动与配置脚本
- 操作系统:ubuntu22.04
- IDE:Visual Studio Code
- 编程语言:C++11
- ROS版本:2
在 ROS 2 中,launch 文件(通常用 Python 或 XML 编写)用于启动多个节点、设置参数、配置 QoS、管理命名空间等。它是构建复杂机器人系统时不可或缺的工具。
什么是 ROS 2 Launch?
ROS 2 的 launch 系统允许你通过一个脚本文件定义:
- 启动哪些节点
- 设置节点参数
- 命名空间配置
- 节点重命名
- 条件控制(如根据参数选择是否启动某节点)
- 加载参数文件(.yaml)
- 包含其他 launch 文件(模块化)
常见的 Launch 文件格式
Python Launch 文件(推荐)
- 最灵活,支持条件判断、变量替换、函数式编程。
- 文件扩展名:.launch.py
XML Launch 文件
- 类似于 ROS 1 的 .launch 文件。
- 更适合简单任务或快速迁移 ROS 1 项目。
YAML 参数文件
- 用于统一配置多个节点的参数。
- 扩展名为 .yaml,常配合 launch 文件使用。
示例:多节点启动与配置(Python Launch 文件)
场景说明
我们有以下两个节点:
- /talker
- /listener
我们要实现:
- 同时启动这两个节点
- 给它们都加上命名空间 /demo
- 使用自定义参数文件 params.yaml
第一步:创建参数文件 params.yaml
# config/params.yamltalker:ros__parameters:topic_name: "chatter"rate: 10listener:ros__parameters:topic_name: "chatter"
文件存放目录结构:
这样的结构可以适配将来咱的大项目,因为大项目会有许多的节点和配置文件。
第二步:编写 Python Launch 文件 launch.py
from launch import LaunchDescription
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory
import os
import yaml
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfigurationdef generate_launch_description():# 获取包路径和参数文件路径pkg_name = 'cpp_ddsdemo' # 替换为你的包名config_dir = os.path.join(get_package_share_directory(pkg_name), 'config')params_file = os.path.join(config_dir, 'params.yaml')# 定义可传递的参数namespace_arg = DeclareLaunchArgument('namespace', default_value='/demo',description='Namespace for the nodes')# 创建节点talker_node = Node(package=pkg_name,executable='talker',name='talker',namespace=LaunchConfiguration('namespace'),parameters=[params_file],output='screen')listener_node = Node(package=pkg_name,executable='listener',name='listener',namespace=LaunchConfiguration('namespace'),parameters=[params_file],output='screen')return LaunchDescription([namespace_arg,talker_node,listener_node])
第三步:修改 CMakeLists.txt(确保 launch 文件被安装)
install(DIRECTORYlaunchDESTINATION share/${PROJECT_NAME}
)install(DIRECTORYconfigDESTINATION share/${PROJECT_NAME})
第四步:编译并运行
colcon build --packages-select cpp_ddsdemo
source install/setup.bashros2 launch cpp_ddsdemo demo.launch.py
你可以传入参数:
ros2 launch cpp_ddsdemo launch.py namespace:=/myrobot
运行结果:
(base) dingxin@dev01:/media/dingxin/data/projects/ros2/ros2_ws/src/cpp_ddsdemo$ source install/setup.bash
(base) dingxin@dev01:/media/dingxin/data/projects/ros2/ros2_ws/src/cpp_ddsdemo$ ros2 launch cpp_ddsdemo launch.py
[INFO] [launch]: All log files can be found below /home/dingxin/.ros/log/2025-05-27-15-43-03-594551-dev01-1530002
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [talker-1]: process started with pid [1530003]
[INFO] [listener-2]: process started with pid [1530005]
[talker-1] [INFO] [1748331784.141867499] [demo.talker]: Publishing: 'Hello, DDS!'
[listener-2] [INFO] [1748331784.142327897] [demo.listener]: I heard: 'Hello, DDS!'
[talker-1] [INFO] [1748331784.641880704] [demo.talker]: Publishing: 'Hello, DDS!'
[listener-2] [INFO] [1748331784.642206460] [demo.listener]: I heard: 'Hello, DDS!'
[talker-1] [INFO] [1748331785.141891231] [demo.talker]: Publishing: 'Hello, DDS!'
[listener-2] [INFO] [1748331785.142200047] [demo.listener]: I heard: 'Hello, DDS!'
[talker-1] [INFO] [1748331785.641883258] [demo.talker]: Publishing: 'Hello, DDS!'
[listener-2] [INFO] [1748331785.642191690] [demo.listener]: I heard: 'Hello, DDS!'
[talker-1] [INFO] [1748331786.141904319] [demo.talker]: Publishing: 'Hello, DDS!'
Launch 文件常用功能一览
功能 | 示例 |
---|---|
启动节点 | Node(package=‘…’, executable=‘…’) |
设置命名空间 | namespace=‘…’ |
设置参数 | parameters=[file_path] |
传递参数 | DeclareLaunchArgument(…) + LaunchConfiguration(…) |
包含其他 launch 文件 | IncludeLaunchDescription(…) |
条件启动节点 | condition=IfCondition(LaunchConfiguration(‘enable_camera’)) |
输出日志 | output=‘screen’ |
其他示例:XML 格式 Launch 文件
如果你更喜欢 XML 风格:
<launch><node pkg="cpp_ddsdemo" exec="talker" name="talker" namespace="/demo"><param name="topic_name" value="chatter"/><param name="rate" value="10"/></node><node pkg="cpp_ddsdemo" exec="listener" name="listener" namespace="/demo"><param name="topic_name" value="chatter"/></node>
</launch>
⚠️ 注意:XML 格式不支持参数文件加载,不如 Python 灵活。
总结
特性 | 推荐方式 |
---|---|
多节点启动 | ✅ 使用 launch 文件 |
参数配置 | ✅ 使用 .yaml 文件 + parameters=[] |
命名空间 | ✅ 使用 namespace= |
参数传递 | ✅ 使用 DeclareLaunchArgument() 和 LaunchConfiguration() |
模块化 | ✅ 使用 IncludeLaunchDescription() 包含其他 launch 文件 |