KerboScript в примерах и задачах. Часть 2. Простейшие орбитальные манёвры

Kerbal Space Program » Гайды

Часть 0 и часть 1 гайда должны были научить читателя писать простой автопилот для вывода спутника на орбиту. В этой части используем предыдущие наработки и некоторые сведения из орбитальной механики для запуска первого спутника будущей ретрансляционной сети.

Для низко- или среднеорбитальных группировок идеально использование ненаправленных антенн в сети, поскольку они соединяются с любым аппаратом, который находится в зоне действия. Из начальных антенн Communotron 16 имеет дальность действия 2500 км, что достаточно для сети из четырёх спутников, расположенных по углам квадрата на круговой орбите высотой 2500/√2 км - RKerbin = 1167 км. В пределах этой высоты можно построить "третьсинхронную" орбиту с периодом 2 часа на высоте 1067 км. Спутник на такой орбите будет проходить над каждой точкой экватора дважды в сутки в одно и то же время.

Конструкция спутника


Технические подробности:

Первый коммуникационный спутник

Рисунок 1. Низкоорбитальный коммуникационный спутник.

Кроме вывода спутника на целевую орбиту, хотелось бы также организовать пуск без ненужного засорения космоса. Вариантов два: либо изначально вывести на траекторию с перицентром внутри атмосферы и потом слегка довывести спутником, либо после отделения спутника затормозить последнюю ступень и сбросить её в атмосферу. По причинам, которые будут ясны позднее, предлагаю реализовать второй вариант. Для этого хватит пары старых добрых сепратронов на носитель поставим свой командный модуль, модуль kOS и гиродины.

Памятуя об избыточных световых и плазменных эффектах в предыдущей части, добавим в скрипт вывода дросселирование двигателя при достижении тяговооружённости выше определённого уровня.
function CapTWR {
  parameter maxTWR is 3.0.
  local g0 to Kerbin:mu/Kerbin:radius^2. // TWR считается относительно веса на уровне моря
  lock throttle to min(1, ship:mass*g0*maxTWR / max( ship:availablethrust, 0.001 ) ). // без max() будет деление на ноль при пропадании тяги
}

Функция схода с орбиты:
function DumpRocket {
  lock steering to ship:retrograde.
  wait until vang(facing:vector, retrograde:vector) < 5.
  lock throttle to 1.
  wait until periapsis < 10000.
  lock throttle to 0.
}

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

Чтобы вручную не писать каждый раз в терминале команды на копирование и запуск файла, поместим их в загрузочный скрипт. Загрузочный скрипт - это та программа, которая запускается при загрузке крафта в память - это может происходить как при старте, так и при переключении на крафт, находящийся вне Physics Range. Скрипты для начальной загрузки можно выбирать только из тех, которые лежат в папке Ships/Script/boot. Выбрать необходимый скрипт можно в редакторе по ПКМ на kOS модуль.
ВАЖНО: у каждого модуля в крафте загрузочный скрипт задаётся отдельно. Дальше мы это используем для задания работы спутника после отделения от носителя.
Создаём файл Ships/Script/boot/KommsatLVboot.ks следующего содержания:
copypath("0:/KommsatLV.ks","launch.ks"). // здесь должен быть путь к скрипту для ракеты
// 0:/ - это папка Ships/Script/
runpath("launch.ks").

В kOS модуле на носителе выбираем KommsatLVboot.ks в качестве загрузочного скрипта. Теперь программа ракеты запускается при старте автоматически.

Для вывода спутника на целевую орбиту нужно, кроме задачи расчёта и выполнения гомановского перехода, как-то передать на него управление после разделения с носителем. С одного kOS модуля на другой переключиться нельзя, командой switch только можно переключить путь по умолчанию, откуда модуль считывает файлы. Можно ввести команды "с земли" через терминал, но траектория вывода такова, что к моменту разделения спутник уже за горизонтом, и нужно целую орбиту ждать его прохода над ЦУПом. Поэтому сделаем так, чтобы спутник мог сам понять, что он уже выведен на орбиту. Есть (вероятно) много способов это сделать, но я предпочитаю со спутника проверять, не появился ли в файловой системе определённый файл, а с носителя его создавать перед отделением.

Итак, начинаем писать файл Ships/Script/Kommsat.ks

wait until exists("released.txt"). // ожидаем появления файла
wait 20. // даём ступени сойти с орбиты
satprogram(). // а вот это надо ещё написать

В программе ракеты, естественно, разделение нужно реализовать в виде

  lock steering to up.
  wait 10.
  
  print "Releasing payload.".
  create("2:/released.txt"). // kOS модуль спутника для ракеты имеет номер 2, а для спутника номер 1
  stage.

Теперь переходим к программе действий спутника после отделения. Перво-наперво, ориентироваться солнечными панелями на свет. Смотрим ещё раз рисунок 1. Командный модуль при сборке в редакторе я не поворачивал, поэтому ориентирован он стандартным образом - верх на юг, нос вверх, правая сторона на запад. Таким образом, панели у него слева и справа. Значит, если повернуть спутник верхней стороной на солнце, а потом на 90o по крену в любую сторону, то панели будут смотреть на солнце. Удобно то, что солнце в экваториальной плоскости, поэтому направление на него с орбиты Кербина всегда (почти) перпендикулярно направлению на север (или юг).

function AlignToSun {
  lock steering to lookdirup(north:vector,Sun:position) + R(0,0,90).
}

