Балістична ракета 600 км+ на С++
Вітаю спільноту. Мене звати Олексій, я цікавлюсь балістикою і програмуванням. Пишу в Qt, тому що там легко інтегрувати графічний інтерфейс в потужне ядро обчислень C++ для майже будь якої платформи. В Qt зробив для смартфона систему злиття сигналів сенсорів для визначення орієнтації (IMU fusion) на фільтрі Махоні, а потім його замінив на власний фільтр Калмана (ESKF).
Одним із перших моїх складних проєктів в програмуванні було моделювання польоту мінометного пострілу. Просто з цікавості зробив щось на кшталт балістичного калькулятора і віддав знайомим в ЗСУ. Один з них сказав, що для міномета не потрібен, але снайпери деякі розрахунки досі роблять в Excel — їм потрібно зробити додаток для Android, щоб обчислювати це автоматично. Без подробиць скажу, що це школа підготовки снайперів і жоден з існуючих комерційних додатків не міг надати потрібні опції аби втілити їхні ідеї. Так народилась моя насправді серйозна програма з балістики для снайперської зброї — кастомний балістичний калькулятор CalcTheBullet. В ньому ми зробили дійсно унікальні речі, наприклад, врахували вертикальний градієнт вітру і реалізували режим стрільби з закритої позиції без прямої видимості цілі по наведенню з дрона. На YouTube за цією назвою можна знайти відео з демонстрацією роботи програми при здійсненні таких пострілів на дуже далекій дистанції.
Маючи певний бекграунд я задався ціллю змоделювати політ балістичної ракети, цікаво було «чисельно побачити» як вона стартує, яку швидкість набирає, як нею прицілитись і куди можна влучити. Якщо і вам цікаво, то далі поясню з прикладами.

Балістика на C++ в Qt Framework
В якості прототипа моєї ракети я взяв з Вікіпедії та інших відкритих джерел дані по твердопаливній ракеті Грім:
- діаметр — 0,92 метри;
- повна маса — 3780 кг;
- бойова частина — 500 кг;
- суха маса — 1130 кг;
- питомий імпульс — 264 секунди;
- тяга — 171600 Н;
- час вигоряння палива 40 секунд;
На фото видно, що у неї є хвостові керуючі поверхні, отже в щільних шарах атмосфери можна маневрувати.
Для визначення таких характеристик як моменти інерції, центр мас та розмір керуючих поверхонь зробив 3D креслення в AutoCAD.

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

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

