Dead Reckoning в ArduPilot: что происходит после потери GPS

Как Copter продолжает оценивать движение после потери пригодной внешней позиции, когда включается Dead Reckoning, что делают FS_DR_ENABLE и FS_DR_TIMEOUT и почему этот режим рассчитан только на короткое аварийное окно.

Материал обновлён: сентябрь 2026. Dead Reckoning в Copter — короткий аварийный режим после потери внешней позиции/скорости, а не полноценная инерциальная навигация на длительное время.


Короткий ответ

Когда EKF теряет пригодный внешний источник горизонтальной позиции и скорости, он некоторое время может продолжать оценивать движение по IMU и заранее оценённому ветру/drag model. Ошибка такого решения быстро накапливается, поэтому ArduPilot ограничивает Dead Reckoning по времени.

В официальной документации указано, что для большинства коптеров практическое окно составляет примерно 10–30 секунд. Это не гарантированная продолжительность и не рекомендация выставлять конкретное значение без испытаний.

ИНФОГРАФИКА · DEGRADATION PATH

После потери позиции неопределённость только растёт

Dead Reckoning выигрывает время на возврат или безопасное завершение полёта, но не создаёт новый абсолютный источник координат.

01 · NORMALВнешняя позиция доступна

GNSS / ExternalNav / другой source корректирует накопление ошибок EKF.

Позиция и скорость регулярно привязываются к внешним измерениям.

→
02 · SOURCE LOSTНет position / velocity aid

EKF обнаруживает потерю пригодного внешнего источника.

Причина может быть не только GPS: важен сам position estimate.

→
03 · DEAD RECKONINGIMU + wind / drag estimate

Состояние прогнозируется без абсолютной горизонтальной коррекции.

Ошибка положения и скорости со временем накапливается.

→
04 · TIMEOUTОбычный EKF failsafe

Если пригодная позиция не восстановлена до лимита, выполняется дальнейшее failsafe-действие.

Цель — не дать аппарату бесконечно доверять дрейфующей оценке.

Ключ: внешний GNSS корректирует дрейф. Без него IMU не знает абсолютную позицию, а малые ошибки ускорения и ветра интегрируются в растущую ошибку скорости и координат.

