Стабилизация ракеты в полёте

Тема в разделе "WASM.A&O", создана пользователем Intro, 29 сен 2019.

  1. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    559
    Надо вычислить угловую скорость между двумя векторами в движке ODE.
    Дано два вектора, один текущий и другой нужный, надо задать такую угловую скорость, чтобы тело развернулось к нужному вектору.
    Надо для стабилизации в полёте объекта типа ракета(стрела), чтобы объект только в полёте разворачивался параллельно вектору скорости.
    Так алгоритм общем виде, я понял, а вот алгоритм вычисления вектора угловой скорости не понял.
    Кто поможет?

    ЗЫ
    А понял, надо вычислить ось вращения вежду двумя этими вектора, то есть нужный вектор имеет относительно этих векторов угол 90гр. и условно направлен вверх. Или вниз? Upd: для этого есть функция crossproduct.

    ЗЫЫ
    В общем вроде разобрался.
    Грязный код.
    Код (Lua):
    1.  
    2. --стабилизация корпуса в полёте.
    3. local stabilized_factor = 2.0
    4. local torque = vector():set(0,0,0)
    5. local dir = rocket:direction()
    6. logf("direction[%.5f, %.5f, %.5f]", dir.x, dir.y, dir.z)
    7. local angle = math.acos(clamp(dir:dotproduct(new_dir), -1.0, 1.0))
    8. if angle > 0.0001 then
    9.     torque:crossproduct(dir, new_dir):normalize_safe():mul(math.sin(angle)*rock_vel*stabilized_factor)
    10. end
    11. logf("torque[%.5f, %.5f, %.5f] angle=%.5f", torque.x, torque.y, torque.z, angle*RAD2DEG)
    12. ph_shell:set_angular_vel(torque)
    13.  
    В принципе название топика можно назвать "Стабилизация ракеты(стрелы)" как то так. Потом код сделаю по лучше, чтобы тело(ракета, стрела, авиабомба) виляла стабилизатором некоторое время, пока колебания не угаснут под действием стабилизирующие силы. Но это при условии, если стартовый угол атаки был большой.
    ЗЫЫЫ
    В общем, получилось.
    Чистый код.
    Код (Lua):
    1. --стабилизация корпуса в полёте.
    2. local stabilized_factor = 0.25
    3. local torque = vector():set(0,0,0)
    4. local dir = rocket:direction()
    5. local angle = math.acos(clamp(dir:dotproduct(new_dir), -1.0, 1.0))
    6. if angle > 0.0001 then
    7.     torque:crossproduct(dir, new_dir):set_length(math.sin(angle)*rock_vel*rock_vel*stabilized_factor)
    8. end
    9. ph_shell:set_torque(torque)
    Название топика можно изменить на "Стабилизация ракеты в полёте".
     
    Последнее редактирование: 29 сен 2019
  2. voffka0

    voffka0 Member

    Публикаций:
    0
    Регистрация:
    22 янв 2019
    Сообщения:
    136
    тангаж, рысканье, вращение в норме (цитата)
    https://ru.wikipedia.org/wiki/Динамика_полёта
    https://ru.wikipedia.org/wiki/Шесть_степеней_свободы
    лично прошел descent 3 на самых тяжелых настройках, кроме концовки...хочу взяться за overload, но уже надоели компьютерные игры, так что врядли...
    "в небе только и мысли что о море..."
    "и сниться нам трава-трава у дома, зелёная-зелёная трава"...
     
    Последнее редактирование: 29 сен 2019
  3. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    138
    Адрес:
    Ташлинск
    Задача звучит как управление углом поворота через управление угловой скоростью.
    Т.к в трехмерном пространстве общее управление по 3м осям (тангаж, крен, рысканье) одинаковое, рассмотрим только для одной плоскости - для остальных аналогично.

    Уравнение, описывающее систему: (где предпросмотр у формул в редактировании сообщений?!!):

    [math]\frac{dX_1}{dt}[/math] = [math]X_2[/math], где [math]X_1 - [/math]угол, [math]X_2 - [/math]угловая скорость (начальная, или постоянно действующая. Или равная нулю, если таковых нет).
    Управлять углом будем через скорость: [math]\frac{dX_1}{dt} = X_2 + U[/math], где [math]U - [/math]найденное управление.

    Синтезируем управление по методу АКАР (процедуры синтеза типовые, их пропущу):
    1. Линейное управление
    Возьмем линейную макропеременную [math]\psi = (X_1 - a)[/math], где [math]a - [/math]желаемый угол, получим управление: [math]U = - \frac{X_1-a}{T} - X_2[/math], где [math]a - [/math]желаемый угол, [math]T - [/math]постоянная времени (полностью синтез параметров вроде [math]T[/math] не помню, но система должна быть устойчивой здесь при [math]T=1[/math]), тогда управление будет [math]U = a - X_1 - X_2[/math]

    2. Нелинейное управление
    Возьмем нелинейную макропеременную [math]\psi = th(X_1 - a)[/math]. Тогда получим управление: [math]U = -X_2 - \frac{th(X_1 - a)\cdot ch^{2}(X_1 - a)}{T}[/math], возьмем постоянную времени [math]T = 1[/math], система должна быть устойчивой. Тогда [math]U = -X_2 - th(X_1 - a)\cdot ch^{2}(X_1 - a)[/math]. Переходный процесс в этом случае быстрее.

    Вообще, предполагается, что управление будет непрерывным, [math]-[/math] как там оно дискретно будет я не скажу. Возможно, все будет хорошо.
     
    eshmereum нравится это.
  4. voffka0

    voffka0 Member

    Публикаций:
    0
    Регистрация:
    22 янв 2019
    Сообщения:
    136
    это для самолётов, для ракет - не крен, а вращение, посмотри запуски в космос в рилтайм, я не даром привёл цитату...
     
  5. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    138
    Адрес:
    Ташлинск
    И что, для ракет трехмерное пространство другое? Все то же самое, как ни назови. Думайте, прежде чем писать.

    ЗЫ: Mikl___ - формула неправильная после редактирования (2-й случай). Надо именно
    [math]\psi = th(X_1 - a)[/math]; [math]U = -X_2 - \frac{th(X_1 - a)\cdot ch^{2}(X_1 - a)}{T}[/math]; где [math]th -[/math] гиперб. тангенс, [math]ch -[/math] гиперб. косинус
     
    Последнее редактирование модератором: 13 окт 2019
  6. voffka0

    voffka0 Member

    Публикаций:
    0
    Регистрация:
    22 янв 2019
    Сообщения:
    136
    хорошо, я подумаю :)
     
    Последнее редактирование: 13 окт 2019
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Для лаб работы сгодится может быть. Реально параметры всегда подбираются. В любой технике есть сложная временная функция - пид"

    Маска техника тоже на ней основана. Это универсальная функция. Для любых моторов, не важно электрический он или на газе.

    А формула ваша с певого взгляда не корректна, так как в ней нет лимитов, это очевидно даже из общих соображений: T -> 0 => U -> в бесконечность. А физически никакая материя не может эти значения принимать. Законы сохранения :sarcastic_hand:
     
  8. njeen

    njeen Active Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    138
    Адрес:
    Ташлинск
    ПИД - это один из методов получения управления, он из классической ТАУ. Мною приведено управление по методу из синергетической теории управления, не классической, там другой подход к синтезу управления . "Это универсальная функция" - это не означает, что это единственный способ.
    Использованный метод состоит из 2х этапов:
    1. структурный синтез управления
    2. параметрический синтез, где определяются коэффициетны (T в том числе) - там определяются допустимые области значений данных коэффициентов, чтобы система была стабильна, и далее выбирается из найденной области какой-то их набор, исходя из максимального быстродействия. Повторюсь - полностью не помню синтез здесь коэфф-в, приведено мною лишь чтобы система была стабильна.
    Ограничение на величину управления U конечно можно задать, но ТС не просил этого же, не ? Это же чисто в програмке-физ движке смоделировать что-то - тогда это вполне сгодится. Или вы думаете, что ТС дома ракету в железе собирает ? :lol:

    "А формула ваша с певого взгляда не корректна, так как в ней нет лимитов" - а вы смоделируйте, смоделируйте ..
     
  9. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    559
    Что то, тут вы ударились в матан! И честно говоря, я мало чего понял, точней совсем ничего не понял!:to_take_umbrage:
    Я просто программист-любитель (ПЛ), и как у многих ПЛ, у меня большая проблема с матаном! Некоторые П говорят, что П матан не нужен! Ржу в голос! Если бы у меня не было проблем с матаном, то я бы такой ерунды тут точно не спрашивал.
    В общем, задача общем виде.
    Есть объект "ракета", которая летит в упреждённую точку, вектор тяги направлен по направлению ракеты. Ракета постоянно разворачивается в упреждённую точку цели, пока не столкнётся с ней, или не потеряет цель.
    Теперь конкретно проблема.
    Есть два 3д вектора, один текущий, это вектор направления ракеты, и второй вектор направлен на упреждённую точку.
    Надо задать такую вращательную скорость объекту чтобы он начал разворачиваться во второй вектор, т.е. в упреждённую точку.
    В ODE вектор позиции X,Y,Z - на север, вверх, запад.
    Вектор вращения - соответственно скорость вращения по этим осям почасовой стрелки, если не ошибаюсь.
    Матрица ориентации объекта
    Tvector i; T _14_; вправо
    Tvector j; T _24_; верх
    Tvector k; T _34_; направления вперёд
    Tvector c; T _44_; позиция
    Надо вычислить нужный вектор вращения.
    Более конкретные входные данные:
    XFORM - матрица положения объекта
    rocket_dir - вектор направления = XFORM.k
    future_dir - вектор упр. точки
    Выходные данные:
    angular_vel - вектор скорости разворота, длина равна общей скорости разворота и пропорциональна скорости ракеты и углу между векторами rocket_dir и future_dir

    Я бы и сам решил, но что-то в последние время туплю, вроде и просто всё.
     
  10. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    [math]future_{T}+future_{dir} - rocket_{T} =V_1[/math]
    [math]rocket_{dir}=V_2[/math]
    Вектор [math]V_2[/math] надо довернуть до вектора [math]V_1[/math].
    Раскладываем на дирекционные углы
    [math]АЗ_{2}=atan2(V_{2}\cdot X,V_{2}\cdot Y)[/math];
    [math]УМ_{2}=arcsin(\frac{V_{2}\cdot Z}{Len(V_{2})})[/math]

    [math]АЗ_1=atan2(V_1\cdot X,V_1\cdot Y)[/math];
    [math]УМ_1=arcsin(\frac{V_1\cdot Z}{Len(V_1)})[/math]

    Находим разницу и подставляем в матрицы поворота, которые умножаем между собой.

    Скорость подбираем так что бы расстояние до цели было минимальное на n шагов вперед - вернее сумма квадратов. Или можно использовать нечёткий ПИД регулятор.
    https://habr.com/ru/post/413539/
     
  11. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    559
    Как оказалось код в ТС оказался немного неправильный.
    Вот исправный вариант.
    Код (Lua):
    1.  
    2. --разворот корпуса в сторону точки встречи.
    3. local angular_factor = 0.2
    4. angle = math.acos(clamp(rocket_dir:dotproduct(self.future_dir), -1.0, 1.0))
    5. local angular_vel = vector():crossproduct(rocket_dir, self.future_dir):set_length(rock_vel*angular_factor*angle)
    6. angular_vel:add(rocket_dir:mul(3.1415*10.0)) --вращение вокруг оси
    7. ph_shell:set_angular_vel(angular_vel)
    8.  
    Как видно для определения вектора разворота используется метод crossproduct и задаём длину вектора пропорциональна углу разворота.

    Но тут другая проблема. Надо рассчитать угол атаки при котором ракета перестаёт падать вниз. При полёте реальной ракеты за счёт игры центра тяжести и центра давления, ракету разворачивает на определённый угол, который компенсирует силу тяжести, и ракета летит прямолинейно. Сейчас думаю просто рассчитать текущий угол атаки при котором ракета перестаёт падать, и задать соответствующую скорость разворота.
    Но нет ли других формул, которые даёт аналогичный результат?
     
  12. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    559
    Есть такая штука как диздок. Ну вот смотрим.
    Реалистичная физика ракеты в игровом движке.
    Обычно, в игровых движках, ракета летит по сильно упрощенной физикой. В некоторых ситуациях это не целесообразно. И тут надо создать более реалистичную физику, полностью реалистичную физику делать сложно, и не целесообразно, поэтому формулы, по которым летит ракета, упрощены.
    На ракету в полёте воздействует следующие силы: реактивная сила двигателя, силы тяжести, сила сопротивления воздуха, подъёмная сила, стабилизирующая вращающая сила, так же, если ракета управляемая, то ещё, и управляющая вращающая сила.
    [math]\alpha[/math] - угол атаки
    [math]k_{air drag}[/math] - коэффициент сила сопротивления воздуха
    [math]k_{lift}[/math] - коэффициент подъёмной силы
    Реактивная сила двигателя направлена точно по направлению ракеты.
    Сила воздушного сопротивления складывается с индуктивным сопротивлением, которая зависит от угла атаки.
    [math]k_{tren} = k_{air drag} + sin(\alpha)\cdot k_{lift}[/math]
    Подъёмная сила зависит от угла атаки, и максимальна при определенном значении, а дальше происходить срыв подъёмной силы и её резкое уменьшение.
    [math]k_{lift force} = sin(\alpha)\cdot k_{lift}[/math]
    Стабилизирующая сила (вращающая), при положительном [math]stabilized\;factor[/math] стремится уменьшить угол атаки, при отрицательным, если угол атаки не равен нулю, то стремится увеличить. Обычно [math]stabilized\;factor[/math] положительный.
    [math]angular = rock_{vel}\cdot rock_{vel}\cdot stabilized\;factor\cdot sin(\alpha)[/math]
    Управляющая сила используется управляемыми ракетами.
    Работает, так же как и стабилизирующая сила, и пытается развернуть ракету в точку наведения. Должна быть сильней стабилизирующей силы. А так же, гасить лишнюю угловую скорость, чтобы ракета в полёте не раскачивалась.
    Так же можно учитывать волновое сопротивление, если ракета летит на сверхзвуковой скорости, и если это целесообразно.

    © НаноБот 26.11.2020 г.
     
  13. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
  14. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.067
    Intro, весь принцип управления построен на простом принципе == от акселерометров получаешь данные отклонения от предыдущего положения продольной оси ракеты и делаешь импульсы двигом, дабы парировать эти углы. скорость реакции двига должна укладываться в 30-50мс , а на больших лагах идут нелинейные процессы и ни акий матан не поможет. Вообще, про матан в плане практики надо знать одну простую вещь == любое тех решение успешно ровно настолько, насколько успешно оно содействует линейному поведению целевого процесса.