DeftechSenior

ПЗ для дронів

ПЗ для дронів — це польотний код безекіпажного апарата й наземне ПЗ, що ним командує, створені, щоб лишатися безпечними, коли зникне звʼязок, позиція чи заряд. Безекіпажний апарат — це розподілена система, у якій один вузол падає з неба, якщо пропустить дедлайн, і цей єдиний факт вирішує, який код де працює, що може блокуватися і чому дозволено падати. Сторінка починається з чеклиста готовності до польоту на двадцять пʼять рядків; далі — стек як ієрархія дедлайнів, драбина фейлсейфів як справжня специфікація, рішення про повернення як розрахунок енергії, автономність як список рішень, симуляція як тестове середовище і сім задокументованих аварій.

Стек упорядкований за
Дедлайнами, не шарами
Специфікація —
Драбина фейлсейфів
Повернення вмикає
Енергія до дому, не %

Чеклист готовності до польоту

Спершу весь чеклист — бо саме про це питає огляд готовності до польоту і бо кожен його рядок уже коштував комусь апарата: сім таких аварій — унизу цієї сторінки. Він пронумерований, щоб на рядок можна було послатися: «ми жодного разу не проганяли 2.4» — це задача, тоді як «фейлсейфи треба б переглянути» — це настрій. Він написаний для команди, яка будує або інтегрує ПЗ — на , чи власному автопілоті. Це не передпольотна картка оператора, хоча половина групи 5 зрештою на неї потрапляє.

Робіть спершу групи 2 і 6. Конфігурація фейлсейфів — це те, що апарат справді робить, коли щось іде не так, а доки збій не вкинули в симуляції, ніхто не бачив, як ця конфігурація працює.

  1. 1.Стек і його межі

    1. Політний контролер виконує керування й оцінку стану — і більше нічого. Фіча не йде туди через те, що там «ближче до заліза».
    2. Бортовий компʼютер звертається до автопілота через один інтерфейс повідомлень як недовірений клієнт: кожне завдання, яке він надсилає, перевіряють на допустимий діапазон і можуть відхилити.
    3. Автопілот стежить за сигналом «я живий» (heartbeat) від бортового компʼютера й має налаштовану дію на випадок, коли той замовкне.
    4. Жодне рішення керування на борту не чекає, поки відпрацює канал із землею.
  2. 2.Драбина фейлсейфів

    1. Кожна умова має налаштовану дію: втрачено канал керування, втрачено позицію, мало енергії, досягнуто межу, бортовий компʼютер мовчить, оцінювач стану несправний.
    2. Кожну дію забезпечує найнижчий ярус, здатний її забезпечити: межу й запас енергії — автопілот, і ніколи не лише наземна станція.
    3. Тестують комбінації, а не лише окремі умови: втрачений звʼязок разом із низьким зарядом і зустрічним вітром — окремий випадок.
    4. Останній щабель — посадку на місці, парашут, припинення польоту — справді відпрацьовано, а що він робить над людьми, водою й дорогами, записано.
  3. 3.Енергія й шлях додому

    1. Повернення вмикає енергія, потрібна, щоб долетіти додому, плюс резерв на посадку, порахована з відстані й вітру, — а не фіксований відсоток батареї.
    2. Залишок ємності оцінюють за спожитим зарядом, а не лише за напругою, і знають, що на холоді ця оцінка завищена.
    3. Маршрут на випадок утрати звʼязку оминає людей і закінчується там, де вимушена посадка прийнятна, — а не петлею, яку летять, доки не скінчиться паливо.
    4. Пільговий таймер утрати звʼязку дає рутинним обривам минути, не перериваючи місії, і його значення — рішення, ухвалене на рев’ю, а не значення за замовчуванням.
  4. 4.Позиція і стан

    1. Справність оцінювача стану відстежують, і оцінка, якій більше не можна вірити, — це окрема умова фейлсейфу, а не попередження на екрані.
    2. Утрата супутникового позиціонування веде до визначеної поведінки: утримуватися на інерціальній і візуальній оцінці задане число секунд, потім знижуватися чи повертатися.
    3. Кожен сенсор, здатний завершити політ, звіряють з іншим: супутникову позицію чи показ висоти, що розходиться з рештою, беруть під сумнів, а не виконують.
    4. Кожне вимірювання має мітку часу, яку перевіряють, бо застаріле значення, подане як свіже, шкодить більше, ніж відсутнє.
  5. 5.Наземна станція й конфігурація

    1. Параметри лежать у системі контролю версій окремо для кожного планера, а їхню зміну переглядають так само, як зміну коду.
    2. Перед польотом параметри на апараті порівнюють із переглянутим набором, і будь-яка розбіжність блокує зліт.
    3. Налаштування, послаблене заради тесту чи демонстрації, має власника й дату, коли воно спливає.
    4. Прошивку, параметри й файли місії підтверджують на кожному апараті: флот — це N підтверджень, а не одне завантаження.
    5. Керування не може перейти між пультами чи операторами, поки вони розходяться в положенні органу керування, а критичний для безпеки збій має власну тривогу.
  6. 6.Тести й докази

    1. Симуляція запускається на кожен мердж, і кожна змодельована місія має перевірки по записаному логу.
    2. запускається за розкладом, бо помилки таймінгу й баги драйверів у чистій симуляції невидимі.
    3. Збої — це скриптовані кейси в наборі: обірвати звʼязок, заморозити сенсор, зсунути мітку часу, підмінити показ батареї, зупинити мотор.
    4. Кожен політний лог зберігають і можуть відтворити, а збій, побачений у повітрі бодай раз, стає тест-кейсом, що житиме завжди.

