Инструменты интроспекции и rqt

ROS даёт богатый набор инструментов, чтобы видеть и отлаживать живую систему без кода.

Интроспекция — это осмотр работающей системы ROS изнутри: какие узлы запущены, какие топики и сервисы есть, что по ним идёт. Главный графический инструмент — rqt.

Командная строка ros2

Утилита ros2 — швейцарский нож робототехника. У неё единый шаблон: ros2 <что> <действие>. Освоив его, вы исследуете любую систему.

КомандаЧто показывает
ros2 node list / infoузлы и их связи
ros2 topic list / echo / hz / infoтопики, данные, частоту
ros2 service list / callсервисы и их вызов
ros2 action list / send_goalдействия
ros2 param list / get / setпараметры
ros2 interface showструктуру типа сообщения

rqt_graph — карта системы

Команда rqt_graph рисует живой граф вычислений: овалы — узлы, прямоугольники — топики, стрелки — потоки данных. Это бесценно при отладке: сразу видно, что узел планировщика, оказывается, не подписан на лидар, или что в /cmd_vel почему-то пишут два узла сразу.

rqt_graph
 ( lidar_driver ) --/scan--> [ /scan ] --> ( obstacle_avoid )
 ( obstacle_avoid ) --/cmd_vel--> [ /cmd_vel ] --> ( base_controller )

rqt и его плагины

rqt — это контейнер графических плагинов. Кроме графа есть: rqt_console (просмотр логов всех узлов в одном окне с фильтрами), rqt_plot (строит график числового поля топика в реальном времени — например, скорость во времени), rqt_reconfigure (крутилки для параметров узлов вживую). Это превращает абстрактную распределённую систему в наглядную приборную панель.

Отладка распределённой системы

Робот — это распределённая система, и баги в ней коварны. Узел запущен, но молчит; топик есть, но пустой; данные идут, но в неверной системе координат. Универсальный алгоритм диагностики:

  1. ros2 node list — все ли узлы поднялись?
  2. ros2 topic list + echo — идут ли данные и какие?
  3. ros2 topic hz — не упала ли частота?
  4. rqt_graph — все ли связи на месте?
  5. rqt_console — нет ли ошибок в логах?

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

Все эти инструменты — обычные узлы ROS. ros2 topic echo создаёт временного подписчика на топик. rqt_graph опрашивает discovery DDS, чтобы узнать, кто что публикует. Логи узлов идут в специальный топик /rosout, и rqt_console просто подписывается на него. Поэтому инструменты интроспекции ничем не «привилегированы» — они играют по тем же правилам графа, что и ваши узлы.

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

  • Отлаживать кодом то, что видно командой. Часто echo и rqt_graph мгновенно показывают проблему.
  • Забыть про разный ROS_DOMAIN_ID. Инструмент в другом домене не увидит узлов — будет казаться, что их нет.
  • Не смотреть /rosout. Ошибки узлов часто уже залогированы, а вы ищете причину вслепую.

Итоги

  • ros2 node/topic/service/param/action — командный осмотр живой системы.
  • rqt_graph рисует граф узлов и топиков.
  • rqt-плагины дают логи, графики и настройку параметров вживую.
  • Инструменты — это обычные узлы, играющие по правилам графа.
Проверьте себя
1. Что рисует rqt_graph?
AКарту помещения
BЖивой граф узлов, топиков и связей между ними
CГрафик заряда батареи
DДерево файлов проекта
2. Куда узлы пишут свои логи, откуда их читает rqt_console?
AВ файл /var/log
BВ топик /rosout
CВ сервис /logs
DВ параметр log
3. Узел запущен, но ros2 topic echo молчит. С чего разумно начать диагностику?
AПереустановить ROS
BПроверить ros2 topic hz/info и совпадение ROS_DOMAIN_ID и QoS
CПереписать узел на C++
DУдалить топик