Lab039 — двухступенчатая безопасная реакция и оценка пути до остановки

Состояние Git до реализации
- Корень: C:/Users/user/Desktop/projects/SDR_Rover
- Ветка: main
- HEAD: 23cfdf581b63d2674e7c48965aea45cc5afff2d7
- Перед окончательным повторным запуском рабочее дерево содержало только новые файлы Lab039; индекс был пуст.
- Неизвестных изменений не было; локально известный origin/main имел ahead/behind 0/0.
- Lab036–Lab038 присутствовали; Lab038 зафиксирована коммитом 23cfdf5.
- Fetch, pull и push не выполнялись.

Конечный автомат
- NORMAL поддерживает заданную скорость и принимает только команды с новым sequence.
- STAGE1_DECELERATION запрещает положительное ускорение и применяет a_stage1.
- STAGE2_BRAKING задаёт нулевую скорость и применяет a_stage2 до точной остановки.
- EMERGENCY_LATCHED выполняет ту же обязательную остановку, фиксируется и не снимается обычной командой.
- Свежая команда снимает только временные защитные состояния; старая и повторная команды таймер не обновляют.
- Предварительная реакция уменьшает скорость с возможностью мягкого восстановления, а обязательное торможение требует полной остановки.

Порядок совпадающих событий
- Полностью полученная emergency-команда обрабатывается первой и фиксирует аварийную остановку.
- Полностью полученная свежая обычная команда обрабатывается раньше первого и второго порогов watchdog при одинаковом времени.
- Такая команда обновляет время свежести и отменяет переход, рассчитанный от предыдущей команды; затем очередь событий строится заново.
- Далее обрабатывается второй порог, затем первый; равные пороги запрещены проверкой ThresholdPolicy.
- Правило receive-before-threshold отдельно проверяется для обоих порогов.

Параметры движения и эксперимента
- Длительность опыта: 120 с; команды: 20 Гц; a_resume=1.0 м/с².
- Основная матрица: 5 каналов × 4 политики × 3 скорости × 3 профиля = 180 сочетаний.
- Условия с потерями: 100 повторов; контроль без потерь: один детерминированный опыт.
- Скорости: 5, 15 и 25 км/ч; внутри модели используются м/с.
- Профили a_stage1/a_stage2: мягкий 0,5/2,0; номинальный 1,0/3,0; интенсивный 1,5/4,0 м/с².
- Интегрирование событийное и точное на каждом участке постоянного ускорения; крупный фиксированный шаг не используется.
- Ранее сформированный каталог результатов Lab039 удалён; все CSV, TXT и PNG получены заново одним полным запуском окончательного кода.
- Проверенные при построении нагрузки пакеты CRC/FEC: 12356/714.

Компактная сводка 180 сочетаний
политика | реакции этапа 1, 1/мин (среднее) | торможения этапа 2, 1/мин (среднее) | полные остановки, 1/мин (среднее) | максимальный полный путь, м
Один порог 250 мс | 0.0000 | 1.2510 | 0.1078 | 13.7924
Два порога 100/200 мс | 4.3680 | 1.6900 | 0.1303 | 13.2697
Два порога 150/250 мс | 2.5890 | 1.2510 | 0.1146 | 13.6170
Два порога 200/300 мс | 1.6900 | 0.9800 | 0.1024 | 13.9642

Расширенная сводка политик
политика | этап 1 ср/макс, 1/мин | этап 2 ср/макс, 1/мин | остановки ср/макс, 1/мин | путь ср/макс/P95макс, м | время этап 1/этап 2/ноль, % | потеря скорости, м/с | восстановление, с
Один порог 250 мс | 0.0000/0.0000 | 1.2510/2.3400 | 0.1078/0.7600 | 1.2516/13.7924/13.7924 | 0.0000/0.7027/0.1496 | 0.0000 | 0.6127
Два порога 100/200 мс | 4.3680/11.3850 | 1.6900/2.9950 | 0.1303/0.8400 | 1.3003/13.2697/13.2697 | 0.4340/0.8205/0.1686 | 0.0256 | 0.5525
Два порога 150/250 мс | 2.5890/4.2100 | 1.2510/2.3400 | 0.1146/0.7850 | 1.2081/13.6170/13.6170 | 0.2864/0.7027/0.1568 | 0.0220 | 0.5362
Два порога 200/300 мс | 1.6900/2.9950 | 0.9800/1.8650 | 0.1024/0.7350 | 1.2571/13.9642/13.9642 | 0.2084/0.6121/0.1463 | 0.0219 | 0.5336