Стек — це ієрархія дедлайнів

Спокусливо читати бортове ПЗ як шари абстракції — так, як читають вебзастосунок. Корисніше читати його як шари того, скільки часу кожна частина може витратити. Внутрішній контур керування виконується сотні разів на секунду й має жорсткий дедлайн: пропустиш — і апарат стає нестабільним за частку секунди. Усе над ним має дедалі більший запас часу, і саме розмір запасу вирішує, що там може жити.

Політний стек найкраще читати як ієрархію дедлайнів, а не абстракцій. Політний контролер тримає апарат у повітрі на циклі жорсткого реального часу в мілісекундах; йому не можна чекати ні на що — тому він малий, детермінований і майже ніколи не є місцем для нових фіч. Автопілот над ним перетворює місію на завдання швидкості й курсу з меншою частотою. Бортовий компʼютер виконує все, що може дозволити собі спізнитися: сприйняття, планування, роботу з відео, — і його падіння не повинне дійти до ярусу нижче. Наземну станцію намальовано свідомо як вхід, а не як залежність, бо звʼязок зникне, а апарат усе одно мусить поводитися. Саме тому справжньою специфікацією є драбина фейлсейфів, а не логіка місії: що станеться, коли зникне звʼязок, коли втратиться позиція, коли енергії до дому залишиться впритул, коли досягнуто межу. Ці чотири відповіді й відрізняють демонстрацію від того, чим можна літати.

Одну деталь діаграма спрощує, і вона важить, коли читаєте код PX4 чи ArduPilot. Перші два яруси зазвичай — та сама плата з тією самою прошивкою. Регулятор кутових швидкостей, оцінювач стану, навігація й логіка режимів — це задачі на одному мікроконтролері, розділені пріоритетом і частотою циклу, а не кабелем. Тож межа між ними — рішення планувальника, і додати роботи у швидку задачу — саме той спосіб, у який фіча краде час у стабілізації. Бортовий компʼютер — перший ярус, що справді є окремою машиною, і саме тому йому можна дозволити падати.

