KerboScript в примерах и задачах. Часть 3. Предсказание орбиты. Летим на Муну.

Kerbal Space Program » Гайды

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


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

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

Базовая теория


Сколько нужно дельты?
Чтобы попасть в сферу действия Муны, нужно - сюрприз - выйти на орбиту с апоцентром не менее HMun - RSOI, где HMun = 12 Мм - высота орбиты Муны (от центра Кербина), RSOI = 2,4 Мм - радиус её сферы влияния. C опорной орбиты высотой 80 км на такой манёвр потребуется 835 м/с.

Куда целиться?
Планировать трансфер, конечно, нужно так, чтобы сама Муна при этом оказалась где-то рядом. Что значит "где-то рядом", можно понять, сравнив радиус сферы влияния с высотой орбиты. Легко рассчитать, что угловое расстояние между центром Муны и краем сферы влияния при взгляде из центра Кербина есть arcsin(2,4/12) = 11,5o. Таким образом, если планировать трансфер аналогично тому, как планировался трансфер к другому аппарату в предыдущей части, то допустимо в апоцентре оказаться на 10-11 градусов впереди или позади Муны (см. рис. 1). Для "идеальной" трансферной орбиты (зелёная на рис. 1) угол упреждения φ0 равен 121o. Формулы для расчёта этого угла приведены в предыдущей части.
KerboScript в примерах и задачах. Часть 3. Предсказание орбиты. Летим на Муну.

Рисунок 1. Углы для трансфера к Муне. φ0 = 121o, φ1 = 11o.

Прямая или ретроградная орбита?
Для давно играющих не секрет, что выход на ретроградную орбиту Муны требует больше дельты, чем выход на прямую. Почему так? Наклонение орбиты определяется вектором момента импульса аппарата в муноцентрической системе. Поскольку при пересечении границы сферы влияния скорость в кербиноцентрической системе отсчета (КЦСО) не должна меняться, то скорость в муноцентрической СО должна быть равна векторной разности скорости аппарата в КЦСО и скорости самой Муны. Момент импульса в муноцентрической системе тогда будет равен
I = m ([ RM × VK ] - [ RM × VMun ]),
где RM - вектор от центра Муны к аппарату, VK и VMun - скорости аппарата и Муны в КЦСО.
Поскольку скорость Муны относительно Кербина VMun направлена на восток, то при входе в сферу влияния Муны со стороны Кербина аппарат получает от неё "в подарок" момент, направленный на север, т.е. в направлении положительной орбиты. Скорость же в КЦСО в момент пересечения сферы влияния может быть направлена так, что даёт момент, направленный на юг (рис. 2), и величина этого момента тем больше, чем больше синус угла между скоростью в КЦСО и радиус-вектором "Муна-аппарат". Поскольку этот угол меньше, когда Муна находится впереди аппарата, то при заходе с этого направления орбита относительно Муны всегда будет прямая.

Рисунок 2. Сложение скоростей при пересечении сферы влияния.

Оценим минимальную скорость, необходимую для попадания на ретроградную орбиту. Будем считать, что кеоцентрическая скорость в момент входа в сферу действия Муны практически перпендикулярна радиус-вектору "Муна-аппарат", а скорость Муны составляет с ним угол около 45o. Это значит, что скорость аппарата в момент подхода к границе сферы влияния Муны должна быть не менее VMun/√2 = 384 м/с. Отсюда можем найти величину большой полуоси орбиты, принимая точку входа на расстоянии примерно HMun - RSOI/2. Тогда A ≈ 7,15 Мм. Чтобы перейти на такой эллипс с орбиты 80 км, требуется 865 м/с, апоцентр кеплеровой орбиты будет на высоте около 13,6 Мм.
Выход на ретроградные орбиты полезен, если хочется получить траекторию свободного возврата - когда аппарат, облетев Муну, возвращается обратно на Кербин.

Программируем зонд-импактор


Для этой задачи функция transfernode, написанная в прошлой части гайда, при вызове без параметров создаёт узел манёвра для траектории столкновения с Муной. Навешивание дополнительной логики работы зонда читателям предоставляется для самостоятельной работы.

Программируем пролётный зонд


При планировании манёвра для выхода на пролётную траекторию наша цель - не просто добиться попадания в сферу действия Муны, но также пройти на заданном расстоянии от естественного спутника. Можно это сделать, конечно, через ту же функцию transfernode, аккуратно подобрав угол прицеливания, но мы воспользуемся более научным методом.
Дело в том, что kOS может получить траектории после манёвра, которые показываются в игре. Используем их для выхода на нужную высоту аналогично тому, как это делается при планировании манёвров вручную.
Орбиты представлены в виде структуры ORBIT, имеющей множество полей, из которых в данной части будут интересны следующие:

:apoapsis
:periapsis
:hasnextpatch // тип boolean - есть ли по ходу траектории переход в другую сферу влияния
:nextpatch // тип ORBIT - орбита после перехода
:nextpatcheta // время до перехода в секундах

NB: Попытка получить суффиксы :nextpatch и :nextpatcheta приводят к ошибкам, если на орбите в пределах горизонта планирования нет никаких переходов - об этом не нужно забывать! Прежде чем получать orbit:nextpatch, нужно всегда проверять наличие перехода через orbit:hasnextpatch.

Напоминаю, что в предыдущих частях также использовался суффикс orbit:period для получения периода орбиты.
Орбиту можно получить по суффиксу :orbit для любого объекта, относящегося к классу ORBITABLE (т.е. для кораблей и планет). Примеры:

print Mun:orbit:apoapsis. // напечатает 11400000
print Kerbin:orbit:hasnextpatch. // если напишет True, то что-то серьёзно не так
if ship:orbit:hasnextpatch {
  print ship:orbit:nextpatcheta. // вывод времени до перехода в следующую сферу влияния
}

Просто orbit означает то же самое, что ship:orbit, т.е. орбиту текущего аппарата.
Получение орбиты после (идеально выполненного) манёвра производится по суффиксу :orbit маневрового узла. Чтобы этот суффикс был доступен, узел должен быть добавлен в план полёта командой add.

//Как сделать не получится
set nd to node(time:seconds + 120, 0, 0, 50). // 50 м/с вперёд
print nd:orbit:periapsis. // будет ошибка, т.к. узел не добавлен в план
//Как надо делать
set nd to node(time:seconds + 120, 0, 0, 50).
add nd.
print nd:orbit:periapsis. // печать перицентра после манёвра


Теперь напишем функцию перехода на орбиту с заданным перицентром у Муны. Делать это будем так: поставим манёвр подъёма апоцентра до орбиты Муны на ближайшее время, а затем будем двигать его вперёд по времени, пока он не приведёт к нужной орбите.

function TransferToMunPe {
  parameter targetpe is 50000.
  // расчёт dV
  local munsma to Mun:orbit:semimajoraxis.
  local r0 to orbit:semimajoraxis.
  local v0 to velocity:orbit:mag.
  
  local a1 to (munsma + r0)/2. // большая полуось переходной орбиты
  local Vpe to sqrt( body:mu * ( 2/r0 - 1/a1 ) ).
  local deltav to Vpe - v0.
  
  // поставим манёвр так, чтобы только успеть его выполнить
  local dob to deltav*mass/ship:availablethrust.
  local nd to node(time:seconds + dob/2 + 30, 0, 0, deltav).
  add nd.
  
  // сдвигаем до тех пор, пока не получим нужный перицентр у Муны
  until nd:orbit:hasnextpatch and abs(nd:orbit:nextpatch:periapsis - targetpe) < 2500 {
    set nd:eta to nd:eta + 0.2.
  }
}


"Закороченная" логика
Хоть это сразу и не заметно, в функции TransferToMunPe есть довольно грязный хак. Дело в том, что при входе в цикл until мы не знаем, попали ли вообще начальным манёвром в Муну, а значит, и не можем знать, не вызовем ли ошибку попыткой получить nd:orbit:nextpatch:periapsis. Но нас спасает способ вычисления логических выражений, применяемый в kOS (и во многих других языках программирования, включая C). Используется то, что операция "и" возвращает истину только тогда, когда истинны оба аргумента. Это означает, что при вычислении выражения А и В, если А проверено и ложно - то В можно уже не проверять! Поэтому до вычисления abs(nd:orbit:nextpatch:periapsis - targetpe) < 2500 в примере дело доходит лишь в том случае, если истинно nd:orbit:hasnextpatch, т.е. орбита после манёвра переходит в сферу влияния другого тела.

Программируем орбитальный зонд


Для попадания на стабильную орбиту достаточно добавить скругление орбиты где-то внутри сферы действия Муны. Программа работы аппарата после отделения от носителя будет выглядеть примерно так:

TransferToMunPe(50000).
exenode().
wait until body:name = "Mun".
wait until eta:periapsis < 30.
circularize().
open_antennae(). // открыть антенны для установления связи с ЦУП; предлагается для самостоятельного написания

Следует заметить, что здесь нет автоматического контроля варпа, т.е. этот код в полностью атоматическом режиме будет выполняться о-о-очень долго. Имеет смысл воспользоваться описанной в прошлых частях функцией warpfor, которая использует встроенную переменную warp для быстрой промотки длинных промежутков времени. Тогда полная циклограмма работы спутника с момента отделения от носителя выглядит так:
TransferToMunPe(50000).
exenode().
warpfor(orbit:nextpatcheta).
wait until body:name = "Mun". // убеждаемся, что действительно попали в сферу влияния Муны
warpfor(eta:periapsis - 30).
circularize().