Форма планети. Адже Земля не є ідеально круглою, то для точності обчислення відстаней і азимуту використовується топографічна система координат WGS84, що точно описує форму планети і є стандартом для GPS-навігації, картографії, геодезії, використовуючи так званий референц-еліпсоїд, що задається екваторіальним і полярним радіусами.
Гравітаційна модель J2. У точній навігації класичної формули Ньютона для кулі недостатньо. Екваторіальне здуття планети створює надлишок маси на екваторі, який працює як додатковий пояс тяжіння. Через нього супутники на орбіті відчувають нерівномірну силу, яка постійно змінює їх траєкторію. Це моделює динамічний коефіцієнт форми J2.
Системи координат. Вже згадана WGS84 — геодезична для роботи з картою. ECEF (Earth-Centered, Earth-Fixed) — система координат, яка обертається разом із Землею. Це стандарт для навігації і балістики, використовується як основна для всіх обчислень. Локальна зв’язана система координат (Body Frame) для аеродинаміки: кут атаки, підйомна сила, тяга. NED (North East Down) — для локальних обчислень відносно поверхні Землі. Трансформація між ними відбувається за допомогою матриць повороту бібліотеки лінійної алгебри Eigen для C++.
Аеродинаміка. У вільному доступі реальних даних аеродинамічного опору ракет знайти неможливо, тому внесено пресет у вигляді балістичного коефіцієнта стандартного снаряду G7 змінної маси з добре відомими табульованими динамічними коефіцієнтами опору залежно від числа Маха.
Метод чисельного інтегрування. Метод Хойна (RK2) з кроком 0,001 с, що забезпечує стабільність розрахунків на високих швидкостях. Компроміс між швидкістю і точністю. Швидкість виконання коду з Eigen у мене чомусь дуже повільна в debug режимі, але добре оптимізується в режимі release.
Архітектура.
Головний диригент, що спілкується з графічним інтерфейсом, передає на обчислення, приймає сигнали і керує класами — AppController.
В підпорядкуванні у нього два головних високонавантажених обчислювача фізичних моделей і стану системи:
Class Calculations. Служить для попереднього обрахунку матриці чутливості запуску. Стартує в окремому потоці і сканує всі траєкторії з можливих кутів запуску — виводить дані на екран у вигляді таблиці: для кожної відстань, час польоту, швидкість біля цілі, апогей тощо. Загалом 91 траєкторія.
Class SimulationWorker. Окремий потік і симуляція польоту в реальному часі. Обробляє цикл while(altitude>0), всередині два таймери: перший QElapsedTimer, який рахує фізичний час польоту, другий таймер інтегратора, який доганяє перший і узгоджує швидкість виконання коду. Якщо є зазор, то потік іде спати, аби не навантажувати даремно процесор. Цикл не обертається швидше ніж реальний таймер, а виконання може сильно запізнюватись для можливості покрокового дебагу. Зроблено це з наступною метою.
Class ImpactEstimator. Коли ракета проходить апогей (найвищу точку траєкторії) вона має знати куди треба здійснити маневр, щоб влучити в задану ціль. Це система передбачення місця падіння. З частотою 20 Герц від поточної точки і до землі йде розрахунок похибки влучання, передається сигнал чи маневр потрібен.
Class CorrectionManager. Вмикається, коли входимо в щільні шари атмосфери. Отримує сигнал про похибку влучання і здійснює керування хвостовими поверхнями. Це призводить до повороту тіла ракети проти потоку повітря, що збільшує опір, народжує підйомну силу, що викривляє траєкторію. Чим нижче спускається ракета, тим вище динамічний тиск і ефективніше викривлення. Таким чином відбувається маневрування балістичної ракети, що заважає ППО передбачити точку перехоплення.
Перелічу інші системи.
GeoMath — математична модель Землі. Тут відбувається трансформація координат одна в іншу, рахуються геодезичні відстані і кути, моделюється гравітація.
MissileState, MissilePhysicsModel — аеродинаміка, інтегрування (розрахунок швидкості, прискорення, поточного положення, орієнтації), сил опору, коріоліса, тяги, відцентрової, оновлення матриць повороту тощо.
TrajectoryRecorder — видає телеметрію польоту в CSV файл і консоль розробника, також хочу ним виводити на екран дані польоту в реальному часі, які в UI ще не видно.
Class Calculations і SimulationWorker використовують одні й ті самі модулі, але в різних конвеєрах. Якщо взяти одну і ту саму траєкторію і прогнати її через ці два різні алгоритми, то різниця в результатах складає ~0,008%. Ніби небагато, але в абсолютних числах на 600 км це аж 50 метрів.
Розглянемо приклад обчислень та як це виглядає.

Мапа вибору цілі
Програма запускається у вигляді інтерактивної мапи, де обирається точка запуска — окреслюється коло з радіусом 670 км, що відповідає максимальній дистанції польоту внесеного прототипу на захід. Через ефект Етвеша дальність польоту на схід більше.
Обирається точка влучання, автоматично розраховується відстань та азимут на ціль. Розрахунок відстані відповідає системі WGS84 і завдяки формулі Вінсенті дає похибку визначення відстані на поверхні Землі 0,5 мм.

Матриця чутливості
Після натискання кнопки «Підготовка» відбувається обрахунок можливих траєкторій польоту, які ми отримаємо при відхиленні вектора тяги двигуна під час старту від 6 до 15 градусів з кроком 0,1 градус. Це займає приблизно 30 секунд на стандартному ПК.
Алгоритм маневру запуска: вертикальний старт протягом двох секунд з наступним відхиленням вектору тяги на заданий кут по азимуту цілі. В цьому вікні представлена матриця чутливості траєкторій польоту в напрямку заданої на попередньому екрані цілі (загалом 91 штука).
Представлені наступні дані.
Тяга — відхилення вектору тяги двигуна, градуси.
Відстань — дистанція балістичного польоту в некерованому режимі, метри.
Апогей — максимальна висота від поверхні еліпсоїда, метри.
Азимут — горизонтальний кут заходу на точку падіння, радіан.
Тангаж — вертикальний кут падіння, радіан.
Швидкість — швидкість біля цілі, м/с
Час — час польоту, секунди.

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

