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

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

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


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

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

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


Сколько нужно дельты?
Чтобы попасть в сферу действия Муны, нужно - сюрприз - выйти на орбиту с апоцентром не менее 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), и величина этого момента тем больше, чем больше синус угла между скоростью в КЦСО и радиус-вектором "Муна-аппарат". Поскольку этот угол меньше, когда Муна находится впереди аппарата, то при заходе с этого направления орбита относительно Муны всегда будет прямая.
KerboScript в примерах и задачах. Часть 3. Предсказание орбиты. Летим на Муну.

Рисунок 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 км. В таких случаях имеет смысл сделать коррекции курса для подстройки орбиты. В продолжении разберём, как выполнять эти коррекции и как вычислить время начала коррекции по высоте, на которой она должна производиться.

Скрипты и крафт:
ships.zip [6,94 Kb] (cкачиваний: 44)

- + +20
У Вас НЕТ прав на выставление оценки для этой новости.
Для выставлени оценки необходимо пройти регистрацию на сайте.
Если Вы уже зарегистрировались, то войдите на сайт.
  1. 0
    Это alex.omega665 alex.omega665 - #10 0
    0
    А не подскажете, IDE под это дело есть?
    Или писать все в обычном текстовом редакторе, без подсветки синтаксиса и автодополнений?
    »
    Написано:
    Группа: Посетители, Публ/Комм: 0/5
     
    1. 0
      Это Soul Soul - #20 0
      +1
      Ээээ... vim? (шучу)
      »
      Написано:
      Группа: Посетители, Публ/Комм: 0/30
       
    2. 53
      Это Lynx Lynx - #30 0
      +1
      Что-то в таком виде можно организовать собственными силами
      https://www.reddit.com/r/Kos/comments/322us6/i_made_a_userdefined_language_for_
      notepad/
      »
      Написано:
      Группа: Хорошие котейки, Публ/Комм: 0/511
       
    3. 9
      Это Pand5461 Pand5461 - #40 0
      +1
      Алекс, что-то есть на форумах, но последний раз обновлялось год назад.
      Вероятно, для Emacs можно дополнение написать, но это нужно хорошо знать и kOS, и ELisp.
      »
      Написано:
      Группа: Модераторы, Публ/Комм: 13/73
      Мои kOS скрипты: https://github.com/pand5461/kOS
       
    4. 0
      Это alex.omega665 alex.omega665 - #50 0
      0
      Хм, всем спасибо за информацию)
      Надо будет поковырять эту тему)
      »
      Написано:
      Группа: Посетители, Публ/Комм: 0/5
       
  2. Выкл.
    Это Dvidio Dvidio - #60 0
    0
    Гайд интересный, хорошо оформлен.Тоже идея не то что бы плоха.Однако, как по мне полеты с аффтопелодом разрушают одну из очень важных состовляющих геймплея - КСП это СИМУЛЯТОР космческой программы.Учитывая, что начав использоать эти скрипты для аффтапелода мы получим лишь игру в ангаре и посадку на скучные и однообразные планеты. Они того не стоят.

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

    Посту плюс за хорошее оформление и грамотное пояснение.
    »
    Написано:
    Группа: Стримеры, Публ/Комм: 52/707


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

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

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

      Да ради бога. Игра тем ведь и хороша, что там нет единственно правильного способа что-либо сделать.
      »
      Написано:
      Группа: Модераторы, Публ/Комм: 13/73
      Мои kOS скрипты: https://github.com/pand5461/kOS
       
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Чат
  • Опрос
  • Стримы
    Хотите ли Вы сотрудничества между проектами SpaceDock.ru и Ангар Джеба?
