### Введение в KSP и kOS **Kerbal Space Program (KSP)** — это симулятор космических полетов, который позволяет игрокам проектировать и запускать свои собственные космические корабли, исследовать планеты, планировать миссии. Игра предлагает высокую степень свободы, позволяя создавать не только простые ракеты и самолёты, но и сложные космические перерабатывающие станции. ![1](ksp_1.jpg) Для расширения возможностей игры существует мод **Kerbal Operating System (kOS)**, который позволяет игрокам писать скрипты для управления своими космическими кораблями. Это позволяет автоматизировать многие процессы в игре, создавая автопилоты, систему автоматических запусков, стыковок, вычислять точное время выполнения орбитальных манёвров и даже сложные многозадачные операции, которые обычно требуют вмешательства игрока. ![2](kos_logo_small.png) ### Пример применения kOS в KSP Построен простой научный аппарат, управление будет осуществляться при помощи заранее написанного скрипта. ![3](Craft_Gradusnik.png) Разберём основные функции подробнее. Объявление функции AROUND которая сравнивает 2 числа в заданном диапазоне. ```kos 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 активирует научный блок с указанным именем. ```kos 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. } ``` Перейдём к основному скрипту: ```kos 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 после приземления. ![3](kOS_CLI.png) ### Практические советы и рекомендации - **Отладка скриптов**: Использование команды `PRINT` или `ALT:RADAR` для отслеживания значений переменных в процессе работы программы помогает легче выявить ошибки. - **Модулярность**: Разбивайте свои скрипты на функции и блоки для упрощения отладки и улучшения читаемости кода. - **Ресурсы сообщества**: На форумах и в онлайн-ресурсах можно найти много примеров скриптов, которые помогут помочь вам программировать на kOs. Можно найти как простые решения, так и сложные алгоритмы от опытных игроков. ### Заключение Использование языка программирования kOS в Kerbal Space Program открывает игрокам новые горизонты для автоматизации процессов и углубленного понимания механик космических полетов. В частности, создание скриптов для суборбитальных и орбитальных полетов позволяет не только значительно упростить рутинные задачи, но и дает возможность экспериментировать с программированием в реальном времени. Автоматизация сбора данных, таких как температура в разных слоях атмосферы, может стать ценным инструментом для исследования физических процессов, происходящих во время полета. Такой подход не только повышает увлекательность игры, но и предоставляет игрокам ценные знания о программировании и астрофизике. С kOS каждый полет может стать уникальным экспериментом, открывающим новые возможности для творчества и аналитики.