### Введение в 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)

Разберём основные функции подробнее:
1. Объявление функции 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
}
```  
2. функция 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 каждый полет может стать уникальным экспериментом, открывающим новые возможности для творчества и аналитики.