#fpv-dr-flow{—bg:#F4F8FC;—surface:#FFFFFF;—border:#C7D5E0;—text:#142438;—text2:#31485C;—muted:#536A7D;—cyan:#00758E;—green:#187A4B;—orange:#C34510;max-width:1080px;margin:30px auto;padding:24px;border:1px solid var(—border);border-radius:18px;background:var(—bg);color:var(—text);font-family:»Onest»,Inter,ui-sans-serif,system-ui,-apple-system,»Segoe UI»,sans-serif;box-sizing:border-box}#fpv-dr-flow *{box-sizing:border-box}#fpv-dr-flow .fpv-dr-eye{font-size:12px;font-weight:800;letter-spacing:.11em;color:var(—cyan);margin-bottom:8px}#fpv-dr-flow h3{margin:0;font-size:clamp(23px,3vw,31px);line-height:1.15;letter-spacing:-.02em}#fpv-dr-flow .fpv-dr-lead{margin:9px 0 22px;color:var(—text2);line-height:1.6;max-width:860px}#fpv-dr-flow .fpv-dr-grid{display:grid;grid-template-columns:minmax(0,1fr) 28px minmax(0,1fr) 28px minmax(0,1fr) 28px minmax(0,1fr);gap:5px;align-items:stretch}#fpv-dr-flow .fpv-dr-card{padding:17px;border:1px solid var(—border);border-radius:16px;background:var(—surface);min-height:230px;display:flex;flex-direction:column}#fpv-dr-flow .fpv-dr-card>span{font-size:11px;font-weight:850;letter-spacing:.05em;color:var(—cyan);margin-bottom:17px}#fpv-dr-flow .fpv-dr-card b{font-size:17px;line-height:1.3}#fpv-dr-flow .fpv-dr-card p{margin:8px 0;color:var(—text2);font-size:14px;line-height:1.5}#fpv-dr-flow .fpv-dr-card small{margin-top:auto;padding-top:10px;border-top:1px solid var(—border);color:var(—muted);font-size:12px;line-height:1.45}#fpv-dr-flow .fpv-dr-ok{border-color:#9FC8B3;background:#F5FBF7}#fpv-dr-flow .fpv-dr-ok>span{color:var(—green)}#fpv-dr-flow .fpv-dr-warn{border-color:#E4B69E;background:#FFF8F4}#fpv-dr-flow .fpv-dr-warn>span{color:var(—orange)}#fpv-dr-flow .fpv-dr-arrow{display:grid;place-items:center;color:var(—cyan);font-size:20px;font-weight:900}#fpv-dr-flow .fpv-dr-band{margin-top:15px;padding:14px 16px;border-left:3px solid var(—orange);border-radius:0 12px 12px 0;background:var(—surface);color:var(—text2)}
@media(max-width:860px){#fpv-dr-flow .fpv-dr-grid{grid-template-columns:1fr}#fpv-dr-flow .fpv-dr-arrow{transform:rotate(90deg);min-height:18px}#fpv-dr-flow .fpv-dr-card{min-height:auto}}@media(max-width:520px){#fpv-dr-flow{padding:18px;margin:24px 0;border-radius:14px}}

Dead Reckoning — это потеря position estimate, а не обязательно только GPS

Документация ArduPilot формулирует условие точнее, чем «пропал GPS»: failsafe предназначен для ситуации, когда аппарат теряет пригодную оценку позиции. Источником позиции может быть GNSS, Optical Flow/ExternalNav или другая настроенная схема.

В логах EKF3 состояние Dead Reckoning отражается отдельным флагом DEAD_RECKONING. Это полезнее, чем делать вывод только по GPS.Status.

Почему IMU недостаточно для долгого полёта

Акселерометры измеряют удельное ускорение, гироскопы — угловую скорость. Чтобы получить скорость и координаты, ошибки измерений приходится интегрировать во времени. Даже небольшой bias постепенно превращается в всё большую ошибку.

У мультикоптера добавляются ветер и аэродинамический drag: одинаковый наклон не означает одинаковую скорость относительно земли. Поэтому для полезного Dead Reckoning ArduPilot рекомендует заранее настроить оценку ветра/drag.

Что нужно настроить

Текущая документация Copter указывает три ключевых элемента:

  • настроить wind-speed estimation, включая коэффициенты EK3_DRAG_BCOEF_X, EK3_DRAG_BCOEF_Y и EK3_DRAG_MCOEF для подходящей платформы;
  • выбрать действие FS_DR_ENABLE;
  • задать FS_DR_TIMEOUT по результатам испытаний конкретного аппарата.

Не копируйте drag coefficients с чужого коптера: они зависят от аэродинамики, массы и геометрии вашего аппарата.

FS_DR_ENABLE

FS_DR_ENABLE определяет действие в момент начала Dead Reckoning. В документированных параметрах доступны:

Значение Действие
0 Disabled / NoAction
1 Land
2 RTL
3 SmartRTL or RTL
4 SmartRTL or Land
6 Auto DO_LAND_START or RTL

Выбор зависит от аппарата, пространства полёта и того, насколько предсказуемо конкретная платформа способна двигаться по dead-reckoned state.

FS_DR_TIMEOUT

FS_DR_TIMEOUT задаёт, сколько секунд Dead Reckoning разрешён после потери position/velocity source. Документированный диапазон параметра — 0–120 секунд, но это не означает, что 120 секунд являются безопасными или достижимыми.

Официальный guide подчёркивает: у большинства аппаратов практически полезное время обычно только 10–30 секунд. Лимит нужно определять экспериментально для конкретной машины.

Что происходит при срабатывании

Для конфигурации с FS_DR_ENABLE=2 документация описывает типичный сценарий: после потери GPS/position aid аппарат некоторое время продолжает нормальный полёт, затем появляется сообщение Dead Reckoning started и начинается RTL по оценённой позиции. Если Home не достигнут до FS_DR_TIMEOUT, вступает обычный EKF failsafe.

Важно: если GNSS восстановился во время такого RTL, ArduPilot не обязан автоматически вернуться в прежний режим — документация отмечает, что аппарат остаётся в RTL, пока режим не изменит пилот/логика.

Связь с EKF failsafe

Dead Reckoning failsafe срабатывает на той же базовой деградации EKF, что и EKF failsafe: когда состояние позиции/скорости становится недостоверным. Dead Reckoning вставляет ограниченное временное окно до окончательной реакции, чтобы дать аппарату шанс приблизиться к Home.

Это не отменяет FS_EKF_THRESH и последующую EKF failsafe logic.

Почему wind estimate обязателен

Для коптера EKF может оценивать ветер без отдельного airspeed sensor, используя body drag model. Когда внешний position/velocity source пропадает, эта сохранённая оценка ветра помогает ограничить рост ошибки скорости.

Перед использованием Dead Reckoning guide рекомендует убедиться, что EKF действительно вычислил wind estimate — например, проверить wind_dir/wind_vel в GCS и соответствующие log fields.

Безопасная проверка

Сначала используйте SITL/симулятор. На реальном аппарате тест нужен только после проверки обычного Loiter/RTL, wind estimation и ручного выхода из автоматических режимов.

  1. Проверьте, что аппарат стабилен в Stabilize/AltHold и Loiter/RTL.
  2. Проверьте wind estimate и отсутствие EKF warnings.
  3. Начните с небольшого FS_DR_TIMEOUT, соответствующего уже подтверждённому тестом времени.
  4. Проводите испытание в открытом пространстве, близко к пилоту и с запасом высоты/батареи.
  5. Будьте готовы немедленно перейти в ручной режим, не требующий horizontal position estimate, например AltHold/Stabilize.
  6. После теста изучите EKF/GPS/attitude logs и оцените фактический position drift.

Не используйте создание RF-помех как способ тестирования. Для функциональной проверки ArduPilot имеет симуляцию/управляемое отключение источника; задача — проверить failsafe, а не воспроизводить радиоподавление.

Что смотреть в логах

  • флаг EKF3 DEAD_RECKONING;
  • GPS.Status, position/velocity и время исчезновения GNSS aid;
  • EKF position/velocity innovations и error estimates;
  • wind estimate перед потерей position source;
  • фактическое изменение mode и время до FS_DR_TIMEOUT;
  • расхождение восстановленной GNSS-позиции с dead-reckoned position после возврата внешних измерений.

Чего Dead Reckoning не делает

  • не создаёт абсолютные координаты из IMU;
  • не гарантирует возврат домой при длительной потере GNSS;
  • не защищает GNSS от jamming/spoofing;
  • не заменяет Optical Flow, VIO, ExternalNav или другой независимый position source;
  • не гарантирует одинаковую точность на двух коптерах с одинаковым FC;
  • не позволяет без испытаний выставить максимальный timeout.

Dead Reckoning или независимый резервный position source

Если задача требует длительной работы без GNSS, правильная архитектура — независимый внешний источник положения/скорости: VIO/ExternalNav, optical flow в подходящих условиях или другая навигационная система. Dead Reckoning предназначен для кратковременного мостика между исправной навигацией и безопасным завершением полёта.

Связанные материалы

Источники

Вывод

Dead Reckoning — это ограниченный запас времени, а не запасной GPS. Он полезен, когда аппарат заранее умеет оценивать ветер и может несколько секунд двигаться по прогнозу EKF, но неопределённость неизбежно растёт. Timeout должен вытекать из испытаний конкретной платформы, а не из максимума параметра.

Прокрутить вверх
На связи