ЯрусДе працюєДедлайнВідкриті прикладиНіколи не має права
Політний контролерМікроконтролер на польотній платіЖорсткий: пропущений цикл — нестабільністьPX4, ArduPilot; Betaflight та INAV на FPVВиділяти памʼять у польоті, торкатися мережі, чекати на ярус вище
АвтопілотТа сама плата, задачі з нижчим пріоритетомТвердий: десятки герцnavigator і commander у PX4; ArduCopter та ArduPlane; оцінювачі EKF2 та EKF3Залежати від звʼязку з землею в усьому, що тримає апарат у безпеці
Бортовий компʼютерОдноплатний компʼютер на LinuxМʼякий: за можливостіROS 2 через міст uXRCE-DDS у PX4, MAVROS, MAVSDKМати владу; його падіння має зупинитися на інтерфейсі
Наземна станціяНоутбук чи планшет на земліЛюдський час: від секунд до хвилинQGroundControl, Mission PlannerБути єдиним місцем, де живе правило безпеки
Канал звʼязкуОдне радіо, іноді кількаЖодного — це вхідMAVLink через телеметрійне радіоВважатися наявним

MAVLink заслуговує на окреме речення, бо ним розмовляє майже кожна відкрита наземна станція й бібліотека для бортового компʼютера. Це компактний протокол повідомлень між апаратом і всім, що поза ним: heartbeat раз на секунду, щоб кожна сторона знала, що інша жива, потоки телеметрії, команди з підтвердженнями й протокол місії, у якому апарат запитує точки маршруту по одній і підтверджує завантаження цілком. Підтвердження — та частина, яку треба поважати. Надіслана команда — це ще не прийнята команда, і наземне ПЗ, що вважає їх тим самим, — це саме те, через що апарат зрештою летить місію, яку ніхто не довантажив.

Драбина фейлсейфів — це і є специфікація

План місії описує, що має статися. Конфігурація фейлсейфів описує, що станеться, і саме вона вирішує, чи можна цим апаратом узагалі літати. Фейлсейф (failsafe) — це поведінка, налаштована заздалегідь для одного конкретного збою: умова, що її вмикає, і дія, яку апарат після цього виконує сам, нікого не питаючи. Кожен запис відповідає на одне питання — це сталося, що тепер, — і кожна відповідь є обміном без безкоштовного варіанта.

УмоваРозумна поведінкаОбмін, який вона робить
Втрачено канал керуванняПродовжувати місію визначений час, потім повертатисяНегайне повернення марнує більшість вильотів, бо звʼязок зникає рутинно. Ніколи не повертатися — втратити апарат.
Втрачено визначення позиціїУтримуватися за інерціальною та візуальною оцінкою, потім знижуватися чи повертатися за численням шляхуЧислення шляху дрейфує. Що довше йому вірити, то далі ви від того місця, де себе вважаєте.
Енергії залишається малоПовертатися зараз, із тригером, порахованим з відстані й вітру, — наступний розділФіксований відсоток хибний з обох кінців польоту.
Досягнуто географічну межуВідмовитися її перетинати, хоч що просить місія чи операторЇї має забезпечувати автопілот, інакше це порада, а не межа.
Бортовий компʼютер замовкПовернутися до останнього дійсного режиму автопілота й летіти далі без ньогоАпарат утрачає розумну поведінку й далі летить — і це правильний порядок пріоритетів.
Оцінка стану несправнаПерейти в режим, якому не потрібна позиція, — утримувати висоту або сідатиСідати наосліп може бути гірше, ніж утримуватися; що правильно — залежить від того, що внизу.

З цієї таблиці варто витягти дві властивості — це рядки 2.2 і 2.3. Перша: кожну поведінку слід забезпечувати на найнижчому ярусі, здатному її забезпечити. Межа, реалізована в наземній станції, є побажанням, бо саме наземна станція й зникає. Друга: фейлсейфи взаємодіють, і саме у взаємодіях живуть несподіванки. Зниклий звʼязок плюс низький заряд плюс зустрічний вітер — ситуація інша, ніж кожне з трьох окремо, і конфігурація, що обробляє кожне поодинці, все одно може дати апарат, який упевнено летить геть від дому.

