Связь с железом и micro-ROS

Чтобы ROS управлял настоящими моторами и датчиками, нужны драйверы и мост к микроконтроллерам — micro-ROS.

micro-ROS — версия ROS 2 для микроконтроллеров: она позволяет запустить настоящий ROS-узел прямо на плате вроде ESP32, который публикует и подписывается на топики наравне с узлами на компьютере.

Два мира: компьютер и микроконтроллер

Мозг робота — компьютер (Raspberry Pi, ноутбук) с полноценным ROS 2: навигация, планирование, обработка камеры. Но моторы, энкодеры и простые датчики висят на микроконтроллере (ESP32, STM32) — он работает в реальном времени, точно крутит ШИМ моторов и читает энкодеры. Знакомым по нашим курсам Arduino и MicroPython это близко: МК отвечает за «железную» часть. Вопрос — как связать эти два мира в одну систему ROS.

Способ 1: драйвер-узел на компьютере

Простой подход: на компьютере запускают узел-драйвер, который по последовательному порту (USB/UART) общается с МК по своему протоколу. Узел переводит сообщения ROS в команды для платы и обратно. МК при этом не знает о ROS — он говорит на простом языке «крути мотор на столько-то». Так подключают многие готовые контроллеры моторов.

 [ROS на Pi] --/cmd_vel--> [драйвер-узел] --USB/UART--> [ESP32] --> моторы
                          (переводит ROS <-> протокол платы)

Способ 2: micro-ROS прямо на плате

Более элегантный путь — поставить micro-ROS на сам ESP32. Тогда микроконтроллер становится полноправным узлом графа: он сам публикует /odom с энкодеров и подписывается на /cmd_vel. Отдельный узел-переводчик не нужен — плата говорит на языке ROS напрямую. Это требует более мощных МК (ESP32, STM32), потому что нужно уместить часть стека ROS в ограниченную память.

 [ROS на Pi] <==топики==> [ micro-ROS agent ] <--serial--> [ESP32: ROS-узел]
                         (мост в обычный граф)            публикует /odom
                                                          слушает /cmd_vel

micro-ROS Agent

МК слишком слаб для полного DDS, поэтому micro-ROS использует облегчённый протокол и агента — программу на компьютере, которая выступает мостом: она общается с платой по последовательному каналу и «вносит» её узел в обычный граф ROS 2. Для остальной системы узел на ESP32 неотличим от любого другого: он виден в ros2 node list, его топики — в ros2 topic list.

Как работает под капотом

micro-ROS построен на XRCE-DDS — «DDS для очень ограниченных устройств». МК не хранит всю логику discovery и сериализации; он шлёт компактные сообщения агенту, а тот разворачивает их в полноценный DDS-трафик. На самом МК micro-ROS обычно работает поверх реал-тайм ОС (например, FreeRTOS) или в составе прошивки. Память жёстко ограничена, поэтому число и размер сообщений планируют заранее — динамически «насоздавать» топиков, как на компьютере, нельзя.

Частые ошибки

  • Забыть запустить micro-ROS agent. Без моста узел на плате не появится в графе — «робота не видно».
  • Перегрузить слабый МК. Большие сообщения (картинки) на ESP32 не уместятся; ему оставляют моторы и простые датчики.
  • Путать уровни ответственности. Реальное время и точный ШИМ — на МК; тяжёлые вычисления — на компьютере.

Итоги

  • Железо подключают либо узлом-драйвером на компьютере, либо micro-ROS на самом МК.
  • micro-ROS превращает ESP32/STM32 в полноценный узел графа ROS 2.
  • micro-ROS Agent — мост между платой и обычным графом через XRCE-DDS.
  • МК берёт реальное время и моторы, компьютер — тяжёлые вычисления.
Проверьте себя
1. Что такое micro-ROS?
AМаленькая версия RViz
BВерсия ROS 2 для микроконтроллеров, делающая плату полноценным узлом графа
CОблегчённый дистрибутив Ubuntu
DТип лидара
2. Зачем нужен micro-ROS Agent?
AЧтобы ускорить процессор
BЭто мост: он вносит узел с микроконтроллера в обычный граф ROS 2
CЧтобы собрать пакеты
DЧтобы рисовать карту
3. Как разумно распределить задачи между МК и компьютером?
AВсё считать на МК
BРеальное время и моторы — на МК, тяжёлые вычисления — на компьютере
CВсё на компьютере, МК не нужен
DСлучайным образом