ROS2 Launch 文件
Launch 文件概念讲解
说明核心概念 Launch 文件是 ROS 2 中用于自动化启动和管理多个节点的脚本文件。
1. 什么是 Launch 文件
Launch 文件(启动文件) 是 ROS 2 中用于描述系统启动过程的配置文件。它允许用户在一个文件中定义需要启动的节点、设置参数、配置命名空间、重映射话题等,然后通过一条命令启动整个系统。
简单来说,Launch 文件就是一个"启动脚本",它告诉 ROS 2:
- 需要启动哪些节点
- 每个节点的参数是什么
- 节点之间的话题如何映射
- 节点应该在哪个命名空间下运行
2. 为什么需要 Launch 文件
在实际的机器人系统中,通常需要同时运行多个节点协同工作。如果手动逐个启动节点,会非常繁琐且容易出错。
Launch 文件的主要优势包括:
- 一键启动:通过一条命令启动多个节点,简化操作流程
- 参数配置:在启动时为节点设置参数,无需修改代码
- 话题重映射:灵活调整节点之间的话题连接关系
- 命名空间管理:避免节点和话题名称冲突
- 条件启动:根据条件决定是否启动某个节点
- 可复用性:Launch 文件可以包含其他 Launch 文件,便于模块化
3. Launch 文件支持的格式
ROS 2 支持三种格式的 Launch 文件:
| 格式 | 扩展名 | 特点 |
|---|---|---|
| Python | .launch.py | 最常用,功能最强大,支持复杂逻辑和条件判断 |
| XML | .launch.xml | 结构清晰,易于阅读,适合简单配置 |
| YAML | .launch.yaml | 简洁易读,适合静态配置 |
说明推荐 Python 格式是最推荐的格式,因为它最灵活,支持条件判断、循环等复杂逻辑。
4. Python Launch 文件的基本结构
一个典型的 Python Launch 文件包含以下基本结构:
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
"""生成启动描述"""
return LaunchDescription([
# 在这里定义要启动的节点
Node(
package='包名',
executable='可执行文件名',
name='节点名称',
output='screen',
parameters=[{'参数名': 参数值}],
),
# 可以继续添加更多节点...
])关键组成部分说明:
LaunchDescription:Launch 文件的顶层容器,包含所有要执行的动作Node:表示一个要启动的 ROS 2 节点generate_launch_description():必须的入口函数,返回 LaunchDescription 对象
5. Launch 文件与功能包的关系
Launch 文件通常放在功能包的 launch/ 目录下:
my_package/
├── package.xml
├── setup.py
├── resource/
├── my_package/
│ └── __init__.py
│ └── node1.py
│ └── node2.py
└── launch/
└── my_launch.launch.py为了让 ros2 launch 命令能找到 Launch 文件,需要在 setup.py 中配置:
import os
from glob import glob
from setuptools import setup
package_name = 'my_package'
setup(
name=package_name,
version='0.0.0',
# ... 其他配置 ...
data_files=[
('share/ament_index/resource', ['resource/' + package_name]),
# 关键配置:安装 launch 文件
(os.path.join('share', package_name, 'launch'), glob('launch/*.launch.py')),
],
)6. 参数与 Launch 文件的关系
Launch 文件与参数系统紧密配合,可以在启动节点时设置参数:
Node(
package='my_package',
executable='my_node',
parameters=[{
'param_name_1': 'value_1',
'param_name_2': 42,
'param_name_3': True,
}],
)也可以从 YAML 文件加载参数:
import os
from ament_index_python.packages import get_package_share_directory
config = os.path.join(
get_package_share_directory('my_package'),
'config',
'params.yaml'
)
Node(
package='my_package',
executable='my_node',
parameters=[config],
)学习内容4:Launch 文件实践
下面通过一个实际案例来学习如何创建和使用 Launch 文件。我们将创建一个倒计时节点,并通过 Launch 文件启动它。
第一步:创建 launch 目录
在功能包目录下创建 launch 目录:
# 在功能包目录下执行
mkdir launch第二步:创建 countdown.launch.py 文件
在 launch 目录下创建 Launch 文件:
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
"""生成启动描述"""
return LaunchDescription([
# 启动倒计时节点
Node(
package='lq_pkg1', # 功能包名
executable='countdown_node', # 可执行文件名(在 setup.py 中配置)
name='countdown_node', # 节点名称
output='screen', # 输出到屏幕
parameters=[{
'countdown_time': 10, # 倒计时时间参数
}],
),
])第三步:修改 setup.py
在功能包的 setup.py 中添加 launch 文件的安装配置:
import os
from glob import glob
from setuptools import find_packages, setup
package_name = 'lq_pkg1'
setup(
name=package_name,
version='0.0.0',
packages=find_packages(exclude=['contrib', 'docs', 'tests']),
data_files=[
('share/ament_index/resource', ['resource/' + package_name]),
(os.path.join('share', package_name), ['package.xml']),
# 添加这行:安装 launch 文件
(os.path.join('share', package_name, 'launch'), glob(os.path.join('launch', '*.launch.py'))),
],
install_requires=['setuptools'],
zip_safe=True,
maintainer='Your Name',
maintainer_email='your_email@example.com',
description='ROS2 Python package',
license='TODO',
tests_require=['pytest'],
entry_points={
'console_scripts': [
'countdown_node = lq_pkg1.countdown:main',
],
},
)第四步:编译工作空间
⚠️ 警告注意 编译前请确保处于工作空间的根目录下。
# 回到工作空间根目录
cd ~/ros_code/lq_ws
# 编译
colcon build第五步:运行 Launch 文件
首先加载环境:
source install/setup.bash然后运行 Launch 文件:
# 命令格式:ros2 launch 包名 launch文件名
ros2 launch lq_pkg1 countdown.launch.py第六步:用命令行验证 Launch 效果
保持 Launch 文件运行的终端,新开一个终端,加载环境后查看节点:
source install/setup.bash
ros2 node list可以看到启动的节点名称。
查看节点的参数:
ros2 param list /countdown_node查看参数的值:
ros2 param get /countdown_node countdown_time说明总结 通过 Launch 文件,我们可以一次性启动多个节点,并为它们配置参数。这大大简化了复杂系统的启动过程。