Автор: Pand5461 Категория: Kerbal Space Program » Гайды

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

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

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


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

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


Обычно чем раньше производится коррекция, тем меньше нужно менять орбиту для достижения нужного результата. С другой сторону, на высокоэллиптической орбите даже малые изменения могут требовать большой Δ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 - большая полуось и эксцентриситет эллипса. Идею вывода этого выражения можно посмотреть в Википедии .
Нехитрыми тригонометрическими преобразованиями показывается связь истинной и эксцентрической аномалий:
KerboScript в примерах и задачах. Часть 3.5. Предсказание положения на орбите.


Средняя же аномалия вычисляется по уравнению Кеплера:
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 - орбитальный период Муны.
Реализация этого метода оставляется желающим для самостоятельной работы.

Скрипты с коррекцией орбиты для крафта из прошлой части :
script.zip [3,45 Kb] (cкачиваний: 19)

- + +17
У Вас НЕТ прав на выставление оценки для этой новости.
Для выставлени оценки необходимо пройти регистрацию на сайте.
Если Вы уже зарегистрировались, то войдите на сайт.
  1. 51
    Это Lynx Lynx - #10 0
    +1
    А будет рассматриваться коррекция целевого наклонения? В контрактах попасть на полярную орбиту к Муне очень часто встречается.
    »
    Написано:
    Группа: Хорошие котейки, Публ/Комм: 0/430 [Онлайн]
     
    1. 7
      Это Pand5461 Pand5461 - #20 0
      0
      Будет. Я как раз думал - включать в эту часть выход на полярную орбиту или нет. Решил, что и так много математики, и не стал.
      Так-то полярные орбиты по простоте вторые после экваториальных, т.к. там на круговой орбите скорость всегда направлена либо строго на север, либо строго на юг. По сути, дождаться восходящего узла, горизонтальную повернуть на север - и типа готово, в перицентре скруглить только не забыть.
      Но это я после майских праздников буду писать, т.к. в командировку отправляюсь.
      »
      Написано:
      Группа: Хорошие люди, Публ/Комм: 10/37
       
      1. 51
        Это Lynx Lynx - #30 0
        0
        Ты имеешь в виду отлет с полярной орбиты? В стоке дельты маленькие, поэтому на экваториальную орбиту вокруг Муны с экваториальной орбиты выходить едва ли не выгоднее чем с полярной.
        И вообще хочется конечно выход на орбиту с произвольным наклонением с любой опорной орбиты.
        »
        Написано:
        Группа: Хорошие котейки, Публ/Комм: 0/430 [Онлайн]
         
        1. 7
          Это Pand5461 Pand5461 - #40 0
          0
          Цитата: Lynx
          Ты имеешь в виду отлет с полярной орбиты?

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

          Если вопрос в том, как запрогать изменение наклонения внутри одной SOI, то это я буду писать. Скорее всего, буду описывать комбинированный манёвр изменения наклонения и апсид.
          Если про задачи типа "рассчитать окно для запуска с Байконура на наклонение 51.6 так, чтобы трансфером попасть на полярную орбиту Луны" - то эту задачу я пока не решил. Если решу, то выкладывать буду разве что на форум и без подробных комментариев. Потому что какой смысл в игре тогда с готовыми решениями для любой задачи?
          »
          Написано:
          Группа: Хорошие люди, Публ/Комм: 10/37
           
          1. 51
            Это Lynx Lynx - #50 0
            +1
            Не, я имел в виду как сразу выйти на орбиту с целевым наклонением, а не изменять его после влета в СОИ.
            Матаппарат у Левантовского в общем виде есть.

            Дай чутка поучаствую )
            Для смены наклонения в СОИ надо поставить маневр в точку орбиты наиболее удаленную от планеты и имеющую широту не более целевого наклонения. Так?
            »
            Написано:
            Группа: Хорошие котейки, Публ/Комм: 0/430 [Онлайн]
             
            1. 7
              Это Pand5461 Pand5461 - #60 0
              0
              Цитата: Lynx
              Не, я имел в виду как сразу выйти на орбиту с целевым наклонением, а не изменять его после влета в СОИ.

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

              Тащемта, да. Плюс всякая тригонометрия, чтобы дельту рассчитать. В частности, для перехода на полярную орбиту можно маневр ставить в любой точке орбиты, что определённо упрощает задачу.
              »
              Написано:
              Группа: Хорошие люди, Публ/Комм: 10/37
               
              1. 51
                Это Lynx Lynx - #70 0
                0
                Да нет блин, как выйти на орбиту с целевым наклонением в другой СОИ.
                Как с экваториальой орбиты вокруг Кербина выйти на орбиту 60гр вокруг Муны.
                »
                Написано:
                Группа: Хорошие котейки, Публ/Комм: 0/430 [Онлайн]
                 
                1. 7
                  Это Pand5461 Pand5461 - #80 0
                  0
                  В стоке прямой трансфер едва ли не дороже выйдет, чем в СОИ Муны менять наклонение, как ты заметил уже.
                  И это как раз та задача, с которой я пока не разобрался.
                  »
                  Написано:
                  Группа: Хорошие люди, Публ/Комм: 10/37
                   
  2. Выкл.
    Это KMS KMS - #90 0
    0
    Pand5461 упорно призывает меня (и, полагаю, Finn, просто он крепче) из сумрака. Чую не удержусь и включусь в процесс, ввиду образования некоторого свободного времени... За статью, сенкс.
    »
    Написано:
    Группа: Модераторы, Публ/Комм: 0/28
     
    1. 70
      Это Басила Басила - #100 0
      +1
      Дада, бросай кубики)
      »
      Написано:
      Группа: Редактор, Публ/Комм: 3/951 [Онлайн]
      Даннинг с Крюгером погубят человечество.
      игривые картинки
      "Сложные проблемы всегда имеют простые, легкие для понимания неправильные решения."
       
  3. 70
    Это Басила Басила - #110 0
    0
    Цитата: Lynx
    Для смены наклонения в СОИ надо поставить маневр в точку орбиты наиболее удаленную от планеты и имеющую широту не более целевого наклонения.

    Если уж совсем экономить, то делать это в две операции. Сначала в АП минимизировать разницу наклонений, а потом в более удаленном узле уравнять. Для большинства ситуаций разница несущественная, но так делают ИРЛ.
    »
    Написано:
    Группа: Редактор, Публ/Комм: 3/951 [Онлайн]
    Даннинг с Крюгером погубят человечество.
    игривые картинки
    "Сложные проблемы всегда имеют простые, легкие для понимания неправильные решения."
     
    1. 51
      Это Lynx Lynx - #120 0
      0
      Тогда сразу оценивать эффективность поднятия Ап и смены в нем.
      »
      Написано:
      Группа: Хорошие котейки, Публ/Комм: 0/430 [Онлайн]
       
  4. 0
    Это mmm99rus mmm99rus - #130 0
    +1
    Автор - огонь. "Постановка задачи", подпись под рисунками по ГОСТУу, читать очень приятно, не статья, а НИОКР. Добавить другие методы выполнения задачи, сравнение методов, ну и вывод - и можно публиковать на правах диссертации на соискание степени доктора кербологических наук :) Реально обрадовало, что такие качественные статьи выпускаются.
    P.S. Автор, ты случаем не из МФТИ, МГТУ, МГУ (мМехмат/ФФ/ВМК)?
    »
    Написано:
    Группа: Посетители, Публ/Комм: 0/103
     
    1. 7
      Это Pand5461 Pand5461 - #140 0
      0
      Цитата: mmm99rus
      Автор, ты случаем не из МФТИ, МГТУ, МГУ (мМехмат/ФФ/ВМК)?

      LENINGRAD POLITEKHNIKA!
      (нет, МФТИ)
      Альтернативные методы, хоть они и есть, специально не добавлял. И так всё слишком сложно для неподготовленного человека.
      »
      Написано:
      Группа: Хорошие люди, Публ/Комм: 10/37
       
      1. 0
        Это mmm99rus mmm99rus - #150 0
        0
        МФТИ? ФОПФ?
        Я думал, что на новодачной еще нет интернета xD
        »
        Написано:
        Группа: Посетители, Публ/Комм: 0/103
         
        1. 7
          Это Pand5461 Pand5461 - #160 0
          0
          Боже упаси попасть на ФОПФ. Физхим.
          На Новодачной скоро не только интернета, но и электричек не будет :)
          »
          Написано:
          Группа: Хорошие люди, Публ/Комм: 10/37
           
          1. 76
            Это alexoff alexoff - #170 0
            0
            Я давным-давно там олимпиаду по физике сдавал в огромной неотапливаемой столовой, когда на улице было -25С, сидели толпой и мерзли...
            »
            Написано:
            Группа: Хорошие люди, Публ/Комм: 22/811
             
            1. 0
              Это mmm99rus mmm99rus - #180 0
              0
              Перед олимпиадой тебя не забыли обшмонать охранники? на физтехе такое любят...
              »
              Написано:
              Группа: Посетители, Публ/Комм: 0/103
               
              1. 76
                Это alexoff alexoff - #190 0
                0
                Там полный бардак был, охраны даже не помню. Приехало что-то уж слишком много народа, задачи решались коллективным разумом, даже не следили. Вроде в 2003 году это было все
                »
                Написано:
                Группа: Хорошие люди, Публ/Комм: 22/811
                 
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Чат
  • Трансляции
  • Информация
    На какой стороне Силы Вы?
