Космолет + Kerbal Operating System (KOS)


Предисловие.

В данной статье я хочу продемонстрировать космолет, который выводит грузы на низкую опорную орбиту в полностью автоматическом режиме, включая взлет, гравитационный маневр, построение орбиты, сброс груза, сход с орбиты и посадку.
Для автоматизации была использована кербальская операционная система - Kerbal Operating System (KOS), имеющая в своей основе скриптовый язык программирования. Эта система позволяет автоматизировать почти все процессы космических программ Кербала.
Здесь будет поэтапно рассмотрен процесс программирования и алгоритмизации вывода на орбиту для космолета, каждому этапу соответствует отдельная функция.
В процессе составления программы будут использованы только общие понятия орбитальной механики и физики, без использования формул и высшей математики - это связано в первую очередь с тем, что вывод космолета на орбиту существенно сложнее традиционных ракет, и математический расчет полета займет очень большой объем вводных данных и потребует много времени. Кроме того, конструкции космолетов порой очень сильно отличаются друг от друга, при этом они имеют очень большую вариабельность режимов работы двигателей в атмосфере и разные коэффициенты воздушного сопротивления, которые еще при этом меняются от высоты, и иные особенности. Ввиду вышеперечисленных причин, написать более-менее общий математический алгоритм для большинства космолетов без использования сложных формул и знаний физики не представляется возможным, это уже тема отдельной статьи.
А целью статьи является как раз составление максимально простого и универсального скрипта, который был бы способен автоматизировать процесс полета для большинства конструкций космолетов.

Описание демонстрационного космолета и его конструкция.

Для данной статьи был создан демонстрационный беспилотный космолет "Sparrow" ("Воробей") по классической компоновке, за основу конструкции был взят одноименный пилотируемый космолет из моих предыдущих статей.

Космолет "Воробей" имеет один двигатель CR-7 Рапира, один грузовой отсек CRG-04, два топливных бака-адаптера Мк2 с 2.5 тоннами ракетного топлива в одном и 180 галлонами жидкого топлива в другом, один бак-адаптер для жидкого топлива NCS Adapter с 24 галлонами топлива, два радиальных воздухозаборника XM-G50 Radial Air Intake. В качестве командного модуля использован горизонд ОКТО2, для ориентации в космосе установлен гиродин Small Inline Reaction Wheel. Для отделения и установки груза в грузовом отсеке установлен отделитель TD-06. Для аэродинамического управления использованы три элерона Eleron4, два винглета Advanced Canard, два малых дельтавидных крыла Small Delta Wing и плюс еще один аэродинамический обтекатель Small Nose Cone. Шасси установлено трехстоечное, один LY-10 и два LY-35. Для вертикальной посадки опционально устанавливается один парашют Mk2-R в грузовом отсеке. Для обеспечения космолета электричеством на весь полет установлены две батареи Z-200 на 200 единиц электроэнергии каждая.

Сухая масса космолета (с парашютом) - 4.17 тонны, масса заправленного - 7.19 тонны, масса снаряженного (с грузом) - 10.69 тонны. Отношение массы ПН к массе заправленного космолета - 48.67%, процент ПН составляет 32.74%, максимальная грузоподъемность на 75 км круговую орбиту - 3.5 тонны.
Космолет при разгоне в атмосфере разгоняется до ~1840 м/с на высоте 25 км.

В ангаре.

Разработка алгоритма и программного скрипта.

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

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

-сначала взлет с ВПП и разгон до требуемой скорости;-
затем начало гравитационного поворота в атмосфере для формирования суборбитальной траектории;
-затем после завершения атмосферного разгона на высоте 25 км переключение режима двигателя и завершение гравитационного маневра;
-затем поддержка требуемой высоты апоцентра и подъем до него;
-затем расчет начала и времени прожига для скругления орбиты;
-затем сброс груза на орбите;
-затем прожиг для торможения на орбите и сход с нее;
-и наконец непосредственно посадка, на парашюте или по самолетному.

Теперь приступим к разработке самого скриптового кода, каждый этап рассматривается отдельно. Не забудем, что в разработанной программе вводные данные оптимизированы именно для "Воробья", для других космолетов нужно вводить иные полетные данные.

Листинг 1. Начало и окончание программы.

Для начала напишем приветственное слово игроку и инициализируем выполнение первой функции взлета - это функция Ascent, код которой (и других) приведен в дальнейшем листинге. В переменной LandAlt мы сохраняем высоту от командного модуля до поверхности - это понадобится для посадки и команды уборки шасси, в переменной OrbitAlt мы прописываем нужную нам высоту круговой орбиты, в переменной OrbitInclination мы задаем требуемый наклон орбиты, в донном случае 0 градусов (азимут в 90 град. соответствует наклону орбиты в 0 град.). Так как мы начинаем старт с экватора, то можно задать любой наклон орбиты. Наконец, в переменной-семафоре TypeLand задается желаемый тип посадки: 0 - это самолетная, 1 - это вертикальная на парашюте. Строка кода WAIT UNTIL FALSE не дает преждевременно завершится работе программы и ждет команды игрока на завершение работы нажатием комбинации клавиш Ctrl+C.
CLEARSCREEN.
PRINT "HELLO, KERBONAUT!".
SET LandAlt TO ALT:RADAR. //Задаем высоту от модуля до ВПП
SET OrbitAlt TO 75000. //Задаем нужную высоту орбиты
SET OrbitInclination TO 90. //Задаем требуемый наклон орбиты
//Задаем нужный тип посадки: 0-самолетная, 1-вертикальная
SET TypeLand TO 0.
Ascent ().
.
.
.
.//Здесь будут расположены функции для каждого этапа полета
.
.
.
WAIT UNTIL FALSE. //Для выхода из программы нажмите Ctrl+C