З тієї ж причини доступність — хибна ціль для всього, що літає. Відсоток часу роботи описує сервіс, який або працює, або ні. Апарат проводить свої найцікавіші хвилини в часткових станах — без звʼязку, без супутникової позиції, без бортового компʼютера, — і корисна специфікація називає, що ще працює на кожному рівні втрат. Таблиця фейлсейфів і є такою специфікацією, тільки записаною.

Повернення — це розрахунок енергії, а не відсоток

Найпоширеніше налаштування батареї в полі — якийсь варіант «повертатися на 30%». Воно виглядає як обережність, і воно хибне з обох кінців польоту. Енергія, потрібна апарату, щоб дістатися додому, росте з відстанню до дому й із вітром, проти якого доведеться летіти. Фіксований відсоток не знає ні того, ні іншого.

Візьмімо умовний мультикоптер, що витрачає близько 4% батареї на кілометр у безвітря й хоче мати 10% резерву на посадку. За кілометр від дому йому треба 14%, щоб повернутися, тож тригер на 30% відправляє його назад із 16% батареї, які так і не використали. За пʼять кілометрів йому треба 30% — поріг точний рівно на одній відстані й більше ніде. Тепер додаймо зустрічний вітер, що вдвічі зменшує шляхову швидкість. Кожен кілометр триває вдвічі довше й коштує приблизно вдвічі більше енергії, тож за пʼять кілометрів тому самому апарату треба вже близько 50%, і тригер на 30% спрацьовує тоді, коли долетіти вже неможливо.

Фіксований тригер батареї точний рівно на одній відстані й за одного вітру. На графіку — умовний мультикоптер, що витрачає близько 4% батареї на кілометр у безвітря й тримає 10% резерву на посадку, тож заряд, потрібний, щоб долетіти додому, — це 10% плюс 4% за кожен кілометр від дому. Зустрічний вітер, що вдвічі зменшує шляхову швидкість, удвічі збільшує час на кожному кілометрі, а отже приблизно вдвічі й енергію: 10% плюс 8% на кілометр. Тригер на 30% збігається з лінією безвітря на 5 км і з лінією вітру на 2,5 км. Ближче він відправляє апарат додому з батареєю, яку той так і не використав. Далі й проти вітру він спрацьовує тоді, коли долетіти додому вже неможливо. Тригер, який варто налаштовувати, рахують із відстані й вітру з урахуванням резерву на посадку, — а холодну батарею, що віддає менше, ніж показує, вважають меншою.

Обидва основні відкриті автопілоти дають більше ніж одне число. ArduPilot має двоступеневий фейлсейф батареї — низький і критичний рівні, кожен спрацьовує за напругою або за спожитою ємністю й має власну дію. PX4 має рівні low, critical та emergency і, окремо, фейлсейф саме для цієї проблеми: він оцінює, чи залишку батареї вистачає ледве-ледве на повернення, і тоді вмикає режим Return. Хоч що ви використовуєте, рішення для рев’ю — це рядок 3.1: з чого рахують тригер, а не який відсоток вписати.

Та сама логіка стосується шляху додому — це рядок 3.3. Маршрут на випадок утрати звʼязку — це план польоту, який виконується без жодного нагляду, тож він отримує той самий рев’ю, що й місія, і навіть більший: де він перетинає людей, яку висоту тримає над рельєфом, який справді перетинає, і де закінчується, якщо звʼязок так і не повернеться. «Літає петлею, доки не повернеться контакт» — не закінчення. Це неухвалене рішення про те, де апарат опиниться на землі, коли скінчиться енергія.

Автономність — це набір рішень, а не рівень

