KerboScript в примерах и задачах. Часть 3.5. Предсказание положения на орбите.

Kerbal Space Program » Гайды

В предыдущих частях гайда описаны все основные шаги для того, чтобы отправить аппарат с поверхности Кербина к ближайшему спутнику и обеспечить с ним связь. Однако в каких-то случаях всё может пойти немного не по плану, и орбита после трансфера оказывается не такой, какая надо. В этой части рассмотрим, как можно исправить положение.

Постановка задачи


Аппарат находится на экваториальной эллиптической орбите вокруг Кербина, входящей в сферу действия Муны. Необходимо провести коррекцию орбиты на заданном расстоянии от Кербина таким образом, чтобы в сфере действия Муны перицетр оказался на заданной высоте.

На какой высоте проводить коррекцию?


Обычно чем раньше производится коррекция, тем меньше нужно менять орбиту для достижения нужного результата. С другой сторону, на высокоэллиптической орбите даже малые изменения могут требовать большой ΔV, если их проводить вблизи перицентра. Для примера будем считать, что манёвр надо производить на высоте, равной половине расстояния от Кербина до Муны. Задача расчёта оптимальной высоты проведения коррекции оставляется желающим для самостоятельного решения.

Как производится коррекция?


В общем случае, манёвр представляется в виде суммы трёх ортогональных компонент - касательной (prograde), радиальной (radial out) и нормальной (normal). Касательная и радиальная компоненты лежат в плоскости орбиты, нормальная направлена по нормали к плоскости орбиты (NB: хотя в KSP используется левосторонняя система координат, вектор нормали к орбите там направлен согласно правилу правого винта). Поскольку по условию плоскости орбит аппарата и Муны совпадают, то коррекции в нормальном направлении не требуется. Вектор корректирующего импульса имеет только касательную и радиальную составляющие.

Расчёт момента коррекции


В kOS планирование манёвра осуществляется путём задания момента времени, на который нужно поставить узел. Следовательно, требуется по заданной высоте рассчитать, сколько времени потребуется аппарату, чтобы до неё долететь.
Задача нетривиальная, поскольку движение по кеплеровой орбите неравномерное. Оно подчиняется второму закону Кеплера:
  • за равные промежутки времени радиус-вектор, соединяющий планету и аппарат, заметает равные площади

К счастью, задача описания такого движения в терминах обыкновенных, а не дифференциальных уравнений была решена самим же Кеплером.
Чтобы понять это решение, нужно разобраться, как определяется положение тела на орбите в пространстве и во времени.
В пространстве положение тела можно определить направлением радиус-вектора, проведённого от тела к планете. Это направление задаётся углом, который называется истинной аномалией и обозначается буквой ν. Стандартным считается отсчёт истинной аномалии от направления на перицентр. Положение на орбите в терминах времени также определяется через время, прошедшее от момента прохождения перицентра. Это время переводится в другой угол, называемый средней аномалией M . По определению, средняя аномалия меняется равномерно по времени, т.е.
M(t) = 2π (t - tPe) / T,
где t - текущее время, tPe - время последнего (или любого другого) прохождения через перицентр, T - орбитальный период, M - средняя аномалия в радианах.
Таким образом, время, требуемое для движения от точки 1 до точки 2 на орбите, равно
Δt = (M2 - M1) T / 2π
Для нахождения связи между истинной и средней аномалиями вводится параметр, называемый эксцентрической аномалией E. Геометрический смысл её проще всего понять по картинке:
KerboScript в примерах и задачах. Часть 3.5. Предсказание положения на орбите.

Рисунок 1. Истинная аномалия ν, эксцентрическая аномалия E и средняя аномалия M.

С помощью эксцентрической аномалии легко записывается параметрическое уравнение эллипса, если начало координат поместить в его центре:
x = acosE, y = bsinE
Длина радиус-вектора, проведённого из фокуса к телу на орбите (SP на рис. 1):
r = a (1 - e · cosE),
где r - длина радиус-вектора, a и e - большая полуось и эксцентриситет эллипса. Идею вывода этого выражения можно посмотреть в Википедии.
Нехитрыми тригонометрическими преобразованиями показывается связь истинной и эксцентрической аномалий:


