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

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

Часть 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, или
    KerboScript в примерах и задачах. Часть 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.
    Более аккуратная оценка использует формулу Циолковского:
    KerboScript в примерах и задачах. Часть 2. Простейшие орбитальные манёвры

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

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

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

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

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

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

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

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

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

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


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

- + +21
У Вас НЕТ прав на выставление оценки для этой новости.
Для выставлени оценки необходимо пройти регистрацию на сайте.
Если Вы уже зарегистрировались, то войдите на сайт.
  1. 4
    Это Lucifer1981 Lucifer1981 - #10 0
    0
    ???????????????????????????????????????????????????????????????????????????????
    ???????????????????????????????????????????????????????????????????????????????
    ???????????????????????????????????????????????????????????????????????????????
    ????????????!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !!!!!!!!!!!!
    »
    Написано:
    Группа: Посетители, Публ/Комм: 6/122
     
    1. 4
      Это Andeeez Andeeez - #20 0
      0
      А какой смысл, сколько эмоций в этом комментарии... прям расплачусь сейчас... это шедевр...
      »
      Написано:
      Группа: Посетители, Публ/Комм: 6/150
       
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Чат
  • Трансляции
  • Информация
    На какой стороне Силы Вы?
Последние комментарии
  • Rudolf Rudolf написал в
    The Grand Tour Кербин - Муна - ... (всего 7 комм.)
    Огромное спасибо!
    Я уже убедился, что в изначальной концепции крафта до Дюны добраться труда не составит, но вот вернуться на Кербен...
  • Lynx Lynx написал в
    The Grand Tour Кербин - Муна - ... (всего 7 комм.)
    Так-то нормально для новичка, но Кербен?
  • Marschig Marschig написал в
    The Grand Tour Кербин - Муна - ... (всего 7 комм.)
    По доработке.
    Надо выкинуть лишние детали: ТТУ, крылышки, RCS двигатели, бак с монотопливом, LV-T30 с лендера (для Дюны всё равно хватит одного LV-909). Тем самым снизим TWR на старте до подходящего уровня и увеличим запас dV на 1300 м/с.

    Векторинга двигателей для управления достаточно, носитель взлетает баллистической кривой в прогрейд за ~3200 м/с, на низкой орбите остаётся ~7 км/с.



    Аппарат, безусловно, избыточен для заявленных целей, что на Муну-Минмус, что на Дюну. Но что от него требуется делает, и статья оформлена пристойно для первого раза. Поставил плюс :)
  • Rudolf Rudolf написал в
    The Grand Tour Кербин - Муна - ... (всего 7 комм.)
    Последовательность исправлена, перезалил крафт в оригинальной версии, без парашютов. Спасибо, буду дорабатывать cold_sweat
  • TAL TAL написал в
    The Grand Tour Кербин - Муна - ... (всего 7 комм.)
    Конструктивную критику? Ок, это мы могем :)
    1 В файле сохранения нарушена последовательность срабатывания ступеней
    2 Паращюты 1-й и 2-й "возвращаемой" ступени несработают на той высоте и с той скоростью - убрать
    3 РН неустойчив и болтается как сосиска - смог вывести на орбиту только "буквой Г"
    4 Монопропилен ненужен - поставить один большой САС
    5 Слишком много посадочных ног
    6 Излишне мощные боковые движки лендера - Терьеры 909 самое то
    7 Боковые баки лендера соединить с центральным шлангами, а движки убрать
    8 Лендер неустойчив при посадке - схема с тремя боковыми баками надежнее

    До Дюны дотянул, но избыточные боковые движки весь взлет испортили.
  • Rudolf Rudolf написал в
    The Grand Tour Кербин - Муна - ... (всего 7 комм.)
    Спасибо, это я недоглядел, всё исправил cold_sweat
Все комментарии
Обновления на форуме
179 Всего
9 Польз.
170 Гостей
Онлайн список
Новостей на страницу:
Наверх