С Новым годом! Форум программистов, компьютерный форум, киберфорум
Алгоритмы
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/47: Рейтинг темы: голосов - 47, средняя оценка - 4.51
97 / 5 / 0
Регистрация: 10.10.2016
Сообщений: 7

Алгоритм наведения ракеты на цель методом пропорциональное наведение

10.10.2016, 03:33. Показов 10450. Ответов 7
Метки lua (Все метки)

Студворк — интернет-сервис помощи студентам
Разрабатываю новый класс оружие для одной игры(С.Т.А.Л.К.Е.Р), ПЗРК.
Сам алгоритм ПЗРК я почти сделал, так же реализовал и наведение ракеты на цель, правда совсем инвалидным и халтурным способом, поэтому надо новый алгоритм для ракеты.
Требуется создать алгоритм наведения ракеты на цель: методом пропорционального наведение, это когда ракета летит не на цель, а вне которую упреждающую точку. Сам этот способ описан в интернетах хорошо, например здесь.
http://studopedia.su/9_79470_m... eniya.html
Но мне не ясно как конкретно вычислить вектор на упреждающую точку в 3-х мерном мире.
Некоторые вводные: ракета видит цель, но не знает скорость цели, так же не учитывает свою скорость, вектор на упреждающую точку вычисляется из разницы вектора ГСН текущего и прошлого апдейта, вектор ГСН постоянно направлен на цель, ракета разворачивается с определённой перегрузкой и эта перегрузка не может превысить некоторое значение. В начале ракета стартует строго на цель. В общем, ракета летя к цели, стремится уменьшить разницу между этим вектором(который постоянно направлен на цель) на текущем и прошлом апдейте до нуля.
Реализовывать буду на Lua и потом на C++.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.10.2016, 03:33
Ответы с готовыми решениями:

Выполните компьютерное моделирование наведения ракеты в точку на экране
Помогите решить следующую задачу: Выполните компьютерное моделирование наведения ракеты в точку на экране, указываемую нажатием на...

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

Алгоритм движения ракеты при выходе за пределы Земли
Здравствуйте! Дана скорость ракеты при выходе за пределы атмосферы Земли. Составить алгоритм определения того, как будет двигаться ракета...

7
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
10.10.2016, 13:26
Вам в раздел геометрии наверно…
Вот как я понял и приблизительно представляю логику алгоритма. Но я не математик. Скорей всего есть проще метод а в книге непонятная мне лирика…
A ракета, B цель.
Замеряем координаты B через 0.1 сек получим B1. Замеряем угол между векторами AB и AB1 получим угловую скорость цели B угол Alfa0.
Теперь нужно отложить этот угол в 3д. Тут мне видится только матрица поворота вокруг произвольной оси в 3д есть на википедии, она принимает 3 единичных вектора все нормализованы:
1) ось поворота C0, получаем векторным произведением AB на AB1
2) начало поворота C1, нормализованный AB
3) угол поворота Alfa0*k, и принятое направление поворота.
Теперь подставляем в матрицу все известные и получаем единичный вектор направления полета ракеты на упреждающий курс.

Зная f0(t) скорость ракеты и цели f1(t) можно построить в 3д траектории полета цели и ракеты от параметров k. Для моделирования перехвата, менять траектории цели для имитации укланения…
Как учитывать макс крутость траектории от допустимой перегрузки неведомо… может просто большие k брать. Почему наплевали на скорость ракеты и берут ее неподвижной тоже неведомо, видимо не актуально а расчет бы усложнило.