Листинг 2. Функция взлета и разгона.

Приступим к написанию кода для функции взлета. Оптимальным решением для постоянной проверки состояния полета мне представляется использование вложенных триггеров - так код получается компактным и эффективным. Они будут использованы и в других функциях.
Вначале обязательно отключаем САС - кербоскрипт с ним, к сожалению, конфликтует. Строка кода SET STEERINGMANAGER:PITCHPID:KP задает угловую скорость цели в направлении тангажа. Проще говоря, она задает точность и скорость "прицеливания" носа корабля на заданный угол тангажа. Угол тангажа для взлета задается минимально возможный, чтобы космолет не набрал слишком большую высоту при разгоне. Оптимальная высота окончания разгона - 300-400 м. Чтобы после взлета быстро выровнять нос космолета на заданный угол в 3 град., ставим значение на 1. Для тяжелых и неповоротливых космолетов лучше ставить значение в пределах 0.1-0.5. Потом в условии триггера прописываем взлетную скорость, для Воробья это ~130-140м/с.
Как только высота будет в 2 раза больше стояночной (LandAlt умножаем на 2), то отдаем команду на уборку шасси и разворот в заданном направлении (строка HEADING(OrbitInclination,3)).
Теперь мы должны разогнаться до необходимой скорости, при которой тяга CR-7 будет наиболее высокой. Оптимальная разгонная тяга для большинства космолетов составляет 400-420 КН - если гнать больше, то потратим лишнее топливо и сгорим в атмосфере, если меньше - то гравитационный маневр будет неэффективным. Данная тяга набирается при скорости 700-750 м/с. Поэтому при достижении скорости 700 м/с триггер отдает команду на переход к следующей функции - функции гравитационного маневра в атмосфере.



FUNCTION Ascent          //Функция взлета и разгона
{
SAS OFF.
BRAKES OFF.
//Задаем требуюмую "отзывчивость" тангажа
SET STEERINGMANAGER:PITCHPID:KP TO 1.
LOCK THROTTLE TO 1.
STAGE.
PRINT "WAIT TAKEOFF...".
 WHEN SHIP:GROUNDSPEED > 130 THEN //На скорости 130м/с взлет
 {
  //Угол тангажа для взлета с ВПП ставим 3 градуса
  LOCK STEERING TO R(0,0,0) + HEADING(90,3).
   WHEN ALT:RADAR > LandAlt*2 THEN //Высота уборки шасси
    {
     GEAR OFF.
     PRINT "TAKEOFF COMPLETED!".
     PRINT "WAIT RUN...".
     LOCK STEERING TO R(0,0,0) + HEADING(OrbitInclination,3).
      //По достижении 700м/с и тяги рапир в 400КН гравиповорот
      WHEN SHIP:GROUNDSPEED > 700 THEN
      {
       PRINT "RUN COMPLETED!".
       GravityTurn ().  //Переход к функции гравиповорота
      }
    }
 }
}

Листинг 3. Функция гравитационного маневра в атмосфере.