Автономність зазвичай обговорюють як шкалу від дистанційного керування до повної незалежності — це корисне резюме й поганий інженерний інструмент. Питання, на яке справді має відповісти проєкт, вужче, і воно повторюється для кожної здатності: які рішення цей апарат ухвалює сам, на яких підставах, у яких межах, а які утримує й питає. Відповісти на цей список — це і є проєктування. Рівень — ярлик, який можна навісити потім.

Два питання сортують кожне рішення: чи коротший його дедлайн за похід до людини й назад, і чи можна хибний вибір скасувати. Три з чотирьох відповідей знайомі. Коротке й оборотне — стабілізацію, обхід перешкоди — вирішують на борту, бо відповісти вчасно ніхто б не встиг, а помилка коштує мало. Довге й оборотне — підправити маршрут, навести камеру — теж можна вирішувати на борту, якщо потім доповісти. Довге й незворотне — це там, де апарат утримує рішення й питає.

Автономність легше проєктувати як сортування рішень, ніж як рівень. Дві властивості визначають місце кожного рішення, яке може ухвалити апарат: чи його дедлайн коротший за похід до людини й назад, і чи можна хибне рішення скасувати. Короткі й оборотні рішення, як-от стабілізацію чи обхід перешкоди, ухвалюють на борту, бо відповісти вчасно ніхто б не встиг, а помилка коштує мало. Довгі й оборотні, як-от підправити маршрут, теж можна ухвалювати на борту, якщо потім доповісти. Довгі й незворотні утримують, доки не відповість людина, — і це працює, лише коли апарат уміє безпечно чекати. Четверта клітинка — та, яку проєкти пропускають: часу спитати немає, а скасувати не можна — мотор відмовляє низько над дорогою, оцінка позиції розвалюється біля землі, спрацьовує умова припинення польоту. Відповідь тут — не автономність і не людина в контурі, а людина, яка заздалегідь, на землі, вирішує, в який бік апарат помилятиметься, і записує це рішення в конфігурацію, де його можна переглянути.

Четвертий квадрант — той, який проєкти пропускають: часу спитати немає, а скасувати не можна. Мотор відмовляє низько над дорогою; оцінка позиції розвалюється за кілька метрів над землею; спрацьовує умова припинення польоту. Порадитися ні з ким, і що б не сталося далі — це остаточно. Відповідь тут — ні автономність, ні людина в контурі. Це людина, яка заздалегідь, на землі, вирішує, в який бік апарат помилятиметься, і записує це рішення в конфігурацію, де його можна переглянути. Парашут у Цюриху — саме цей квадрант: рішення про припинення польоту ухвалили задовго до того, і воно було правильним. Відмовив механізм, що мав його виконати.

Вирішувати на борту

  • Усе з дедлайном коротшим за похід до людини й назад: обхід перешкод, стабілізація, скасування посадки.
  • Усе, що тримає апарат у безпеці: межі, обмеження висоти, запас енергії, рішення про повернення.
  • Усе оборотне й дешеве в разі помилки: підправити маршрут, куди дивитися камерою.
  • Навігація, що мусить тривати без звʼязку, — а це на практиці більша частина польоту.

Утримати й спитати

  • Усе з наслідками й незворотне, де помилку не виправити повторною спробою.
  • Усе, що спирається на класифікацію, яку апарат не може перевірити: ідентичність, намір, чи є там людина.
  • Усе поза межами, дозволеними оператором, включно з продовженням місії, що виглядає нешкідливим.
  • Усе, про що апарат не зможе потім доповісти: незаписану автономну дію неможливо розібрати.

У правого стовпця є наслідок, який часто пропускають: щоб утримати рішення, апарат мусить уміти безпечно чекати. Система, яка має спитати людину, але не може зависнути, не може зберегти запит і не може розумно поводитися, якщо відповіді не буде, не реалізувала вимогу — вона її записала. Чекання — це здатність із власним бюджетом енергії, власним тайм-аутом і власним фейлсейфом. Бік оператора в утриманому рішенні — що йому показують, скільки часу він має, як записують відмову — належить сторінці про . Бік апарата — цій.