Добавлено через 16 минут
Кстати вроде перегрузка ракеты это макс разность углов между двумя положениями за единицу времени. Значит у вас будет по сути две траектории ракеты, одна расчетная, а другая реальная зависит от маневренности ракеты.
Может ввести маневренность AlfaMax это макс угол на который может повернуть ракета за единицу времени. Значит поворот в матрице будет на угол:
Если Alfa0*k > AlfaMax то AlfaMax иначе Alfa0*k
0
97 / 5 / 0
Регистрация: 10.10.2016
Сообщений: 7
10.10.2016, 15:57  [ТС]
Пожалуй несколько ошибся с названием топика, надо было назвать - "Эмуляция ИК ГСН ракеты ПЗРК".
ГСН вырабатывает два параметра: это угол фазы и амплитуда. Угол фазы характеризует угол плоскости на упреждающую точку, а амплитуда характеризует угол ошибки наведения, если фаза равна нулю, то ракета легла на траекторию упреждающей точки. Кстати: ЭВМ автопилота ракеты ПЗРК от Стрелы-2 до Вербы аналоговый, у американского Стингера РПМ автопилот цифровой, его эмулировать будет сложней.
dir_rocket - вектор ракеты
dir_target - текущий вектор направленный на цель
dir_koordinator - вектор ГСН равен dir_target на прошлом апдейте
delta - разница времени с прошлым апдейтом, сек.
Угол фазы и амплитуда вычисляется из разницы вектора dir_target и dir_koordinator, далее угол фазы мы используем что бы рассчитать угол поворота ракеты в сторону упреждающей точки, а фаза используется насколько резко будем поворачивать, если фаза близка к нулю то летим прямо.
Проблема в том что у меня плохо с матаном, и я не могу рассчитать угол разворота ракеты в зависимости от этих параметров.
1
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
11.10.2016, 10:41
Можете показать расчет фазы и амплитуды без производных чисто формулы по которым расчет?

Значит у вас есть угол между (dir_rocket) и (курс на перехват)? И еще резкость поворота?
Непонятно зачем нужна величина резкости поворота если есть угол? То как резко повернуть зависит просто от величины угла между dir_rocket и (курс на перехват).


Ракета мгновенно повернуть не может, поскольку например курс корректируется каждые 0.1 сек значит нужно поворачивать dir_rocket на максимально близкий к Alfa0 за например 5 FPS. Как найти величину угла поворота для каждого кадра?

Если Alfa0 это угол между (dir_rocket) и (курс на перехват):
AlfaMax это макс угол поворота ракеты за 0.1 сек.
Линейная зависимость:
Alfa1=Если (Alfa0> AlfaMax) то (AlfaMax/(кол-во FPS между замерами. курса) )иначе (Alfa0/(кол-во FPS между замерами курса))
Дальше матрицей поворота вокруг произвольной оси повернуть dir_rocket на Alfa1 вокруг оси (векторное произведение dir_rocket и (курс на перехват)) это даст новый вектор dir_rocket который искали.

Тогда в итоге будет если ракета далеко от курса Alfa0>AlfaMax то поворачивает на курс с макс скоростью разворота равной AlfaMax/(кол-во FPS между замерами. курса). Если угол Alfa0 (угол между dir_rocket и dir_koordinator) то ракета близка к курсу то поворачивать будет тем плавней чем меньше Alfa0. Зачем в расчете другое непонятно…

Добавлено через 1 час 46 минут
Цитата Сообщение от Introtech Посмотреть сообщение
ракета видит цель, но не знает скорость цели, так же не учитывает свою скорость, вектор на упреждающую точку вычисляется из разницы вектора ГСН текущего и прошлого апдейта,
Мне кажется в такой постановке можно навести только если на самой ракете видеокамера которая видит цель и получает координаты цели (обычно двигателя ) в 2д на своем экране это даст 2 вещи:
1) угол вектора от центра камеры до цели – даст направление поворота ракеты
2) Величина этого вектора даст крутость поворота ракеты
Но как тогда находят упреждение непонятно, может это в дебрях книг есть. Вообще описание математики в книге что я читаю довольно сумбурное, и зачем то в плоскости… видимо не предназначено для построения ГСН даже для игры и многие детали упускают.

В моем понимании суть получения упреждающей точки это минимум 2 вещи как не крути:
1)Знание скорости цели
2)знание направления полета цели.
Может по двум замерам находят эти величины с очень малым интервалом времени с РЛС?
А метод называют “наведения с последовательным непрерывным упреждением”.
Книга “Самонаведение ракет Куркоткин” Стр 29
Я так понял вы пару книг глянули, есть какая то на простом языке пояснения с именно вашим методом?
И сразу простой вопрос: почему не взять самый простой метод наведения “метод прямого наведения” Стр 20. и просто добавить скорости ракете до (скорость самой быстрой цели)*5 например.