Теперь приступим к разработке кода функции для построения суборбитальной траектории в атмосферном режиме.
Из курса физики мы знаем, что корабль остается на орбите потому, что скорость корабля уравновешивает силу притяжения планеты, находясь в каждый момент времени в свободном падении, при условии, конечно, что вектор скорости направлен по касательной самой орбиты. Из этого можно сделать логичный вывод, что наиболее эффективным профилем вывода космолета будет такой, который обеспечит набор первой космической скорости (~2290м/с для Кербина) в момент подъема космолета на нужную высоту орбиты, при этом угол вектора скорости должен быть всегда параллелен поверхности планеты - т.е. 0 градусов по горизонту. Иными словами, чем меньше угол тангажа (до определенного предела) от горизонта при суборбитальном разгоне, тем лучше для эффективности профиля вывода. К сожалению, в атмосфере мы имеем ограничение скорости ввиду перегрева космолета, поэтому угол тангажа придется в любом случае увеличивать.
Еще одна важная особенность - двигатель CR-7 в атмосферном режиме работы имеет примерно в 10 раз больший УИ, чем в ракетном режиме. Поэтому, в отличие от традиционных ракет, для которых важно как можно быстрее покинуть плотные слои атмосферы, космолеты же должны, наоборот, как можно дольше оставаться в атмосфере, для набора максимально возможной скорости, не менее ~1800-1880 м/с, что позволит брать на борт как можно меньшее количество крайне неэффективного ракетного топлива для работы CR-7 в вакууме.
Для Воробья ставим угол тангажа на 13 град. - HEADING(OrbitInclination,13), это минимально возможный угол при котором космолет не сгорит от перегрева. Причем угол в 13 градусов - это минимально возможный угол для почти всех космолетов, полететь под меньшим углом вам вряд ли удастся. Для больших и не слишком тяговитых космолетов ставьте угол тангажа в пределах 14-16 град. Далее возникает один важный момент - с какой скоростью мы должны повышать угол тангажа (ограничить угол атаки)? Здесь нужно следовать следующему правилу - лучше меньший угол тангажа и бОльшая скорость подъема, чем бОльший угол тангажа и меньшая скорость подъема. Иными словами, чем медленнее мы поднимаем нос космолета до заданного угла тангажа, тем лучше.
За скорость подъема (точнее, реагирования) по тангажу отвечает строка кода SET STEERINGMANAGER:PITCHPID:KD - она устанавливает скорость реакции на изменение по тангажу. Для Воробья ставим значение на 50, это позволит максимально медленно поднять нос до 13 градусов, избежав при этом критического перегрева. Для больших и менее тяговитых космолетов ставьте значение в пределах 40-20, для большей скорости подъема, т.к. они поднимаются медленнее и могут перегреться в атмосфере. Вообще подбор оптимального угла тангажа и его угловой скорости - дело сложное, нужно индивидуально подбирать значения для каждого космолета таким образом, чтобы нагрев в атмосфере не доходил до максимально возможной жаростойкости деталей (как правило это 2400К). Причем использование термометра и строки кода SHIP:SENSORS:TEMP для контроля нагрева не подходит - он банально сгорит при температуре выше 1200К, поэтому параметры придется подбирать вручную.
Еще необходимо строками кода SET STEERINGMANAGER:ROLLPID:KP и SET STEERINGMANAGER:ROLLPID:KD жестко ограничить вращение космолета по крену. Дело в том, что САС у нас постоянно отключен, и при атмосферном разгоне возможны значительные колебания по крену, что приводит к потере скорости, чего допускать нельзя.
Далее, как только мы прошли точку наибольшего нагрева, на высоте примерно 12-14 км, нам нужно понизить угол тангажа, точнее, отпустить положение космолета по направлению скорости (в прогрейд LOCK STEERING TO R(0,0,0)+PROGRADE), для избежания потерь скорости и поднятия перицентра как можно выше к поверхности. Однако тут есть нюанс - если мы направим космолет в прогрейд сразу после прохождения наивысшей термальной точки, то угол тангажа к горизонту на высоте ~25 км будет почти пологим, и после выполнения прожига в ракетном режиме для поднятия апоцентра до высоты орбиты, наш космолет будет находиться немалое время в еще достаточно плотных слоях атмосферы, и она будет тормозить его при восхождении к апоцентру, сбрасывая при этом сам апоцентр. Чтобы поддерживать высоту апоцентра до выхода за пределы атмосферы, космолет будет выполнять короткие "постреливания" двигателем, и потратит на это примерно 50-70dV, что слишком много. Нам нужно уложиться в 10-15dV, это оптимальный расход дельты для поддержки высоты апоцентра. Поэтому существует оптимальная для каждого отдельного космолета высота, в которой мы переводим космолет в положение прогрейда (для Воробья это 16 км), при которой наш космолет после прожига в ракетном режиме наберет достаточную высоту для быстрого вылета из атмосферы. Напоминаю, что наша задача при полете в атмосферном режиме (до высоты 25 км) поднять как можно выше не апоцентр, а именно перицентр, до высоты от центра Кербина в -335 км, плюс-минус 5 км - это и будет показателем эффективного профиля вывода в атмосферном режиме двигателя.
Далее мы приближаемся к высоте ~25 км, при которой тяга CR-7 упадет настолько, что скорость и перицентр перестают расти, и пришла пора переключить режим двигателя на ракетный, который выполняет строка кода TOGGLE AG1, как только триггер обнаружит высоту большую чем 25 км (WHEN SHIP:ALTITUDE > 25000 THEN). Затем следующий за ним триггер проверяет, не превысил ли апоцентр заданную высоту орбиты, и если да, то отключает двигатель и переводит управление к следующей функции - функции поддержки апоцентра и восхождения до него ApoapsisSupport.



FUNCTION GravityTurn  //Функция гравитационного маневра
{
PRINT "WAIT GRAVITY TURN...".
//Задаем требуюмую "отзывчивость" тангажа
SET STEERINGMANAGER:PITCHPID:KP TO 10.
//Задаем требуюмую угловую скорость тангажа
SET STEERINGMANAGER:PITCHPID:KD TO 50.
//Задаем требуюмую "отзывчивость" крена
SET STEERINGMANAGER:ROLLPID:KP TO 1.
//Задаем требуюмую угловую скорость крена
SET STEERINGMANAGER:ROLLPID:KD TO 100.
//Угол начала гравиповорота ставим 13 градусов
LOCK STEERING TO R(0,0,0) + HEADING(OrbitInclination,13).
 WHEN SHIP:ALTITUDE > 16000 THEN //Угол окончания гравиповорота
 {
  LOCK STEERING TO R(0,0,0) + PROGRADE.
   WHEN SHIP:ALTITUDE > 25000 THEN //На 25км переключаем рапиру
   {
    SET STEERINGMANAGER:PITCHPID:KP TO 5.
    SET STEERINGMANAGER:ROLLPID:KP TO 5.
    SET STEERINGMANAGER:PITCHPID:KD TO 1.
    SET STEERINGMANAGER:ROLLPID:KD TO 1.
    TOGGLE AG1.
     WHEN APOAPSIS > OrbitAlt THEN
     {
      PRINT "GRAVITY TURN COMPLETED!".
      LOCK THROTTLE TO 0.
      ApoapsisSupport (). //Переход к функции апоцентра
     }
   }
 }
}

Листинг 4. Функция поддержки высоты апоцентра.

