Автор: 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
       
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Чат
  • Трансляции
  • Информация
    На какой стороне Силы Вы?
Последние комментарии
  • Secairus12 Secairus12 написал в
    ТАКР Адмирал Кузнецов (всего 13 комм.)
    Судя по деталям крыльев, картон.
    (автор, если что - мне очень даже нра)
  • lllypa lllypa написал в
    ΔVcalculator (ОБНОВЛЕНИЕ 1.1) (всего 12 комм.)
    О! это мысль. пожалуй сделаю.

    Кинь в меня, пожалуйста, конфигом РСС. Делов по его вкорячиванию на час-полтора.. Зато хорошее дело.
  • Soul Soul написал в
    ΔVcalculator (ОБНОВЛЕНИЕ 1.1) (всего 12 комм.)
    Тоже вариант, чёта не подумал... И правится быстро, и доступно всем без скачивания.
  • Басила Басила написал в
    ΔVcalculator (ОБНОВЛЕНИЕ 1.1) (всего 12 комм.)
    А что мешает на гугульдокс запихнуть табличку и юзать её из бравзера?) мне дома офис лень ставить, в тех редких случаях, когда он нужен - так и делаю)
  • KTO_TO KTO_TO написал в
    ТАКР Адмирал Кузнецов (всего 13 комм.)
    а броня хорошая? (у реплики)
  • KTO_TO KTO_TO написал в
    Мод SSTO Parts Plus - тест (всего 6 комм.)
    ладно, ты мне нурсы сделал
Все комментарии
Обновления на форуме
131 Всего
5 Польз.
126 Гостей
Google, Яндекс, aleksei1, Rsa, KTO_TO, Secairus12, Alexa, SpacePixel
Онлайн список
Новостей на страницу:
Наверх