Добавлено через 13 часов 7 минут
Похоже намудрили с алгоритмами наведения и терминами. Упреждения здесь нет. Ракета будет бить в хвост цели. А это метод называется “прямого наведения” из “Куркоткин самонаведение ракет “ Стр 20.
Матана тут нет, у вас чисто геометрическая задача. Запилите рисунок с обозначениями и на геометрии может подскажут как сделать просто. Тут можно мозг сломать при попытке представить все это =).
0
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
11.10.2016, 20:02
Сделал модель простенькую в GeoGebra алгоритма “метод прямого наведения” в 2D как я его вижу и работает.
Цель движется слева направо зеленые точки равные интервалы времени траектории цели.
Желтые управляю траекторией полета цели.
Черные точки траектория ракеты. Стрелка это вектор запуска ракеты.
Красный отрезок это минимум расстояния между целью и ракетой.
Вы попробовали алгоритм в 2д? Может 3д будет если например соединить решение из разных плоскостей. Ни схемы не сделали… бросили? =).
0
97 / 5 / 0
Регистрация: 10.10.2016
Сообщений: 7
11.10.2016, 20:29  [ТС]
Так значит, проработал алгоритм как следует, и понял, как надо реализовывать. Вот рисунок
http://savepic.ru/11787085.jpg
Сначала нам надо вычислить фазу и амплитуду, фаза это плоскость ошибки т.е. плоскость на которой лежит УТВ(упреждённая точка встречи), а амплитуда это величина ошибки. Вот код, который вычисляет эти параметры.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
local cosine = self.dir_koordinator.y
local ugl0 = math.acos(cosine)
local t = (ugl0 - 90*DEG2RAD)/ugl0
local vec1 = CreateSlerp(vector():set(0,1.0,0), self.dir_koordinator, t)
local vec2, faza = 0, 0
cosine = clamp(self.dir_koordinator:dotproduct(dir_target), -1, 1)
if math.abs(cosine) > 0 then        --amplitude > 0.02*DEG2RAD then
        vec2 = (vector():div(dir_target, cosine):sub(self.dir_koordinator)):normalize()
        faza = clamp(vec1:dotproduct(vec2), -1, 1)
end
local amplitude = math.acos(cosine)
faza = math.acos(faza)
log1("koordinator: faza = "..faza*RAD2DEG..", amplitude = "..amplitude*RAD2DEG.." grad")
http://savepic.ru/11745089.gif
Я также ранее сделал другой алгоритм который вычисляет УТВ по параметрам скорости, позиции цели и ракеты, в общем работает, но халтура, ОГС понятие не имеет, какая там скорость у цели и даже у самой ракеты. Так же сделал расчёт фазы и амплитуды для реальной УТВ, self.dir_future – это вектор на УТВ.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
local cosine = dir_rocket.y
local ugl0 = math.acos(cosine)
local t = (ugl0 - 90*DEG2RAD)/ugl0
local vec1 = CreateSlerp(vector():set(0,1.0,0), dir_rocket, t)
cosine = clamp(dir_rocket:dotproduct(self.dir_future), -1, 1)
local amplitude = math.acos(cosine)
local vec2, faza = 0, 0
if math.abs(cosine) > 0 then        --if amplitude > 0.02*DEG2RAD then
    vec2 = (vector():div(self.dir_future, cosine):sub(dir_rocket)):normalize()
    faza = clamp(vec1:dotproduct(vec2), -1, 1)
end
faza = math.acos(faza)
log1("rocket: faza = "..faza*RAD2DEG..", amplitude = "..amplitude*RAD2DEG.." grad, amplitude = "..amplitude/(1*DEG2RAD))
Эти углы оказались близки, но не точны, очевидно, сказывается потеря точности из-за использования одинарной точности
(float). Далее алгоритм вырисовывается самим собой, нам надо развернуть вектор на угол фазы вот так как на рисунке.
http://savepic.ru/11751232.gif
Ракета разворачивается в сторону вектора vec3, при большой амплитуде на максимальной перегрузке, а при малой, старается