Данная функция достаточно проста, три вложенных триггера проверяют текущую высоту апоцентра до тех пор, пока космолет не выйдет за пределы атмосферы - т.е. когда высота превысит 70 км, где атмосфера уже не будет тормозить восхождение космолета к апоцентру и ввиду этого прекратится снижение высоты апоцентра ниже орбитальной.
Как только высота апоцентра снизится ниже орбитальной (в нашем случае 75 км), то триггер отдает команду на включение двигателя в 50% мощности до тех пор, пока апоцентр снова станет выше заданной высоты орбиты. И так пока не выйдем за пределы атмосферы. Чтобы выполнение триггера не прервалось после первого цикла проверки, то пропишем специальную команду RETURN true, которая не дает завершиться циклу, и переменную-переключатель, которая меняет значение после того, как космолет поднимется выше 70 км, строка кода RETURN false заметит это изменение, и отключит выполнение цикла триггера.
После того как мы покинули атмосферу, триггер отдает команду на управление функции закругления орбиты - это функция CircularizationOrbit.



FUNCTION ApoapsisSupport      //Функция подъема до апоцентра
{
PRINT "WAIT CLIMB TO APOAPSIS...".
SET Count TO 1. //Создаем переменную-счетчик
 WHEN APOAPSIS < OrbitAlt THEN //Если апоцентр упал вкл. тягу
 {
  LOCK THROTTLE TO 0.5.
   //Если апоцентр повышен откл. тягу
   WHEN APOAPSIS > OrbitAlt THEN
   {
    LOCK THROTTLE TO 0.
     WHEN SHIP:ALTITUDE > 70000 THEN //На 70км вкл. счетчик
     {
      SET Count TO 0.
      CircularizationOrbit (). //Переход к функции закругления
     }
   }
    IF Count > 0 //Если 0 то отключаем триггер
    RETURN true.
    ELSE         //Если не 0 то продолжаем триггер
    RETURN false.
 }
}

Листинг 5. Функция закругления орбиты.

После того, как мы приблизимся к апоцентру на определенное расстояние, нужно сделать маневр закругления орбиты - поднять перицентр до высоты орбиты.
Чтобы это сделать, для начала нужно вычислить расстояние текущего положения перицентра до недостающей высоты орбиты. Для этого запишем в переменную DistanceToPeriapsis разницу между требуемой высоты орбиты до текущего положения перицентра строкой кода SET DistanceToPeriapsis TO OrbitAlt-PERIAPSIS. Так как у нас расстояние получилось в метрах, а нам нужно в километрах, то просто разделим его на 1000.
Далее нам нужно выяснить максимальное ускорение космолета. Для этого запишем в переменную MaxAcceleration отношение максимальной тяги двигателя к текущей массе космолета при помощи строки кода SET MaxAcceleration TO ship:maxthrust/ship:mass. Хорошо, теперь мы знаем, сколько километров за секунду пролетит космолет.
Теперь осталось выяснить время, за которое космолет с известным максимальным ускорением должен работать двигателем для поднятия перицентра до орбиты. Для этого в переменную BurnTime запишем отношение расстояния перицентра к максимальному ускорению при помощи строки кода SET BurnTime TO DistanceToPeriapsis/MaxAcceleration.
Отлично, время прожига мы вычислили, осталось задать момент начала прожига. Это, как известно, такой момент, когда до апоцентра останется половина необходимого времени. Для этого делим время прожига на половину строкой кода SET BurnTime TO BurnTime/2.
Наконец, нужно задать момент начала прожига строкой кода ETA:APOAPSIS, и триггер по достижению указанного времени даст команду на включение двигателя в направлении скорости, т.е. прогрейда. Но есть один нюанс - из-за того, что масса космолета при прожиге хоть и немного, но уменьшается, возможна ситуация, что космолет не успеет пролететь сам апоцентр и начнет "отбрасывать" его от себя, при этом завысив орбиту существенно выше расчетной. Чтобы избежать излишних сложных вычислений для корректирования тяги, было найдено простое решение - начинать прожиг не на полной тяге, а только на уровне 90-80% от максимальной. Это гарантирует, что прожиг будет завершен уже за апоцентром, и его расчетная высота не завысится более чем на 0.5-1 км, и такая точность для НОО будет вполне приемлема.
Уровень тяги подбирается индивидуально для каждого космолета, для высоко тяговооруженных ставьте LOCK THROTTLE на ~0.8, для менее тяговооруженных лучше ~0.9.
После начала прожига триггер проверяет высоту перицентра, и как только он чуть превысит заданную высоту орбиты, то он отдает команду на отключение двигателя и передает управление функции сброса груза - функция CargoDumping.



FUNCTION CircularizationOrbit  //Функция закругления орбиты
{
PRINT "CLIMB TO APOAPSIS COMPLETED!".
LOCK STEERING TO R(0,0,0) + PROGRADE.
//Вычисляем расстояние перицентра до нужной высоты орбиты
SET DistanceToPeriapsis TO OrbitAlt-PERIAPSIS.
//Передвигаем запятую до километров
SET DistanceToPeriapsis TO DistanceToPeriapsis/1000.
//Вычисляем максимальное ускорение для двигателя
SET MaxAcceleration TO ship:maxthrust/ship:mass.
//Вычисляем время прожига для закругления орбиты
SET BurnTime TO DistanceToPeriapsis/MaxAcceleration .
//Задаем время начала прожига
SET BurnTime TO BurnTime/2.
PRINT "WAIT ORBIT CIRCULARIZATION...".
 WHEN ETA:APOAPSIS < BurnTime THEN //Начало прожига
 {
  LOCK THROTTLE TO 0.9.
   WHEN PERIAPSIS > OrbitAlt THEN
   {
    LOCK THROTTLE TO 0.
     //Убеждаемся что орбита закруглена
     WHEN APOAPSIS > OrbitAlt AND PERIAPSIS > OrbitAlt THEN
     {
      CargoDumping (). //Переход к функции сброса ПН
     }
   }
 }
}

