Балістична ракета 600 км+ на С++

💡 Усі статті, обговорення, новини про оборонні технології — в одному місці. Приєднуйтесь до DefTech спільноти!

Вітаю спільноту. Мене звати Олексій, я цікавлюсь балістикою і програмуванням. Пишу в 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 метри.

Висновок

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

Інженерам. Якщо ввести власні аеродинамічні залежності, масу, характеристики двигуна, то ним можна тестувати алгоритми керування під час пуску та наведення в процесі термінальної корекції, отримати дані по самим екстремальним режимам польоту.

Цивільним. Чисельно побачити як літає балістична ракета, дізнатись чому вона така небезпечна. Її швидкість, час прильоту і траєкторія, коли вона, як метеорит, просто падає з неба, дуже ускладнює перехоплення силами протиповітряної оборони.

Підписуйтеся на WhatsApp-канал DefTech спільноти!

👍ПодобаєтьсяСподобалось28
До обраногоВ обраному6
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

В логах 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.
Напевно завтра зможу дати посилання на завантаження

Ох уж ці ліцензії :-)

600 км
Грім:
діаметр — 0,92 метри

це скоріше гіпотетичний Сапсан
а Грім/Грім-2 — внутрішня назва експортної версії на ~280км (Missile Technology Control Regime) з діаметром ~0.6м

у неї є хвостові керуючі поверхні

і газодинамічні рулі

це скоріше гіпотетичний Сапсан

Так, вірно — це старшенький. І якщо я вірно оцінив масу палива, то Москву і Волгоград дістає впевнено. І навіть Сочі з Псковом

while(altitude>0), деякі регіони Землі можуть мати від’ємну висоту відносно рівня моря, наприклад Мертве море розташоване на висоті −420м. Це може давати суттєву похибку? Чи +/- пів кілометра по висоті пофіг?

Ви праві, деякі регіони можуть бути в горах і мати висоту навіть тисячі метрів.
Наочний приклад із логу польоту: на висоті 4358 метрів недоліт до заданих координат 3678 метрів.
OpenStreetMap, з якої беруться координати, не надає даних по висоті рельєфу. Треба підключити окремий API для цього і брати точні висоти точок пуску і цілі. На даному етапі планета — це еліпсоїд WGS84 (математична 3D-модель Землі без рельєфу)

Підписатись на коментарі