Средняя же аномалия вычисляется по уравнению Кеплера:
M = E - e · sinE,
где M - средняя аномалия в радианах, E - эксцентрическая аномалия в радианах, e - эксцентриситет.
При помощи этого уравнения легко находим, сколько времени потребуется, чтобы оказаться на высоте, равной половине радиуса орбиты Муны (или любой другой наперёд заданной высоте). Для получения параметров орбиты используются следующие поля структуры ORBIT :

orbit:semimajoraxis // большая полуось
orbit:eccentricity // эксцентриситет
orbit:trueanomaly // истинная аномалия в градусах
orbit:period // орбитальный период

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

function etaheight {
  parameter h is apoapsis.
  if (h > apoapsis) or (h < periapsis) { return 1/0. } // краш, если высота имеет недопустимые значения
  local rmag is body:radius + h. // расстояние от фокуса
  local ta to orbit:trueanomaly.
  local sma to orbit:semimajoraxis.
  local ecc to orbit:eccentricity.
  local eanow to 2 * arctan( sqrt( (1 - ecc) / (1 + ecc) ) * tan(ta) ). // эксцентрическая аномалия в градусах!
  local manow to eanow - constant:radtodeg * ecc * sin(eanow). // радианы нужно перевести в градусы
  local eaheight to arccos( ( 1 - rmag / sma ) / ecc ). // эксцентрическая аномалия на целевой высоте
  // проверки на случай, если первый проход нужной высоты будет при движении вниз
  if -eaheight > eanow { set eaheight to -eaheight. }
  if eaheight < eanow { set eaheight to 360 - eaheight. }
  local maheight to eaheight - constant:radtodeg * ecc * sin(eaheight).
  return orbit:period * (maheight - manow) / 360.
}


Расчёт корректирующего импульса


Для расчёта приращения скорости, которое приведёт перицентр будущей орбиты к желаемому значению, пойдём по пути наименьшего сопротивления, т.е. градиентного спуска.
Градиентом называют направление, вдоль которого функция многих переменных быстрее всего возрастает. В нашем случае эта функция
f(dVPRG, dVRAD) = Pe(dVPRG, dVRAD) - Pe0,
где dVPRG и dVRAD - приращения скорости в тангенциальном и радиальном направлениях, Pe0 - желаемая высота перицентра.
Градиент функции f(x, y) определяется как вектор grad f с компонентами (∂f/∂x, ∂f/∂y).
Алгоритм расчёта манёвра такой:
  1. 1) ставим начальный манёвр на заданное время с ΔV = 0
  2. 2) оцениваем частные производные ∂Pe/∂ΔVPRG и ∂Pe/∂ΔVRAD; вычисляем градиент
  3. 3) скорость изменения функции вдоль градиента равна df/d(grad f) = ((∂f/∂x)2 + (∂f/∂y)2)1/2 = |grad f|
  4. 4) оцениваем необходимую добавку к дельте как dΔV = (Pe0 - Pe) / (dPe / d(grad Pe) ), раскладываем её по тангенциальной и радиальной компонентам согласно направлению градиента
  5. 5) обновляем дельту: ΔV -> ΔV + dΔV; вычисляем перицентр с новой дельтой; если он отличается от нужной величины, переходим к п.2 и вычисляем следующую поправку