Интерпретация агрегированного пути
- Нулевой полный путь в строке сочетания означает отсутствие полной остановки в данном сочетании, а не отсутствие движения ровера.
- Средний путь, включающий нулевые значения сочетаний без полной остановки, нельзя использовать как единственный показатель безопасности.
- Для сравнения политик необходимо совместно учитывать максимальный путь, аналитический путь при длительной потере связи, частоту обязательных торможений и частоту полных остановок.

Сравнение 100/200 и 150/250 мс по выбранным условиям
канал | скорость, км/ч | политика | этап 1/этап 2/остановки, 1/мин | путь ср/макс/P95макс, м | время этап 1/этап 2/ноль, % | потеря скорости, м/с | восстановление, с
260 кбит/с, помеха 200 мс | 5 | Два порога 100/200 мс | 4.4650/2.9300/0.3950 | 0.5553/0.7234/0.7234 | 0.6166/1.0200/0.1803 | 0.0492 | 0.4254
260 кбит/с, помеха 200 мс | 5 | Два порога 150/250 мс | 3.7700/2.3400/0.3133 | 0.6292/0.7929/0.7929 | 0.4875/0.8047/0.1435 | 0.0358 | 0.4040
260 кбит/с, помеха 200 мс | 15 | Два порога 100/200 мс | 4.4650/2.9300/0.0100 | 0.8148/2.8425/2.8425 | 0.6166/1.0200/0.0038 | 0.0485 | 0.4887
260 кбит/с, помеха 200 мс | 15 | Два порога 150/250 мс | 3.7700/2.3400/0.0067 | 0.8181/3.0509/3.0509 | 0.4875/0.8047/0.0026 | 0.0355 | 0.4626
260 кбит/с, помеха 200 мс | 25 | Два порога 100/200 мс | 4.4650/2.9300/0.0000 | 0.0000/0.0000/0.0000 | 0.6166/1.0200/0.0000 | 0.0484 | 0.4887
260 кбит/с, помеха 200 мс | 25 | Два порога 150/250 мс | 3.7700/2.3400/0.0000 | 0.0000/0.0000/0.0000 | 0.4875/0.8047/0.0000 | 0.0354 | 0.4619
230 кбит/с, помеха 200 мс | 5 | Два порога 100/200 мс | 4.8100/2.9950/0.3783 | 0.5574/0.7234/0.7234 | 0.6405/1.0384/0.1851 | 0.0415 | 0.4091
230 кбит/с, помеха 200 мс | 5 | Два порога 150/250 мс | 3.8550/2.3150/0.2983 | 0.6301/0.7929/0.7929 | 0.5002/0.8226/0.1486 | 0.0414 | 0.3972
230 кбит/с, помеха 200 мс | 15 | Два порога 100/200 мс | 4.8100/2.9950/0.0167 | 2.1422/3.5846/3.5846 | 0.6405/1.0384/0.0090 | 0.0415 | 0.4642
230 кбит/с, помеха 200 мс | 15 | Два порога 150/250 мс | 3.8550/2.3150/0.0133 | 2.2813/3.7930/3.7930 | 0.5002/0.8226/0.0076 | 0.0414 | 0.4523
230 кбит/с, помеха 200 мс | 25 | Два порога 100/200 мс | 4.8100/2.9950/0.0017 | 2.3840/7.1519/7.1519 | 0.6405/1.0384/0.0002 | 0.0415 | 0.4656
230 кбит/с, помеха 200 мс | 25 | Два порога 150/250 мс | 3.8550/2.3150/0.0000 | 0.0000/0.0000/0.0000 | 0.5002/0.8226/0.0000 | 0.0412 | 0.4533
230 кбит/с, помеха 1000 мс | 5 | Два порога 100/200 мс | 1.1800/1.0550/0.7050 | 0.5691/0.7234/0.7234 | 0.1867/1.9272/1.3055 | 0.0092 | 0.9961
230 кбит/с, помеха 1000 мс | 5 | Два порога 150/250 мс | 1.1100/1.0350/0.6650 | 0.6408/0.7929/0.7929 | 0.1773/1.8405/1.2442 | 0.0049 | 0.9795
230 кбит/с, помеха 1000 мс | 15 | Два порога 100/200 мс | 1.1800/1.0550/0.3083 | 3.6007/5.0676/5.0676 | 0.1867/1.9272/0.5730 | 0.0092 | 2.0091
230 кбит/с, помеха 1000 мс | 15 | Два порога 150/250 мс | 1.1100/1.0350/0.2883 | 3.8241/5.2759/5.2759 | 0.1773/1.8405/0.5452 | 0.0049 | 1.9554
230 кбит/с, помеха 1000 мс | 25 | Два порога 100/200 мс | 1.1800/1.0550/0.1383 | 8.7272/13.2697/13.2697 | 0.1867/1.9272/0.2724 | 0.0092 | 2.3735
230 кбит/с, помеха 1000 мс | 25 | Два порога 150/250 мс | 1.1100/1.0350/0.1317 | 9.1214/13.6170/13.6170 | 0.1773/1.8405/0.2596 | 0.0049 | 2.3052
- Полные данные каждой комбинации находятся в lab039_summary.csv, lab039_watchdog_metrics.csv и lab039_distance_metrics.csv.

