Skip to content

ПР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).
  • Восстановление — явное правило возврата в рабочий режим, а не «само прошло».

Что сделать

  1. Подключите открытый интерфейс безопасности: адаптер привода подписан только на /drive/safe, ограничитель публикует /safety/status с причиной и счётчиком вмешательств.
  2. Для каждого сбоя (превышение предела, старый вход, препятствие, потеря heartbeat) запишите в таблицу отказов: стимул, способ обнаружения, безопасную реакцию, условие восстановления и регрессионный тест.
  3. Исходная версия пропускает старую команду после потери сенсора. Воспроизведите опасное движение (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 тесты дополняют, но не заменяют физический сценарий остановки.

Официальные справочники

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