function midcoursecorr {
  parameter pe0.
  parameter pe0tol is 100. // с какой точностью (в метрах) хотим получить перицентр
  local dvrad to 0.
  local dvprg to 0.
  local corrnode to node(time:seconds + etaheight(Mun:apoapsis/2), dvrad, 0, dvprg).
  add corrnode.
  local newpe to corrnode:orbit:nextpatch:periapsis.
  local pe1 to 0.
  local pe2 to 0.
  local gradr to 0.
  local gradp to 0.
  
  until abs(newpe - pe0) < pe0tol {
  // оценка частной производной по dV_rad
    local dvrad1 to dvrad - 0.001.
    set corrnode:radialout to dvrad1.
    set pe1 to corrnode:orbit:nextpatch:periapsis.
    local dvrad1 to dvrad + 0.001.
    set corrnode:radialout to dvrad1.
    set pe2 to corrnode:orbit:nextpatch:periapsis.
    set gradr to (pe2 - pe1) / 0.002.
    
  // оценка частной производной по dV_prg
    local dvprg1 to dvprg - 0.001.
    set corrnode:prograde to dvprg1.
    set pe1 to corrnode:orbit:nextpatch:periapsis.
    local dvprg1 to dvprg + 0.001.
    set corrnode:prograde to dvprg1.
    set pe2 to corrnode:orbit:nextpatch:periapsis.
    set gradp to (pe2 - pe1) / 0.002.
    local dfdgrad to sqrt(gradr^2 + gradp^2).
    set dvrad to dvrad + gradr/dfdgrad * (pe0 - newpe) / dfdgrad.
    set dvprg to dvprg + gradp/dfdgrad * (pe0 - newpe) / dfdgrad.
    
    set corrnode:prograde to dvprg.
    set corrnode:radialout to dvrad.
    set newpe to corrnode:orbit:nextpatch:periapsis.
  }
}


Бонус: расчёт попадания в Муну без опорной орбиты


Умение вычислять средние аномалии в различных точках орбиты можно использовать для расчёта попадания в Муну (или выхода на сближение с другим кораблём) прямо со старта.
Требуются два запуска - один пристрелочный, второй боевой. В первом запуске аппарат сразу выводится на орбиту с апоцентром выше 12 тыс. км (с типичными ракетами из KSP, скорее всего, этот апоцентр будет достигнут ещё до выхода из атмосферы, т.е. это даже не будет стабильной орбитой). После выхода за границу атмосферы нужно отметить:
  • а) сколько времени прошло со старта
  • б) какой угол дуги аппарат прошёл с момента старта
  • в) сколько времени осталось лететь до высоты орбиты Муны
  • г) какой угол осталось пройти до достижения этой высоты

Первый пункт решается крайне просто - встроенная переменная missiontime хранит время с момента старта (запуска первой ступени).
Третий и четвёртый пункт решаются описанным выше способом - через аномалии на текущей и на будущей высоте.
Для второго пункта нужно посчитать угол между радиус-вектором аппарата и некоторым фиксированным направлением в момент старта и момент выхода из атмосферы. Такое направление, к счастью, имеется, и хранится в системной переменной solarprimevector.
Таким образом, становится известно, какой угол проходит аппарат с момента старта до высоты Муны и сколько времени это занимает. Откуда уже несложно и высчитать угол упреждения для основного запуска:
Δφ0 = Δφship - ΔφMun = Δφship - 360°×Δt/TMun
где Δφ0 - угол упреждения, Δφship - полный угол, проходимый аппаратом со старта до достижения высоты Муны, Δt - время со старта до достижения этой высоты, TMun - орбитальный период Муны.
Реализация этого метода оставляется желающим для самостоятельной работы.