Теперь будем организовывать трансфер.
  1. Вычисляем высоту целевой орбиты, опираясь на желаемый период обращения 2 часа.
    Используем очевидную формулу T = 2πR/V, где R = H + RKerbin - радиус орбиты, круговая скорость V рассчитывается по формуле V = (μ/R)1/2. Итого получаем T = 2πR3/2/μ1/2, или
    KerboScript в примерах и задачах. Часть 2. Простейшие орбитальные манёвры

    μ - гравитационный параметр центрального тела, равный произведению его массы на универсальную гравитационную постоянную
  2. Вычисляем скорость в перицентре (более подробный гайд на эту тему).
    Как известно, полная механическая энергия тела на орбите определяется величиной большой полуоси и равна ε = -μ/2A (на единицу массы). Из закона сохранения энергии получаем, что -μ/2A = -μ/r + v2/2, или

    Большая полуось переходной орбиты будет равна, естественно, A = RKerbin + (Hnow + Htarget)/2, а расстояние от центра Кербина в её перицентре будет r = Hnow + RKerbin.
  3. Делаем манёвр перицентра в прогрейд с ΔV = VPe - Vnow.
  4. Аналогичным образом рассчитываем и выполняем манёвр апоцентра.

Манёвры перицентра и апоцентра будем проводить через узлы маневрирования. Из kOS можно получить узел как структуру, имеющую суффиксы

:eta         // оставшееся до манёвра время
:deltav      // вектор оставшегося изменения скорости
:prograde    // dV в направлении прогрейда
:radialout   // dV в радиальном направлении
:normal      // dV в нормальном направлении
:orbit       // предсказываемая орбита после выполнения манёвра

Поля :eta, :prograde, :radialout и :normal можно как получить, так и изменить, остальные можно только получить. Узел создаётся командой

node(utime, radial, normal, prograde)

где utime - это время, на которое ставится узел.
Чтобы получить орбиту после манёвра, нужно добавить его в план полёта. Это делается командой add. Удалить узел можно командой remove.

set nd to node(time:seconds + 120, 0, 0, 10). // 10 м/с в прогрейд через 2 минуты
add nd.  // добавили узел на траекторию
print nd:orbit:apoapsis.  // печать апоцентра после выполнения

Напишем универсальную функцию для выполнения произвольного узла манёвра. Логика её работы:
  1. Оценить время выполнения манёвра.
    Грубая оценка, использующая начальную массу аппарата и максимальный уровень тяги - это Δt = ΔV·m0/Fmax.
    Более аккуратная оценка использует формулу Циолковского:

    из которой нехитрыми преобразованиями получаем окончательную формулу

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

    Расчёт манёвра вывода на переходную орбиту по периоду конечной круговой орбиты:

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

    Самым последним шагом сделаем тонкую подгонку периода орбиты.

    Наконец, соберём всё это в функцию работы спутника.

    Функция nextmode() будет устанавливать следующий режим работы спутника. Но не только. Дело в том, что при перезагрузке спутник начнёт выполнять всю программу сначала, а этого не хочется. Нужно, чтобы он переходил к первому незаконченному пункту и продолжал с него. Для этого заведём на аппарате вспомогательный файл, в который функция nextmode() будет писать текущий режим работы. При перезагрузке сперва будем читать его, а потом уже запускать satprogram(). Делаем это командой log, которая дописывает строчки в конец файла. Будем передавать ей на печать команды смены режима работы спутника, а писать попросим в файл .ks.

    Теперь программы носителя и спутника полностью готовы, есть только одно "но": программа спутника занимает более 5 кБ и не вмещается в ёмкость накопителя малого модуля kOS по умолчанию. Поэтому в редакторе нужно поменять ёмкость накопителя на 10 кБ, после чего всю конструкцию можно запускать.
    На орбите

    Рисунок 2. Себяшка на орбите.

    Видео вывода, крафт (нужны kOS и RemoteTech) и скрипты:


    Гайд получился и так довольно длинным, поэтому завершение сети переносится в следующую часть.
KerboScript в примерах и задачах. Часть 2.5. Триггеры. Завершение спутниковой сети
28 мар 2017 в 03:52, Гайды
Kastronomicon, маяк Кербина
11 дек 2016 в 12:57, Гайды »
  1. Lucifer1981

    Lucifer1981 @Евгений 28 марта 2017 10:51

    ???????????????????????????????????????????????????????????????????????????????
    ???????????????????????????????????????????????????????????????????????????????
    ???????????????????????????????????????????????????????????????????????????????
    ????????????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !!!!!!!!!!!!

    1. Andeeez

      Andeeez Гость 28 марта 2017 11:21

      А какой смысл, сколько эмоций в этом комментарии... прям расплачусь сейчас... это шедевр...

{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
Последние сообщения с форума
  • Автор
    Тема в разделе: В ангаре у Боба
    Просмотров: 7400
    Ответов: 55
  • Автор
    Тема в разделе: Технические вопросы
    Просмотров: 24639
    Ответов: 68
  • Автор
    Тема в разделе: Моды
    Просмотров: 1538
    Ответов: 2
  • Автор
    Тема в разделе: В ангаре у Боба
    Просмотров: 207219
    Ответов: 1484
  • Автор
    Тема в разделе: Игровой процесс
    Просмотров: 1831
    Ответов: 1
    Все сообщения..
    Полный список последних сообщений
    Loading...

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