Путь и защитные реакции
- Максимальный наблюдавшийся промежуток без свежей команды: 6546.922 мс.
- Максимальное время применения устаревшей команды до обязательного торможения: 300 мс.
- Максимальный путь до первой реакции: 1.7361 м.
- Максимальный путь до второго порога: 2.0808 м.
- Максимальный тормозной путь после второго порога: 12.0563 м.
- Максимальный полный путь после последней свежей команды: 13.9642 м.
- Частота предварительных реакций: 0.0000…11.3850 1/мин.
- Частота полных остановок: 0.0000…0.8400 1/мин.
- Произведение v × timeout описывает только путь до порога; после него ровер сохраняет скорость и проходит дополнительный тормозной путь.
- Путь реакции растёт линейно со скоростью, а идеализированный тормозной путь v²/(2a) — квадратично, поэтому высокая начальная скорость особенно существенна.
- Короткий первый порог чаще пересекается обычными краткими помехами и вызывает лишние замедления.
- Длинный второй порог дольше сохраняет движение до обязательного торможения и увеличивает полный путь.

Аналитические контрольные расчёты без восстановления связи
скорость, км/ч | профиль | один порог: реакция/торможение/итого, м | 150/250: реакция/замедление/торможение/итого, м | разница, м | ошибка модели, м
5 | Мягкий | 0.3472/0.4823/0.8295 | 0.2083/0.1364/0.4482/0.7929 | -0.0366 | 0.000e+00
5 | Номинальный | 0.3472/0.3215/0.6687 | 0.2083/0.1339/0.2769/0.6191 | -0.0496 | 0.000e+00
5 | Интенсивный | 0.3472/0.2411/0.5883 | 0.2083/0.1314/0.1919/0.5316 | -0.0568 | 0.000e+00
15 | Мягкий | 1.0417/4.3403/5.3819 | 0.6250/0.4142/4.2367/5.2759 | -0.1060 | 0.000e+00
15 | Номинальный | 1.0417/2.8935/3.9352 | 0.6250/0.4117/2.7563/3.7930 | -0.1422 | 0.000e+00
15 | Интенсивный | 1.0417/2.1701/3.2118 | 0.6250/0.4092/2.0167/3.0509 | -0.1609 | 0.000e+00
25 | Мягкий | 1.7361/12.0563/13.7924 | 1.0417/0.6919/11.8833/13.6170 | -0.1755 | 0.000e+00
25 | Номинальный | 1.7361/8.0376/9.7737 | 1.0417/0.6894/7.8077/9.5388 | -0.2348 | 0.000e+00
25 | Интенсивный | 1.7361/6.0282/7.7643 | 1.0417/0.6869/5.7706/7.4992 | -0.2651 | 0.000e+00
- Максимальная абсолютная ошибка событийной модели: 0.000e+00 м.

Независимая аварийная остановка
- Расчёт: 45 сочетаний; emergency сформирована на 60-й секунде; политика локального таймера 150/250 мс.
- Итоговая доставка за окно 500 мс: 98.000…100.000%.
- Время первой доставки: среднее до 8.609 мс, P95 до 6.523 мс, максимум 204.765 мс.
- Путь за время доставки: до 0.0597 м в среднем по сочетанию.
- Тормозной путь после получения: до 12.0563 м в среднем по сочетанию.
- Полный путь от формирования до остановки: среднее до 12.1106 м; максимум 12.8187 м.
- Недоставок за 500 мс: 2 в одном канальном условии, 3 суммарно в независимых транспортных опытах.
- При недоставке доля опытов с включением второго этапа локального таймера: до 100.000%.
- При недоставке доля остановок локальным таймером: до 100.000%.
- Средний путь локальной остановки при недоставке: до 2.8541 м; время — до 1.6847 с.
- Удалённая emergency не заменяет локальный сторожевой таймер: канал может быть физически недоступен, а локальная реакция не зависит от доставки.
- ACK лишь прекращает будущие копии и информирует отправителя; торможение начинается при первом корректном emergency до получения ACK.