сразу попасть в УТВ.
Может быть, надо проработать формулы для расчёта угла фазы, что бы увеличить точность.
Вот ещё лог, понятно что погрешность существенная, rocket - точные параметры фазы.
Кликните здесь для просмотра всего текста
delta_ogs = 0.2039999961853 sec
dir_rocket = x(-0.80911296606064), y(-0.10871564596891), z(0.57750952243805)
dir_target = x(-0.80736768245697), y(-0.11201272904873), z(0.57931905984879)
dir_koordinator = x(-0.8076034784317), y(-0.11153579503298), z(0.57908225059509)
koordinator: faza = 145.50108337402, amplitude = 0.039564684033394 grad
rocket: faza = 143.14672851563, amplitude = 0.23738826811314 grad, amplitude = 0.23738826811314
delta_ogs = 0.21400000154972 sec
dir_rocket = x(-0.80736768245697), y(-0.11201272159815), z(0.57931905984879)
dir_target = x(-0.80710691213608), y(-0.11263407766819), z(0.5795618891716)
dir_koordinator = x(-0.80736768245697), y(-0.11201272904873), z(0.57931905984879)
koordinator: faza = 150.8127746582, amplitude = 0.044234659522772 grad
rocket: faza = 150.64170837402, amplitude = 2.488213300705 grad, amplitude = 2.488213300705
delta_ogs = 0.20900000631809 sec
dir_rocket = x(-0.80195552110672), y(-0.1246342882514), z(0.58423763513565)
dir_target = x(-0.80685085058212), y(-0.11248391866684), z(0.5799475312233)
dir_koordinator = x(-0.80710691213608), y(-0.11263407766819), z(0.5795618891716)
koordinator: faza = 71.909271240234, amplitude = 0.027976455166936 grad
rocket: faza = 64.540451049805, amplitude = 1.375439286232 grad, amplitude = 1.375439286232
delta_ogs = 0.21999999880791 sec
dir_rocket = x(-0.79449361562729), y(-0.11818257719278), z(0.59566158056259)
dir_target = x(-0.80689191818237), y(-0.11280323565006), z(0.57982838153839)
dir_koordinator = x(-0.80685085058212), y(-0.11248391866684), z(0.5799475312233)
koordinator: faza = 159.41137695313, amplitude = 0 grad
rocket: faza = 154.36251831055, amplitude = 1.1176762580872 grad, amplitude = 1.1176762580872
delta_ogs = 0.21299999952316 sec
dir_rocket = x(-0.79686915874481), y(-0.13077607750893), z(0.58982819318771)
dir_target = x(-0.80719274282455), y(-0.1134884878993), z(0.5792755484581)
dir_koordinator = x(-0.80689191818237), y(-0.11280323565006), z(0.57982838153839)
koordinator: faza = 137.84274291992, amplitude = 0.055952914059162 grad
rocket: faza = 138.6039276123, amplitude = 2.5566539764404 grad, amplitude = 2.5566539764404
delta_ogs = 0.21099999547005 sec
dir_rocket = x(-0.80132132768631), y(-0.14148481190205), z(0.58126264810562)
dir_target = x(-0.80740684270859), y(-0.11322021484375), z(0.57902979850769)
dir_koordinator = x(-0.80719274282455), y(-0.1134884878993), z(0.5792755484581)
koordinator: faza = 50.236511230469, amplitude = 0.027976455166936 grad
rocket: faza = 39.043853759766, amplitude = 1.1713621616364 grad, amplitude = 1.1713621616364


Добавлено через 5 минут
ЗЫ
Язык программирования Lua движка XRay Engine, тут нету поддержки синтаксиса lua.
Функция CreateSlerp сферическая интерполяция 3-х мерного вектора.
1
1472 / 827 / 140
Регистрация: 12.10.2013
Сообщений: 5,456
12.10.2016, 00:42
Цитата Сообщение от Introtech Посмотреть сообщение
ugl0 - 90*DEG2RAD
Рекомендую забыть углы, только радианы.
Цитата Сообщение от Introtech Посмотреть сообщение
Вот код, который вычисляет эти параметры.
В моем расчете достаточно найти угол между двумя векторами, вектором оси ракеты и вектором на цель.
Цитата Сообщение от Introtech Посмотреть сообщение
сделал другой алгоритм который вычисляет УТВ по параметрам скорости, позиции цели и ракеты, в общем работает, но халтура
Как это халтура? =).
Гляньте в книге “Куркоткин Самонаведение ракет “ Стр27 “Метод наведения с последовательным упреждением “ Одна строчка формула, и голая идея алгоритма, тонкости на совести программиста +продумать немного тригонометрии которую упустили для упрощения изсложения. Мне кажется самый мощный метод наведения. В остальных книгах заумный ненужный для игры матан.

