1. Если вы только начинаете программировать на ассемблере и не знаете с чего начать, тогда попробуйте среду разработки ASM Visual IDE
    (c) на правах рекламы
    Скрыть объявление

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

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

  1. Intro

    Intro Member

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

    njeen Member

    Публикаций:
    0
    Регистрация:
    26 мар 2017
    Сообщения:
    76
    Адрес:
    Ташлинск
    Задача звучит как управление углом поворота через управление угловой скоростью.
    Т.к в трехмерном пространстве общее управление по 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] как там оно дискретно будет я не скажу. Возможно, все будет хорошо.
     
  4. voffka0

    voffka0 Member

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

    njeen Member

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

    ЗЫ: 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
    Сообщения:
    73
    хорошо, я подумаю :)
     
    Последнее редактирование: 13 окт 2019
  7. Indy_

    Indy_ Well-Known Member

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

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

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

    njeen Member

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

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