Симуляция в Gazebo

Прежде чем рисковать настоящим роботом, его испытывают в симуляторе Gazebo.

Gazebo — физический симулятор для ROS: он моделирует робота и окружающий мир с реалистичной физикой, генерируя виртуальные данные датчиков, как настоящие.

Зачем симуляция

Настоящий робот стоит денег, ломается при падении с лестницы и требует места. Симуляция снимает эти ограничения. В Gazebo можно за минуту перезапустить эксперимент, проверить алгоритм на сотне разных комнат, протестировать поведение при разрядке батареи или отказе мотора — всё без риска. Команды разрабатывают и отлаживают навигацию робота, у которого ещё нет ни одной железной детали. Это называют разработкой «sim-first».

Что моделирует Gazebo

  • Физику: массы, трение, столкновения, гравитацию. Колёса буксуют, робот опрокидывается, если центр тяжести высоко.
  • Датчики: виртуальный лидар «светит» лучами и возвращает расстояния до виртуальных стен, камера рендерит сцену, IMU выдаёт ускорения.
  • Мир: комнаты, мебель, препятствия, другие роботы — целые сцены.

Связь с ROS

Gazebo интегрируется с ROS через плагины. Виртуальный лидар публикует в тот же топик /scan с тем же типом LaserScan, что и настоящий. Виртуальные моторы подписываются на /cmd_vel. Для остальной системы симуляция неотличима от реальности — те же топики, те же сообщения.

 реальный мир:   [ железный лидар ] --/scan--> [ навигация ]
 симуляция:      [ Gazebo лидар   ] --/scan--> [ навигация ]
                  (навигация не видит разницы)

Именно поэтому навигацию пишут один раз, а гоняют и в Gazebo, и на железе без изменений кода.

Запуск

# запустить симулятор с миром
ros2 launch my_robot_sim world.launch.py

# поехать вперёд в симуляции
ros2 topic pub /cmd_vel geometry_msgs/msg/Twist "{linear: {x: 0.2}}"

Использование URDF

Gazebo берёт ту же модель робота из URDF, что и RViz, но использует её полнее: collision-геометрию для столкновений, inertial (массу и инерцию) для физики. К URDF добавляют плагины датчиков: тег, который говорит «здесь виртуальный лидар, публикуй в /scan с такими параметрами». Так одна модель служит и для визуализации, и для симуляции.

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

Gazebo гоняет цикл физического движка: на каждом шаге (например, раз в миллисекунду модельного времени) он решает уравнения механики — кто куда сдвинулся, что столкнулось. Виртуальные датчики на каждом шаге считывают состояние мира и публикуют сообщения. Важная деталь — симулированное время: в симуляции есть свои часы (топик /clock), и узлы должны использовать его, а не реальное, иначе при замедленной симуляции всё рассинхронизируется. Это включают параметром use_sim_time: true.

Sim-to-real разрыв

Симуляция не идеальна: реальное трение, шум датчиков и задержки моторов всегда немного другие. Алгоритм, идеальный в Gazebo, на железе может вести себя хуже — это sim-to-real gap. Поэтому симуляция не отменяет тесты на реальном роботе, а сильно сокращает их число и риск.

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

  • Забыть use_sim_time. Узлы берут реальное время вместо симулированного — TF и данные рассинхронизируются.
  • Отсутствие inertial в URDF. Физика без масс ведёт себя нереалистично — робот «дёргается» или проваливается.
  • Слепо верить симуляции. Идеально в Gazebo не значит идеально на железе из-за sim-to-real разрыва.

Итоги

  • Gazebo симулирует робота и мир с физикой и виртуальными датчиками.
  • Симуляция использует те же топики, что и реальный робот — код не меняется.
  • Модель берётся из URDF плюс плагины датчиков; нужно use_sim_time.
  • Симуляция ускоряет разработку, но не отменяет sim-to-real проверку.
Проверьте себя
1. Что такое Gazebo?
AМенеджер пакетов
BФизический симулятор робота и мира с виртуальными датчиками
CИнструмент рисования графа
DТип сообщения
2. Почему навигацию не нужно переписывать для симуляции и для реального робота?
AGazebo переписывает код сам
BСимуляция публикует те же топики и типы сообщений, что и реальные датчики
CНавигация работает только в Gazebo
DЭто разные программы
3. Зачем нужен параметр use_sim_time: true?
AЧтобы ускорить симуляцию
BЧтобы узлы использовали симулированное время (/clock), а не реальное
CЧтобы отключить физику
DЧтобы сменить язык