Skip to content

ПР06. Gazebo и мост ros_gz

Работа обязательна для обеих траекторий. Рассчитывайте на одну лабораторную пару и примерно 2 часа самостоятельной доработки.

Цель

Запустить мир без графического окна и доказать по топикам полный путь /drive/safe → адаптер → bridge → Gazebo → odometry на единой временной шкале, а также зафиксировать частоты и системы координат всех сенсоров.

Критерии зачтено

Работа зачтена, когда выполнены все три стадии и прошла автопроверка:

СтадияЧто требуется
1 · Собратьheadless-запуск mcity-minimal.sdf с роботом и конфигурацией моста
2 · Сломатьв копии конфигурации неверны направление или топик IMU/команды
3 · Доказатьошибка найдена через ros2 topic info -v и исправлена без второго моста; команда видна на обеих сторонах
Автопроверкаcheck_practice.py PR06 проверит src/**/*.sdf, src/**/bridge*.yaml, evidence/pr06/{sensors.json,headless.txt} и заявления public_tests_passed, defect_reproduced, defect_fixed, headless_verified

Что получится

Вы запустите SDF-модель без графического окна, передадите безопасную команду Ackermann через адаптер и ros_gz, а затем прочитаете камеру, лидар, IMU, одометрию и их системы координат.

Главная проверка — полный путь /drive/safe → adapter → bridge → Gazebo → odometry и единую временную шкалу.

Перед началом

  • выполнена ПР05: дерево frames связно и у каждого ребра один владелец;
  • tools/workstation_report.sh сохранён в evidence и не показывает критического сбоя выбранного рендерера;
  • версии среды совпадают с project/baseline.lock.yaml;
  • для Docker-пути workspace уже собран внутри osrf/ros:lyrical-desktop-full, а не подмонтирован из другой ROS-среды.

Пакеты и понятия

  • mcity-minimal.sdf — мир курса; робот подключается отдельно, модель — course-owned SDF с камерой, лидаром, IMU и одометрией.
  • Мир подключает модель по URI model://course_ackermann, поэтому рабочее пространство требует путь к моделям: export GZ_SIM_RESOURCE_PATH=$PWD/project/models:$GZ_SIM_RESOURCE_PATH. Без этой переменной мир не загрузится («Unable to find uri model://course_ackermann»).
  • Адаптер — ваш код между ROS-командой и Gazebo: переводит смысл команды. Мост ros_gz — передатчик поддерживаемого типа между двумя транспортами.
  • Headless — запуск серверной части без графического окна (gz sim -s); это и есть маршрут проверки в CI.
  • Временная шкала симуляции: сенсоры, контроллер и оценка используют одно время, привязанное через /clock (use_sim_time).

Что сделать

  1. Запустите mcity-minimal.sdf в headless-режиме, добавьте робота и подключите конфигурацию моста из базовой версии курса.
  2. Измените один параметр сенсора и добавьте пространство имён в launch-файл. Измерьте фактическую частоту (ros2 topic hz) и метки времени симуляции (ros2 topic echo /clock --once): заявленная и измеренная частоты должны совпадать с точностью до настроек.
  3. В копии конфигурации моста неверно указаны направление или топик IMU либо команды. Найдите ошибку через ros2 topic info -v и исправьте без второго моста. Для команды докажите её наличие на обеих сторонах: ROS-топик и gz topic -i -t /model/course_ackermann/cmd_vel.

Для каждого сенсора зафиксировать название топика, тип, frame_id, источник времени, заявленную и измеренную частоту.

Сохраните .sdf, YAML моста и evidence/pr06/{sensors.json,headless.txt,report.json}.

Проверка

bash
gz sdf -k project/worlds/mcity-minimal.sdf
gz sim -s project/worlds/mcity-minimal.sdf
ros2 launch ros_gz_bridge ros_gz_bridge.launch.py config_file:=bridge.yaml
ros2 topic info -v /vehicle/gz_cmd_vel
gz topic -i -t /model/course_ackermann/cmd_vel
ros2 topic echo /clock --once
colcon test
python3 /path/to/course/tools/check_practice.py PR06 --submission .

Готово, если безоконный запуск завершает короткий сценарий, сенсоры используют время симуляции и корректные системы координат, а /drive/raw не доходит до Gazebo в обход /drive/safe. Дополнительно: повторите запуск в Docker.

Диагностическая последовательность

  1. Проверить SDF отдельно от runtime: gz sdf -k.
  2. Убедиться, что симуляционное время растёт, а мир не стоит на паузе.
  3. Найти последнюю границу, на которой видна команда: safe-топик, выход адаптера, Gazebo Transport, изменение odometry.
  4. Проверить пару типов и direction в YAML; совпадение названий само по себе ничего не доказывает.
  5. Только после прохождения команды исследовать сочленения, оси, трение и физику.

Такой порядок отделяет ошибку маршрутизации от ошибки кинематики и уменьшает число случайных правок.

Как работаем на лабораторной

После проверки дерева tf2 сопоставим названия топиков ROS 2 и Gazebo. Затем запустите мир только с сервером или устраните первую ошибку моста. Это последняя практическая работа, обязательная и для проектной, и для экзаменационной траектории.

Общий порядок: runbook · troubleshooting.

Если использовался ИИ, применяются правила курса.

Официальные справочники

Учебные материалы: CC BY 4.0 · Код: Apache-2.0