Для безопасности имеет смысл, как и для коммуникационных спутников, для каждого этапа выполнения выделить свой режим работы.
Пример, показывающий, зачем это надо: предположим, аппарат по дороге попал в тень достаточно надолго, чтобы разрядились батареи. После выхода из тени он заново начнёт работу, но скрипт перезагрузится и начнётся сначала. При этом аппарат будет пытаться заново найти трансфер (который, вообще-то, рассчитывался в предположении круговой орбиты, что уже неверно), затем выполнить манёвр (на что может уже не хватать дельты), затем заново ждать попадания в сферу действия Муны, а по дороге он может снова разрядиться, что приведёт к повторению круга заново.
Опробуем методику путём запуска спутника KommSat из предыдущей части на орбиту Муны высотой 150 км.

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

Скрипты и крафт:
KerboScript в примерах и задачах. Часть 3.5. Предсказание положения на орбите.
16 апр 2017 в 01:45, Гайды
Теория и практика межпланетных перелетов. Часть 1.
2 окт 2015 в 21:49, Гайды
  1. alex.omega665

    alex.omega665 6 апреля 2017 18:47

    А не подскажете, IDE под это дело есть?
    Или писать все в обычном текстовом редакторе, без подсветки синтаксиса и автодополнений?

    1. Soul

      Soul @Павел Гладилов 6 апреля 2017 19:52

      Ээээ... vim? (шучу)

    2. Lynx

      Lynx 6 апреля 2017 20:16

      Что-то в таком виде можно организовать собственными силами
      https://www.reddit.com/r/Kos/comments/322us6/i_made_a_userdefined_language_for_
      notepad/

    3. Pand5461

      Pand5461 6 апреля 2017 20:29 Автор

      Алекс, что-то есть на форумах, но последний раз обновлялось год назад.
      Вероятно, для Emacs можно дополнение написать, но это нужно хорошо знать и kOS, и ELisp.

    4. alex.omega665

      alex.omega665 7 апреля 2017 17:47

      Хм, всем спасибо за информацию)
      Надо будет поковырять эту тему)

  2. Dvidio

    Dvidio @Давид 8 апреля 2017 04:23

    Гайд интересный, хорошо оформлен.Тоже идея не то что бы плоха.Однако, как по мне полеты с аффтопелодом разрушают одну из очень важных состовляющих геймплея - КСП это СИМУЛЯТОР космческой программы.Учитывая, что начав использоать эти скрипты для аффтапелода мы получим лишь игру в ангаре и посадку на скучные и однообразные планеты. Они того не стоят.

    Как по мне, все веселье в ксп достовляет выход на орбиту, стыковка и просчет трансферов на глаз.

    Посту плюс за хорошее оформление и грамотное пояснение.

    1. Pand5461

      Pand5461 8 апреля 2017 14:41 Автор

      Цитата: Dvidio
      Однако, как по мне полеты с аффтопелодом разрушают одну из очень важных состовляющих геймплея - КСП это СИМУЛЯТОР космческой программы.Учитывая, что начав использоать эти скрипты для аффтапелода мы получим лишь игру в ангаре и посадку на скучные и однообразные планеты. Они того не стоят.

      а) Игра становится немного "про другое" - полностью согласен, фокус смещается с пилотирования на предварительное планирование
      б) Я не считаю, что автоматизация полётов есть единственно правильный способ играть (по крайней мере, без RemoteTech). Мне просто нравится осознание, что я научил тупую железяку что-то делать без посторонней помощи.
      в) Эти скрипты не настолько могучи, чтобы работать для любого крафта в любой ситуации. В процессе адаптации к конкретным миссиям, скорее всего, будет немало аварий.
      г) Если сравнивать с MechJeb, когда самостоятельно пишешь, хотя бы понимаешь, что твои манёвры означают с точки зрения орбитальной механики.
      д) Да просто мало по kOS руководств с разбором и объяснением работы скриптов, новичкам жуть как сложно начинать из-за этого. Вот решил заполнить пробел, как могу.

      Цитата: Dvidio
      Как по мне, все веселье в ксп достовляет выход на орбиту, стыковка и просчет трансферов на глаз.

      Да ради бога. Игра тем ведь и хороша, что там нет единственно правильного способа что-либо сделать.

{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
Последние сообщения с форума
  • Автор
    Тема в разделе: Корзина
    Просмотров: 26
    Ответов: 1
  • Автор
    Тема в разделе: Новости
    Просмотров: 75788
    Ответов: 0
  • Автор
    Тема в разделе: Вопросы по игре
    Просмотров: 1577399
    Ответов: 12701
  • Автор
    Тема в разделе: В ангаре у Боба
    Просмотров: 9735
    Ответов: 55
  • Автор
    Тема в разделе: Технические вопросы
    Просмотров: 26078
    Ответов: 68
    Все сообщения..
    Полный список последних сообщений
    Loading...

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