Після погодження корекції азимута запускається симуляція польоту в реальному часі з обраним азимутом і відхиленням вектора тяги, що вкладає ракету на необхідну траєкторію, яку ми перед цим перевірили. Логи польоту на даний час виводяться в консоль всередині середовища розробки (Qt Creator) та в CSV-файл для перегляду в Excel. Для ілюстрації деякі дані польоту екстраговано в таблицю з кроком 10 секунд, де зазначені основні події.
Приклад симуляції польоту
Початкові дані
Відстань до цілі: 662428 м
Дальність польоту з матриці чутливості по азимуту цілі 665458 м, відхилення вектора тяги двигуна 8,2°.
З корекцією азимуту, яку ми застосували, прогнозована дальність польоту 665315 м. Різницю опрацює система автоматичного маневрування. Це запас енергії для маневру.
Точка пуску: 50° 29′ 38,0″ N, 32° 58′ 35,2″ E
Точка цілі: 55° 45′ 13,5″ N, 37° 37′ 11,5″ E
Азимут на ціль: 0,456167 рад, або 26,1365°
Таблиця телеметрії
|
Час (сек) |
Висота (м) |
Відстань (м) |
Швидкість (м/с) |
Щільність, (кг/м3) |
Опір (Н) |
Прискорення (м/с2) |
|
0,1 |
0,176286 |
2,006E-4 |
3,544 |
1,20595 |
0,603255 |
35,6644 |
|
10 |
1860,4 |
491,067 |
390,6 |
1,00437 |
20052,9 |
40,6935 |
|
20 |
7031,95 |
3442,11 |
815,0 |
0,577083 |
33788 |
50,0501 |
|
30 |
15326 |
10509,1 |
1412 |
0,185327 |
20603,5 |
79,3333 |
Подія: вимкнення двигуна | ||||||
|
39,982 |
— |
— |
2424 |
— |
— |
— |
|
40 |
27736 |
24576,5 |
2423 |
0,02523 |
7972,18 |
15,0966 |
|
50 |
42176 |
43395,8 |
2337 |
0,00286 |
841,619 |
10,0741 |
|
60 |
55645 |
62040,3 |
2278 |
3,223E-4 |
89,9547 |
9,61491 |
|
70 |
68204 |
80590,1 |
2224 |
4,83E-05 |
12,8489 |
9,53777 |
|
80 |
79862 |
99061,8 |
2173 |
1,00E-05 |
2,54694 |
9,49823 |
|
90 |
90625 |
117462 |
2125 |
2,53E-06 |
0,61452 |
9,46567 |
|
100 |
100495 |
135797 |
2080 |
7,60E-07 |
0,176824 |
9,43661 |
|
110 |
109473 |
154073 |
2039 |
2,64E-07 |
0,059063 |
9,41042 |
|
120 |
117564 |
172294 |
2001 |
1,02E-07 |
0,0219589 |
9,38696 |
|
130 |
124769 |
190467 |
1966 |
4,37E-08 |
9,0878Е-3 |
9,36616 |
|
140 |
131090 |
208597 |
1936 |
2,08E-08 |
4,1870Е-3 |
9,34799 |
|
150 |
136528 |
226690 |
1909 |
1,10E-08 |
2,1479Е-3 |
9,33242 |
|
160 |
141086 |
244750 |
1887 |
6,41E-09 |
1,2269Е-3 |
9,31942 |
|
170 |
144763 |
262784 |
1868 |
4,16E-09 |
7,8055Е-4 |
9,30897 |
|
180 |
147562 |
280796 |
1854 |
2,99E-09 |
5,5310Е-4 |
9,30107 |
|
190 |
149483 |
298791 |
1844 |
2,39E-09 |
4,3660Е-4 |
9,29569 |
|
200 |
150526 |
316775 |
1839 |
2,11E-09 |
3,8395Е-4 |
9,29282 |
Подія: досягнення апогеюВмикається алгоритм прогнозу точки влучання | ||||||
|
206,689 |
150734 |
— |
1838 |
— |
— |
— |
|
210 |
150692 |
334753 |
1838 |
2,07E-09 |
3,762Е-4 |
9,29248 |
|
220 |
149981 |
352730 |
1842 |
2,25E-09 |
4,106Е-4 |
9,29464 |
|
230 |
148392 |
370712 |
1850 |
2,71E-09 |
4,993Е-4 |
9,29932 |
|
240 |
145926 |
388703 |
1862 |
3,62E-09 |
6,764Е-4 |
9,30652 |
|
250 |
142581 |
406708 |
1879 |
5,37E-09 |
1,021Е-3 |
9,31625 |
|
260 |
138356 |
424736 |
1900 |
8,83E-09 |
1,716Е-3 |
9,32853 |
|
270 |
133250 |
442788 |
1925 |
1,61E-08 |
3,211Е-3 |
9,34337 |
|
280 |
127263 |
460872 |
1954 |
3,26E-08 |
6,693Е-3 |
9,3608 |
|
290 |
120392 |
478991 |
1987 |
7,31E-08 |
0,01553 |
9,38084 |
|
300 |
112636 |
497151 |
2024 |
1,82E-07 |
0,04011 |
9,40352 |
|
310 |
103992 |
515359 |
2064 |
5,03E-07 |
0,11534 |
9,42884 |
|
320 |
94458 |
533618 |
2107 |
1,59E-06 |
0,3787 |
9,4568 |
|
330 |
84032 |
551936 |
2154 |
5,87E-06 |
1,4645 |
9,48713 |
|
340 |
72713 |
570317 |
2204 |
2,60E-05 |
6,7965 |
9,51819 |
Подія: динамічний тиск достатній для початку маневруванняПрогнозована похибка влучання: переліт 2824 м, ліворуч 129 м | ||||||
|
350 |
60494 |
588767 |
2256 |
1,453Е-4 |
40,234 |
9,55046 |
|
360 |
47375 |
607286 |
2310 |
0,001278 |
381,51 |
9,622 |
|
370 |
33350 |
625826 |
2357 |
0,01034 |
3150,4 |
10,2025 |
|
380 |
18432 |
643901 |
2305 |
0,1138 |
33141 |
37,3385 |
|
390 |
4357,9 |
658755 |
1661 |
0,7755 |
115069 |
95,218 |
|
Подія: падіння Координати точки падіння: 55° 45′ 13,7″ N, 37° 37′ 11,4″ E | ||||||
|
394,381 |
0 |
662433 |
1223 |
— |
— |
— |
Похибка влучання: 6,6 м (X: 4,512; Y: —4,776)
Різниця з координатами цілі 0,2 кутові секунди.
При польоті на 662 км система автоматично скоригувала вектор тяги на старті, врахувала зміну щільності атмосфери з висотою від 0 до 151 км, прорахувала корекцію, зманеврувала на ціль і забезпечила влучання з похибкою лише 6,6 метри.
Висновок
Даний проєкт вийшов чимось на кшталт цифрового полігону для чисельного моделювання траєкторій балістичних ракетних систем. Він може бути цікавим як розробникам озброєння, так і цивільним.
Інженерам. Якщо ввести власні аеродинамічні залежності, масу, характеристики двигуна, то ним можна тестувати алгоритми керування під час пуску та наведення в процесі термінальної корекції, отримати дані по самим екстремальним режимам польоту.
Цивільним. Чисельно побачити як літає балістична ракета, дізнатись чому вона така небезпечна. Її швидкість, час прильоту і траєкторія, коли вона, як метеорит, просто падає з неба, дуже ускладнює перехоплення силами протиповітряної оборони.
19 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівВ логах5-те значення Distance завжди 0.
Вважайте цей нуль за NaN. Під час обчислення події cutoff, змінна дистанції недоступна. Там поруч регулярний лог, де дистанція надається
Цікава стаття. А про алгоритми в основі т.н. «терком» та подібних систем можете розповісти? Кілька разів прикидав, як воно могло б працювати, приходив до того, що там основа повинна зводитись до порівняння двомірних матриць. Перша — дані картографії зібрані заздалегідь, квантифіковані/дискретизовані по параметрах висоти рельєфу, можливо радіопроникності(?) матеріалів, у певній розмірній сітці. А друга — це живий фід із РЛС ракети, яка продукує такі ж дані. І далі це якось повинно порівнюватись походу, скалдність мабуть в тому, що живий фід може мати динамічну розмірну сітку, бо ж ракета або дрон постійно змінює висоту, і це якось треба враховувати
Посилання на завантаження, якщо хтось бажає постріляти
drive.google.com/...zBaJxIwE/view?usp=sharing
А вы в гравитационной модели учли, что ускорение свободного падения меняется от экватора к полюсу из-за центробежной силы? И это сильнее влияет, вздутие на экваторе.
Є дві складові
Сама гравітація, яка залежить від широти — це вплив нерівномірного розподілу маси
gravitation = GeoMath::calculateGravitationJ2(pos);
Ця функція добре відома, її легко знайти.
А є окрема відцентрова сила, яка залежить від поточної висоти. Ви мабуть її мали на увазі
У векторному вигляді:
aCentrifugal = - Omega_v.cross(Omega_v.cross(pos));
Eigen::Vector3d Omega_v {0.0, 0.0, 0.00007292115}; //кутова швидкість обертання Землі
Eigen::Vector3d pos — поточні координати в системі ECEF.
А чи варто враховувати локальні аномалії, типу масконів (чи як воно там називається?)? Типу там в мантії чи в літофері більш щільна «булька» розміром із гору, яка може додавати над собою кілька десятих до традиційного Жє 9.8м/c^2
Я використав модель гравітації J2
Jn — це так звані коефіцієнти гармоніки, які отримані з супутників, що сканували Землю з орбіти. Ці коефіцієнти описують якою має бути математична форма планети, якщо б її описували по виміряним даним гравітації.
J2 — передає сплюснутість Землі, перетворюючи її в еліпсоїд. Масштаб нерівномірності близько 21 км
J3 — моделює крихітну асиметрію північної і південної півкулі (масштаб цього кілька десятків метрів), перетворює еліпсоїд на грушу
J4 — враховує втиснутість середніх широт в порівнянні з ідеальним еліпсоїдом, масштаб цього всього кілька метрів.
Для прикладу g = 9.80665
J2 може впливати на це значення в діапазоні 0,053 м/с2
J3 має вплив в діапазоні 1,5е-4 м/с2
J4 має вплив в діапазоні 3е-5 м/с2
J3 та J4 мають мізерний вплив на гравітацію, їх враховують якщо треба змоделювати тривалий рух космічної техніки. Про мантію і літосферу, це здається в J3 закладено
На жаль про TERCOM не можу нічого путнього розказати
Тобто «стрєлок» вже не канає) Це просто чудово.
Я не маю відношення ні до «Стрелка», ні до «Стрільця», якщо ви про це
Вітаю :-). А чому G7 drag-функція (табличний Cd(Mach) ? це компроміс чі історично склалось ? цифра 6,6м всередині моделі, але прив’язана до фіктивного Cd? montecarlo по збуренням (вітер на висоті, розкид Isp, помилка маси) CEP як розподіл?
Вітаю, Дмитро. Так, це таблична драг-функція Cd(Mach) від Ballistic Research Laboratory. G7 має гарну аеродинаміку і відомі табульовані дані опору. Їх можна замінити на якісь інші, справжні, але у мене їх немає, тому обрав ці. А ви яку б модель порадили?
Щодо статистичного аналізу: маневр коригування здійснюється, якщо похибка влучання перевищує 14 метрів (10 м вздовж і 10 м поперек траєкторії польоту). Різниця між передбаченою точкою падіння і ціллю в межах п’яти кілометрів майже завжди нівелюється системою маневрування. Для віддалених цілей 600км+ цього достатньо, а на400-500 іноді треба гасити 15 км переліт. Ось тут бувають нюанси з тим чи вимкнеться система керування вчасно і який кут атаки можна використати, щоб це було реально і не розвалило конструкцію.
Спробую погратись з масою і питомим імпульсом. Дякую за ідею
Классна стаття, дякую за вашу працю)
цікаво було б поклацати)
Радий, що вас цікавила моя робота.
Аби не порушувати права третіх сторін, я додам в інтерфейс ліцензійну інформацію, та правила розповсюдження згідно вимог Qt.
Напевно завтра зможу дати посилання на завантаження
Ох уж ці ліцензії :-)
це скоріше гіпотетичний Сапсан
а Грім/Грім-2 — внутрішня назва експортної версії на ~280км (Missile Technology Control Regime) з діаметром ~0.6м
і газодинамічні рулі
Так, вірно — це старшенький. І якщо я вірно оцінив масу палива, то Москву і Волгоград дістає впевнено. І навіть Сочі з Псковом
while(altitude>0), деякі регіони Землі можуть мати від’ємну висоту відносно рівня моря, наприклад Мертве море розташоване на висоті −420м. Це може давати суттєву похибку? Чи +/- пів кілометра по висоті пофіг?
Ви праві, деякі регіони можуть бути в горах і мати висоту навіть тисячі метрів.
Наочний приклад із логу польоту: на висоті 4358 метрів недоліт до заданих координат 3678 метрів.
OpenStreetMap, з якої беруться координати, не надає даних по висоті рельєфу. Треба підключити окремий API для цього і брати точні висоти точок пуску і цілі. На даному етапі планета — це еліпсоїд WGS84 (математична 3D-модель Землі без рельєфу)