libfpv - FPV дрон в будь-якій грі
⚠️ Те, що ви читаєте, — переклад, зроблений ШІ. Спочатку статтю написано англійською, оригінал можна прочитати тут.
Ну що ж, усім привіт, давно я не працював над по-справжньому цікавим проєктом. Радий бачити вас тут — схоже, вам справді хочеться дізнатися, як було створено libfpv.
Спойлер: ви можете розчаруватися.
Зміст
Демонстрація
Перш за все мені треба показати, на що здатна libfpv. Ти, так-так, ти, давай, зіграй у Mario 64 просто тут: завантаж гру (пробіл, пробіл), дочекайся появи Маріо й натисни F, щоб заспавнити дрон:
Якщо хочете пограти на весь екран, переходьте за цим посиланням: https://sm64ex-fpv.hammerill.com
Я також уже показував проєкт на Reddit, ось найперший пост із Super Mario 64:
А ось наступний, із Grand Theft Auto IV:
І нарешті, моє повне проходження SM64, зігране майже виключно на квадрику:
Передісторія
Усе почалося з того, що я зацікавився FPV-симуляторами загалом. Спочатку спеціалізованими симуляторами на кшталт Liftoff та інших, потім FPV-модами для великих ігор на кшталт GTA V. Не розповідатиму, чому мене все це взагалі зацікавило, там було багато емоцій... Просто пропущу це.
Коротше, грати в GTA V з FPV-модом було чудово, це ніби заново відкрити для себе гру з зовсім іншого ракурсу. А ще це відчуття свободи: класичні FPV-симулятори змушують вас залишатися в межах мапи, а з цим модом я міг облетіти всю мапу GTA V, з усіма її будівлями, природою та всім іншим.
Це був неймовірний досвід, і він підштовхнув мене купити справжній FPV-дрон у реальному житті. Сьогодні можна купити найкрихітніші тінівупи, тож я взяв собі Air65 II. Пізніше хочу спаяти свою п'ятидюймівку, але до цього я поки не дійшов (до того ж паяю я жахливо).
Польоти на цьому малюку змусили мене зрозуміти одну річ: граючи з FPV-модом, я повністю пропустив навчання «арму» дрона. Я просто вимкнув його в налаштуваннях і більше про нього не згадував. А зі справжнім дроном це роблять постійно, і я провів кілька хвилин з уже забінженим квадом, не в змозі злетіти, бо просто не знав, що квад треба армити і як це взагалі робиться... Пишу це й почуваюся дурнем, але я справді був у такій ситуації.
Це було перше, що змусило мене усвідомити: мод, у який я грав, оминає речі, які відбуваються в реальному житті, а отже, напевно не симулює й багато чого іншого.
Тоді ж я почав налаштовувати OSD свого дрона: рівень батареї тут, рівень сигналу там, ім'я пілота HAMMERILL у самому низу... А ще можливість сховати все це тумблером вимкнення OSD на пульті, бо мені не особливо треба бачити його 100% часу.
До речі, про тумблери. На самому початку щоразу, коли мій вуп падав догори дриґом, мені доводилося знімати окуляри й іти перевертати його руками. Потім я побачив, як якийсь чувак в інтернеті робить щось чарівне: CRASH FLIP — і дрон перевертається сам. Так я дізнався, що це реальна функція під назвою turtle mode. І знову це те, чого симулятор мене не навчив.
Увімкнення turtle mode — штука досить технічна: якщо в симуляторі просто тиснеш «перевернути», і все, дрон знову летить, то в реальному житті треба дизармити, увімкнути тумблер crash flip, армити з ним (переконавшись, що газ на 0%), штовхнути стік у бік перевороту, дизармити, вимкнути той самий тумблер, армити (знову переконавшись, що газ на 0%) і злітати. Досі мені не траплявся жоден FPV-симулятор, який змушував би тебе проходити всю цю процедуру, щоб ти звик до неї ще до того, як політаєш на справжньому дроні.
...
Після всього цього мені захотілося ще й знімати на FPV-дрон у BeamNG.drive, а саме — робити це в записі сцени, щоб потім зняти збоку, як я дрифтую. Я завантажив мод з FPV-дроном і... не зрозумів, як його заспавнити. Лише пізніше до мене дійшло, що квад — це новий «транспортний засіб», так я його й заспавнив. Налаштував пульт, але не знайшов жодних опцій для налаштування рейтів. Нарешті злетів і... Фізика була жахливою, вона працювала зовсім не так, як в інших симуляторах, і зовсім не так, як літає мій вуп. Це було жахливо: дрон не слухався, не тримав напрямок (взагалі-то в реальному житті PID якраз і потрібен, щоб дрон був чуйним) і все в такому дусі.
Я навіть не намагався заспавнити його в записі сцени — я б просто не зрозумів, як помістити туди FPV-«транспорт», щоб політати навколо сцени (мод без документації), та й з такою фізикою мені це було просто нецікаво.
Дві проблеми FPV-модів
Усе це змусило мене зрозуміти, що в «FPV-модів» загалом є дві проблеми, які для мене важливі. Ось вони:
- Кожен мод треба робити з нуля для кожної гри. «З нуля» означає, що треба витратити час, підігнати фізику, створити/прикріпити об'єкт дрона до ігрового світу, реалізувати OSD/рейти/тюнінг... Роботи величезна кількість, і все це доводиться переробляти знову і знову для КОЖНОЇ гри, в якій хочеться FPV-мод.
- Як прямий наслідок пункту 1, для конкретної гри вам можуть трапитися FPV-моди з поганою фізикою, поганою інтеграцією з ігровими режимами (наприклад, незрозуміло, як заспавнити квад у записі сцени в BeamNG), поганими або відсутніми OSD/рейтами/тюнінгом... І жоден FPV-мод не намагається бути максимально реалістичним, тож ви не зможете, наприклад, напрацювати м'язову пам'ять для перевороту в turtle mode, граючи в нього.
TLDR: моддерам завжди доводиться робити весь FPV-мод з нуля, і він не буде настільки реалістичним, наскільки міг би.
Ідея
Одного дня мені просто спала на думку кумедна думка: «От би пограти в FPV-симулятор, де квад працює просто... на Betaflight, як справжній дрон, який буквально літає віртуальним світом, і щоб я міг налаштовувати його через Configurator і все таке».
Тоді я ще не знав, що після недовгих пошуків натраплю на pr0p — FPV-симулятор, який робить САМЕ це.
Ба більше, ця гра працює на опенсорсному рушії SimITL, саме він реалізує весь квад з Betaflight на борту. І фізика в нього добра, адже він емулює справжню поведінку PID справжнього квада (і все, що робить польотний контролер), тож можна відчути, наприклад, справжній prop wash.
Коли я побачив усе це кілька місяців тому, мене це дуже надихнуло, але тоді я нічого з цим не зробив.
...
Ви бачили величезну хвилю людей, які модять ігри за допомогою ШІ? Я — так, ще й як.
Усе це нагадало мені про те, що люди робили кілька років тому з декомпіляцією Super Mario 64, я кажу про libsm64. Якщо ви не знаєте, що це, — це штука, яка дозволяє вбудувати іграбельного Маріо з цієї гри в абсолютно будь-яку іншу гру.
Тепер складіть ці два факти: є FPV-спільнота, яка хоче модити ігри, додаючи в них FPV-дрони, але для кожної гри це треба робити з нуля; і є libsm64, яка дозволяє грати за Маріо з ТОЧНО ТАКОЮ САМОЮ фізикою, анімаціями, керуванням і поведінкою, як в оригінальній грі, в усіх можливих іграх.
Ніхто ж не розробляє Маріо з нуля щоразу, коли робить мод з libsm64, правда?
То навіщо щоразу розробляти FPV-дрон?
Я знав, що треба робити. Я мав створити libfpv — духовну спадкоємицю libsm64, яка вбудовує FPV-дрони в ігри так само, як libsm64 робить це з Маріо.
Реалізація
Я знав, що вручну робитиму все надто повільно, тому віддав ШІ всю технічну частину (сумно це казати, враховуючи, що кілька років тому я писав проєкти на C/C++ руками й відкидав ШІ — так було і з розробкою цього сайту, на якому ви читаєте цю статтю, і зі збиранням ядра Linux з драйверами HDMI CEC для моєї роботи, де я вовтузився з бітами зсувів, щоб драйвер міг отримати доступ до периферії, прописував це в device tree, щоб ядро це запам'ятало, і де ШІ був марний, бо просто нічого не знав/не розумів... Але сьогодні мені доводиться переглянути свою позицію й почати користуватися ним усерйоз). Просто ось що таке сьогодні «software dev».
ШІ використовувався навіть на етапі технічного проєктування. Я пояснив ідею Claude, сказав, що хочу, щоб libfpv була заснована на SimITL, попросив його поставити мені уточнювальні технічні питання (наприклад, де крутитиметься логіка Betaflight і хто рахуватиме фізику дрона — гра чи libfpv) і видати мені промпт з повною специфікацією, щоб передати його Claude Code для ініціалізації проєкту libfpv.
Claude Code (Opus 5.5) почав збирати проєкт з модулями на кшталт SimITL, самого Betaflight, Dear ImGui... Потім скомпілював автономний приклад, який трохи нагадував pr0p, тільки з гіршою графікою та лайновою мапою. Але цього мені вистачило, щоб зрозуміти, що ця штука має потенціал.
Я навіть не казав йому, що має бути в меню ImGui, — він сам зрозумів, що воно буде потрібне для налаштування пульта й навіть самого дрона, ніби Betaflight Configurator недоступний (хоча він був доступний завдяки SimITL; але от у браузерних версіях — ні).
Ще на ранніх етапах розробки я зробив libfpv сумісною з будь-якою ОС: Windows, Linux, macOS. Імовірно, навіть з консолями, але поки не офіційно (у мене є PS Vita, тож дайте знати, якщо хочете, щоб я щось із нею зробив).
Я також попрацював над доведенням інтеграції Betaflight. SimITL це робив, але не реалізовував деякі речі на кшталт GPS-елементів на OSD і робочого turtle mode, а також обробки тумблерів вимкнення OSD / airmode... Тепер я можу зробити власний ідеально «реалістичний» FPV-симулятор, який можна вбудувати будь-куди!
Після двох годин роботи Claude, коли перша версія libfpv була готова, я попросив його спробувати інтегрувати libfpv у Super Mario 64. Кумедно, адже сам проєкт народився з ідеї libsm64. Зрештою, це гра мого дитинства.
Я змусив його працювати над форком sm64ex, щоб перша інтеграція була не впроваджена в гру, а вбудована прямо в її вихідний код.
Я дав Claude попрацювати... 30 хвилин. За 30 хвилин він зміг видати вже протестований MVP.
Він зробив так, щоб дрон взаємодіяв з оточенням, з робочими колізіями та всім іншим, що стосується зв'язки sm64ex <-> libfpv.
Результат був настільки добрий, що я просто мусив запостити це на Reddit. Потім я пішов спати. Було пізно. Зранку мені треба було займатися математикою.
Побачивши, що людям ідея дуже сподобалася, вже наступного вечора я захотів протестувати справжнє впровадження в гру, у велику гру. З усіх цікавих ігор я обрав GTA IV. Не GTA V, бо наявний FPV-мод для неї добрий, і не GTA San Andreas, яку я дуже хотів, бо вона в мене просто не була встановлена.
Я знову дав Claude попрацювати, але цього разу було складніше: спочатку треба підготувати інструменти для модингу, а після години очікування отримуєш першу версію з купою багів. Я її дебажу, змушую свого агента все виправляти... Зрештою за 3 години в мене була ще одна робоча інтеграція libfpv. Тож я мусив запостити на Reddit і її!
Якщо я витратив 3 болісні години на дебаг, чи можна це досі називати вайб-кодингом? 🤔
Згідно з Вікіпедією — так, враховуючи, що я лише тестував отриманий код і спрямовував ШІ, щоб той його виправляв, не вичитуючи його повністю. Який сором 🙈
Висновок
Після GTA IV я нарешті зрозумів, що libfpv має майбутнє і що я маю переконатися, що це саме те майбутнє, яке нам потрібне. Замість того щоб пробувати інші ігри, я почав покращувати саме ядро libfpv і переробляти фізику, бо отримав щодо цього відгуки. Усе для того, щоб libfpv (і її інтеграція в SM64) відчувалася менш «плаваючою» і менш млявою.
Інтеграції, які я хочу зробити пізніше, — це, звісно, GTA San Andreas і BeamNG.drive, ігри, про які я вже згадував. Будуть і інші, я впевнений.
А ще разом з libfpv готується інший секретний проєкт, от побачите 😉