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.
Проверьте себя
1. Для чего нужны launch-файлы?
AДля компиляции C++
BЧтобы запустить множество узлов одной командой с нужными параметрами
CДля рисования графа
DДля хранения карт
2. На каком языке чаще пишут launch-файлы в ROS 2?
AТолько XML
BPython
CТолько YAML
DC++
3. Что такое remapping в launch-файле?
AПерезапуск узла
BПереименование топиков узла на лету (например /scan в /robot1/scan)
CСжатие сообщений
DУдаление пакета