Launch-файлы: запуск множества узлов
Запускать десяток узлов вручную невозможно — для этого есть launch-файлы.
Launch-файл — описание того, какие узлы запустить, с какими параметрами и в каком окружении; запускается одной командой
ros2 launch.
Проблема ручного запуска
У нашего робота шесть узлов, у настоящего — легко двадцать. Открывать двадцать терминалов и в каждом вводить ros2 run с параметрами — нереально. Launch-файл собирает весь запуск в один сценарий: какие узлы поднять, с какими параметрами, в каких пространствах имён, что перезапускать при падении. Одна команда — и вся система робота на ногах.
Launch на Python
В ROS 2 launch-файлы пишут на Python (есть и XML/YAML, но Python гибче). Файл возвращает LaunchDescription со списком того, что запустить. Код — language-text (исполняется механизмом launch, не в браузере):
from launch import LaunchDescription
from launch_ros.actions import Node
def generate_launch_description():
return LaunchDescription([
Node(package='my_robot_driver',
executable='lidar_driver',
name='lidar'),
Node(package='my_robot_driver',
executable='base_controller',
name='base',
parameters=[{'max_speed': 0.5}]),
Node(package='my_robot_nav',
executable='planner',
name='planner'),
])Запуск
ros2 launch my_robot_bringup robot.launch.pyВывод:
[INFO] [launch]: Запуск 3 узлов [lidar]: лидар инициализирован [base]: max_speed = 0.5 [planner]: планировщик готов
Что умеют launch-файлы
- Задавать параметры и загружать YAML-конфиги для узлов.
- Помещать узлы в пространства имён (например, для нескольких роботов).
- Переименовывать топики (remapping): узел публикует в
/scan, а вы перенаправляете в/robot1/scan. - Включать другие launch-файлы — так строят иерархию: главный launch включает launch драйверов и launch навигации.
- Задавать аргументы запуска (
DeclareLaunchArgument), чтобы один файл работал и для симуляции, и для реального робота.
Как работает под капотом
Launch — это не просто «запусти процессы». Это система оркестрации: она следит за жизненным циклом процессов, может перезапускать упавшие узлы, выстраивать события («когда поднялся лидар — запусти навигацию»). Когда вы вызываете ros2 launch, исполняется ваша Python-функция generate_launch_description, она возвращает дерево действий, и launch-система выполняет их, отслеживая каждый запущенный процесс. По Ctrl+C она аккуратно гасит все узлы разом.
Частые ошибки
- Опечатка в executable. Имя должно совпадать с зарегистрированным в setup.py, иначе «executable not found».
- Забыть собрать пакет с launch-файлом. Launch тоже устанавливается через colcon; без сборки ros2 launch его не найдёт.
- Дублировать имена узлов в одном launch. Два узла с одним name конфликтуют; используйте namespace или разные имена.
Итоги
- Launch-файл запускает множество узлов одной командой.
- В ROS 2 их пишут на Python, возвращая LaunchDescription.
- Умеют параметры, namespace, remapping и включение других launch.
- Launch-система оркестрирует процессы и гасит их по Ctrl+C.