Симуляція — це тестове середовище, а не зручність

Кожен важливий тут випадок збою — це те, чого не відтвориш на справжньому апараті: утрата позиції на двохстах метрах, зупинка мотора в розвороті, зникнення звʼязку на дальньому кінці маршруту, батарея з хибним показанням. Літати такі тести дорого, небезпечно й повільно, а ті, які пережив, не повториш однаково. Продакшн-трафіку, з якого можна вчитися, теж немає. Зворотний звʼязок, який вебкоманда отримує з живої телеметрії, приходить сюди файлом логу після посадки — якщо апарат сів. Тож головним тестовим середовищем є симулятор, і зрілість симуляційного стенду добре описує зрілість команди.

Зріла команда польотного ПЗ налітує більшість годин у симуляції. Software in the loop запускає справжню прошивку автопілота на робочій станції проти змодельованого планера, сенсорів і світу — достатньо швидко, щоб пролітати сотні місій на кожен мердж; так ловлять помилки логіки, поведінку фейлсейфів і збої послідовності місії. Hardware in the loop запускає справжню польотну плату з прошивкою проти змодельованої фізики — щоночі й десятками — і знаходить те, що залежить від справжнього процесора: таймінг, навантаження CPU й баги драйверів. Льотні випробування обмежують кількома на реліз — для того, чого не відтворює жодна модель: вібрації, поширення радіосигналу й погоди. Жоден із трьох ярусів не заміняє інший, бо кожен знаходить клас збоїв, невидимий попередньому. Стрілка назад угору — те, що змушує драбину покращуватися: кожен політний лог є вхідними даними тесту, тож збій, побачений у повітрі бодай раз, відтворюють у симуляції, і відтоді він запускається на кожен мердж.
ЯрусЩо справжнєЩо змодельованеЩо знаходить лише він
Software in the loopПрошивка автопілота, скомпільована для робочої станціїПланер, сенсори, світ і звʼязок — у Gazebo чи у власній фізичній моделі ArduPilotПомилки логіки, поведінку фейлсейфів, послідовність місії — досить швидко, щоб пролітати сотні місій на мердж
Hardware in the loopПольотна плата з її прошивкоюФізика й сенсорні входи, які подають на платуТаймінг, навантаження CPU, баги драйверів — усе, що залежить від справжнього процесора
Льотні випробуванняУсеНічогоВібрацію, поширення радіосигналу, погоду — те, чого не відтворює жодна модель

Дві практики перетворюють цю драбину на регресійний набір, а не на три місця, де люди іноді щось тестують. Збої — це скриптовані кейси, а не експерименти, — рядок 6.3, — тож обірвати звʼязок на дальній точці маршруту — це тест, що запускається на кожен мердж і падає на конкретному рядку. І кожен політний лог — вхідні дані тесту, рядок 6.4. Збій, побачений у повітрі раз, відтворюють у симуляції, і він лишається в наборі назавжди — це те саме правило, що й у будь-якому регресійному наборі, і саме воно робить набір кращим щоразу, коли щось іде не так. Збій міток часу в Ingenuity нижче — саме такий, який скриптований кейс ловить дешево: зсуньте мітки часу одного входу й перевірте, що оцінювач це помічає.

Ритм релізів випливає з усього цього, і саме ця частина вебпрактики переноситься найгірше. Розгортати кілька разів на день і лагодити вперед — це припущення, що наступне виправлення дійде до працюючої системи за хвилини. Апарат у полі може бути недосяжним тижнями, тож версія, яку він несе, мусить бути безпечною сама по собі тижнями. Релізів тут менше, їх розгортають поетапно по флоту, підтверджують на кожному апараті — рядок 5.4 — і їх можна відкотити на самому апараті.