Листинг 6. Функция сброса груза на орбите.

Довольно простая функция. Вначале открывает грузовой отсек и ждет 5 сек. до полного его открытия, затем активирует отделитель и ждет некоторое время, пока груз не отлетит на безопасное расстояние. Время задается индивидуально для каждой ситуации, в зависимости от массы груза, его размеров, силы отделения и т.д. В данном случае достаточно 30 сек. для отлета ПН на безопасное расстояние.
Затем грузовой отсек закрывается и переходим к дальнейшей функции - функция схода с орбиты Deorbit.



FUNCTION CargoDumping    //Функция отделения груза на орбите
{
PRINT "ORBIT CIRCULARIZATION COMPLETED!".
PRINT "WAIT DUMPING CARGO...".
TOGGLE AG3. //Открываем отсек и ждем 5 секунд до полного открытия
WAIT 5.
TOGGLE AG4. //Отделяем груз и ждем 30 сек. для отлета груза
WAIT 30.
TOGGLE AG3.
Deorbit (). //Переход к функции схода с орбиты
}

Листинг 6. Функция схода с орбиты.

Сразу после сброса ПН триггер дает команду на разворот в ретрогрейд и включает двигатель до тех пор, пока перицентр не станет ниже 65 км. Высота в 65 км выбрана для того, чтобы сход с орбиты был более безопасным при перегреве, да и топлива тратить на сброс перицентра нужно только минимум. Хотя вы всегда можете задать другую, более низкую высоту сброса перицентра.
Как только перицентр сброшен, следующий триггер отдает команду на разворот в положение 45 град. по тангажу, для более эффективного аэроторможения.
Далее триггер ждет снижения высоты до 25 км, перед самым входом в аэродинамически плотный слой атмосферы, и фиксирует тангаж космолета в направлении прогрейда, чтобы плавно снизиться и притормозить до скорости у поверхности в 30-50 м/с, в зависимости от типа космолета.
Затем вскоре триггер ждет высоты начала посадочных действий, по умолчанию задана высота в 20 км, но можно задать и другую, более низкую, если позволяет конструкция космолета. Триггер проверяет переменную TypeLand, и в зависимости от того, какое значение ей было задано перед полетом, выбирает тип посадки - обычную самолетную или вертикальную на парашюте для соответствующей функции.



FUNCTION Deorbit     //Функция схода с орбиты
{
PRINT "DUMPING CARGO COMPLETED!".
PRINT "WAIT DEORBIT...".
SET STEERING TO RETROGRADE. //Разворачиваем в ретрогрейд
WAIT 10. //Ждем окончания разворота
LOCK THROTTLE TO 0.5.
 WHEN PERIAPSIS < 65000 THEN //Сброс перицентра до 65км
 {
  LOCK STEERING TO HEADING(OrbitInclination,45).
  LOCK THROTTLE TO 0.
//На 25км фиксируем в прогрейд для входа в плотные слои атм-ры
   WHEN SHIP:ALTITUDE < 25000 THEN
   {
    PRINT "DEORBIT COMPLETED!".
    PRINT "WAIT LANDING...".
    LOCK STEERING TO PROGRADE.
     WHEN ALT:RADAR < 20000 THEN
     {
      IF TypeLand < 1 //Если задан 0 то самолетная посадка
      LandingNormal ().
      ELSE  //Если задана 1 то вертикальная посадка
      LandingVertical ().  //Переход к функции посадки
     }
   }
 }
}

Листинг 7. Функция для нормальной самолетной посадки.

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



FUNCTION LandingNormal //Функция самолетной посадки
{
TOGGLE AG1.
 WHEN ALT:RADAR < 400 THEN //На высоте 400м вкл. тягу и шасси
 {
  GEAR ON.
  LOCK STEERING TO R(0,0,0) + HEADING(OrbitInclination,5).
  LOCK THROTTLE TO 0.15.
   WHEN ALT:RADAR < LandAlt THEN //Если коснулись земли тормозим
   {
    UNLOCK STEERING.
    TOGGLE AG5.  //Если есть тормозной парашют - открываем его
    LOCK THROTTLE TO 0.
    BRAKES ON.
    PRINT "VESSEL LANDED!".
   }
 } 
}

Листинг 8. Функция для вертикальной посадки.

Эта функция обеспечивает простой метод посадки на парашюте, или парашютах. Здесь главное при конструировании космолета установить в отсек такой парашют, который обеспечит при раскрытии вертикальную скорость не более 19 м/с (максимальная ударная прочность CR-7 20 м/с). Парашют Mk2-R, имея вес только в 100 кг, снижает вес примерно в 5 тонн на скорости ~10-15 м/с, что вполне приемлемо для безопасной посадки.
Следует упомянуть одну особенность - некоторые космолеты с хорошей аэродинамической площадью крыла могут сесть на шасси и без парашюта, т.к. вертикальная скорость при свободном падении у них составит (при открытом грузовом отсеке)30-40 м/с, что ниже предела ударопрочности шасси (50-70 м/с). Поэтому если вы уверены, что ваш космолет выдержит такое падение и не перевернется после удара на шасси, то строку кода раскрытия парашюта TOGGLE AG5 можно и убрать.
Высота начала раскрытия парашюта задается индивидуально для каждого космолета.



