Appearance
ПР11. Контур безопасности
Работа относится к проектной траектории. Рассчитывайте на одну лабораторную пару и примерно 2,5 часа самостоятельной доработки.
Цель
Построить ограничитель между /drive/raw и /drive/safe и доказать по таблице отказов, что числовые пределы, свежесть сцены, дистанция остановки и heartbeat работают независимо от источника команды, а каждая остановка имеет причину в /safety/status.
Критерии зачтено
Работа зачтена, когда выполнены все три стадии и прошла автопроверка:
| Стадия | Что требуется |
|---|---|
| 1 · Собрать | единственный путь через ограничитель, /safety/status с причиной и счётчиком, таблица отказов «стимул → реакция → восстановление → тест» |
| 2 · Сломать | старая команда проходит после потери сенсора: воспроизвести опасное движение |
| 3 · Доказать | сторожевой таймер даёт нулевую скорость, восстановление только по явному правилу, время остановки в лимите |
| Автопроверка | check_practice.py PR11 проверит evidence/pr11/{fault-matrix.md,safety-tests.txt,status.json} и заявления public_tests_passed, defect_reproduced, defect_fixed, safe_stop_verified |
Что получится
Ограничитель между /drive/raw и /drive/safe будет проверять числовые пределы, свежесть сцены, расстояние до препятствия и heartbeat контроллера. Каждое вмешательство получает понятную причину в /safety/status.
Пакеты и понятия
safety_supervisor— пакет ограничителя между/drive/raw(команда от любого источника: контроллер, VLM, политика) и/drive/safe(единственный вход адаптера привода)./safety/status— состояние ограничителя: режим (nominal/limited/stopped), причина вмешательства, счётчик.- Свежесть сцены: возраст входного описания (
stampпротив текущего времени); потеря сенсора → старая команда не должна исполняться (watchdog/heartbeat). - Восстановление — явное правило возврата в рабочий режим, а не «само прошло».
Что сделать
- Подключите открытый интерфейс безопасности: адаптер привода подписан только на
/drive/safe, ограничитель публикует/safety/statusс причиной и счётчиком вмешательств. - Для каждого сбоя (превышение предела, старый вход, препятствие, потеря heartbeat) запишите в таблицу отказов: стимул, способ обнаружения, безопасную реакцию, условие восстановления и регрессионный тест.
- Исходная версия пропускает старую команду после потери сенсора. Воспроизведите опасное движение (
stale_scene→ команда всё равно уходит), добавьте сторожевой таймер и проверьте, что после сбоя скорость становится нулевой, а восстановление происходит только по явному правилу.
Сохраните evidence/pr11/{fault-matrix.md,safety-tests.txt,status.json,report.json}.
Проверка
bash
colcon test --packages-select safety_supervisor
PYTHONPATH=project/src python3 -m unittest project/tests/test_vertical_slice.py
python3 /path/to/course/tools/check_practice.py PR11 --submission .Готово, если к приводу ведёт единственный путь через ограничитель, все fixtures останавливают робота за заданное время, а восстановление происходит только по явному правилу. Дополнительно: property-based тест числовых пределов.
Как работаем на лабораторной
После проверки адаптера сцены составим короткую таблицу опасных ситуаций. Затем запустите fixture с устаревшей сценой и сохраните тест, который сначала падает.
Общий порядок: runbook · troubleshooting.
Если использовался ИИ, применяются правила курса.
Обязательные правила
- адаптер привода подписан только на
/drive/safe; - числовые значения, скорость изменения, свежесть и проверка конечности действуют независимо от источника
/drive/raw; - каждая остановка или ограничение имеет причину, входные величины и правило восстановления;
- аварийная остановка не задерживается обычным ограничителем темпа изменения;
- property-based тесты дополняют, но не заменяют физический сценарий остановки.