Сім аварій — і рядок, що покриває кожну

Кожна з них має публічне розслідування чи задокументований опис. У більшості апарат зробив саме те, що йому сказали ПЗ і конфігурація, а розслідування знайшло причину в проєктному рішенні, а не в невдачі. Жодна не стосується логіки місії — тієї частини, яку демонструє кожна команда.

ВипадокЩо сталосяРядок, що це покриває
Predator B, Ногалес, Аризона, квітень 2006Пульт наземної станції завис, і пілот передав керування на другий, ідентичний пульт, не вирівнявши важелі. На тому пульті важіль керування двигуном стояв у положенні, що перекриває паливний клапан, і двигун зупинився. На батареї апарат вимкнув супутниковий канал і транспондер, тож диспетчери його втратили, а маршрут на випадок утрати звʼязку був петлею, що могла закінчитися лише падінням десь на ній. Девʼять зависань пульта за три місяці до того лишилися нерозібраними.5.5 і 3.3. Рекомендації NTSB вказують на обидва: передачу керування, яку система відхиляє, поки важелі розходяться, окремі тривоги для критичних збоїв і маршрут утрати звʼязку, що закінчується в безпечному місці.
Світлове шоу, Гонконг, жовтень 2018Під час шоу над гаванню 46 зі 100 дронів утратили супутникове позиціонування через завади й упали у Вікторія-Гарбор; збитки оцінили щонайменше в HK$1 млн. Вони мали функцію повернення до точки зльоту, і організатор сказав, що завади не дали їй спрацювати: їй була потрібна саме та позиція, яку вони щойно втратили.4.2. Повернення, що залежить від сигналу, який зник, — це не поведінка на випадок утрати цього сигналу.
Matternet M2, Цюрих, травень 2019Дрон медичної доставки виявив збій приблизно за дві хвилини після зльоту й, як і було задумано, увімкнув систему припинення польоту. Парашут розкрився, але його єдиний трос зачепився за гостру деталь дрона й обірвався, і дрон упав у лісистій місцевості. Слідчі також зʼясували, що попереджувальний сигнал люди поблизу не почули.2.4. Рішення припинити політ було правильним; механізм, що мав його виконати, відмовив у найслабшому місці. Swiss Post перейшла на два посилені троси й гучніший сигнал.
Ingenuity, політ 6, Марс, травень 2021Один кадр навігаційної камери загубився, і кожен наступний надходив із хибною міткою часу. Оцінювач раз у раз виправляв помилки, яких не було, і гелікоптер розгойдувало більш ніж на 20 градусів по крену й тангажу. Він сів приблизно за 5 м від цілі, бо конструкція витримувала помилки таймінгу й на фінальному зниженні переставала використовувати кадри камери.4.4 — і успіх для 2.1: запасний варіант для фінального зниження спроєктували ще до того, як щось пішло не так.
Ingenuity, політ 72, Марс, січень 2024Над одноманітними піщаними брижами, приблизно за 20 секунд після зльоту, навігаційна система не змогла знайти достатньо деталей поверхні, щоб за ними стежити. Оцінка швидкості пішла хибно, гелікоптер жорстко торкнувся ґрунту з великою горизонтальною швидкістю, і всі чотири лопаті зламалися. Це був останній політ.4.1. Оцінка, якій бракує даних, має вміти про це сказати, і це має змінювати те, що робить апарат.
Amazon MK30, Орегон, грудень 2024Два дрони доставки на випробуваннях з інтервалом приблизно в чотири хвилини вимкнули пропелери в польоті під легким дощем. За оглядом матеріалів NTSB від Bloomberg, оновлення ПЗ зробило лідар чутливішим до дощу, а ПЗ діяло за хибно зчитаною висотою. Amazon призупинила доставки в січні 2025.4.3 і 6.3. Одному сенсору дозволили завершити політ на власне слово, а змінена поведінка сенсора — саме те, що скриптований кейс збою має перевірити, перш ніж оновлення полетить.
Шоу дронів, Орландо, грудень 2024Помилки конфігурації — центр шоу, його курс, неоднакові оновлення на різних апаратах і нестандартні налаштування геозони — перемістили шоу ближче до глядачів, ніж дозволяв власний стандарт оператора. Дрони зіткнулися й упали на глядачів, а семирічний хлопчик отримав тяжкі травми. Остаточний звіт NTSB встановив, що через відсутність надійної перехресної перевірки жодну з цих помилок не виявили.5.2 і 5.4. Флот із пʼятисот апаратів — це пʼятсот конфігурацій, і ніщо не порівняло їх із переглянутою.