FUNCTION LandingVertical //Функция вертикальной посадки
{
 WHEN ALT:RADAR < 400 THEN //На высоте 400м начинаем открытие
 {
  TOGGLE AG3. //Открываем отсек, потом шасси и ждем 5 секунд
  GEAR ON.
  //Для посадки сначала на задние шасси немного поднимем нос
  LOCK STEERING TO R(0,0,0) + HEADING(OrbitInclination,10).
  WAIT 5.
  TOGGLE AG5. //Открываем парашют
   WHEN ALT:RADAR < LandAlt THEN //Если коснулись земли тормозим
    {
     UNLOCK STEERING.
     BRAKES ON.
     PRINT "VESSEL LANDED!".
    }
 }
}

Запуск программы.

Сами скрипты хранятся в папке игры по адресу - ...\Kerbal Space Program\Ships\Script. Сам файл скрипта назван по имени космолета SPARROW.KS, чтобы легче было его идентифицировать.
Скачайте и установите мод KOS, ссылка на сайт с модом и руководством приведена в начале статьи.
Когда загрузитесь на ВПП, включите тормоза, чтобы космолет не скатился по инерции в сторону, пока вы будете запускать терминал и сам скрипт.
Для запуска программы SPARROW наберите в терминале команду switch to 1. - это подключит диск SCS модуля KAL9000, потом скопируйте из КСЦ сам файл скрипта на наш космолет командой copypath ("0:/SPARROW", "1:"). Ну и наконец напишем команду на исполнение программы - run SPARROW.
Дальше ничего делать не потребуется, просто расслабьтесь и наслаждайтесь полетом. Можете также отключить визуальный интерфейс клавишей F2.
В архиве лежит сам файл скрипта с комментариями по коду на русском, и тот же самый скрипт без комментариев - его лучше всего и загружать в папку, так как KOS вместо русских букв будет отображать неверную кодировку. Также в архиве есть файл крафта космолета Воробей.

Ввод команд для запуска работы программы

Клавиши управления.


1. Переключить режим CR-7 и открыть/закрыть воздухозаборник (соответственно режиму CR-7)
2. Включить/выключить CR-7
3. Открыть/закрыть грузовой отсек
4. Отделить груз
5. Раскрыть парашют/парашюты
6. Переключить терминал KOS
Шасси переключаем стандартной кнопкой G, систему RCS стандартной кнопкой R.

Помните, что вы можете включать/отключать в полете при необходимости систему RCS, грузовой отсек кнопкой 3, и ни в коем случае не включать SAS - это приведет к дестабилизации космолета.
Варп включать да высоты 40 км не рекомендуется, это может привести к неправильной работе KOS в атмосфере. Также учтите, что на орбите при включенном варпе ориентация космолета работать не будет.

Демонстрационное видео полета.


 


Критика и замечания приветствуются, вопросы задавайте в комментариях. Также жду предложений по оптимизации скрипта программы.
Спасибо за внимание :)

sparrowkos.zip [9,28 Kb] (cкачиваний: 8)

