Симуляция в 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 проверку.