Де це вироджується

Чесне обмеження всього на цій сторінці в тому, що фейлсейф відповідає лише на ті збої, які хтось уявив. Кожен із семи випадків був, якщо дивитися назад, умовою, під яку ніхто не написав рядка: важіль із двома значеннями, дощ на лідарі, пісок, на якому нічого не видно. Симуляція відтворює збої, які ви заскриптували, а небезпечний саме той, який нікому не спало на думку заскриптувати. Це не аргумент проти драбини. Це аргумент за те, щоб зберігати кожен політний лог, відтворювати його й ставитися до кожної несподіванки як до нового рядка, а не як до невдачі.

  • Таблиця фейлсейфів, що існує як документ і жодного разу не виконувалася — ні в симуляції, ні деінде.
  • Межа, яку забезпечує наземна станція, — компонент, якого гарантовано не буде, коли це важить.
  • «Повертатися на 30%», скопійоване з форуму в кожен планер, хай яка в нього дальність і хай який вітер.
  • Параметри, змінені на польовому ноутбуці, які так і не повернулися в систему контролю версій.
  • Набір симуляцій, що сотні разів пролітає щасливу місію й не вкидає жодного збою.
  • Політний лог, який зберігають лише для розбору інцидентів і ніколи не відтворюють як тест.
  • Вимога «людина в контурі» для рішення, на яке апарат не може чекати.
  • Демонстрація в гарну погоду, на повній батареї, із сильним звʼязком і автором поруч, подана як доказ бодай чогось.
  • Процес релізів, скопійований із веброзробки — розгортати часто, лагодити вперед, — для апарата, що може бути недосяжним тижнями.

Коли це застосовувати

Застосовуйте, коли

  • Як огляд готовності до польоту: двадцять пʼять рядків угорі, з посиланням на номер.
  • Коли вирішуєте, що належить політному контролеру, автопілоту й бортовому компʼютеру: вирішує дедлайн, а не мова.
  • Коли пишете чи переглядаєте конфігурацію фейлсейфів або тригер повернення — частину специфікації, що вирішує придатність до польоту.
  • Коли будуєте тестове середовище: спершу симуляція, далі hardware in the loop, повітря — востаннє й рідко.

Уникайте, коли

  • Як джерело деталей про сприйняття чи моделі: це належить компʼютерному зору, і ця сторінка свідомо туди не заходить.
  • Як настанову щодо спільної оперативної картини чи інтерфейсу оператора — це сторінка C2; ця закінчується апаратом і його каналом.
  • Як заміну документації самого автопілота: назви параметрів і точна поведінка для кожної версії живуть там.
  • Для системи, де людина справді завжди присутня й реагує: тутешні обмеження були б зайвим тягарем.

Джерела й метод

На чому стоїть ця стаття

  • 9 джерел
  • 5 задокументованих збоїв
  • Перевірено 13 жовтня 2026 р.

Дослідження з Claude. Пошук і звірку першоджерел зроблено з Claude (Anthropic). Відбір, текст і перевірку фактів — редакція Anatomy of IT Product.

Було корисно?

Поділіться з тим, хто працює над тією ж задачею.