- + +11
У Вас НЕТ прав на выставление оценки для этой новости.
Для выставлени оценки необходимо пройти регистрацию на сайте.
Если Вы уже зарегистрировались, то войдите на сайт.
  1. Выкл.
    Это GektorZap GektorZap - #10 0
    +1
    Где ж ты раньше был,когда я ВОТ ЭТО ВОТ строил? Я чуть не опух искать и понимать,как работает KOS XD
    »
    Написано:
    Группа: Хорошие люди, Публ/Комм: 68/359
     
    1. 0
      Это Kostya88 Kostya88 - #20 0
      0
      Ну так построил же :)
      »
      Написано:
      Группа: Хорошие люди, Публ/Комм: 5/29
       
  2. 9
    Это Slv Slv - #30 0
    +1
    Проверочку бы при посадке дописать чтоб вертикальную скорость мерило (и соответственно тангаж подправляло) при приземлении ведь и бугорок может встретиться...
    »
    Написано:
    Группа: Посетители, Публ/Комм: 9/205
    ***
    НашЫ крашЫ самые крашные краши на Кербине и никакие другие краши не перекрашат наши краши по крашности и крашистости!
     
    1. 0
      Это Kostya88 Kostya88 - #40 0
      0
      Проверочку сделать вряд ли выйдет - сам командный модуль находится в отсеке, уже за передней стойкой шасси, и пока он обнаружит кочку, передняя стойка уже наверняка врежется. Да и вряд ли он успеет среагировать.
      Самолетная посадка годится только для ВПП, здесь она сделана просто для полноты картины. Поэтому лучше только на парашюте, 0.1 тонны веса парашюта для спуска почти 5 тонн космолета вполне приемлемо.
      »
      Написано:
      Группа: Хорошие люди, Публ/Комм: 5/29
       
      1. 9
        Это Slv Slv - #50 0
        +1
        Не в этом смысле что ты понял. %-)
        При снижении, если поверхность внизу не ровная, чтоб автопилот сравнивал реальную скорость снижения (относительно поверхности внизу) и скорость снижения например относительно моря, чтоб определять поверхность снизу ровная или с уклоном/подьемом и соответственно тангажом регулировал снижение. Ведь если это не проверять можно получить заметный +к вертикальной скорости если на горку (или предгорье, где поверхности с уклонами) какую-нибудь сесть и сломаться.
        »
        Написано:
        Группа: Посетители, Публ/Комм: 9/205
        ***
        НашЫ крашЫ самые крашные краши на Кербине и никакие другие краши не перекрашат наши краши по крашности и крашистости!
         
        1. 0
          Это Kostya88 Kostya88 - #60 0
          +1
          А, так ты в таком смысле :)
          Хм, надо попробовать, сначала проверю в какой точке радар определяет высоту, и пропишу угол тангажа под рельеф поверхности.
          »
          Написано:
          Группа: Хорошие люди, Публ/Комм: 5/29
           
          1. 9
            Это Slv Slv - #70 0
            +1
            Да и еще перед сбросом или перед торможением вставь выбор Y/N для возможности выбрать примерное место приземления или отмены программы и ручной посадки, будет удобнее думаю.

            Или там по контрол+С можно прервать? Хотя так не очень удобно, если программа не дает задержек для принятия решения.
            »
            Написано:
            Группа: Посетители, Публ/Комм: 9/205
            ***
            НашЫ крашЫ самые крашные краши на Кербине и никакие другие краши не перекрашат наши краши по крашности и крашистости!
             
            1. 0
              Это Kostya88 Kostya88 - #80 0
              0
              Да, там Ctrl+C прерывание.
              Я и хотел написать начало прожига схода с орбиты при помощи Orbitable:GEOPOSITION, чтобы в нужной точке оно сходило с орбиты. Но беда в том, при аэроторможении, даже для почти одинаковых по массе и размерам кораблей, точка приземления получается с очень большой вариабельностью по дистанции от ВПП, и подбирать для каждого космолета широту и долготу схода с орбиты для точного приземления хотя бы в районе КСЦ - дело очень неблагодарное )
              Если бы приземление было на безатмосферной планете - тогда да, там все проще.
              Тут нужно разобраться с физикой и матаном аэроторможения, если получится, тогда сделаю новый скрипт и статью.
              »
              Написано:
              Группа: Хорошие люди, Публ/Комм: 5/29
               
              1. 9
                Это Slv Slv - #90 0
                +1
                Ну если надо таскать периодически стандартные грузы на НОО в принципе 3-4 сохранения/загрузки и точка будет найдена с достаточно высокой точностью. :-)

                PS "район" КСЦ достаточно велик, то есть крутануться там даже с небольшим запасом топлива можно от предгорий с запада от гор и почти до острова. Ну чтоб сесть хоть и не на полосу но уже в районе КСЦ и получить больший выхлоп за возврат крафта.
                »
                Написано:
                Группа: Посетители, Публ/Комм: 9/205
                ***
                НашЫ крашЫ самые крашные краши на Кербине и никакие другие краши не перекрашат наши краши по крашности и крашистости!
                 
              2. 11
                Это Freze Freze - #100 0
                +1
                Тут немножко по-другому делается.
                1 Четко осознать возможности крафта.
                2 Наметить условия, попав в которые мы благополучно приземлимся на ровную поверхность вокруг КСЦ. Например: мы на высоте 100м и скорости 120м\с+-10м\с в 3.5км от центра ксц. С такими вводными мы запускаем скрипт посадки.
                3 Прикинуть участки снижения для достижения благоприятных условий посадки. Например если мы снизились до 20км в 100км от КСЦ прикатить снижение и лететь на скорости 1500. На дистанции 50км снизится до какой-то высоты и какрй-то скорости... итп
                Под это дело, скорее всего придется конструкцию доработать(Рассчитать запас топлива для полета в атмосфере, установить аэротормоз, тормозной парашют итп ).
                »
                Написано:
                Группа: Хорошие люди, Публ/Комм: 10/137
                 
                1. 0
                  Это Kostya88 Kostya88 - #110 0
                  0
                  Ну в принципе я так и предполагаю сделать - создать виртуальную точку на некотором расстоянии от ВПП, к ней подлететь, развернуться если нужно, и с заданной для каждого отдельного космолета тягой и тангажем снизиться и сесть.
                  Пока буду пытаться решить две главные задачи - попробовать сделать корректировку тангажа в зависимости от температуры, это улучшило бы эффективность вывода, но в КОС похоже нет встроенных датчиков температуры (VesselSensors:TEMP), а термометр не подходит - попросту сгорит; и другая задача - попробовать найти формулы и сделать хотя бы приблизительный расчет аэродинамического торможения (я так понимаю это надо смотреть в гидроаэродинамике), это бы позволило точнее сойти с орбиты и не брать на борт лишнее жидкое топливо. Ведь "Шаттлы" как-то садились точно на ВПП и, если не ошибаюсь, без помощи двигателей.
                  Может кто-то знает формулу или еще сможет что подсказать по коду )
                  »
                  Написано:
                  Группа: Хорошие люди, Публ/Комм: 5/29
                   
                  1. 9
                    Это Slv Slv - #120 0
                    +1
                    Поставь термометр с верхней (или торцевой, задней) стороны и измеряй температуру детали на которой он стоит, делов то? Тебе же не обязательно темпер окружающей среды, подойдет и температура самой теплонагруженной детали, например носового обтекателя.
                    »
                    Написано:
                    Группа: Посетители, Публ/Комм: 9/205
                    ***
                    НашЫ крашЫ самые крашные краши на Кербине и никакие другие краши не перекрашат наши краши по крашности и крашистости!
                     
                  2. 11
                    Это Freze Freze - #130 0
                    +1
                    Про вывод и температуру не совсем понял. Для вывода надо узнать сколько дельты на что тратится(мехджеб поможет) и попробовать сократить эти потери подбором траектории и плавным управлением.
                    Аэроторможение и примерную точку приземления можно взять из trajectories(совместимо с kos), хотя я бы тоже хотел узнать формулы расчета.
                    Кода немного есть у меня, пока научил крафт по-самолетному красиво поворачивать. Надо посадку дописывать и выход на посадочный курс(чтоб на полосу сесть), ну и вывод с сход(с наклонной орбиты) тоже надо.
                    »
                    Написано:
                    Группа: Хорошие люди, Публ/Комм: 10/137
                     
  3. 0
    Это i_whisper i_whisper - #140 0
    +1
    + много полезной инфы, спасибо!
    - "Сухая масса космолета - 5.07 тонны, масса заправленного - 7.09 тонны, масса снаряженного (с грузом) - 10.69 тонны. Отношение массы ПН к массе заправленного космолета - 49.36%, процент ПН составляет 32.74%, максимальная грузоподъемность на 75 км круговую орбиту - 3.5 тонны."
    тоесть... "масса заправленного - 7.09 тонны" + "грузоподъемность на 75 км круговую орбиту - 3.5 тонны" = 10590 т. А у тебя "масса снаряженного (с грузом) - 10.69 тонны".
    Поправь, и от меня сразу будет +
    »
    Написано:
    Группа: Посетители, Публ/Комм: 3/12
     
    1. 0
      Это Kostya88 Kostya88 - #150 0
      0
      Да, я забыл еще добавить массу парашюта в 0.1 тонны :)
      Исправил цифры, и еще пару косяков.
      »
      Написано:
      Группа: Хорошие люди, Публ/Комм: 5/29
       
  4. 6
    Это oAsAo oAsAo - #160 0
    +2
    Нужно было назвать kOSмолет
    »
    Написано:
    Группа: Посетители, Публ/Комм: 2/65
    Здесь могла бы быть ваша реклама.:)
     
  5. 11
    Это Freze Freze - #170 0
    +1
    Гонка космолетов продолжается! satisfied
    »
    Написано:
    Группа: Хорошие люди, Публ/Комм: 10/137
     
    1. 74
      Это Басила Басила - #180 0
      +1
      извини, промазал(
      »
      Написано:
      Группа: Модераторы, Публ/Комм: 3/1 049
      Даннинг с Крюгером погубят человечество.
      игривые картинки
      "Сложные проблемы всегда имеют простые, легкие для понимания неправильные решения."
       
      1. 23
        Это Marschig Marschig - #190 0
        +2
        Йа починиль :)
        »
        Написано:
        Группа: Модераторы, Публ/Комм: 17/367
        "Never build a rocket with a fineness ratio greater than 10!" - Wernher von Braun
         
        1. 0
          Это Kostya88 Kostya88 - #200 0
          0
          Спасибо за починку :)
          Сам тоже в одной статье промазал когда-то )
          »
          Написано:
          Группа: Хорошие люди, Публ/Комм: 5/29
           
  6. 0
    Это Kostya88 Kostya88 - #210 0
    0
    Freze, дело в том, что когда космолет при разгоне достигает температуры перегрева близкой к критической (~2300К), то угол тангажа можно для остановки нагрева автоматически поднять (и потом опустить), и тогда не нужно вручную подбирать угол тангажа при котором космолет не сгорит в атмосфере - это сделает за игрока автоматика.
    »
    Написано:
    Группа: Хорошие люди, Публ/Комм: 5/29
     
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Чат
  • Опрос
  • Стримы
    Хотите ли Вы сотрудничества между проектами SpaceDock.ru и Ангар Джеба?
Последние комментарии
  • Marschig Marschig написал в
    Автоматическая экспедиция на Е ... (всего 19 комм.)
    Да, летать на Минмус действительно несложно. А дальше для открытия всей науки и не нужно :)
  • Slv Slv написал в
    Автоматическая экспедиция на Е ... (всего 19 комм.)
    Ну да, к банальнейшему, если каждый сам для себя может определить где заканчивается прохождение, то это самое прохождение вообще становится легче легкого. :-))
    Единственно не надо "заканчивать" его еще до того как начали. :-))))))))))
  • Major Tom Major Tom написал в
    Ion Mk2d (всего 8 комм.)
    давненько на сайтике не было такой годноты!
  • Maggot Maggot написал в
    Руководство пользователя Ferra ... (всего 4 комм.)
    Чувство, что прослушал курс лекций по аэродинамики
  • Major Tom Major Tom написал в
    Руководство пользователя Ferra ... (всего 4 комм.)
    В- великолепный гайд
  • Коловратка Коловратка написал в
    Ion Mk2d (всего 8 комм.)
    Да лана ну шо вы...
Все комментарии
Обновления на форуме
175 Всего
1 Польз.
174 Гостей
Яндекс, Google, Marschig
Онлайн список
Новостей на страницу:
Наверх