Скрипты с коррекцией орбиты для крафта из прошлой части:
KerboScript в примерах и задачах. Часть 3. Предсказание орбиты. Летим на Муну.
5 апр 2017 в 21:21, Гайды
Теория и практика межпланетных перелетов. Часть 1.
2 окт 2015 в 21:49, Гайды
  1. Lynx

    Lynx 16 апреля 2017 12:52

    А будет рассматриваться коррекция целевого наклонения? В контрактах попасть на полярную орбиту к Муне очень часто встречается.

    1. Pand5461

      Pand5461 16 апреля 2017 13:18 Автор

      Будет. Я как раз думал - включать в эту часть выход на полярную орбиту или нет. Решил, что и так много математики, и не стал.
      Так-то полярные орбиты по простоте вторые после экваториальных, т.к. там на круговой орбите скорость всегда направлена либо строго на север, либо строго на юг. По сути, дождаться восходящего узла, горизонтальную повернуть на север - и типа готово, в перицентре скруглить только не забыть.
      Но это я после майских праздников буду писать, т.к. в командировку отправляюсь.

      1. Lynx

        Lynx 16 апреля 2017 15:32

        Ты имеешь в виду отлет с полярной орбиты? В стоке дельты маленькие, поэтому на экваториальную орбиту вокруг Муны с экваториальной орбиты выходить едва ли не выгоднее чем с полярной.
        И вообще хочется конечно выход на орбиту с произвольным наклонением с любой опорной орбиты.

        1. Pand5461

          Pand5461 16 апреля 2017 16:03 Автор

          Цитата: Lynx
          Ты имеешь в виду отлет с полярной орбиты?

          Не, имею в виду, влетели в новую SOI (Мун, Минмус, да хоть Дюна) с каким-то наклонением - как перейти на полярную орбиту. Т.к. экваториальные и полярные орбиты - это вырожденные случаи, для них решения гораздо проще общего.
          Цитата: Lynx
          И вообще хочется конечно выход на орбиту с произвольным наклонением с любой опорной орбиты.

          Если вопрос в том, как запрогать изменение наклонения внутри одной SOI, то это я буду писать. Скорее всего, буду описывать комбинированный манёвр изменения наклонения и апсид.
          Если про задачи типа "рассчитать окно для запуска с Байконура на наклонение 51.6 так, чтобы трансфером попасть на полярную орбиту Луны" - то эту задачу я пока не решил. Если решу, то выкладывать буду разве что на форум и без подробных комментариев. Потому что какой смысл в игре тогда с готовыми решениями для любой задачи?

          1. Lynx

            Lynx 16 апреля 2017 17:17

            Не, я имел в виду как сразу выйти на орбиту с целевым наклонением, а не изменять его после влета в СОИ.
            Матаппарат у Левантовского в общем виде есть.

            Дай чутка поучаствую )
            Для смены наклонения в СОИ надо поставить маневр в точку орбиты наиболее удаленную от планеты и имеющую широту не более целевого наклонения. Так?

          2. Pand5461

            Pand5461 16 апреля 2017 18:18 Автор

            Цитата: Lynx
            Не, я имел в виду как сразу выйти на орбиту с целевым наклонением, а не изменять его после влета в СОИ.

            А, ну это и тут есть, и даже для MJ.
            Самая главная формула: нос надо держать по азимуту HDG = arcsin (cos i / cos LAT), где i - наклонение, LAT - широта. Ну и запускать в момент, когда крафт находится под нужной орбитой. Если по контракту, то в описании нужная долгота восходящего узла написана, если в другой объект попасть - через vessel:orbit:lan её можно получить. Хинт: долгота крафта относительно небесной тверди вычисляется как ship:longitude + body:rotationangle.
            Цитата: Lynx
            Дай чутка поучаствую )
            Для смены наклонения в СОИ надо поставить маневр в точку орбиты наиболее удаленную от планеты и имеющую широту не более целевого наклонения. Так?

            Тащемта, да. Плюс всякая тригонометрия, чтобы дельту рассчитать. В частности, для перехода на полярную орбиту можно маневр ставить в любой точке орбиты, что определённо упрощает задачу.

          3. Lynx

            Lynx 16 апреля 2017 18:30

            Да нет блин, как выйти на орбиту с целевым наклонением в другой СОИ.
            Как с экваториальой орбиты вокруг Кербина выйти на орбиту 60гр вокруг Муны.

          4. Pand5461

            Pand5461 16 апреля 2017 18:54 Автор

            В стоке прямой трансфер едва ли не дороже выйдет, чем в СОИ Муны менять наклонение, как ты заметил уже.
            И это как раз та задача, с которой я пока не разобрался.

  2. KMS

    KMS @Александр 16 апреля 2017 18:02

    Pand5461 упорно призывает меня (и, полагаю, Finn, просто он крепче) из сумрака. Чую не удержусь и включусь в процесс, ввиду образования некоторого свободного времени... За статью, сенкс.

    1. Басила

      Басила 19 апреля 2017 00:08

      Дада, бросай кубики)

  3. Басила

    Басила 19 апреля 2017 00:08

    Цитата: Lynx
    Для смены наклонения в СОИ надо поставить маневр в точку орбиты наиболее удаленную от планеты и имеющую широту не более целевого наклонения.

    Если уж совсем экономить, то делать это в две операции. Сначала в АП минимизировать разницу наклонений, а потом в более удаленном узле уравнять. Для большинства ситуаций разница несущественная, но так делают ИРЛ.

    1. Lynx

      Lynx 19 апреля 2017 22:25

      Тогда сразу оценивать эффективность поднятия Ап и смены в нем.

  4. mmm99rus

    mmm99rus @mmm99 13 июня 2017 22:54

    Автор - огонь. "Постановка задачи", подпись под рисунками по ГОСТУу, читать очень приятно, не статья, а НИОКР. Добавить другие методы выполнения задачи, сравнение методов, ну и вывод - и можно публиковать на правах диссертации на соискание степени доктора кербологических наук :) Реально обрадовало, что такие качественные статьи выпускаются.
    P.S. Автор, ты случаем не из МФТИ, МГТУ, МГУ (мМехмат/ФФ/ВМК)?

    1. Pand5461

      Pand5461 14 июня 2017 00:39 Автор

      Цитата: mmm99rus
      Автор, ты случаем не из МФТИ, МГТУ, МГУ (мМехмат/ФФ/ВМК)?

      LENINGRAD POLITEKHNIKA!
      (нет, МФТИ)
      Альтернативные методы, хоть они и есть, специально не добавлял. И так всё слишком сложно для неподготовленного человека.

      1. mmm99rus

        mmm99rus @mmm99 14 июня 2017 00:40

        МФТИ? ФОПФ?
        Я думал, что на новодачной еще нет интернета xD

        1. Pand5461

          Pand5461 14 июня 2017 00:47 Автор

          Боже упаси попасть на ФОПФ. Физхим.
          На Новодачной скоро не только интернета, но и электричек не будет :)

          1. alexoff

            alexoff @Александр 14 июня 2017 00:57

            Я давным-давно там олимпиаду по физике сдавал в огромной неотапливаемой столовой, когда на улице было -25С, сидели толпой и мерзли...

          2. mmm99rus

            mmm99rus @mmm99 14 июня 2017 01:07

            Перед олимпиадой тебя не забыли обшмонать охранники? на физтехе такое любят...

          3. alexoff

            alexoff @Александр 14 июня 2017 01:08

            Там полный бардак был, охраны даже не помню. Приехало что-то уж слишком много народа, задачи решались коллективным разумом, даже не следили. Вроде в 2003 году это было все

{login}
  • bowtiesmilelaughingblushsmileyrelaxedsmirk
    heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
    winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
    worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
    expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
    disappointedconfoundedfearfulcold_sweatperseverecrysob
    joyastonishedscreamtired_faceangryragetriumph
    sleepyyummasksunglassesdizzy_faceimpsmiling_imp
    neutral_faceno_mouthinnocent
Последние сообщения с форума
  • Автор
    Тема в разделе: В ангаре у Боба
    Просмотров: 7360
    Ответов: 55
  • Автор
    Тема в разделе: Технические вопросы
    Просмотров: 24624
    Ответов: 68
  • Автор
    Тема в разделе: Моды
    Просмотров: 1530
    Ответов: 2
  • Автор
    Тема в разделе: В ангаре у Боба
    Просмотров: 207011
    Ответов: 1484
  • Автор
    Тема в разделе: Игровой процесс
    Просмотров: 1823
    Ответов: 1
    Все сообщения..
    Полный список последних сообщений
    Loading...

    Нашли ошибку?
    Вы можете сообщить об этом администрации.
    Выделив текст нажмите Ctrl+Alt