Lab040: add persistent emergency intent and safe reset
@@ -336,3 +336,28 @@ git version 2.51.1.windows.1
|
|||||||
- Фактические замедления должны быть измерены на реальном ровере.
|
- Фактические замедления должны быть измерены на реальном ровере.
|
||||||
- Локальный сторожевой таймер сохранил безопасную реакцию в опытах, где аварийная команда не была доставлена.
|
- Локальный сторожевой таймер сохранил безопасную реакцию в опытах, где аварийная команда не была доставлена.
|
||||||
- Следующий этап исследует постоянное аварийное намерение наземной станции и безопасное разрешение повторного движения.
|
- Следующий этап исследует постоянное аварийное намерение наземной станции и безопасное разрешение повторного движения.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Запись 015
|
||||||
|
|
||||||
|
## Дата
|
||||||
|
|
||||||
|
5 августа 2026 года
|
||||||
|
|
||||||
|
## Тема
|
||||||
|
|
||||||
|
Завершение Lab040: постоянное аварийное намерение и безопасное повторное разрешение движения.
|
||||||
|
|
||||||
|
## Выполнено
|
||||||
|
|
||||||
|
- Lab040 реализует постоянное аварийное намерение наземной станции.
|
||||||
|
- Ограниченное окно повторения 500 мс признано небезопасным.
|
||||||
|
- При полностью потерянной аварийной передаче ограниченный режим допускал последующее возобновление движения.
|
||||||
|
- В одном из тяжёлых условий путь после такого восстановления достигал в среднем около 490 м при 25 км/ч.
|
||||||
|
- Постоянное аварийное намерение исключило положительные задания скорости и небезопасные возобновления движения.
|
||||||
|
- Подтверждение аварийной команды не снимает аварийное намерение.
|
||||||
|
- Сброс принимается только после остановки, при свежей связи и корректных идентификаторах.
|
||||||
|
- Подтверждение сброса не восстанавливает старую команду движения.
|
||||||
|
- Движение требует новой явной команды оператора.
|
||||||
|
- Следующий этап посвящён сеансам связи, перезапускам устройств и защите от пакетов предыдущего сеанса.
|
||||||
|
|||||||
BIN
data/processed/lab040/lab040_emergency_delivery.png
Normal file
|
After Width: | Height: | Size: 64 KiB |
46
data/processed/lab040/lab040_emergency_metrics.csv
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
channel_condition,mode,initial_speed_kmh,repetitions,delivered_fraction,mean_latch_delay_ms,p95_latch_delay_ms,max_latch_delay_ms,mean_copies,mean_lost_copies,mean_ack_delay_ms,acknowledgements_lost_mean,intent_time_fraction,positive_commands_after_emergency_mean,permitted_commands_after_emergency_mean,time_to_command_suppression_mean_ms,all_first_500ms_lost
|
||||||
|
no_loss,limited_lab038,5.0,1,1.0,1.6800000000003479,1.6800000000003479,1.6800000000003479,1.0,0.0,2.80000000000058,0.0,0.004166666666666667,1800.0,1800.0,90000.0,0
|
||||||
|
no_loss,limited_lab038,15.0,1,1.0,1.6800000000003479,1.6800000000003479,1.6800000000003479,1.0,0.0,2.80000000000058,0.0,0.004166666666666667,1800.0,1800.0,90000.0,0
|
||||||
|
no_loss,limited_lab038,25.0,1,1.0,1.6800000000003479,1.6800000000003479,1.6800000000003479,1.0,0.0,2.80000000000058,0.0,0.004166666666666667,1800.0,1800.0,90000.0,0
|
||||||
|
no_loss,persistent_no_reset,5.0,1,1.0,1.6800000000003479,1.6800000000003479,1.6800000000003479,1.0,0.0,2.80000000000058,0.0,0.75,0.0,0.0,0.0,0
|
||||||
|
no_loss,persistent_no_reset,15.0,1,1.0,1.6800000000003479,1.6800000000003479,1.6800000000003479,1.0,0.0,2.80000000000058,0.0,0.75,0.0,0.0,0.0,0
|
||||||
|
no_loss,persistent_no_reset,25.0,1,1.0,1.6800000000003479,1.6800000000003479,1.6800000000003479,1.0,0.0,2.80000000000058,0.0,0.75,0.0,0.0,0.0,0
|
||||||
|
no_loss,persistent_safe_reset,5.0,1,1.0,1.6800000000003479,1.6800000000003479,1.6800000000003479,1.0,0.0,2.80000000000058,0.0,0.25002111388888887,0.0,0.0,0.0,0
|
||||||
|
no_loss,persistent_safe_reset,15.0,1,1.0,1.6800000000003479,1.6800000000003479,1.6800000000003479,1.0,0.0,2.80000000000058,0.0,0.25002111388888887,0.0,0.0,0.0,0
|
||||||
|
no_loss,persistent_safe_reset,25.0,1,1.0,1.6800000000003479,1.6800000000003479,1.6800000000003479,1.0,0.0,2.80000000000058,0.0,0.25002111388888887,0.0,0.0,0.0,0
|
||||||
|
300_50,limited_lab038,5.0,200,1.0,2.9917333333336593,1.6800000000003479,155.81333333333092,1.025,0.025,4.111736666667216,0.0,0.004166666666666667,1800.0,1800.0,90000.0,0
|
||||||
|
300_50,limited_lab038,15.0,200,1.0,2.9917333333336593,1.6800000000003479,155.81333333333092,1.025,0.025,4.111736666667216,0.0,0.004166666666666667,1800.0,1800.0,90000.0,0
|
||||||
|
300_50,limited_lab038,25.0,200,1.0,2.9917333333336593,1.6800000000003479,155.81333333333092,1.025,0.025,4.111736666667216,0.0,0.004166666666666667,1800.0,1800.0,90000.0,0
|
||||||
|
300_50,persistent_no_reset,5.0,200,1.0,2.9917333333336593,1.6800000000003479,155.81333333333092,1.025,0.025,4.111736666667216,0.0,0.75,0.0,0.0,0.0,0
|
||||||
|
300_50,persistent_no_reset,15.0,200,1.0,2.9917333333336593,1.6800000000003479,155.81333333333092,1.025,0.025,4.111736666667216,0.0,0.75,0.0,0.0,0.0,0
|
||||||
|
300_50,persistent_no_reset,25.0,200,1.0,2.9917333333336593,1.6800000000003479,155.81333333333092,1.025,0.025,4.111736666667216,0.0,0.75,0.0,0.0,0.0,0
|
||||||
|
300_50,persistent_safe_reset,5.0,200,1.0,2.9917333333336593,1.6800000000003479,155.81333333333092,1.025,0.025,4.111736666667216,0.0,0.25003919386111106,0.0,0.0,0.0,0
|
||||||
|
300_50,persistent_safe_reset,15.0,200,1.0,2.9917333333336593,1.6800000000003479,155.81333333333092,1.025,0.025,4.111736666667216,0.0,0.25003919386111106,0.0,0.0,0.0,0
|
||||||
|
300_50,persistent_safe_reset,25.0,200,1.0,2.9917333333336593,1.6800000000003479,155.81333333333092,1.025,0.025,4.111736666667216,0.0,0.25003919386111106,0.0,0.0,0.0,0
|
||||||
|
260_200,limited_lab038,5.0,200,1.0,19.55153846217634,18.64615384679169,157.53846153910445,1.02,0.02,20.843847308325895,0.0,0.004166666666666667,1800.0,1800.0,90000.0,0
|
||||||
|
260_200,limited_lab038,15.0,200,1.0,19.55153846217634,18.64615384679169,157.53846153910445,1.02,0.02,20.843847308325895,0.0,0.004166666666666667,1800.0,1800.0,90000.0,0
|
||||||
|
260_200,limited_lab038,25.0,200,1.0,19.55153846217634,18.64615384679169,157.53846153910445,1.02,0.02,20.843847308325895,0.0,0.004166666666666667,1800.0,1800.0,90000.0,0
|
||||||
|
260_200,persistent_no_reset,5.0,200,1.0,19.55153846217634,18.64615384679169,157.53846153910445,1.02,0.02,20.843847308325895,0.0,0.75,0.0,0.0,0.0,0
|
||||||
|
260_200,persistent_no_reset,15.0,200,1.0,19.55153846217634,18.64615384679169,157.53846153910445,1.02,0.02,20.843847308325895,0.0,0.75,0.0,0.0,0.0,0
|
||||||
|
260_200,persistent_no_reset,25.0,200,1.0,19.55153846217634,18.64615384679169,157.53846153910445,1.02,0.02,20.843847308325895,0.0,0.75,0.0,0.0,0.0,0
|
||||||
|
260_200,persistent_safe_reset,5.0,200,1.0,19.55153846217634,18.64615384679169,157.53846153910445,1.02,0.02,20.843847308325895,0.0,0.2501198999711538,0.0,0.0,0.0,0
|
||||||
|
260_200,persistent_safe_reset,15.0,200,1.0,19.55153846217634,18.64615384679169,157.53846153910445,1.02,0.02,20.843847308325895,0.0,0.2501198999711538,0.0,0.0,0.0,0
|
||||||
|
260_200,persistent_safe_reset,25.0,200,1.0,19.55153846217634,18.64615384679169,157.53846153910445,1.02,0.02,20.843847308325895,0.0,0.2501198999711538,0.0,0.0,0.0,0
|
||||||
|
230_200,limited_lab038,5.0,200,1.0,5.925913042961427,3.860869564700664,258.1217391299049,1.04,0.04,7.386914565218402,0.0,0.004166666666666667,1800.0,1800.0,90000.0,0
|
||||||
|
230_200,limited_lab038,15.0,200,1.0,5.925913042961427,3.860869564700664,258.1217391299049,1.04,0.04,7.386914565218402,0.0,0.004166666666666667,1800.0,1800.0,90000.0,0
|
||||||
|
230_200,limited_lab038,25.0,200,1.0,5.925913042961427,3.860869564700664,258.1217391299049,1.04,0.04,7.386914565218402,0.0,0.004166666666666667,1800.0,1800.0,90000.0,0
|
||||||
|
230_200,persistent_no_reset,5.0,200,1.0,5.925913042961427,3.860869564700664,258.1217391299049,1.04,0.04,7.386914565218402,0.0,0.75,0.0,0.0,0.0,0
|
||||||
|
230_200,persistent_no_reset,15.0,200,1.0,5.925913042961427,3.860869564700664,258.1217391299049,1.04,0.04,7.386914565218402,0.0,0.75,0.0,0.0,0.0,0
|
||||||
|
230_200,persistent_no_reset,25.0,200,1.0,5.925913042961427,3.860869564700664,258.1217391299049,1.04,0.04,7.386914565218402,0.0,0.75,0.0,0.0,0.0,0
|
||||||
|
230_200,persistent_safe_reset,5.0,200,1.0,5.925913042961427,3.860869564700664,258.1217391299049,1.04,0.04,7.386914565218402,0.0,0.25013972127536394,0.0,0.0,0.0,0
|
||||||
|
230_200,persistent_safe_reset,15.0,200,1.0,5.925913042961427,3.860869564700664,258.1217391299049,1.04,0.04,7.386914565218402,0.0,0.25013972127536394,0.0,0.0,0.0,0
|
||||||
|
230_200,persistent_safe_reset,25.0,200,1.0,5.925913042961427,3.860869564700664,258.1217391299049,1.04,0.04,7.386914565218402,0.0,0.25013972127536394,0.0,0.0,0.0,0
|
||||||
|
230_1000,limited_lab038,5.0,200,0.99,3.860869564700665,3.860869564700664,3.860869564700664,1.1,0.11,5.321869565218408,0.0,0.004166666666666667,1800.0,1800.0,90000.0,2
|
||||||
|
230_1000,limited_lab038,15.0,200,0.99,3.860869564700665,3.860869564700664,3.860869564700664,1.1,0.11,5.321869565218408,0.0,0.004166666666666667,1800.0,1800.0,90000.0,2
|
||||||
|
230_1000,limited_lab038,25.0,200,0.99,3.860869564700665,3.860869564700664,3.860869564700664,1.1,0.11,5.321869565218408,0.0,0.004166666666666667,1800.0,1800.0,90000.0,2
|
||||||
|
230_1000,persistent_no_reset,5.0,200,1.0,17.288521738613035,3.860869564700664,1371.3391304341976,1.265,0.265,18.74952043477778,0.0,0.75,0.0,0.0,0.0,2
|
||||||
|
230_1000,persistent_no_reset,15.0,200,1.0,17.288521738613035,3.860869564700664,1371.3391304341976,1.265,0.265,18.74952043477778,0.0,0.75,0.0,0.0,0.0,2
|
||||||
|
230_1000,persistent_no_reset,25.0,200,1.0,17.288521738613035,3.860869564700664,1371.3391304341976,1.265,0.265,18.74952043477778,0.0,0.75,0.0,0.0,0.0,2
|
||||||
|
230_1000,persistent_safe_reset,5.0,200,1.0,17.288521738613035,3.860869564700664,1371.3391304341976,1.265,0.265,18.74952043477778,0.0,0.2500872242282613,0.0,0.0,0.0,2
|
||||||
|
230_1000,persistent_safe_reset,15.0,200,1.0,17.288521738613035,3.860869564700664,1371.3391304341976,1.265,0.265,18.74952043477778,0.0,0.2500872242282613,0.0,0.0,0.0,2
|
||||||
|
230_1000,persistent_safe_reset,25.0,200,1.0,17.288521738613035,3.860869564700664,1371.3391304341976,1.265,0.265,18.74952043477778,0.0,0.2500872242282613,0.0,0.0,0.0,2
|
||||||
|
BIN
data/processed/lab040/lab040_latch_time.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
46
data/processed/lab040/lab040_load_metrics.csv
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
channel_condition,mode,initial_speed_kmh,repetitions,emergency_copy_load_kbps,emergency_ack_load_kbps,zero_control_load_kbps,reset_request_load_kbps,reset_ack_load_kbps,total_extra_load_kbps,video_published_fraction,telemetry_delivered_fraction,maximum_queue_packets
|
||||||
|
no_loss,limited_lab038,5.0,1,0.004200000000000001,0.0028,0.0,0.0,0.0,0.007000000000000001,1.0,1.0,21
|
||||||
|
no_loss,limited_lab038,15.0,1,0.004200000000000001,0.0028,0.0,0.0,0.0,0.007000000000000001,1.0,1.0,21
|
||||||
|
no_loss,limited_lab038,25.0,1,0.004200000000000001,0.0028,0.0,0.0,0.0,0.007000000000000001,1.0,1.0,21
|
||||||
|
no_loss,persistent_no_reset,5.0,1,0.004200000000000001,0.0028,5.52,0.0,0.0,0.007000000000000001,1.0,1.0,21
|
||||||
|
no_loss,persistent_no_reset,15.0,1,0.004200000000000001,0.0028,5.52,0.0,0.0,0.007000000000000001,1.0,1.0,21
|
||||||
|
no_loss,persistent_no_reset,25.0,1,0.004200000000000001,0.0028,5.52,0.0,0.0,0.007000000000000001,1.0,1.0,21
|
||||||
|
no_loss,persistent_safe_reset,5.0,1,0.004200000000000001,0.0028,1.9657333333333333,0.0032666666666666664,0.0030666666666666668,0.013333333333333334,1.0,1.0,21
|
||||||
|
no_loss,persistent_safe_reset,15.0,1,0.004200000000000001,0.0028,1.9657333333333333,0.0032666666666666664,0.0030666666666666668,0.013333333333333334,1.0,1.0,21
|
||||||
|
no_loss,persistent_safe_reset,25.0,1,0.004200000000000001,0.0028,1.9657333333333333,0.0032666666666666664,0.0030666666666666668,0.013333333333333334,1.0,1.0,21
|
||||||
|
300_50,limited_lab038,5.0,200,0.004305000000000001,0.0028,0.0,0.0,0.0,0.007105,0.9416527777777778,0.9792,21
|
||||||
|
300_50,limited_lab038,15.0,200,0.004305000000000001,0.0028,0.0,0.0,0.0,0.007105,0.9416527777777778,0.9792,21
|
||||||
|
300_50,limited_lab038,25.0,200,0.004305000000000001,0.0028,0.0,0.0,0.0,0.007105,0.9416527777777778,0.9792,21
|
||||||
|
300_50,persistent_no_reset,5.0,200,0.004305000000000001,0.0028,5.52,0.0,0.0,0.007105,0.9416527777777778,0.9792,21
|
||||||
|
300_50,persistent_no_reset,15.0,200,0.004305000000000001,0.0028,5.52,0.0,0.0,0.007105,0.9416527777777778,0.9792,21
|
||||||
|
300_50,persistent_no_reset,25.0,200,0.004305000000000001,0.0028,5.52,0.0,0.0,0.007105,0.9416527777777778,0.9792,21
|
||||||
|
300_50,persistent_safe_reset,5.0,200,0.004305000000000001,0.0028,1.965856,0.0033973333333333334,0.0030973333333333334,0.013599666666666668,0.9416388888888889,0.9791875000000001,21
|
||||||
|
300_50,persistent_safe_reset,15.0,200,0.004305000000000001,0.0028,1.965856,0.0033973333333333334,0.0030973333333333334,0.013599666666666668,0.9416388888888889,0.9791875000000001,21
|
||||||
|
300_50,persistent_safe_reset,25.0,200,0.004305000000000001,0.0028,1.965856,0.0033973333333333334,0.0030973333333333334,0.013599666666666668,0.9416388888888889,0.9791875000000001,21
|
||||||
|
260_200,limited_lab038,5.0,200,0.0042840000000000005,0.0028,0.0,0.0,0.0,0.007084,0.9602777777777778,0.9797583333333334,36
|
||||||
|
260_200,limited_lab038,15.0,200,0.0042840000000000005,0.0028,0.0,0.0,0.0,0.007084,0.9602777777777778,0.9797583333333334,36
|
||||||
|
260_200,limited_lab038,25.0,200,0.0042840000000000005,0.0028,0.0,0.0,0.0,0.007084,0.9602777777777778,0.9797583333333334,36
|
||||||
|
260_200,persistent_no_reset,5.0,200,0.0042840000000000005,0.0028,5.52,0.0,0.0,0.007084,0.9602777777777778,0.9797583333333334,36
|
||||||
|
260_200,persistent_no_reset,15.0,200,0.0042840000000000005,0.0028,5.52,0.0,0.0,0.007084,0.9602777777777778,0.9797583333333334,36
|
||||||
|
260_200,persistent_no_reset,25.0,200,0.0042840000000000005,0.0028,5.52,0.0,0.0,0.007084,0.9602777777777778,0.9797583333333334,36
|
||||||
|
260_200,persistent_safe_reset,5.0,200,0.0042840000000000005,0.0028,1.9661473333333332,0.003707666666666667,0.003128,0.013919666666666667,0.9603055555555555,0.9797708333333333,38
|
||||||
|
260_200,persistent_safe_reset,15.0,200,0.0042840000000000005,0.0028,1.9661473333333332,0.003707666666666667,0.003128,0.013919666666666667,0.9603055555555555,0.9797708333333333,38
|
||||||
|
260_200,persistent_safe_reset,25.0,200,0.0042840000000000005,0.0028,1.9661473333333332,0.003707666666666667,0.003128,0.013919666666666667,0.9603055555555555,0.9797708333333333,38
|
||||||
|
230_200,limited_lab038,5.0,200,0.0043679999999999995,0.0028,0.0,0.0,0.0,0.007167999999999999,0.849125,0.97985,40
|
||||||
|
230_200,limited_lab038,15.0,200,0.0043679999999999995,0.0028,0.0,0.0,0.0,0.007167999999999999,0.849125,0.97985,40
|
||||||
|
230_200,limited_lab038,25.0,200,0.0043679999999999995,0.0028,0.0,0.0,0.0,0.007167999999999999,0.849125,0.97985,40
|
||||||
|
230_200,persistent_no_reset,5.0,200,0.0043679999999999995,0.0028,5.52,0.0,0.0,0.007167999999999999,0.849125,0.97985,40
|
||||||
|
230_200,persistent_no_reset,15.0,200,0.0043679999999999995,0.0028,5.52,0.0,0.0,0.007167999999999999,0.849125,0.97985,40
|
||||||
|
230_200,persistent_no_reset,25.0,200,0.0043679999999999995,0.0028,5.52,0.0,0.0,0.007167999999999999,0.849125,0.97985,40
|
||||||
|
230_200,persistent_safe_reset,5.0,200,0.0043679999999999995,0.0028,1.966408,0.003985333333333334,0.003143333333333333,0.014296666666666666,0.8491805555555555,0.9798749999999999,40
|
||||||
|
230_200,persistent_safe_reset,15.0,200,0.0043679999999999995,0.0028,1.966408,0.003985333333333334,0.003143333333333333,0.014296666666666666,0.8491805555555555,0.9798749999999999,40
|
||||||
|
230_200,persistent_safe_reset,25.0,200,0.0043679999999999995,0.0028,1.966408,0.003985333333333334,0.003143333333333333,0.014296666666666666,0.8491805555555555,0.9798749999999999,40
|
||||||
|
230_1000,limited_lab038,5.0,200,0.00462,0.0027719999999999997,0.0,0.0,0.0,0.007391999999999999,0.8631388888888889,0.9797125,40
|
||||||
|
230_1000,limited_lab038,15.0,200,0.00462,0.0027719999999999997,0.0,0.0,0.0,0.007391999999999999,0.8631388888888889,0.9797125,40
|
||||||
|
230_1000,limited_lab038,25.0,200,0.00462,0.0027719999999999997,0.0,0.0,0.0,0.007391999999999999,0.8631388888888889,0.9797125,40
|
||||||
|
230_1000,persistent_no_reset,5.0,200,0.005313,0.0028,5.52,0.0,0.0,0.008113,0.8631388888888889,0.9797083333333334,40
|
||||||
|
230_1000,persistent_no_reset,15.0,200,0.005313,0.0028,5.52,0.0,0.0,0.008113,0.8631388888888889,0.9797083333333334,40
|
||||||
|
230_1000,persistent_no_reset,25.0,200,0.005313,0.0028,5.52,0.0,0.0,0.008113,0.8631388888888889,0.9797083333333334,40
|
||||||
|
230_1000,persistent_safe_reset,5.0,200,0.005313,0.0028,1.96604,0.0035933333333333334,0.0030819999999999997,0.014788333333333334,0.8631805555555556,0.97975,39
|
||||||
|
230_1000,persistent_safe_reset,15.0,200,0.005313,0.0028,1.96604,0.0035933333333333334,0.0030819999999999997,0.014788333333333334,0.8631805555555556,0.97975,39
|
||||||
|
230_1000,persistent_safe_reset,25.0,200,0.005313,0.0028,1.96604,0.0035933333333333334,0.0030819999999999997,0.014788333333333334,0.8631805555555556,0.97975,39
|
||||||
|
46
data/processed/lab040/lab040_motion_metrics.csv
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
channel_condition,mode,initial_speed_kmh,repetitions,mean_distance_to_braking_m,p95_distance_to_braking_m,max_distance_to_braking_m,mean_distance_to_stop_m,p95_distance_to_stop_m,max_distance_to_stop_m,mean_time_to_stop_seconds,p95_time_to_stop_seconds,maximum_speed_after_emergency_mps,full_stop_fraction,reaccelerations_before_reset,braking_releases_before_reset_ack,movement_while_intent,recovery_after_lost_emergency,watchdog_stops_after_lost_emergency,unsafe_recoveries,mean_stop_to_resume_seconds,mean_distance_after_unsafe_resume_m,negative_speed_cases,target_speed_exceeded_cases
|
||||||
|
no_loss,limited_lab038,5.0,1,0.0023333333333326323,0.0023333333333326323,0.0023333333333326323,0.32383539094650615,0.32383539094650615,0.32383539094650615,0.46464296296296226,0.46464296296296226,1.3888888888888888,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
no_loss,limited_lab038,15.0,1,0.007000000000005002,0.007000000000005002,0.007000000000005002,2.900518518518524,2.900518518518524,2.900518518518524,1.3905688888888896,1.3905688888888896,4.166666666666667,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
no_loss,limited_lab038,25.0,1,0.011666666666656056,0.011666666666656056,0.011666666666656056,8.049218106995795,8.049218106995795,8.049218106995795,2.316494814814817,2.316494814814817,6.944444444444445,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
no_loss,persistent_no_reset,5.0,1,0.0023333333333326323,0.0023333333333326323,0.0023333333333326323,0.32383539094650615,0.32383539094650615,0.32383539094650615,0.46464296296296226,0.46464296296296226,1.3888888888888888,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
no_loss,persistent_no_reset,15.0,1,0.007000000000005002,0.007000000000005002,0.007000000000005002,2.900518518518524,2.900518518518524,2.900518518518524,1.3905688888888896,1.3905688888888896,4.166666666666667,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
no_loss,persistent_no_reset,25.0,1,0.011666666666656056,0.011666666666656056,0.011666666666656056,8.049218106995795,8.049218106995795,8.049218106995795,2.316494814814817,2.316494814814817,6.944444444444445,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
no_loss,persistent_safe_reset,5.0,1,0.0023333333333326323,0.0023333333333326323,0.0023333333333326323,0.32383539094650615,0.32383539094650615,0.32383539094650615,0.46464296296296226,0.46464296296296226,1.3888888888888888,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
no_loss,persistent_safe_reset,15.0,1,0.007000000000005002,0.007000000000005002,0.007000000000005002,2.900518518518524,2.900518518518524,2.900518518518524,1.3905688888888896,1.3905688888888896,4.166666666666667,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
no_loss,persistent_safe_reset,25.0,1,0.011666666666656056,0.011666666666656056,0.011666666666656056,8.049218106995795,8.049218106995795,8.049218106995795,2.316494814814817,2.316494814814817,6.944444444444445,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
300_50,limited_lab038,5.0,200,0.003523520833332583,0.0023333333333326323,0.09007453703703305,0.32543289857947344,0.32383539094650615,0.49304062124373615,0.4658030968518511,0.46464296296296226,1.3888888888888888,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
300_50,limited_lab038,15.0,200,0.010570562500004854,0.007000000000005002,0.27022361111110627,2.9053386202872944,2.9005185185185383,3.413649983383692,1.3917290227777783,1.3905688888888896,4.166666666666667,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
300_50,limited_lab038,25.0,200,0.017617604166656094,0.011666666666656056,0.45037268518515816,8.05726080290037,8.049218106995797,8.906275806428908,2.3176549487037055,2.316494814814817,6.944444444444445,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
300_50,persistent_no_reset,5.0,200,0.003523520833332583,0.0023333333333326323,0.09007453703703305,0.32543289857947344,0.32383539094650615,0.49304062124373615,0.4658030968518511,0.46464296296296226,1.3888888888888888,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
300_50,persistent_no_reset,15.0,200,0.010570562500004854,0.007000000000005002,0.27022361111110627,2.9053386202872944,2.9005185185185383,3.413649983383692,1.3917290227777783,1.3905688888888896,4.166666666666667,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
300_50,persistent_no_reset,25.0,200,0.017617604166656094,0.011666666666656056,0.45037268518515816,8.05726080290037,8.049218106995797,8.906275806428908,2.3176549487037055,2.316494814814817,6.944444444444445,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
300_50,persistent_safe_reset,5.0,200,0.003523520833332583,0.0023333333333326323,0.09007453703703305,0.32543289857947344,0.32383539094650615,0.49304062124373615,0.4658030968518511,0.46464296296296226,1.3888888888888888,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
300_50,persistent_safe_reset,15.0,200,0.010570562500004854,0.007000000000005002,0.27022361111110627,2.9053386202872944,2.9005185185185383,3.413649983383692,1.3917290227777783,1.3905688888888896,4.166666666666667,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
300_50,persistent_safe_reset,25.0,200,0.017617604166656094,0.011666666666656056,0.45037268518515816,8.05726080290037,8.049218106995797,8.906275806428908,2.3176549487037055,2.316494814814817,6.944444444444445,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
260_200,limited_lab038,5.0,200,0.02659741546859795,0.025897435898322385,0.15572649572737873,0.3445953708476268,0.3473994935114959,0.5185923163385837,0.4789198347584711,0.4816091168097536,1.3888888888888888,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
260_200,limited_lab038,15.0,200,0.0801952787182271,0.07769230769496005,0.4671794871821362,2.96093647562938,2.971210826213479,3.4861643328012093,1.4048457606843985,1.407535042735681,4.166666666666667,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
260_200,limited_lab038,25.0,200,0.1337931419678634,0.12948717949160482,0.7786324786368937,8.149294041316582,8.167038619820914,9.025752810169308,2.3307716866103227,2.333460968661605,6.944444444444445,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
260_200,persistent_no_reset,5.0,200,0.026314295810478294,0.025897435898322385,0.15572649572737873,0.3443122511895071,0.3473994935114959,0.5185923163385837,0.478715988604625,0.4816091168097536,1.3888888888888888,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
260_200,persistent_no_reset,15.0,200,0.07934591974386812,0.07769230769496005,0.4671794871821362,2.9600871166550213,2.971210826213479,3.4861643328012093,1.4046419145305524,1.407535042735681,4.166666666666667,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
260_200,persistent_no_reset,25.0,200,0.1323775436772651,0.12948717949160482,0.7786324786368937,8.147878443025984,8.167038619820914,9.025752810169308,2.3305678404564762,2.333460968661605,6.944444444444445,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
260_200,persistent_safe_reset,5.0,200,0.026314295810478294,0.025897435898322385,0.15572649572737873,0.3443122511895071,0.3473994935114959,0.5185923163385837,0.478715988604625,0.4816091168097536,1.3888888888888888,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
260_200,persistent_safe_reset,15.0,200,0.07934591974386812,0.07769230769496005,0.4671794871821362,2.9600871166550213,2.971210826213479,3.4861643328012093,1.4046419145305524,1.407535042735681,4.166666666666667,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
260_200,persistent_safe_reset,25.0,200,0.1323775436772651,0.12948717949160482,0.7786324786368937,8.147878443025984,8.167038619820914,9.025752810169308,2.3305678404564762,2.333460968661605,6.944444444444445,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
230_200,limited_lab038,5.0,200,0.006844621233567239,0.005362318839864599,0.1541304347818837,0.32576159827607626,0.3268643764530381,0.5648917516543079,0.4657324702088222,0.4668238325276626,1.3888888888888888,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
230_200,limited_lab038,15.0,200,0.020596070507492143,0.016086956519586693,0.4623913043456582,2.905471134864391,2.909605475038134,3.63035426730859,1.3916583961347495,1.39274975845359,4.166666666666667,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
230_200,limited_lab038,25.0,200,0.03434751978141037,0.02681159419930168,0.7706521739094399,8.057197132357981,8.064363034528526,9.267833243868353,2.3175843220606733,2.3186756843795138,6.944444444444445,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
230_200,persistent_no_reset,5.0,200,0.006844621233567239,0.005362318839864599,0.1541304347818837,0.32576159827607626,0.3268643764530381,0.5648917516543079,0.4657324702088222,0.4668238325276626,1.3888888888888888,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
230_200,persistent_no_reset,15.0,200,0.020596070507492143,0.016086956519586693,0.4623913043456582,2.905471134864391,2.909605475038134,3.63035426730859,1.3916583961347495,1.39274975845359,4.166666666666667,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
230_200,persistent_no_reset,25.0,200,0.03434751978141037,0.02681159419930168,0.7706521739094399,8.057197132357981,8.064363034528526,9.267833243868353,2.3175843220606733,2.3186756843795138,6.944444444444445,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
230_200,persistent_safe_reset,5.0,200,0.006844621233567239,0.005362318839864599,0.1541304347818837,0.32576159827607626,0.3268643764530381,0.5648917516543079,0.4657324702088222,0.4668238325276626,1.3888888888888888,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
230_200,persistent_safe_reset,15.0,200,0.020596070507492143,0.016086956519586693,0.4623913043456582,2.905471134864391,2.909605475038134,3.63035426730859,1.3916583961347495,1.39274975845359,4.166666666666667,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
230_200,persistent_safe_reset,25.0,200,0.03434751978141037,0.02681159419930168,0.7706521739094399,8.057197132357981,8.064363034528526,9.267833243868353,2.3175843220606733,2.3186756843795138,6.944444444444445,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
230_1000,limited_lab038,5.0,200,0.005283552251343249,0.005362318839864599,0.005362318839864599,0.3218591033962589,0.3268643764530381,0.3268643764530381,0.461660666666149,0.4668238325276626,1.3888888888888888,1.0,10,0,0,2,2,2,1.1665964573268308,120.24802134182156,0,0
|
||||||
|
230_1000,limited_lab038,15.0,200,0.015719344103756895,0.016086956519586693,0.016086956519586693,2.848456321603509,2.909605475038134,2.909605475038134,1.3719143961347493,1.39274975845359,4.166666666666667,1.0,10,0,0,2,2,2,0.240670531400907,356.3939634279401,0,0
|
||||||
|
230_1000,limited_lab038,25.0,200,0.02619747596775227,0.02681159419930168,0.02681159419930168,7.9154550932807,8.064363034528498,8.064363034528526,2.288520870540642,2.3186756843795138,6.944444444444445,0.99,10,0,0,2,0,2,0.0,599.4073675629743,0,0
|
||||||
|
230_1000,persistent_no_reset,5.0,200,0.005283552251343249,0.005362318839864599,0.005362318839864599,0.3218591033962589,0.3268643764530381,0.3268643764530381,0.461660666666149,0.4668238325276626,1.3888888888888888,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
230_1000,persistent_no_reset,15.0,200,0.015719344103756895,0.016086956519586693,0.016086956519586693,2.848456321603509,2.909605475038134,2.909605475038134,1.3719143961347493,1.39274975845359,4.166666666666667,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
230_1000,persistent_no_reset,25.0,200,0.02619747596775227,0.02681159419930168,0.02681159419930168,7.897429893107608,8.064363034528498,8.064363034528526,2.285820389693524,2.3186756843795138,6.944444444444445,1.0,0,0,0,0,0,0,0.0,0.0,0,0
|
||||||
|
230_1000,persistent_safe_reset,5.0,200,0.005283552251343249,0.005362318839864599,0.005362318839864599,0.3218591033962589,0.3268643764530381,0.3268643764530381,0.461660666666149,0.4668238325276626,1.3888888888888888,1.0,0,0,0,2,0,0,0.0,0.0,0,0
|
||||||
|
230_1000,persistent_safe_reset,15.0,200,0.015719344103756895,0.016086956519586693,0.016086956519586693,2.848456321603509,2.909605475038134,2.909605475038134,1.3719143961347493,1.39274975845359,4.166666666666667,1.0,0,0,0,2,0,0,0.0,0.0,0,0
|
||||||
|
230_1000,persistent_safe_reset,25.0,200,0.02619747596775227,0.02681159419930168,0.02681159419930168,7.897429893107608,8.064363034528498,8.064363034528526,2.285820389693524,2.3186756843795138,6.944444444444445,1.0,0,0,0,2,0,0,0.0,0.0,0,0
|
||||||
|
BIN
data/processed/lab040/lab040_protection_load.png
Normal file
|
After Width: | Height: | Size: 65 KiB |
170
data/processed/lab040/lab040_report.txt
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
Lab040 — постоянное аварийное намерение и безопасное повторное разрешение движения
|
||||||
|
|
||||||
|
Состояние Git до начала
|
||||||
|
- Корень: C:/Users/user/Desktop/projects/SDR_Rover
|
||||||
|
- Ветка: main
|
||||||
|
- HEAD: b3ebe1637fbb401198cdbb43a862e94614be9cb0
|
||||||
|
- Рабочее дерево и индекс были чистыми; относительно локально известной origin/main расхождение составляло 0/0.
|
||||||
|
- Коммиты Lab038 и Lab039 присутствовали; сетевые команды Git не выполнялись.
|
||||||
|
|
||||||
|
Автоматы наземной станции и ровера
|
||||||
|
- Наземная станция: GROUND_NORMAL → GROUND_EMERGENCY_REQUESTED → GROUND_EMERGENCY_CONFIRMED → GROUND_RESET_REQUESTED → GROUND_MOVEMENT_REAUTHORIZED.
|
||||||
|
- Подтверждение аварийной команды прекращает её копии, но не снимает аварийное намерение и не разрешает положительные команды движения.
|
||||||
|
- Ровер сохраняет состояния NORMAL, STAGE1_DECELERATION, STAGE2_BRAKING и EMERGENCY_LATCHED из Lab039.
|
||||||
|
- Обычная или поздняя старая команда не снимает EMERGENCY_LATCHED.
|
||||||
|
|
||||||
|
Безопасный сброс
|
||||||
|
- Сброс использует отдельные идентификаторы потоков и прикладные данные внутри неизменного пакета LinkPacket из Lab033.
|
||||||
|
- Проверяются зафиксированное аварийное состояние, нулевая фактическая скорость, свежесть связи 250 мс, идентификатор события, номер последовательности, нулевая требуемая скорость и запрет движения.
|
||||||
|
- Потерянное подтверждение сброса вызывает повтор запроса; принятый дубликат не повторяет действие, но вызывает новое подтверждение.
|
||||||
|
- После подтверждения сброса сохраняется нулевая скорость; новая команда оператора формируется только через 2 секунды и имеет новый номер последовательности.
|
||||||
|
|
||||||
|
Параметры
|
||||||
|
- Опыт 120 с; аварийная команда на 30-й секунде; сброс на 60-й секунде; команды 20 Гц; повторы каждые 50 мс.
|
||||||
|
- Матрица: 5 каналов × 3 режима × 3 скорости = 45 сочетаний; условия с потерями по 200 повторов.
|
||||||
|
- Сторожевой таймер 150/250 мс; замедление первой ступени 1,0 м/с², второй ступени 3,0 м/с², ускорение восстановления 1,0 м/с².
|
||||||
|
- Исходная нагрузка проверена контрольной суммой и помехоустойчивым кодированием: 12356/714.
|
||||||
|
|
||||||
|
Компактная таблица 45 сочетаний
|
||||||
|
канал | режим | скорость | доставка аварийной команды, % | время аварийного намерения, % | небезопасное восстановление, % | остановка, % | нагрузка, кбит/с | видео, % | телеметрия, % | очередь
|
||||||
|
Без потерь, 300 кбит/с | Ограниченное повторение | 5 | 100.000 | 0.417 | 0.000 | 100.000 | 0.00700 | 100.000 | 100.000 | 21
|
||||||
|
Без потерь, 300 кбит/с | Ограниченное повторение | 15 | 100.000 | 0.417 | 0.000 | 100.000 | 0.00700 | 100.000 | 100.000 | 21
|
||||||
|
Без потерь, 300 кбит/с | Ограниченное повторение | 25 | 100.000 | 0.417 | 0.000 | 100.000 | 0.00700 | 100.000 | 100.000 | 21
|
||||||
|
Без потерь, 300 кбит/с | Постоянное намерение | 5 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00700 | 100.000 | 100.000 | 21
|
||||||
|
Без потерь, 300 кбит/с | Постоянное намерение | 15 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00700 | 100.000 | 100.000 | 21
|
||||||
|
Без потерь, 300 кбит/с | Постоянное намерение | 25 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00700 | 100.000 | 100.000 | 21
|
||||||
|
Без потерь, 300 кбит/с | Постоянное намерение и сброс | 5 | 100.000 | 25.002 | 0.000 | 100.000 | 0.01333 | 100.000 | 100.000 | 21
|
||||||
|
Без потерь, 300 кбит/с | Постоянное намерение и сброс | 15 | 100.000 | 25.002 | 0.000 | 100.000 | 0.01333 | 100.000 | 100.000 | 21
|
||||||
|
Без потерь, 300 кбит/с | Постоянное намерение и сброс | 25 | 100.000 | 25.002 | 0.000 | 100.000 | 0.01333 | 100.000 | 100.000 | 21
|
||||||
|
300 кбит/с, помеха 50 мс | Ограниченное повторение | 5 | 100.000 | 0.417 | 0.000 | 100.000 | 0.00711 | 94.165 | 97.920 | 21
|
||||||
|
300 кбит/с, помеха 50 мс | Ограниченное повторение | 15 | 100.000 | 0.417 | 0.000 | 100.000 | 0.00711 | 94.165 | 97.920 | 21
|
||||||
|
300 кбит/с, помеха 50 мс | Ограниченное повторение | 25 | 100.000 | 0.417 | 0.000 | 100.000 | 0.00711 | 94.165 | 97.920 | 21
|
||||||
|
300 кбит/с, помеха 50 мс | Постоянное намерение | 5 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00711 | 94.165 | 97.920 | 21
|
||||||
|
300 кбит/с, помеха 50 мс | Постоянное намерение | 15 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00711 | 94.165 | 97.920 | 21
|
||||||
|
300 кбит/с, помеха 50 мс | Постоянное намерение | 25 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00711 | 94.165 | 97.920 | 21
|
||||||
|
300 кбит/с, помеха 50 мс | Постоянное намерение и сброс | 5 | 100.000 | 25.004 | 0.000 | 100.000 | 0.01360 | 94.164 | 97.919 | 21
|
||||||
|
300 кбит/с, помеха 50 мс | Постоянное намерение и сброс | 15 | 100.000 | 25.004 | 0.000 | 100.000 | 0.01360 | 94.164 | 97.919 | 21
|
||||||
|
300 кбит/с, помеха 50 мс | Постоянное намерение и сброс | 25 | 100.000 | 25.004 | 0.000 | 100.000 | 0.01360 | 94.164 | 97.919 | 21
|
||||||
|
260 кбит/с, помеха 200 мс | Ограниченное повторение | 5 | 100.000 | 0.417 | 0.000 | 100.000 | 0.00708 | 96.028 | 97.976 | 36
|
||||||
|
260 кбит/с, помеха 200 мс | Ограниченное повторение | 15 | 100.000 | 0.417 | 0.000 | 100.000 | 0.00708 | 96.028 | 97.976 | 36
|
||||||
|
260 кбит/с, помеха 200 мс | Ограниченное повторение | 25 | 100.000 | 0.417 | 0.000 | 100.000 | 0.00708 | 96.028 | 97.976 | 36
|
||||||
|
260 кбит/с, помеха 200 мс | Постоянное намерение | 5 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00708 | 96.028 | 97.976 | 36
|
||||||
|
260 кбит/с, помеха 200 мс | Постоянное намерение | 15 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00708 | 96.028 | 97.976 | 36
|
||||||
|
260 кбит/с, помеха 200 мс | Постоянное намерение | 25 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00708 | 96.028 | 97.976 | 36
|
||||||
|
260 кбит/с, помеха 200 мс | Постоянное намерение и сброс | 5 | 100.000 | 25.012 | 0.000 | 100.000 | 0.01392 | 96.031 | 97.977 | 38
|
||||||
|
260 кбит/с, помеха 200 мс | Постоянное намерение и сброс | 15 | 100.000 | 25.012 | 0.000 | 100.000 | 0.01392 | 96.031 | 97.977 | 38
|
||||||
|
260 кбит/с, помеха 200 мс | Постоянное намерение и сброс | 25 | 100.000 | 25.012 | 0.000 | 100.000 | 0.01392 | 96.031 | 97.977 | 38
|
||||||
|
230 кбит/с, помеха 200 мс | Ограниченное повторение | 5 | 100.000 | 0.417 | 0.000 | 100.000 | 0.00717 | 84.913 | 97.985 | 40
|
||||||
|
230 кбит/с, помеха 200 мс | Ограниченное повторение | 15 | 100.000 | 0.417 | 0.000 | 100.000 | 0.00717 | 84.913 | 97.985 | 40
|
||||||
|
230 кбит/с, помеха 200 мс | Ограниченное повторение | 25 | 100.000 | 0.417 | 0.000 | 100.000 | 0.00717 | 84.913 | 97.985 | 40
|
||||||
|
230 кбит/с, помеха 200 мс | Постоянное намерение | 5 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00717 | 84.913 | 97.985 | 40
|
||||||
|
230 кбит/с, помеха 200 мс | Постоянное намерение | 15 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00717 | 84.913 | 97.985 | 40
|
||||||
|
230 кбит/с, помеха 200 мс | Постоянное намерение | 25 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00717 | 84.913 | 97.985 | 40
|
||||||
|
230 кбит/с, помеха 200 мс | Постоянное намерение и сброс | 5 | 100.000 | 25.014 | 0.000 | 100.000 | 0.01430 | 84.918 | 97.987 | 40
|
||||||
|
230 кбит/с, помеха 200 мс | Постоянное намерение и сброс | 15 | 100.000 | 25.014 | 0.000 | 100.000 | 0.01430 | 84.918 | 97.987 | 40
|
||||||
|
230 кбит/с, помеха 200 мс | Постоянное намерение и сброс | 25 | 100.000 | 25.014 | 0.000 | 100.000 | 0.01430 | 84.918 | 97.987 | 40
|
||||||
|
230 кбит/с, помеха 1000 мс | Ограниченное повторение | 5 | 99.000 | 0.417 | 1.000 | 100.000 | 0.00739 | 86.314 | 97.971 | 40
|
||||||
|
230 кбит/с, помеха 1000 мс | Ограниченное повторение | 15 | 99.000 | 0.417 | 1.000 | 100.000 | 0.00739 | 86.314 | 97.971 | 40
|
||||||
|
230 кбит/с, помеха 1000 мс | Ограниченное повторение | 25 | 99.000 | 0.417 | 1.000 | 99.000 | 0.00739 | 86.314 | 97.971 | 40
|
||||||
|
230 кбит/с, помеха 1000 мс | Постоянное намерение | 5 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00811 | 86.314 | 97.971 | 40
|
||||||
|
230 кбит/с, помеха 1000 мс | Постоянное намерение | 15 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00811 | 86.314 | 97.971 | 40
|
||||||
|
230 кбит/с, помеха 1000 мс | Постоянное намерение | 25 | 100.000 | 75.000 | 0.000 | 100.000 | 0.00811 | 86.314 | 97.971 | 40
|
||||||
|
230 кбит/с, помеха 1000 мс | Постоянное намерение и сброс | 5 | 100.000 | 25.009 | 0.000 | 100.000 | 0.01479 | 86.318 | 97.975 | 39
|
||||||
|
230 кбит/с, помеха 1000 мс | Постоянное намерение и сброс | 15 | 100.000 | 25.009 | 0.000 | 100.000 | 0.01479 | 86.318 | 97.975 | 39
|
||||||
|
230 кбит/с, помеха 1000 мс | Постоянное намерение и сброс | 25 | 100.000 | 25.009 | 0.000 | 100.000 | 0.01479 | 86.318 | 97.975 | 39
|
||||||
|
|
||||||
|
Отрицательный исходный режим
|
||||||
|
- Полностью потерянные первые 500 мс аварийной передачи: 2 на одно сочетание.
|
||||||
|
- Остановки по сторожевому таймеру после такой потери: 4.
|
||||||
|
- Небезопасные восстановления движения: 6; максимальная доля 1.000%.
|
||||||
|
- Среднее время от остановки до повторного движения: 1.1666 с; путь после восстановления до 599.4074 м.
|
||||||
|
- Ограниченный режим Lab038 служит отрицательным исходным уровнем и не принимается для рабочей архитектуры.
|
||||||
|
|
||||||
|
Постоянное аварийное намерение
|
||||||
|
- Итоговая доставка 100% в режимах постоянного намерения получена в конечной выборке и не является математической гарантией.
|
||||||
|
- Безопасность не зависит от гарантированной доставки удалённой команды: локальный сторожевой таймер продолжает действовать.
|
||||||
|
- Подтверждение аварийной команды (Emergency ACK) прекращает копии, но не снимает аварийное намерение emergency_intent.
|
||||||
|
- Положительные задания при активном аварийном намерении: 0.
|
||||||
|
- Команды с разрешением движения при активном аварийном намерении: 0.
|
||||||
|
- Небезопасные восстановления в режимах 2 и 3: 0.
|
||||||
|
|
||||||
|
Подтверждение сброса
|
||||||
|
- Принятые запросы сброса: 1.0000 на опыт; отклонённые: 0.0120.
|
||||||
|
- Причины отказов: аварийное состояние не зафиксировано=0, движение=0, устаревшая связь=36, неверное событие=0, старый номер последовательности=0, ненулевая скорость=0, разрешение движения=0.
|
||||||
|
- Среднее число повторов сброса: 0.0990; потерянных подтверждений сброса: 0.0000.
|
||||||
|
- 95-й процентиль времени от запроса оператора до подтверждения сброса: до 7.477 мс.
|
||||||
|
- Движение до подтверждения сброса: 0; автоматическое восстановление старой команды: 0.
|
||||||
|
- Подтверждение сброса (RESET_ACK) разрешает перейти только в безопасное состояние с нулевой скоростью.
|
||||||
|
- Для движения после сброса требуется новая команда оператора.
|
||||||
|
|
||||||
|
Точечная проверка пути до начала безопасной реакции
|
||||||
|
- Канал: 230 кбит/с, средняя помеха 1000 мс; транспортный эксперимент повторно не запускался.
|
||||||
|
- Если в момент действия оператора уже активно состояние STAGE1_DECELERATION, STAGE2_BRAKING или EMERGENCY_LATCHED, путь до начала реакции равен нулю и не измеряется до будущего перехода в торможение.
|
||||||
|
- режим | скорость, км/ч | среднее, м | 95-й процентиль, м | максимум, м | полные остановки, % | небезопасные возобновления
|
||||||
|
- Ограниченное повторение | 5 | 0.005284 | 0.005362 | 0.005362 | 100.000 | 2
|
||||||
|
- Ограниченное повторение | 15 | 0.015719 | 0.016087 | 0.016087 | 100.000 | 2
|
||||||
|
- Ограниченное повторение | 25 | 0.026197 | 0.026812 | 0.026812 | 99.000 | 2
|
||||||
|
- Постоянное намерение | 5 | 0.005284 | 0.005362 | 0.005362 | 100.000 | 0
|
||||||
|
- Постоянное намерение | 15 | 0.015719 | 0.016087 | 0.016087 | 100.000 | 0
|
||||||
|
- Постоянное намерение | 25 | 0.026197 | 0.026812 | 0.026812 | 100.000 | 0
|
||||||
|
- Постоянное намерение и сброс | 5 | 0.005284 | 0.005362 | 0.005362 | 100.000 | 0
|
||||||
|
- Постоянное намерение и сброс | 15 | 0.015719 | 0.016087 | 0.016087 | 100.000 | 0
|
||||||
|
- Постоянное намерение и сброс | 25 | 0.026197 | 0.026812 | 0.026812 | 100.000 | 0
|
||||||
|
- Сводная и двигательная таблицы согласованы по числу повторов, доле полных остановок и небезопасным возобновлениям.
|
||||||
|
- Ни один график Lab040 напрямую не использует путь до начала реакции; график пути до остановки использует отдельный показатель полного пути и не требует изменения.
|
||||||
|
|
||||||
|
Движение и нагрузка
|
||||||
|
- Максимальный путь до полной остановки: 9.2678 м; максимальное время: 2.3335 с.
|
||||||
|
- Дополнительная нагрузка защиты: 0.00948…0.01479 кбит/с.
|
||||||
|
- Нагрузка нулевых состояний: до 5.52000 кбит/с; максимальная очередь 40 пакетов.
|
||||||
|
- Видео опубликовано: 84.913…100.000%; телеметрия: 97.919…100.000%.
|
||||||
|
|
||||||
|
Функциональные проверки
|
||||||
|
- ПРОЙДЕНО — 01. Оператор фиксирует аварийное намерение: действие оператора фиксирует аварийное намерение наземной станции
|
||||||
|
- ПРОЙДЕНО — 02. После аварии нет положительной заданной скорости: аварийное намерение заменяет движение безопасным нулевым состоянием с торможением
|
||||||
|
- ПРОЙДЕНО — 03. Движение запрещено до сброса: после подтверждения аварийной команды движение остаётся запрещённым
|
||||||
|
- ПРОЙДЕНО — 04. Потеря аварийной команды сохраняет намерение: управляемая помеха теряет все копии за первые 500 мс, не снимая аварийное намерение
|
||||||
|
- ПРОЙДЕНО — 05. Подтверждение аварии сохраняет намерение: потеря первого подтверждения и доставка повтора сохраняют аварийное намерение
|
||||||
|
- ПРОЙДЕНО — 06. Первая аварийная команда фиксирует состояние ровера: первая аварийная команда фиксирует аварийное состояние ровера
|
||||||
|
- ПРОЙДЕНО — 07. Обычная команда не снимает аварийное состояние: обычная команда не снимает аварийное состояние ровера
|
||||||
|
- ПРОЙДЕНО — 08. Старая команда движения отклоняется: запоздалая команда движения со старым номером последовательности отклоняется
|
||||||
|
- ПРОЙДЕНО — 09. Сброс при движении отклоняется: движущийся ровер отклоняет запрос сброса
|
||||||
|
- ПРОЙДЕНО — 10. Сброс при устаревшей связи отклоняется: при устаревшем состоянии связи запрос сброса отклоняется
|
||||||
|
- ПРОЙДЕНО — 11. Сброс для неверного события отклоняется: запрос сброса с неверным идентификатором аварии отклоняется
|
||||||
|
- ПРОЙДЕНО — 12. Сброс со старым номером последовательности отклоняется: запрос сброса со старым номером последовательности отклоняется
|
||||||
|
- ПРОЙДЕНО — 13. Сброс с ненулевой скоростью отклоняется: ненулевая скорость или разрешение движения приводят к отклонению сброса
|
||||||
|
- ПРОЙДЕНО — 14. После успешного сброса скорость остаётся нулевой: принятый сброс выводит из аварийного состояния только в состояние нулевой скорости
|
||||||
|
- ПРОЙДЕНО — 15. До подтверждения сброса движение отсутствует: до подтверждения сброса наземная станция сохраняет безопасное нулевое задание
|
||||||
|
- ПРОЙДЕНО — 16. Потеря подтверждения сброса вызывает повтор: управляемая потеря первого подтверждения сброса вызывает повтор запроса
|
||||||
|
- ПРОЙДЕНО — 17. Дубликат не выполняет сброс дважды: принятый дубликат не выполняет сброс повторно
|
||||||
|
- ПРОЙДЕНО — 18. На дубликат повторно отправляется подтверждение: принятый дубликат вызывает повторное подтверждение сброса
|
||||||
|
- ПРОЙДЕНО — 19. Старая команда движения не восстанавливается: подтверждение сброса не восстанавливает сохранённую команду движения
|
||||||
|
- ПРОЙДЕНО — 20. Для движения требуется новая команда оператора: для движения требуется новый номер последовательности команды оператора
|
||||||
|
- ПРОЙДЕНО — 21. Аварийное состояние устойчиво к обычным командам: состояние EMERGENCY_LATCHED не снимается обычной командой управления
|
||||||
|
- ПРОЙДЕНО — 22. Сторожевой таймер работает при потере аварийной команды: локальный двухступенчатый сторожевой таймер работает без доставки аварийной команды
|
||||||
|
- ПРОЙДЕНО — 23. Интервалы помех воспроизводимы: фиксированное начальное значение генератора воспроизводит интервалы помех
|
||||||
|
- ПРОЙДЕНО — 24. Действие оператора во время торможения: действие оператора при уже активном торможении даёт нулевой путь до начала реакции
|
||||||
|
|
||||||
|
Созданные файлы
|
||||||
|
- protocol/persistent_emergency.py
|
||||||
|
- protocol/safe_reset.py
|
||||||
|
- tests/lab040_persistent_emergency.py
|
||||||
|
- data/processed/lab040/lab040_summary.csv
|
||||||
|
- data/processed/lab040/lab040_emergency_metrics.csv
|
||||||
|
- data/processed/lab040/lab040_reset_metrics.csv
|
||||||
|
- data/processed/lab040/lab040_motion_metrics.csv
|
||||||
|
- data/processed/lab040/lab040_load_metrics.csv
|
||||||
|
- data/processed/lab040/lab040_report.txt
|
||||||
|
- data/processed/lab040/lab040_emergency_delivery.png
|
||||||
|
- data/processed/lab040/lab040_unsafe_recovery.png
|
||||||
|
- data/processed/lab040/lab040_latch_time.png
|
||||||
|
- data/processed/lab040/lab040_stop_path.png
|
||||||
|
- data/processed/lab040/lab040_reset_latency.png
|
||||||
|
- data/processed/lab040/lab040_protection_load.png
|
||||||
|
- data/processed/lab040/lab040_video_telemetry.png
|
||||||
|
- data/processed/lab040/lab040_tradeoff.png
|
||||||
|
|
||||||
|
Ограничения
|
||||||
|
- Параметры замедления предварительные и требуют измерения на реальном ровере.
|
||||||
|
- Модель одномерная и не заменяет испытания тормозов, привода и процедуры операторского сброса.
|
||||||
|
- Lab040 не добавлена в Git и не закоммичена; Lab028–Lab039 не изменены.
|
||||||
BIN
data/processed/lab040/lab040_reset_latency.png
Normal file
|
After Width: | Height: | Size: 50 KiB |
46
data/processed/lab040/lab040_reset_metrics.csv
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
channel_condition,mode,initial_speed_kmh,repetitions,requests_created_mean,requests_transmitted_mean,requests_accepted_mean,requests_rejected_mean,rejected_not_latched,rejected_moving,rejected_stale_link,rejected_event_mismatch,rejected_old_sequence,rejected_nonzero_request,rejected_movement_permitted,mean_accept_delay_ms,mean_reset_ack_delay_ms,p95_reset_ack_delay_ms,reset_acks_lost_mean,repeated_requests_mean,duplicates_suppressed_mean,reset_reacks_mean,mean_ack_to_new_command_seconds,mean_time_to_actual_resume_seconds,movement_before_reset_ack_cases,automatic_old_command_restorations
|
||||||
|
no_loss,limited_lab038,5.0,1,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
no_loss,limited_lab038,15.0,1,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
no_loss,limited_lab038,25.0,1,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
no_loss,persistent_no_reset,5.0,1,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
no_loss,persistent_no_reset,15.0,1,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
no_loss,persistent_no_reset,25.0,1,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
no_loss,persistent_safe_reset,5.0,1,1.0,1.0,1.0,0.0,0,0,0,0,0,0,0,1.3066666666645688,2.533666666664658,2.533666666664658,0.0,0.0,0.0,0.0,2.0,2.0536533333333367,0,0
|
||||||
|
no_loss,persistent_safe_reset,15.0,1,1.0,1.0,1.0,0.0,0,0,0,0,0,0,0,1.3066666666645688,2.533666666664658,2.533666666664658,0.0,0.0,0.0,0.0,2.0,2.0536533333333367,0,0
|
||||||
|
no_loss,persistent_safe_reset,25.0,1,1.0,1.0,1.0,0.0,0,0,0,0,0,0,0,1.3066666666645688,2.533666666664658,2.533666666664658,0.0,0.0,0.0,0.0,2.0,2.0536533333333367,0,0
|
||||||
|
300_50,limited_lab038,5.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
300_50,limited_lab038,15.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
300_50,limited_lab038,25.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
300_50,persistent_no_reset,5.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
300_50,persistent_no_reset,15.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
300_50,persistent_no_reset,25.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
300_50,persistent_safe_reset,5.0,200,1.0,1.04,1.0,0.01,0,0,2,0,0,0,0,3.476268333331234,4.703263333331371,2.533666666664658,0.0,0.04,0.0,0.0,2.0,2.057250933333337,0,0
|
||||||
|
300_50,persistent_safe_reset,15.0,200,1.0,1.04,1.0,0.01,0,0,2,0,0,0,0,3.476268333331234,4.703263333331371,2.533666666664658,0.0,0.04,0.0,0.0,2.0,2.057250933333337,0,0
|
||||||
|
300_50,persistent_safe_reset,25.0,200,1.0,1.04,1.0,0.01,0,0,2,0,0,0,0,3.476268333331234,4.703263333331371,2.533666666664658,0.0,0.04,0.0,0.0,2.0,2.057250933333337,0,0
|
||||||
|
260_200,limited_lab038,5.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
260_200,limited_lab038,15.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
260_200,limited_lab038,25.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
260_200,persistent_no_reset,5.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
260_200,persistent_no_reset,15.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
260_200,persistent_no_reset,25.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
260_200,persistent_safe_reset,5.0,200,1.0,1.135,1.0,0.02,0,0,4,0,0,0,0,12.97215884617376,14.387996538461607,7.477384615384608,0.0,0.135,0.0,0.0,2.0,2.0636698426923186,0,0
|
||||||
|
260_200,persistent_safe_reset,15.0,200,1.0,1.135,1.0,0.02,0,0,4,0,0,0,0,12.97215884617376,14.387996538461607,7.477384615384608,0.0,0.135,0.0,0.0,2.0,2.0636698426923186,0,0
|
||||||
|
260_200,persistent_safe_reset,25.0,200,1.0,1.135,1.0,0.02,0,0,4,0,0,0,0,12.97215884617376,14.387996538461607,7.477384615384608,0.0,0.135,0.0,0.0,2.0,2.0636698426923186,0,0
|
||||||
|
230_200,limited_lab038,5.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
230_200,limited_lab038,15.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
230_200,limited_lab038,25.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
230_200,persistent_no_reset,5.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
230_200,persistent_no_reset,15.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
230_200,persistent_no_reset,25.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
230_200,persistent_safe_reset,5.0,200,1.0,1.22,1.0,0.025,0,0,5,0,0,0,0,15.166219570442614,16.766553043666867,5.668300000003406,0.0,0.22,0.0,0.0,2.0,2.0674834226092775,0,0
|
||||||
|
230_200,persistent_safe_reset,15.0,200,1.0,1.22,1.0,0.025,0,0,5,0,0,0,0,15.166219570442614,16.766553043666867,5.668300000003406,0.0,0.22,0.0,0.0,2.0,2.0674834226092775,0,0
|
||||||
|
230_200,persistent_safe_reset,25.0,200,1.0,1.22,1.0,0.025,0,0,5,0,0,0,0,15.166219570442614,16.766553043666867,5.668300000003406,0.0,0.22,0.0,0.0,2.0,2.0674834226092775,0,0
|
||||||
|
230_1000,limited_lab038,5.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
230_1000,limited_lab038,15.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
230_1000,limited_lab038,25.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
230_1000,persistent_no_reset,5.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
230_1000,persistent_no_reset,15.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
230_1000,persistent_no_reset,25.0,200,0.0,0.0,0.0,0.0,0,0,0,0,0,0,0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0,0
|
||||||
|
230_1000,persistent_safe_reset,5.0,200,1.0,1.1,1.0,0.005,0,0,1,0,0,0,0,8.86656478782701,10.466907391354853,5.357000000003609,0.0,0.1,0.0,0.0,2.0,2.073877863913489,0,0
|
||||||
|
230_1000,persistent_safe_reset,15.0,200,1.0,1.1,1.0,0.005,0,0,1,0,0,0,0,8.86656478782701,10.466907391354853,5.357000000003609,0.0,0.1,0.0,0.0,2.0,2.073877863913489,0,0
|
||||||
|
230_1000,persistent_safe_reset,25.0,200,1.0,1.1,1.0,0.005,0,0,1,0,0,0,0,8.86656478782701,10.466907391354853,5.357000000003609,0.0,0.1,0.0,0.0,2.0,2.073877863913489,0,0
|
||||||
|
BIN
data/processed/lab040/lab040_stop_path.png
Normal file
|
After Width: | Height: | Size: 88 KiB |
46
data/processed/lab040/lab040_summary.csv
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
channel_condition,mode,initial_speed_kmh,repetitions,emergency_delivery_fraction,emergency_intent_time_fraction,unsafe_recovery_fraction,full_stop_fraction,movement_while_intent_cases,movement_before_reset_ack_cases,positive_commands_after_emergency_mean,permitted_commands_after_emergency_mean,total_extra_load_kbps,video_published_fraction,telemetry_delivered_fraction,maximum_queue_packets
|
||||||
|
no_loss,limited_lab038,5.0,1,1.0,0.004166666666666667,0.0,1.0,0,0,1800.0,1800.0,0.007000000000000001,1.0,1.0,21
|
||||||
|
no_loss,limited_lab038,15.0,1,1.0,0.004166666666666667,0.0,1.0,0,0,1800.0,1800.0,0.007000000000000001,1.0,1.0,21
|
||||||
|
no_loss,limited_lab038,25.0,1,1.0,0.004166666666666667,0.0,1.0,0,0,1800.0,1800.0,0.007000000000000001,1.0,1.0,21
|
||||||
|
no_loss,persistent_no_reset,5.0,1,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.007000000000000001,1.0,1.0,21
|
||||||
|
no_loss,persistent_no_reset,15.0,1,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.007000000000000001,1.0,1.0,21
|
||||||
|
no_loss,persistent_no_reset,25.0,1,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.007000000000000001,1.0,1.0,21
|
||||||
|
no_loss,persistent_safe_reset,5.0,1,1.0,0.25002111388888887,0.0,1.0,0,0,0.0,0.0,0.013333333333333334,1.0,1.0,21
|
||||||
|
no_loss,persistent_safe_reset,15.0,1,1.0,0.25002111388888887,0.0,1.0,0,0,0.0,0.0,0.013333333333333334,1.0,1.0,21
|
||||||
|
no_loss,persistent_safe_reset,25.0,1,1.0,0.25002111388888887,0.0,1.0,0,0,0.0,0.0,0.013333333333333334,1.0,1.0,21
|
||||||
|
300_50,limited_lab038,5.0,200,1.0,0.004166666666666667,0.0,1.0,0,0,1800.0,1800.0,0.007105,0.9416527777777778,0.9792,21
|
||||||
|
300_50,limited_lab038,15.0,200,1.0,0.004166666666666667,0.0,1.0,0,0,1800.0,1800.0,0.007105,0.9416527777777778,0.9792,21
|
||||||
|
300_50,limited_lab038,25.0,200,1.0,0.004166666666666667,0.0,1.0,0,0,1800.0,1800.0,0.007105,0.9416527777777778,0.9792,21
|
||||||
|
300_50,persistent_no_reset,5.0,200,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.007105,0.9416527777777778,0.9792,21
|
||||||
|
300_50,persistent_no_reset,15.0,200,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.007105,0.9416527777777778,0.9792,21
|
||||||
|
300_50,persistent_no_reset,25.0,200,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.007105,0.9416527777777778,0.9792,21
|
||||||
|
300_50,persistent_safe_reset,5.0,200,1.0,0.25003919386111106,0.0,1.0,0,0,0.0,0.0,0.013599666666666668,0.9416388888888889,0.9791875000000001,21
|
||||||
|
300_50,persistent_safe_reset,15.0,200,1.0,0.25003919386111106,0.0,1.0,0,0,0.0,0.0,0.013599666666666668,0.9416388888888889,0.9791875000000001,21
|
||||||
|
300_50,persistent_safe_reset,25.0,200,1.0,0.25003919386111106,0.0,1.0,0,0,0.0,0.0,0.013599666666666668,0.9416388888888889,0.9791875000000001,21
|
||||||
|
260_200,limited_lab038,5.0,200,1.0,0.004166666666666667,0.0,1.0,0,0,1800.0,1800.0,0.007084,0.9602777777777778,0.9797583333333334,36
|
||||||
|
260_200,limited_lab038,15.0,200,1.0,0.004166666666666667,0.0,1.0,0,0,1800.0,1800.0,0.007084,0.9602777777777778,0.9797583333333334,36
|
||||||
|
260_200,limited_lab038,25.0,200,1.0,0.004166666666666667,0.0,1.0,0,0,1800.0,1800.0,0.007084,0.9602777777777778,0.9797583333333334,36
|
||||||
|
260_200,persistent_no_reset,5.0,200,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.007084,0.9602777777777778,0.9797583333333334,36
|
||||||
|
260_200,persistent_no_reset,15.0,200,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.007084,0.9602777777777778,0.9797583333333334,36
|
||||||
|
260_200,persistent_no_reset,25.0,200,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.007084,0.9602777777777778,0.9797583333333334,36
|
||||||
|
260_200,persistent_safe_reset,5.0,200,1.0,0.2501198999711538,0.0,1.0,0,0,0.0,0.0,0.013919666666666667,0.9603055555555555,0.9797708333333333,38
|
||||||
|
260_200,persistent_safe_reset,15.0,200,1.0,0.2501198999711538,0.0,1.0,0,0,0.0,0.0,0.013919666666666667,0.9603055555555555,0.9797708333333333,38
|
||||||
|
260_200,persistent_safe_reset,25.0,200,1.0,0.2501198999711538,0.0,1.0,0,0,0.0,0.0,0.013919666666666667,0.9603055555555555,0.9797708333333333,38
|
||||||
|
230_200,limited_lab038,5.0,200,1.0,0.004166666666666667,0.0,1.0,0,0,1800.0,1800.0,0.007167999999999999,0.849125,0.97985,40
|
||||||
|
230_200,limited_lab038,15.0,200,1.0,0.004166666666666667,0.0,1.0,0,0,1800.0,1800.0,0.007167999999999999,0.849125,0.97985,40
|
||||||
|
230_200,limited_lab038,25.0,200,1.0,0.004166666666666667,0.0,1.0,0,0,1800.0,1800.0,0.007167999999999999,0.849125,0.97985,40
|
||||||
|
230_200,persistent_no_reset,5.0,200,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.007167999999999999,0.849125,0.97985,40
|
||||||
|
230_200,persistent_no_reset,15.0,200,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.007167999999999999,0.849125,0.97985,40
|
||||||
|
230_200,persistent_no_reset,25.0,200,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.007167999999999999,0.849125,0.97985,40
|
||||||
|
230_200,persistent_safe_reset,5.0,200,1.0,0.25013972127536394,0.0,1.0,0,0,0.0,0.0,0.014296666666666666,0.8491805555555555,0.9798749999999999,40
|
||||||
|
230_200,persistent_safe_reset,15.0,200,1.0,0.25013972127536394,0.0,1.0,0,0,0.0,0.0,0.014296666666666666,0.8491805555555555,0.9798749999999999,40
|
||||||
|
230_200,persistent_safe_reset,25.0,200,1.0,0.25013972127536394,0.0,1.0,0,0,0.0,0.0,0.014296666666666666,0.8491805555555555,0.9798749999999999,40
|
||||||
|
230_1000,limited_lab038,5.0,200,0.99,0.004166666666666667,0.01,1.0,0,0,1800.0,1800.0,0.007391999999999999,0.8631388888888889,0.9797125,40
|
||||||
|
230_1000,limited_lab038,15.0,200,0.99,0.004166666666666667,0.01,1.0,0,0,1800.0,1800.0,0.007391999999999999,0.8631388888888889,0.9797125,40
|
||||||
|
230_1000,limited_lab038,25.0,200,0.99,0.004166666666666667,0.01,0.99,0,0,1800.0,1800.0,0.007391999999999999,0.8631388888888889,0.9797125,40
|
||||||
|
230_1000,persistent_no_reset,5.0,200,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.008113,0.8631388888888889,0.9797083333333334,40
|
||||||
|
230_1000,persistent_no_reset,15.0,200,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.008113,0.8631388888888889,0.9797083333333334,40
|
||||||
|
230_1000,persistent_no_reset,25.0,200,1.0,0.75,0.0,1.0,0,0,0.0,0.0,0.008113,0.8631388888888889,0.9797083333333334,40
|
||||||
|
230_1000,persistent_safe_reset,5.0,200,1.0,0.2500872242282613,0.0,1.0,0,0,0.0,0.0,0.014788333333333334,0.8631805555555556,0.97975,39
|
||||||
|
230_1000,persistent_safe_reset,15.0,200,1.0,0.2500872242282613,0.0,1.0,0,0,0.0,0.0,0.014788333333333334,0.8631805555555556,0.97975,39
|
||||||
|
230_1000,persistent_safe_reset,25.0,200,1.0,0.2500872242282613,0.0,1.0,0,0,0.0,0.0,0.014788333333333334,0.8631805555555556,0.97975,39
|
||||||
|
BIN
data/processed/lab040/lab040_tradeoff.png
Normal file
|
After Width: | Height: | Size: 52 KiB |
BIN
data/processed/lab040/lab040_unsafe_recovery.png
Normal file
|
After Width: | Height: | Size: 68 KiB |
BIN
data/processed/lab040/lab040_video_telemetry.png
Normal file
|
After Width: | Height: | Size: 114 KiB |
147
protocol/persistent_emergency.py
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
"""Постоянное аварийное намерение наземной станции для Lab040.
|
||||||
|
|
||||||
|
Автомат состояний намеренно отделяет подтверждение аварийного пакета от
|
||||||
|
снятия намерения оператора. Только принятое подтверждение сброса разрешает
|
||||||
|
сформировать новую команду движения.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from enum import Enum
|
||||||
|
|
||||||
|
from protocol.control_failsafe import ControlState, SAFE_STATE
|
||||||
|
from protocol.emergency_ack import EmergencyIdentity
|
||||||
|
|
||||||
|
|
||||||
|
class GroundState(str, Enum):
|
||||||
|
GROUND_NORMAL = "ground_normal"
|
||||||
|
GROUND_EMERGENCY_REQUESTED = "ground_emergency_requested"
|
||||||
|
GROUND_EMERGENCY_CONFIRMED = "ground_emergency_confirmed"
|
||||||
|
GROUND_RESET_REQUESTED = "ground_reset_requested"
|
||||||
|
GROUND_MOVEMENT_REAUTHORIZED = "ground_movement_reauthorized"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class GroundSnapshot:
|
||||||
|
state: GroundState
|
||||||
|
emergency_intent: bool
|
||||||
|
movement_permitted: bool
|
||||||
|
emergency_acknowledged: bool
|
||||||
|
reset_acknowledged: bool
|
||||||
|
|
||||||
|
|
||||||
|
class PersistentEmergencyController:
|
||||||
|
"""Автомат наземной станции, не снимающий намерение по подтверждению аварии."""
|
||||||
|
|
||||||
|
def __init__(self, initial_speed_mps: float) -> None:
|
||||||
|
if initial_speed_mps < 0.0:
|
||||||
|
raise ValueError("начальная скорость не может быть отрицательной")
|
||||||
|
self.state = GroundState.GROUND_NORMAL
|
||||||
|
self.emergency_intent = False
|
||||||
|
self.emergency_event_id: int | None = None
|
||||||
|
self.emergency_stream_id: int | None = None
|
||||||
|
self.emergency_sequence: int | None = None
|
||||||
|
self.emergency_acknowledged = False
|
||||||
|
self.reset_request_id: int | None = None
|
||||||
|
self.reset_sequence: int | None = None
|
||||||
|
self.reset_acknowledged = False
|
||||||
|
self.current_motion_speed_mps = initial_speed_mps
|
||||||
|
self.last_operator_sequence = 0
|
||||||
|
self._sequence_at_emergency = -1
|
||||||
|
|
||||||
|
@property
|
||||||
|
def snapshot(self) -> GroundSnapshot:
|
||||||
|
control = self.control_state()
|
||||||
|
return GroundSnapshot(
|
||||||
|
self.state,
|
||||||
|
self.emergency_intent,
|
||||||
|
control.movement_allowed,
|
||||||
|
self.emergency_acknowledged,
|
||||||
|
self.reset_acknowledged,
|
||||||
|
)
|
||||||
|
|
||||||
|
def request_emergency(
|
||||||
|
self,
|
||||||
|
event_id: int,
|
||||||
|
stream_id: int,
|
||||||
|
sequence_number: int,
|
||||||
|
) -> None:
|
||||||
|
if self.state is not GroundState.GROUND_NORMAL:
|
||||||
|
raise RuntimeError("аварийную команду можно запросить только из нормального состояния")
|
||||||
|
if event_id < 0:
|
||||||
|
raise ValueError("идентификатор события не может быть отрицательным")
|
||||||
|
self.emergency_event_id = event_id
|
||||||
|
self.emergency_stream_id = stream_id
|
||||||
|
self.emergency_sequence = sequence_number
|
||||||
|
self.emergency_intent = True
|
||||||
|
self.emergency_acknowledged = False
|
||||||
|
self.reset_acknowledged = False
|
||||||
|
self._sequence_at_emergency = self.last_operator_sequence
|
||||||
|
self.state = GroundState.GROUND_EMERGENCY_REQUESTED
|
||||||
|
|
||||||
|
def receive_emergency_ack(self, identity: EmergencyIdentity) -> bool:
|
||||||
|
expected = EmergencyIdentity(
|
||||||
|
self.emergency_stream_id if self.emergency_stream_id is not None else -1,
|
||||||
|
self.emergency_sequence if self.emergency_sequence is not None else -1,
|
||||||
|
)
|
||||||
|
if identity != expected:
|
||||||
|
return False
|
||||||
|
first = not self.emergency_acknowledged
|
||||||
|
self.emergency_acknowledged = True
|
||||||
|
if self.state is GroundState.GROUND_EMERGENCY_REQUESTED:
|
||||||
|
self.state = GroundState.GROUND_EMERGENCY_CONFIRMED
|
||||||
|
return first
|
||||||
|
|
||||||
|
def request_reset(self, reset_request_id: int, sequence_number: int) -> None:
|
||||||
|
if not self.emergency_intent:
|
||||||
|
raise RuntimeError("для сброса требуется постоянное аварийное намерение")
|
||||||
|
if self.state not in (
|
||||||
|
GroundState.GROUND_EMERGENCY_REQUESTED,
|
||||||
|
GroundState.GROUND_EMERGENCY_CONFIRMED,
|
||||||
|
):
|
||||||
|
raise RuntimeError("сброс уже ожидается или завершён")
|
||||||
|
if reset_request_id < 0 or sequence_number < 0:
|
||||||
|
raise ValueError("идентификаторы сброса не могут быть отрицательными")
|
||||||
|
self.reset_request_id = reset_request_id
|
||||||
|
self.reset_sequence = sequence_number
|
||||||
|
self.reset_acknowledged = False
|
||||||
|
self.state = GroundState.GROUND_RESET_REQUESTED
|
||||||
|
|
||||||
|
def receive_reset_ack(
|
||||||
|
self,
|
||||||
|
event_id: int,
|
||||||
|
reset_request_id: int,
|
||||||
|
accepted: bool,
|
||||||
|
) -> bool:
|
||||||
|
if self.state is not GroundState.GROUND_RESET_REQUESTED:
|
||||||
|
return False
|
||||||
|
if event_id != self.emergency_event_id or reset_request_id != self.reset_request_id:
|
||||||
|
return False
|
||||||
|
if not accepted:
|
||||||
|
return False
|
||||||
|
self.reset_acknowledged = True
|
||||||
|
self.emergency_intent = False
|
||||||
|
self.current_motion_speed_mps = 0.0
|
||||||
|
self.state = GroundState.GROUND_MOVEMENT_REAUTHORIZED
|
||||||
|
return True
|
||||||
|
|
||||||
|
def control_state(self) -> ControlState:
|
||||||
|
if self.state is GroundState.GROUND_NORMAL:
|
||||||
|
return ControlState(self.current_motion_speed_mps, 0.0, False, True)
|
||||||
|
return SAFE_STATE
|
||||||
|
|
||||||
|
def new_operator_motion(self, sequence_number: int, speed_mps: float) -> ControlState:
|
||||||
|
if self.state is not GroundState.GROUND_MOVEMENT_REAUTHORIZED:
|
||||||
|
raise RuntimeError("повторное движение не разрешено")
|
||||||
|
if sequence_number <= self._sequence_at_emergency or sequence_number <= self.last_operator_sequence:
|
||||||
|
raise ValueError("требуется новый номер последовательности команды оператора")
|
||||||
|
if speed_mps <= 0.0:
|
||||||
|
raise ValueError("новая скорость движения должна быть положительной")
|
||||||
|
self.last_operator_sequence = sequence_number
|
||||||
|
self.current_motion_speed_mps = speed_mps
|
||||||
|
self.state = GroundState.GROUND_NORMAL
|
||||||
|
return self.control_state()
|
||||||
|
|
||||||
|
def reject_old_operator_motion(self, sequence_number: int) -> bool:
|
||||||
|
return sequence_number <= self._sequence_at_emergency
|
||||||
192
protocol/safe_reset.py
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
"""Команда безопасного аварийного сброса и её подтверждение для Lab040.
|
||||||
|
|
||||||
|
Оба прикладных блока данных передаются внутри неизменного пакета LinkPacket
|
||||||
|
из Lab033.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from enum import IntEnum
|
||||||
|
import struct
|
||||||
|
|
||||||
|
from protocol.link_packet import Direction, LinkPacket, TrafficClass
|
||||||
|
from protocol.two_stage_failsafe import SafetyState, TwoStageFailsafe
|
||||||
|
|
||||||
|
|
||||||
|
RESET_MAGIC = b"RST1"
|
||||||
|
RESET_ACK_MAGIC = b"RAK1"
|
||||||
|
RESET_FORMAT = "!4sIIfB"
|
||||||
|
RESET_ACK_FORMAT = "!4sIIBB"
|
||||||
|
RESET_SIZE = struct.calcsize(RESET_FORMAT)
|
||||||
|
RESET_ACK_SIZE = struct.calcsize(RESET_ACK_FORMAT)
|
||||||
|
STREAM_RESET = 6
|
||||||
|
STREAM_RESET_ACK = 7
|
||||||
|
|
||||||
|
|
||||||
|
class ResetReason(IntEnum):
|
||||||
|
ACCEPTED = 0
|
||||||
|
NOT_LATCHED = 1
|
||||||
|
MOVING = 2
|
||||||
|
STALE_LINK = 3
|
||||||
|
EVENT_MISMATCH = 4
|
||||||
|
OLD_SEQUENCE = 5
|
||||||
|
NONZERO_REQUEST = 6
|
||||||
|
MOVEMENT_PERMITTED = 7
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class ResetCommand:
|
||||||
|
emergency_event_id: int
|
||||||
|
reset_request_id: int
|
||||||
|
requested_speed_mps: float
|
||||||
|
movement_permitted: bool
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class ResetAcknowledgement:
|
||||||
|
emergency_event_id: int
|
||||||
|
reset_request_id: int
|
||||||
|
accepted: bool
|
||||||
|
reason: ResetReason
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass(frozen=True)
|
||||||
|
class ResetDecision:
|
||||||
|
acknowledgement: ResetAcknowledgement
|
||||||
|
performed: bool
|
||||||
|
duplicate: bool
|
||||||
|
|
||||||
|
|
||||||
|
def encode_reset(command: ResetCommand) -> bytes:
|
||||||
|
if command.emergency_event_id < 0 or command.reset_request_id < 0:
|
||||||
|
raise ValueError("идентификаторы сброса не могут быть отрицательными")
|
||||||
|
return struct.pack(
|
||||||
|
RESET_FORMAT,
|
||||||
|
RESET_MAGIC,
|
||||||
|
command.emergency_event_id,
|
||||||
|
command.reset_request_id,
|
||||||
|
float(command.requested_speed_mps),
|
||||||
|
int(bool(command.movement_permitted)),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def decode_reset(payload: bytes) -> ResetCommand:
|
||||||
|
if len(payload) != RESET_SIZE:
|
||||||
|
raise ValueError("неверная длина данных запроса сброса")
|
||||||
|
magic, event_id, request_id, speed, permitted = struct.unpack(RESET_FORMAT, payload)
|
||||||
|
if magic != RESET_MAGIC or permitted not in (0, 1):
|
||||||
|
raise ValueError("неверные данные запроса сброса")
|
||||||
|
return ResetCommand(event_id, request_id, speed, bool(permitted))
|
||||||
|
|
||||||
|
|
||||||
|
def encode_reset_ack(ack: ResetAcknowledgement) -> bytes:
|
||||||
|
return struct.pack(
|
||||||
|
RESET_ACK_FORMAT,
|
||||||
|
RESET_ACK_MAGIC,
|
||||||
|
ack.emergency_event_id,
|
||||||
|
ack.reset_request_id,
|
||||||
|
int(ack.accepted),
|
||||||
|
int(ack.reason),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def decode_reset_ack(payload: bytes) -> ResetAcknowledgement:
|
||||||
|
if len(payload) != RESET_ACK_SIZE:
|
||||||
|
raise ValueError("неверная длина подтверждения сброса")
|
||||||
|
magic, event_id, request_id, accepted, reason = struct.unpack(RESET_ACK_FORMAT, payload)
|
||||||
|
if magic != RESET_ACK_MAGIC or accepted not in (0, 1):
|
||||||
|
raise ValueError("неверное подтверждение сброса")
|
||||||
|
return ResetAcknowledgement(event_id, request_id, bool(accepted), ResetReason(reason))
|
||||||
|
|
||||||
|
|
||||||
|
def build_reset_packet(
|
||||||
|
command: ResetCommand,
|
||||||
|
sequence_number: int,
|
||||||
|
generation_time_us: int,
|
||||||
|
) -> LinkPacket:
|
||||||
|
return LinkPacket(
|
||||||
|
traffic_class=TrafficClass.EMERGENCY,
|
||||||
|
direction=Direction.GROUND_TO_ROVER,
|
||||||
|
stream_id=STREAM_RESET,
|
||||||
|
sequence_number=sequence_number,
|
||||||
|
generation_time_us=generation_time_us,
|
||||||
|
deadline_ms=50,
|
||||||
|
payload=encode_reset(command),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def build_reset_ack(
|
||||||
|
decision: ResetDecision,
|
||||||
|
sequence_number: int,
|
||||||
|
generation_time_us: int,
|
||||||
|
) -> LinkPacket:
|
||||||
|
return LinkPacket(
|
||||||
|
traffic_class=TrafficClass.EMERGENCY,
|
||||||
|
direction=Direction.ROVER_TO_GROUND,
|
||||||
|
stream_id=STREAM_RESET_ACK,
|
||||||
|
sequence_number=sequence_number,
|
||||||
|
generation_time_us=generation_time_us,
|
||||||
|
deadline_ms=50,
|
||||||
|
payload=encode_reset_ack(decision.acknowledgement),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class SafeResetReceiver:
|
||||||
|
"""Проверяет условия сброса и повторно подтверждает принятые дубликаты."""
|
||||||
|
|
||||||
|
def __init__(self) -> None:
|
||||||
|
self.last_sequence = -1
|
||||||
|
self.accepted_keys: set[tuple[int, int, int]] = set()
|
||||||
|
self.accepted = 0
|
||||||
|
self.rejected = 0
|
||||||
|
self.duplicates = 0
|
||||||
|
self.reacknowledgements = 0
|
||||||
|
|
||||||
|
def process(
|
||||||
|
self,
|
||||||
|
packet: LinkPacket,
|
||||||
|
*,
|
||||||
|
rover: TwoStageFailsafe,
|
||||||
|
actual_speed_mps: float,
|
||||||
|
last_link_age_seconds: float,
|
||||||
|
emergency_event_id: int | None,
|
||||||
|
) -> ResetDecision:
|
||||||
|
if packet.traffic_class is not TrafficClass.EMERGENCY:
|
||||||
|
raise ValueError("запрос сброса должен использовать аварийный класс трафика")
|
||||||
|
if packet.direction is not Direction.GROUND_TO_ROVER or packet.stream_id != STREAM_RESET:
|
||||||
|
raise ValueError("неверная оболочка запроса сброса")
|
||||||
|
command = decode_reset(packet.payload)
|
||||||
|
key = command.emergency_event_id, command.reset_request_id, packet.sequence_number
|
||||||
|
if key in self.accepted_keys:
|
||||||
|
self.duplicates += 1
|
||||||
|
self.reacknowledgements += 1
|
||||||
|
ack = ResetAcknowledgement(command.emergency_event_id, command.reset_request_id, True, ResetReason.ACCEPTED)
|
||||||
|
return ResetDecision(ack, False, True)
|
||||||
|
|
||||||
|
reason = ResetReason.ACCEPTED
|
||||||
|
if rover.state is not SafetyState.EMERGENCY_LATCHED:
|
||||||
|
reason = ResetReason.NOT_LATCHED
|
||||||
|
elif actual_speed_mps > 1e-9:
|
||||||
|
reason = ResetReason.MOVING
|
||||||
|
elif last_link_age_seconds > 0.250 + 1e-12:
|
||||||
|
reason = ResetReason.STALE_LINK
|
||||||
|
elif command.emergency_event_id != emergency_event_id:
|
||||||
|
reason = ResetReason.EVENT_MISMATCH
|
||||||
|
elif packet.sequence_number < self.last_sequence:
|
||||||
|
reason = ResetReason.OLD_SEQUENCE
|
||||||
|
elif abs(command.requested_speed_mps) > 1e-9:
|
||||||
|
reason = ResetReason.NONZERO_REQUEST
|
||||||
|
elif command.movement_permitted:
|
||||||
|
reason = ResetReason.MOVEMENT_PERMITTED
|
||||||
|
|
||||||
|
self.last_sequence = max(self.last_sequence, packet.sequence_number)
|
||||||
|
accepted = reason is ResetReason.ACCEPTED
|
||||||
|
if accepted:
|
||||||
|
self.accepted_keys.add(key)
|
||||||
|
self.accepted += 1
|
||||||
|
rover.state = SafetyState.NORMAL
|
||||||
|
else:
|
||||||
|
self.rejected += 1
|
||||||
|
ack = ResetAcknowledgement(command.emergency_event_id, command.reset_request_id, accepted, reason)
|
||||||
|
return ResetDecision(ack, accepted, False)
|
||||||