Инварианты безопасности
- Отрицательная скорость: 0 случаев.
- Превышение заданной скорости: 0 случаев.
- Второй порог превышен без торможения: 0 случаев.
- Снятие временного состояния старой командой: 0 случаев.
- Снятие аварийной остановки обычной командой: 0 случаев.

Интерпретация пары 150/250 мс
- Для 150/250 мс средняя частота предварительных реакций по матрице: 2.5890 1/мин; полных остановок: 0.1146 1/мин.
- Для 100/200 мс соответствующие значения: 4.3680 и 0.1303 1/мин; для 200/300 мс: 1.6900 и 0.1024 1/мин.
- Максимальный полный путь 150/250 мс: 13.6170 м; 100/200 мс: 13.2697 м; 200/300 мс: 13.9642 м.
- Эти результаты характеризуют компромисс, но не подтверждают окончательный выбор: пороги и замедления автоматически не назначаются.

Ограничения модели
- a_stage1 и a_stage2 являются исследовательскими параметрами и должны быть измерены на реальном ровере.
- Не моделируются уклон, пробуксовка, задержка электромеханического тормоза, изменение сцепления и сопротивление воздуха.
- Не моделируются поперечная динамика, перенос массы, ABS и фактическое время нарастания тормозного момента.
- Это расчётная одномерная модель, а не окончательный алгоритм силовой части и не замена натурных испытаний.

Функциональные проверки
- PASS 01_fresh_command_updates_watchdog: fresh sequence updates timer
- PASS 02_old_command_does_not_update_watchdog: old sequence ignored
- PASS 03_duplicate_does_not_update_watchdog: equal sequence ignored
- PASS 04_first_threshold_enters_stage1: 150 ms enters preliminary deceleration
- PASS 05_second_threshold_enters_stage2: 250 ms enters mandatory braking
- PASS 06_single_threshold_skips_stage1: single threshold goes directly to stage2
- PASS 07_stage1_forbids_positive_acceleration: stage1 acceleration is non-positive
- PASS 08_stage2_commands_zero_speed: stage2 applies mandatory braking to zero
- PASS 09_speed_never_negative: braking is clipped at zero
- PASS 10_constant_acceleration_matches_formula: v and s match analytic formula
- PASS 11_internal_zero_crossing_is_exact: internal stop time integrated exactly
- PASS 12_new_command_releases_temporary_state: fresh command releases temporary state
- PASS 13_old_command_does_not_release_state: old command cannot release stage1
- PASS 14_emergency_enters_latched_state: first emergency latches state
- PASS 15_normal_command_does_not_unlatch: ordinary command cannot unlatch emergency
- PASS 16_ack_not_required_for_braking: braking starts before any ACK
- PASS 17_lost_ack_continues_repetition: controlled first ACK loss deterministically causes exactly one later copy
- PASS 18_received_ack_stops_future_copies: received ACK stops future copies
- PASS 19_stage2_threshold_never_missed: second threshold always enters braking
- PASS 20_fixed_seed_reproducibility: identical seed gives identical intervals
- PASS 21_fresh_command_wins_first_threshold_tie: fresh command at stage1 time is received before the threshold
- PASS 22_fresh_command_wins_second_threshold_tie: fresh command at stage2 time is received before mandatory braking

Созданные файлы
- protocol/two_stage_failsafe.py
- tests/lab039_two_stage_braking.py
- data/processed/lab039/lab039_summary.csv
- data/processed/lab039/lab039_watchdog_metrics.csv
- data/processed/lab039/lab039_distance_metrics.csv
- data/processed/lab039/lab039_emergency_stop_metrics.csv
- data/processed/lab039/lab039_analytic_checks.csv
- data/processed/lab039/lab039_report.txt
- data/processed/lab039/lab039_path_by_speed.png
- data/processed/lab039/lab039_policy_comparison.png
- data/processed/lab039/lab039_deceleration_profiles.png
- data/processed/lab039/lab039_reaction_rates.png
- data/processed/lab039/lab039_safety_state_time.png
- data/processed/lab039/lab039_emergency_path.png
- data/processed/lab039/lab039_analytic_vs_model.png
- data/processed/lab039/lab039_tradeoff.png

Состояние результатов
- Lab039 оставлена вне индекса Git и не закоммичена.
- Lab028–Lab038 не изменялись.
- Сохранены только компактные агрегированные CSV, TXT и PNG; запрещённые артефакты не создавались.
