Appearance
ПР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).
Что сделать
- Запустите
mcity-minimal.sdfв headless-режиме, добавьте робота и подключите конфигурацию моста из базовой версии курса. - Измените один параметр сенсора и добавьте пространство имён в launch-файл. Измерьте фактическую частоту (
ros2 topic hz) и метки времени симуляции (ros2 topic echo /clock --once): заявленная и измеренная частоты должны совпадать с точностью до настроек. - В копии конфигурации моста неверно указаны направление или топик 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.
Диагностическая последовательность
- Проверить SDF отдельно от runtime:
gz sdf -k. - Убедиться, что симуляционное время растёт, а мир не стоит на паузе.
- Найти последнюю границу, на которой видна команда: safe-топик, выход адаптера, Gazebo Transport, изменение odometry.
- Проверить пару типов и
directionв YAML; совпадение названий само по себе ничего не доказывает. - Только после прохождения команды исследовать сочленения, оси, трение и физику.
Такой порядок отделяет ошибку маршрутизации от ошибки кинематики и уменьшает число случайных правок.
Как работаем на лабораторной
После проверки дерева tf2 сопоставим названия топиков ROS 2 и Gazebo. Затем запустите мир только с сервером или устраните первую ошибку моста. Это последняя практическая работа, обязательная и для проектной, и для экзаменационной траектории.
Общий порядок: runbook · troubleshooting.
Если использовался ИИ, применяются правила курса.