Kerbal Space Program (KSP) — это симулятор космических полетов, который позволяет игрокам проектировать и запускать свои собственные космические корабли, исследовать планеты, планировать миссии. Игра предлагает высокую степень свободы, позволяя создавать не только простые ракеты и самолёты, но и сложные космические перерабатывающие станции.
Для расширения возможностей игры существует мод Kerbal Operating System (kOS), который позволяет игрокам писать скрипты для управления своими космическими кораблями. Это позволяет автоматизировать многие процессы в игре, создавая автопилоты, систему автоматических запусков, стыковок, вычислять точное время выполнения орбитальных манёвров и даже сложные многозадачные операции, которые обычно требуют вмешательства игрока.
Построен простой научный аппарат, управление будет осуществляться при помощи заранее написанного скрипта.
Разберём основные функции подробнее.
Объявление функции AROUND которая сравнивает 2 числа в заданном диапазоне.
FUNCTION AROUND
{
PARAMETER NUM1. // Первое число
PARAMETER NUM2. // Второе число
PARAMETER NUM3. // Диапазон, в котором они должны находиться
IF ((NUM1 - NUM2) < NUM3) AND ((NUM1 - NUM2) > - NUM3)
RETURN TRUE. // Если NUM1 и NUM2 находятся в диапазоне NUM3, возвращаем TRUE
ELSE
RETURN FALSE. // Если нет – FALSE
}
функция LOGTEMP активирует научный блок с указанным именем.
FUNCTION LOGTEMP
{
PARAMETER ThermName. // Принимаем имя термометра
PARAMETER Transmit. // Транслировать или coхранить данные эксперимента
set gradusnik to ship:partsTagged(ThermName) [0]. // Hаходим соотв. деталь корабля и помещаем в переменную gradusnik
set ScienceModule to gradusnik:GetModule("ModuleScienceExperiment"). // Hаходим внутри этой части модуль, отвечающий за "науку"
ScienceModule:DEPLOY. // Запускаем эксперемент
IF Transmit
{
WAIT UNTIL ScienceModule:HASDATA. // Ждём когда в модуле появиться данные эксперемента
ScienceModule:TRANSMIT. // Передаём данные об эксперементе по радиосвязи
PRINT "Temperature at altitude " + ALT:RADAR + " transmitted to KSC".
}
ELSE PRINT "Temperature at altitude " + ALT:RADAR + " stored in " + ThermName.
}
Перейдём к основному скрипту:
WAIY 1.
LOGTEMP("gradusnik0", FALSE). // Меряем температуру на стартовом столе
PRINT "Cowntdown initiated:". // Обратный отсчёт
WAIT 1.
PRINT "3".
WAIT 1.
PRINT "2".
WAIT 1.
PRINT "1".
WAIT 1.
PRINT "Launch!".
LOCK STEERING TO HEADING(90,90). // Привязываем руление вертикально вверх
STAGE. // Стартуем ступень
WAIT UNTIL STAGE:SOLIDFUEL < 0.1. // Ждём, пока в ракетном ускорителе не выгорит топливо
PRINT "Solid booster exhausted".
WAIT UNTIL ETA:APOAPSIS < 1. // Ждём, пока до апоцентра останется меньше секунды
PRINT "Decoupling solid booster". // Отстыковка ракетного ускорителя
WAIT 1.
STAGE.
PRINT "Solid booster decoupled".
SET CHECK_80000 TO TRUE.
SET CHECK_40000 TO TRUE.
SET CHECK_20000 TO TRUE.
SET CHECK_5000 TO TRUE.
SET CHECK_LANDED TO TRUE.
UNTIL ((ALT:RADAR < 320) AND (SHIP:AIRSPEED < 200)) // Выполняем цикл до условий: высота < 320 метров, скорость воздушного потока < 200 м/с
{
// На каждой из высот выполняем измерение температуры
IF AROUND(ALT: RADAR, 80000, 1000) AND CHECK_80000
{LOGTEMP("gradusnikl", FALSE). SET CHECK_80000 TO FALSE.}
IF AROUND(ALT: RADAR, 40000, 1000) AND CHECK_40000
{LOGTEMP("gradusnik2", FALSE). SET CHECK 40000 TO FALSE.}
IF AROUND(ALT: RADAR, 20000, 1000) AND CHECK_20000
{LOGTEMP("gradusnik3", FALSE). SET CHECK_20000 TO FALSE.)
IF AROUND(ALT: RADAR, 5000, 1000) AND CHECK_5000
{LOGTEMP("gradusnik4", FALSE). SET CHECK_5000 TO FALSE.}
// А еще создаем лог-файл для просмотра в эксель
LOG TIME:SECONDS + ";" + SHIP:ALTITUDE + ";" + SHIP:VERTICALSPEED + ";" + SHIP:SENSORS:TEMP + ";" to log1.txt.
WAIT 0.5. // Это задерка внутри цикла
}
// После окончания цикла, активируем ступень с парашютом
STAGE.
PRINT "Parachute deployed".
// Освобождаем руление, пусть спутник висит на парашюте свободно.
UNLOCK STEERING.
WAIT UNTIL (STATUS = "LANDED") OR (STATUS = "SPLASHED"). // Ждем приземления или приводнения
LOGTEMP("gradusnik5", FALSE) . // Меряем температуру после приземления
SWITCH Tо 0. // Переключаемся на диск базы.
COPY logl.txt FROM 1. // Копируем лог на базу. Файл появится в папке "Kerbal Space Program/Ships/Script/"
Фотография консоли kOS после приземления.
PRINT
или ALT:RADAR
для отслеживания значений переменных в процессе работы программы помогает легче выявить ошибки.Использование языка программирования kOS в Kerbal Space Program открывает игрокам новые горизонты для автоматизации процессов и углубленного понимания механик космических полетов. В частности, создание скриптов для суборбитальных и орбитальных полетов позволяет не только значительно упростить рутинные задачи, но и дает возможность экспериментировать с программированием в реальном времени. Автоматизация сбора данных, таких как температура в разных слоях атмосферы, может стать ценным инструментом для исследования физических процессов, происходящих во время полета. Такой подход не только повышает увлекательность игры, но и предоставляет игрокам ценные знания о программировании и астрофизике. С kOS каждый полет может стать уникальным экспериментом, открывающим новые возможности для творчества и аналитики.