Последние комментарии
  • Novi4ok Novi4ok написал в
    KerboScript в примерах и задач ... (всего 4 комм.)
    еее реалистичност, плюс канешна
  • Lucifer1981 Lucifer1981 написал в
    Eve Mk2s (всего 6 комм.)
    +++++++++++++++++++++++++++++++++
  • Fell-x27 Fell-x27 написал в
    Kerbal Space Program была купл ... (всего 38 комм.)

    Внимание! У Вас нет прав для просмотра скрытого текста.
  • TAL TAL написал в
    Eve Mk2s (всего 6 комм.)
    Для Евы главное лендер способный взлететь. СЖО оставляете на орбите, а лендер получит лишь небольшие изменения. Крафт имеется - экспериментируйте.
  • SuperКотэ SuperКотэ написал в
    Eve Mk2s (всего 6 комм.)
    вязать бустерные вязанки это как-то странно, вяжи кружком и мамонтом как я мне первая ступень вязанку напомнила
    больше плюсов!
  • NePaltsemDelaniy NePaltsemDelaniy написал в
    Eve Mk2s (всего 6 комм.)
    Шикарный аппарат, Годдард рулЁз)))
Все комментарии
Обновления на форуме
177 Всего
6 Польз.
171 Гостей
Alexa, Google, Яндекс, Rsa, serjey2128, Басила, Sokol290_KSP, Reistlyn, Marschig
Онлайн список
Новостей на страницу:
Наверх