Appearance
ПР05. Launch, QoS и повтор записи
Работа входит в общее ядро курса. Рассчитывайте на одну лабораторную пару и примерно 2 часа самостоятельной доработки.
Входные данные
Простой launch уже знаком по ПР02; здесь добавляем аргументы, namespace и запись. Возьмите свой пакет patrol из ПР04 и добавьте пакет course_bringup и тестовую ноду pose_relay. pose_relay читает /turtle1/pose и публикует sensor_pose с best_effort: используйте turtlesim/msg/Pose в Jazzy или turtlesim_msgs/msg/Pose в Lyrical — тот же тип, который вернула команда ros2 topic type /turtle1/pose в ПР04. Отдельный подписчик использует настраиваемый QoS. Записывайте /robot_a/sensor_pose. Launch-файл принимает аргументы namespace, record, bag_dir и subscriber_reliability; имена топиков внутри нод остаются относительными. Если ПР04 ещё не готова, сначала доведите её до успешных функциональных тестов.
Цель
Одной launch-командой поднять систему, записать поток в MCAP и доказать, что несовместимые профили QoS обнаружены и исправлены на живом потоке и на повторе записи.
Критерии зачтено
Работа зачтена, когда выполнены все три стадии и прошла автопроверка:
| Стадия | Что требуется |
|---|---|
| 1 · Собрать | launch-файл с аргументами, namespace, переназначениями, логами и записью MCAP |
| 2 · Сломать | reliable-подписчик против best effort-сенсора: топик виден, сообщений нет (qos-before.txt) |
| 3 · Доказать | совместимость восстановлена, тот же профиль проверен на живом потоке и записи (qos-after.txt) |
| Автопроверка | check_practice.py PR05 проверит src/**/package.xml, src/**/*launch.py, src/**/pose_relay.py, evidence/pr05/{qos-before.txt,qos-after.txt,bag-metadata.yaml} и заявления public_tests_passed, defect_reproduced, defect_fixed, replay_verified |
Что получится
Одна launch-команда поднимет систему в пространстве имён /robot_a. Вы запишете поток в MCAP и найдёте случай, когда топик виден, но сообщения не приходят из-за несовместимых профилей QoS.
Пакеты и понятия
course_bringup— пакет с launch-файлами: он поднимает всю систему одной командой, а не отдельные ноды вручную.- Пространство имён (
namespace) — префикс полного имени топика (например,/robot_a/cmd_vel); переназначение (remap) переименовывает топик для конкретной ноды. - QoS — профиль надёжности обмена: издатель и подписчик совместимы только когда совместимы запрашиваемые и предлагаемые политики, в частности
reliabilityиdurability. Издательbest effortне может обслужить подписчикаreliable. - MCAP — контейнер записи
rosbag2: хранит сообщения и их временную шкалу, но не версии кода и аргументы запуска.
Что сделать
На паре сначала запустите одну систему в /robot_a; только затем добавляйте проверку QoS и запись. Используйте реальное время, а tf пока не требуется.
- Создайте launch-файл в пакете
course_bringup: аргументы запуска, namespace, переназначения, логи и запись потока в MCAP черезros2 bag record. ПередайтеrecordчерезIfCondition; приfalserecorder не запускается. Не проверяйтеLaunchConfigurationобычнымif. - Запустите систему в
/robot_aи проверьте полные имена. Переназначьте её выход команды в/turtle1/cmd_vel; один turtlesim запускается глобально. - Подписчик с
reliableне получает сенсорный потокbest effort— топик виден вros2 topic list, но сообщения не доходят. Сохраните диагностику (qos-before.txt), исправьте совместимость профилей и повторите проверку на живом потоке и на повторе записи (qos-after.txt).
Для replay создайте config/qos-overrides.yaml:
yaml
/robot_a/sensor_pose:
reliability: best_effort
history: keep_last
depth: 10Сначала сохраните отсутствие сообщений у reliable-подписчика. Затем переключите его на best_effort, запишите один исправленный поток и проиграйте эту же запись с тем же QoS override. Не объединяйте «до» и «после» в разные наборы входных сообщений.
Сохраните launch-файл и evidence/pr05/{qos-before.txt,qos-after.txt,bag-metadata.yaml,report.json}. bag-metadata.yaml копируется из каталога MCAP; вывод ros2 bag info добавляется в qos-after.txt и показывает, что запись содержит один поток.
Проверка
Обязательные файлы сдачи
- В корне репозитория —
AI_USAGE.md, с отдельной записью для PR05: модель, инструмент, характер помощи и способ проверки. Если ИИ не использовался, напишите это явно и поставьтеai_used: falseв отчёте; файл всё равно нужен. Предыдущие записи сохраняйте. Правила и пример. - В
evidence/pr05/report.jsonполеcommit— SHA уже созданного коммита реализации. Отчёт фиксируется следующим коммитом; его SHA указывается при сдаче вместе со ссылкой на CI. Пошаговый пример двух коммитов.
bash
colcon test
# Терминал 1, до исправления:
ros2 launch course_bringup patrol.launch.py \
namespace:=robot_a subscriber_reliability:=reliable record:=false
# Терминал 2: ожидаемый timeout сохраните в qos-before.txt.
timeout 3s ros2 topic echo /robot_a/sensor_pose \
--qos-reliability reliable --once > evidence/pr05/qos-before.txt
# Перезапустите launch с subscriber_reliability:=best_effort, затем:
timeout 3s ros2 topic echo /robot_a/sensor_pose \
--qos-reliability best_effort --once > evidence/pr05/qos-after.txt
ros2 bag record -s mcap -o evidence/pr05/bag \
--topics /robot_a/sensor_pose
# Остановите recorder через Ctrl+C, затем живой launch.
# В A запустите replay, в B повторите оба echo до/после:
ros2 bag play evidence/pr05/bag \
--qos-profile-overrides-path config/qos-overrides.yaml
ros2 bag info evidence/pr05/bag >> evidence/pr05/qos-after.txt
cp evidence/pr05/bag/metadata.yaml evidence/pr05/bag-metadata.yaml
python3 .course-kit/v1/tools/check_practice.py PR05 --submission .Готово, если система запускается из нового терминала, имена изолированы в /robot_a, а один bag-файл показывает сбой до и нормальную доставку после правки QoS. Дополнительно: launch-тест с корректным завершением процессов.
Как работаем на лабораторной
После проверки параметров разберём минимальный пример несовместимого QoS. Затем проверьте несовместимый профиль, после исправления запишите bag и соберите запуск в отдельном пространстве имён.
Общий порядок: runbook · troubleshooting.
Декларация AI_USAGE.md оформляется по правилам курса, в том числе без ИИ.
Официальные справочники
Дополнительное расширение: вторая независимая копия /robot_b. Не делайте её условием первого рабочего запуска.