Цитата Сообщение от Introtech Посмотреть сообщение
углы оказались близки, но не точны,
Понятия не имею про что это, всему расчету не нужна большая точность точки перехвата. Гляньте как гуляет длинна красной линии на тесте алгоритма в 2д.

Цитата Сообщение от Introtech Посмотреть сообщение
CreateSlerp сферическая интерполяция 3-х мерного вектора.
Что за слерпы…Опять амплитуда и фаза…
Почему не сделать проще?
Вход расчета:
1)координаты осей ракеты Zr,Zx,Zy
2)координаты ракеты
3) a0 вектор на цель
4) vR=2 //Скорость ракеты
5) AlfaMax= 0.5 //маневренность ракеты


Найти Alfa0 как угол между векторами Zr и a0 это даст сразу аналог того для чего вам была нужна амплитуда и фаза. a0 = dot вектора Zr и a0, это даст вектор a2 ось поворота для матрицы.
Промотайте пургу на вики до слов “Матрица поворота вокруг произвольной оси”
https://ru.wikipedia.org/wiki/Матрица_поворота
Как по другому я так и не понял =).
Повернуть Za по часовой повернуть матрицей где ось поворота вектор a2, поворачиваемый вектор Zr, и умножить результат на vR это и будет вектор a1 (это новые координаты ракеты, он же новый new_Zr ось ракеты).
new_Yr =dot new_Zr ,new_a0,
new_Xr = dot new_Zr, new_Yr
Все, есть новые координаты ракеты, 3 координаты угла ее осей, и новый вектор на цель new_a0. Примерно такой же алгоритм я протестировал для 2D и он работал как видим.
1
97 / 5 / 0
Регистрация: 10.10.2016
Сообщений: 7
29.09.2019, 17:22  [ТС]
В общем, сам разобрался!
Всё оказалось невероятно просто.
Просто надо было вектор, преобразовать в углы азимута и склонения, в движке XRay есть в пространстве имён vector нужные методы. В других движках, такие методы тоже должны быть.
Lua
1
2
3
4
5
--процесс наведения в точку встречи.
local avelH = (self.cam_dir:getH() - self.last_cam_dir:getH())/delta_sec
local avelP = (self.cam_dir:getP() - self.last_cam_dir:getP())/delta_sec
self.future_dir:setHP(avelH + rocket_dir:getH(), avelP + rocket_dir:getP()) --в точку встречи.
self.last_cam_dir:set(self.cam_dir)
Тут берётся один из вариантов пропорционального наведения, называется параллельное наведение.
Ещё один вариант.
Lua
1
2
3
4
5
--процесс наведения в точку встречи.
local deltaH = self.cam_dir:getH() - self.last_cam_dir:getH()
local deltaP = self.cam_dir:getP() - self.last_cam_dir:getP()
self.future_dir:setHP(deltaH*k_prop + rocket_dir:getH(), deltaP*k_prop + rocket_dir:getP()) --в точку встречи.
self.last_cam_dir:set(self.cam_dir)
Где k_prop - коэффициент пропорциональности. Обычно 2..3, при 1 реализуется метод погони.
Как то так, как видим, задача очень простая, сам не пойму почему сразу до этого не допёр.

Добавлено через 10 минут
ЗЫ
self.cam_dir, self.last_cam_dir -- это векторы следящего координатора цели, т.е. векторы направленные на цель, в текущий момент и на прошлом апдейте.
delta_sec -- соответственно время апдейта, сек.
Остальное вроде всё понятно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.09.2019, 17:22
Помогаю со студенческими работами здесь

Алгоритм движения ракеты при выходе за пределы Земли
Дана скорость ракеты при выходе за пределы атмосферы Земли. Составить алгоритм определения того, как будет двигаться ракета после...

Разработать алгоритм методом пошаговой детализации и программу, реализующую этот алгоритм
Расставить строки данной матрицы в порядке возрастания наибольших элементов в строках.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru