# Шпаргалка-методичка: Launch-файлы в ROS2 (Python)

## Оглавление

* [1. Введение](#1-введение)
* [2. Базовые концепции](#2-базовые-концепции)
  * [2.1 Структура launch-файла](#21-структура-launch-файла)
  * [2.2 Запуск узлов](#22-запуск-узлов)
* [3. Продвинутые техники](#3-продвинутые-техники)
  * [3.1 Параметры и аргументы](#31-параметры-и-аргументы)
  * [3.2 Условный запуск](#32-условный-запуск)
  * [3.3 Включение других launch-файлов](#33-включение-других-launch-файлов)
* [4. Отладка и обработка ошибок](#4-отладка-и-обработка-ошибок)
* [5. Лучшие практики](#5-лучшие-практики)
* [6. Шаблон для быстрого старта](#6-шаблон-для-быстрого-старта)
* [7. Дополнительные ресурсы](#7-дополнительные-ресурсы)

***

## 1. Введение

**Launch-файлы** в ROS2 — это Python-скрипты (или XML), которые:

* Автоматизируют запуск множества узлов
* Управляют параметрами и конфигурациями
* Обеспечивают воспроизводимость запуска системы

**Альтернативы**:

* Ручной запуск через `ros2 run` (не масштабируется)
* Скрипты Bash (менее гибкие)

***

## 2. Базовые концепции

### 2.1 Структура launch-файла

```python
from launch import LaunchDescription
from launch_ros.actions import Node

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='my_package',
            executable='my_node',
            name='custom_node_name',
            parameters=[{'param1': 42}]
        )
    ])
```

### 2.2 Запуск узлов

Ключевые параметры `Node`:

| Параметр     | Описание                   |
| ------------ | -------------------------- |
| `package`    | Имя пакета ROS2            |
| `executable` | Имя исполняемого файла     |
| `namespace`  | Пространство имен для узла |
| `remappings` | Переназначение топиков     |

Пример с ремаппингом:

```python
Node(
    package='tf2_ros',
    executable='static_transform_publisher',
    arguments=['0', '0', '1', '0', '0', '0', 'map', 'base_link'],
    remappings=[('/tf', '/custom_tf')]
)
```

***

## 3. Продвинутые техники

### 3.1 Параметры и аргументы

**Аргументы launch-файла** (CLI-передача):

```python
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration

def generate_launch_description():
    arg = DeclareLaunchArgument(
        'use_sim_time',
        default_value='false',
        description='Use simulation clock'
    )
    
    node = Node(
        package='my_pkg',
        executable='node',
        parameters=[{'use_sim_time': LaunchConfiguration('use_sim_time')}]
    )
    
    return LaunchDescription([arg, node])
```

**Запуск с аргументом**:

```bash
ros2 launch my_pkg launch_file.py use_sim_time:=true
```

### 3.2 Условный запуск

```python
from launch.conditions import IfCondition
from launch.substitutions import PythonExpression

Node(
    package='nav2',
    executable='bt_navigator',
    condition=IfCondition(
        PythonExpression(["'", LaunchConfiguration('use_navigation'), "' == 'true'"])
    )
)
```

### 3.3 Включение других launch-файлов

```python
from launch.actions import IncludeLaunchDescription
from launch.launch_description_sources import PythonLaunchDescriptionSource

IncludeLaunchDescription(
    PythonLaunchDescriptionSource(
        [get_package_share_directory('another_pkg'), '/launch/other.launch.py']
    ),
    launch_arguments={'param1': 'value'}.items()
)
```

***

## 4. Отладка и обработка ошибок

**Типичные ошибки**:

1. `PackageNotFoundError` — проверьте `colcon build` и `source install/setup.bash`
2. Неправильные пути — используйте `get_package_share_directory()`
3. Конфликты имен — уникальные `name` и `namespace` для узлов

**Инструменты отладки**:

```bash
# Просмотр запущенных узлов
ros2 launch --print-description my_launch.py

# Подробный вывод
ros2 launch --show-args my_launch.py
```

***

## 5. Лучшие практики

💡 **Советы от экспертов**:

* Всегда указывайте `namespace` для избежания конфликтов
* Используйте параметры вместо хардкода значений
* Группируйте логически связанные узлы в отдельные launch-файлы
* Документируйте аргументы через `description`

⚠️ **Предупреждения**:

* Избегайте циклических включений launch-файлов
* Не злоупотребляйте условной логикой — это усложняет отладку

***

## 6. Шаблон для быстрого старта

```python
#!/usr/bin/env python3
from launch import LaunchDescription
from launch_ros.actions import Node
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfiguration
from ament_index_python.packages import get_package_share_directory

def generate_launch_description():
    # Аргументы
    use_sim_arg = DeclareLaunchArgument(
        'use_sim_time',
        default_value='false',
        description='Use simulation time'
    )
    
    # Основные узлы
    main_node = Node(
        package='my_robot',
        executable='control',
        parameters=[{
            'use_sim_time': LaunchConfiguration('use_sim_time'),
            'max_speed': 2.0
        }]
    )
    
    return LaunchDescription([
        use_sim_arg,
        main_node
    ])
```

***

## 7. Дополнительные ресурсы

* [Официальная документация ROS2 Launch](https://docs.ros.org/en/humble/Tutorials/Intermediate/Launch/Launch-Main.html)
* [ROS2 Launch by Example](https://github.com/ros2/launch_ros/tree/humble/examples)
* [Продвинутые техники запуска](https://roboticsbackend.com/ros2-launch-files-tutorial/)

GHbdtn


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://alice-and-alex-docs.gitbook.io/alice_and_alex_docs/ros2-development/shpargalka-metodichka-launch-faily-v-ros2-python.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
