Appearance
ПР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 | идентификатор запроса сервиса; одинаковый повтор не должен выполнять работу дважды |
| цель действия | число ячеек участка и скорость объезда |
| прогресс | доля уже обработанных ячеек, публикуется между «старт» и «финиш» |
| результат | обработанные и пропущенные ячейки |
| тайм-аут | предельное время ожидания ответа/завершения; обрабатывается явно, а не падением |
Что сделать
- Создайте пакет
cleaning_interfacesс собственной парой.srvи.action. Пакет интерфейсов должен собираться отдельно от реализации. - В
cleaning_taskпостройте сервер сервиса (создание участка по описанию) и сервер действия: принимает цель, публикует прогресс, завершает результат и корректно реагирует на запрос отмены (нулевая команда движению). - В исходном коде один обработчик намеренно блокируется и не замечает отмену. Воспроизведите позднюю остановку, разбейте работу на короткие шаги и добавьте тест предельного времени безопасной остановки для обычного завершения, отмены и тайм-аута.
Сохраните .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.
Если использовался ИИ, применяются правила курса.