Последние комментарии
  • Kuzminattor Kuzminattor написал в
    Проект "Покорение" (всего 8 комм.)
    1) Я вроде как никогда не говорил, что я умный
    2) Атмосферное торможение я применял и 4 года назад. А для расчета экономии после этого маневра (в реальной жизни) нужно обратиться к гидрогазоаэродинамике, а это целый курсач получиться. И что-то мне подсказывает что в КСП атмосфера упрощена, но у меня нет времени в этом разбираться, я же не только в игрушки дома играю....
    3) Дураки есть везде, с этим особо ничего не поделаешь. Вот и получаем, что вешают вверх ногами, ломают или гнуть другие элементы.
    4) Модель вроде как освоена, но тебе, конечно, виднее. И если что ракетостроение и космические перелеты это немного разные специальности, как собственно и спутники и тепловые щиты и т.д.
    5) Я бы предложил закончить этот бесполезный разговор, он нас ни к чему не приведет
  • Marschig Marschig написал в
    Rocket Science! RS-125, -250, ... (всего 13 комм.)
    Маленькая деталь: оно взлетает с уровня моря, а не с высочайшей точки Ив :)
    Не говоря уже о количестве мест и прочего оборудования.
  • Slv Slv написал в
    Проект "Покорение" (всего 8 комм.)
    Сорри, но ты разбудил мою зверушку -- тролля. :-))) Давай в таком случае пройдемся по пунктам?

    Цитата: Kuzminattor
    Боюсь тебя удивить, но и про карту я знаю.(хотя свою первую ракету на Дюну и обратно я построил "на глаз")
    Если ты внимательно читал букавы (а хотя кому это надо?), то, возможно, обратил внимание, что я дважды применил атмосферное торможение, а это немного не расчетный вариант экономии топлива, я просто взял немного меньше необходимого.И Если ты умеешь считать сколько дельты будет сэкономлено после такого маневра, то буду рад узнать.

    Короче, если для того чтоб начать применять торможение об атмосферу тебе надо 4 года и "инженеру ракетостроителю" после института? все еще нужна помощь в подсчете сэкономленной дельты, ты не такой умный как думаешь, это раз.


    Цитата: Kuzminattor
    Что касается ракетостроения и "продвинутых" инженеров, вот тут, конечно, извини, но я это воспринимаю как личное оскорбление. Ты очевидно не разбираешься как и что делается в ракетно-космической технике, никто никогда не будет строить ракету в одно лицо, этим занимается очень большая команда на разных производственных площадках, а на космодроме/ военной части уже собирают как пазл по готовым чертежам, так что то что мы видим в КСП можно назвать сказкой.

    Да, но кое какие товарищи (и не уверяй меня что это был простой мимокрокодил) умудряются забить деталь вверх ногами с помощью молотка или погнуть какой-нибудь штифт... Я не говорю что это сделал ИМЕННО ТЫ, но кто то все же сделал?


    Цитата: Kuzminattor
    Так же КСП довольно поверхностно отражает все процессы протекающие во время полета РН, но для людей не посвященных этого достаточно.
    Если даже настолько упрощенная модель полета ракеты не освоена "инженером ракетостроителем" за 4 года в достаточном объеме, то какие реальные ракеты он сможет построить?

    PS и все же минус я тебе за это творение не вкатил -- сгонять на Дюну это все же достаточно не простая задача, хотя и плюс тоже не стал ставить.
  • Kuzminattor Kuzminattor написал в
    Проект "Покорение" (всего 8 комм.)
    Боюсь тебя удивить, но и про карту я знаю.(хотя свою первую ракету на Дюну и обратно я построил "на глаз")
    Если ты внимательно читал букавы (а хотя кому это надо?), то, возможно, обратил внимание, что я дважды применил атмосферное торможение, а это немного не расчетный вариант экономии топлива, я просто взял немного меньше необходимого.И Если ты умеешь считать сколько дельты будет сэкономлено после такого маневра, то буду рад узнать.

    Что касается ракетостроения и "продвинутых" инженеров, вот тут, конечно, извини, но я это воспринимаю как личное оскорбление. Ты очевидно не разбираешься как и что делается в ракетно-космической технике, никто никогда не будет строить ракету в одно лицо, этим занимается очень большая команда на разных производственных площадках, а на космодроме/ военной части уже собирают как пазл по готовым чертежам, так что то что мы видим в КСП можно назвать сказкой.
    Так же КСП довольно поверхностно отражает все процессы протекающие во время полета РН, но для людей не посвященных этого достаточно.
  • Elektrichker Elektrichker написал в
    ЖД "Мексиканский тушкан" (всего 1 комм.)
    Попробуй рельсотрон теперь собрать.) А вообще можно такое же, но с практическим применением? Можно на космической базе систему перемещения всякой дичи сделать вроде стыкуемых модулей, но оно же не долетит даже до ноо.
  • Freze Freze написал в
    Космолет + Kerbal Operating Sy ... (всего 17 комм.)
    Тут немножко по-другому делается.
    1 Четко осознать возможности крафта.
    2 Наметить условия, попав в которые мы благополучно приземлимся на ровную поверхность вокруг КСЦ. Например: мы на высоте 100м и скорости 120м\\с+-10м\\с в 3.5км от центра ксц. С такими вводными мы запускаем скрипт посадки.
    3 Прикинуть участки снижения для достижения благоприятных условий посадки. Например если мы снизились до 20км в 100км от КСЦ прикатить снижение и лететь на скорости 1500. На дистанции 50км снизится до какой-то высоты и какрй-то скорости... итп
    Под это дело, скорее всего придется конструкцию доработать(Рассчитать запас топлива для полета в атмосфере, установить аэротормоз, тормозной парашют итп ).
Все комментарии
Обновления на форуме
170 Всего
3 Польз.
167 Гостей
Google, i_whisper, Яндекс, Marschig, GektorZap
Онлайн список
Новостей на страницу:
Наверх