Skip to content

ПР03. Сервис и действие для объезда участка

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

Цель

Собрать собственные .srv и .action и доказать, что действие объезда сообщает прогресс и безопасно останавливается по отмене в предельное время.

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

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

СтадияЧто требуется
1 · Собратьпакет интерфейсов с .srv и .action; действие принимает ячейки и скорость, шлёт прогресс и результат
2 · Сломатьблокирующий обработчик не замечает отмену: воспроизвести позднюю остановку
3 · Доказатьработа разбита на короткие шаги; отмена выдаёт нулевую команду в предельное время, тайм-аут обработан явно
Автопроверкаcheck_practice.py PR03 проверит src/**/package.xml, src/**/*.srv, src/**/*.action, evidence/pr03/execution.md и заявления public_tests_passed, defect_reproduced, defect_fixed

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

Сервис быстро создаёт описание участка, а действие последовательно объезжает его ячейки, сообщает прогресс и безопасно останавливается по запросу. На этом примере станет видно, чем запрос–ответ отличается от задачи, живущей во времени.

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

  • cleaning_interfaces — пакет только с интерфейсами (.srv/.action), без исполняемых нод; сервер и клиент зависят от него.
  • cleaning_task — пакет реализации: сервер сервиса «создать участок» и сервер действия «объехать участок».
  • Сервис: один запрос — один ответ. Действие: цель + обратная связь (прогресс) + результат + протокол отмены. Отмена выполняется до конца: действие публикует результат и выдаёт нулевую команду движению, а не только меняет статус.
ЭлементЧто означает
request_idидентификатор запроса сервиса; одинаковый повтор не должен выполнять работу дважды
цель действиячисло ячеек участка и скорость объезда
прогрессдоля уже обработанных ячеек, публикуется между «старт» и «финиш»
результатобработанные и пропущенные ячейки
тайм-аутпредельное время ожидания ответа/завершения; обрабатывается явно, а не падением

Что сделать

  1. Создайте пакет cleaning_interfaces с собственной парой .srv и .action. Пакет интерфейсов должен собираться отдельно от реализации.
  2. В cleaning_task постройте сервер сервиса (создание участка по описанию) и сервер действия: принимает цель, публикует прогресс, завершает результат и корректно реагирует на запрос отмены (нулевая команда движению).
  3. В исходном коде один обработчик намеренно блокируется и не замечает отмену. Воспроизведите позднюю остановку, разбейте работу на короткие шаги и добавьте тест предельного времени безопасной остановки для обычного завершения, отмены и тайм-аута.

Сохраните .srv, .action, модульные и launch-тесты, а также evidence/pr03/{execution.md,report.json} с трассами обычного выполнения, отмены и тайм-аута.

Проверка

bash
colcon test --packages-select cleaning_interfaces cleaning_task
ros2 action list -t
python3 /path/to/course/tools/check_practice.py PR03 --submission .

Готово, если пакет интерфейсов собирается отдельно, отмена не оставляет ненулевую команду, а тайм-аут обрабатывается явно. Дополнительно: сделайте повтор запроса идемпотентным по request_id.

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

После разбора параметров нарисуйте две последовательности: обычное завершение и отмена посередине. Затем создайте пакет интерфейсов и тест, который сначала показывает слишком позднюю остановку.

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

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

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