# TF2

## **1. Назначение**

`tf2` — это система управления **трансформами (координатными преобразованиями)** в ROS 2, которая:

* Отслеживает **иерархию систем координат (фреймов)** робота (например, `base_link`, `laser`, `map`).
* Обеспечивает **преобразование точек, векторов и других данных** между разными фреймами.
* Поддерживает **временную синхронизацию** трансформ (учёт задержек).
* Заменяет устаревшую систему `tf` из ROS 1, работая быстрее и стабильнее.

***

## **2. Основные компоненты**

* **`tf2_ros`** — основной пакет для работы с трансформами (публикация, подписка, буферизация).
* **`tf2_msgs`** — сообщения ROS для работы с трансформами (например, `TFMessage`).
* **`tf2_geometry_msgs`** — преобразование геометрических сообщений (`Point`, `Pose`, `Vector3` между фреймами).
* **`tf2_sensor_msgs`** — поддержка преобразований данных сенсоров (например, `PointCloud2`).
* **`tf2_tools`** — утилиты командной строки (`view_frames`, `tf2_echo`).

***

## **3. Ключевые функции**

### **Публикация трансформ**

* **Статические трансформы** (не изменяются со временем):

  ```python
  from tf2_ros import StaticTransformBroadcaster
  broadcaster = StaticTransformBroadcaster(node)
  transform_stamped = ... # Заполнить transform_stamped
  broadcaster.sendTransform(transform_stamped)
  ```
* **Динамические трансформы** (изменяются во времени):

  ```python
  from tf2_ros import TransformBroadcaster
  broadcaster = TransformBroadcaster(node)
  transform_stamped = ... # Заполнить transform_stamped
  broadcaster.sendTransform(transform_stamped)
  ```

### **Подписка на трансформы**

* **`tf2_ros.Buffer`** — хранит историю трансформ.
* **`tf2_ros.TransformListener`** — подписывается на `/tf` и `/tf_static`.

  ```python
  tf_buffer = tf2_ros.Buffer()
  tf_listener = tf2_ros.TransformListener(tf_buffer, node)
  ```

### **Преобразование координат**

```python
try:
    transform = tf_buffer.lookup_transform(
        'target_frame',
        'source_frame',
        rclpy.time.Time())
except tf2_ros.LookupException as e:
    node.get_logger().error(f"Ошибка преобразования: {e}")
```

***

## **4. Интеграция с другими пакетами**

* **`robot_state_publisher`** — основной источник трансформ для робота.
* **`rviz2`** — визуализация фреймов и трансформ.
* **`nav2`** — навигация с учётом систем координат (`map`, `odom`, `base_link`).
* **`moveit2`** — планирование движений с использованием `tf2`.

***

## **5. Запуск и утилиты**

### **Командные утилиты**

* **`tf2_echo <source_frame> <target_frame>`** — вывод текущего преобразования между фреймами.
* **`view_frames`** — генерация PDF-графа связей фреймов.
* **`tf2_monitor`** — мониторинг задержек и ошибок в трансформах.

### **Пример launch-файла**

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

def generate_launch_description():
    return LaunchDescription([
        Node(
            package='tf2_ros',
            executable='static_transform_publisher',
            arguments=['0', '0', '0.1', '0', '0', '0', 'base_link', 'laser']
        )
    ])
```

***

## **6. Важные особенности**

* **Временные метки**: `tf2` учитывает время трансформ, что важно для корректной работы с задержками.
* **Буферизация**: `tf2_ros.Buffer` хранит историю трансформ (настраивается через параметры).
* **Обработка ошибок**:
  * `LookupException` — фрейм не найден.
  * `ExtrapolationException` — нет данных на нужный момент времени.
  * `ConnectivityException` — разрыв в графе фреймов.

***

## **7. Типичные проблемы и решения**

* **"No transform from X to Y"**:
  * Проверить, публикуются ли трансформы (`rostopic echo /tf`).
  * Убедиться, что фреймы существуют в URDF.
* **Задержки трансформ**: увеличить буфер (`tf2_ros.Buffer`).
* **Дублирование фреймов**: избегать конфликтов между `robot_state_publisher` и ручными трансформами.

***

## **8. Документация и ресурсы**

* Официальная документация: <https://index.ros.org/p/tf2/>
* Исходный код: <https://github.com/ros2/geometry2>

***

`tf2` — это фундаментальная библиотека ROS 2, обеспечивающая **согласованное представление систем координат** робота. Она критически важна для навигации, обработки сенсорных данных и управления движениями.


---

# 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/tf2.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.
