kRPC — это мост между KSP и внешним миром. Внутри игры работает сервер, снаружи — твоя программа на Python (или C#, C++, Java, Lua), которая читает телеметрию и отдаёт команды по TCP. Никакого своего языка: обычный Python со всеми библиотеками, обычный отладчик, обычный git.
В «Операторе» kRPC — опциональный мод: в базовом наборе GameData его нет, ставится отдельно. Причина честная: он требует установленного Python вне игры, а это уже не «скачал сборку и играешь». Интерфейс мода не русифицирован — переводить нечего, это окно сервера с четырьмя полями.
Зачем это нужно, если есть kOS
kOS исполняется бортовым процессором и живёт по его правилам: лимит инструкций за тик, ограниченный локальный том, отсутствие связи = отсутствие архива. Это фича — она делает автоматизацию частью игры. kRPC этих ограничений не имеет вообще, потому что он вне игры.
Что открывается:
- Настоящие библиотеки.
numpyдля матриц и векторов,scipy.optimizeдля подбора параметров манёвра,matplotlibдля графиков подъёма. - Телеметрия и разбор полётов. Пишешь высоту, скорость, тягу и массу в CSV каждые 0.1 с, потом строишь график и видишь, где профиль разворота теряет 200 м/с.
- Сложная логика. Оптимизатор траектории, планировщик серии запусков, симулятор — то, что в kerboscript писать больно.
- Серии миссий. Один скрипт выводит десять одинаковых ретрансляторов подряд, включая переключение аппаратов и перемотку времени.
Как включить
- Поставить мод в
GameData(актуальная версия — 0.6.0, есть в CKAN). - Запустить игру и загрузить сохранение — окно сервера появится само, кнопка есть и на панели инструментов.
- Настройки открываются по Edit:
- Protocol — для Python нужен
Protobuf over TCP; - Address —localhost, если клиент на той же машине; чтобы управлять с другого компьютера в локальной сети, выбери IP-адрес машины; - RPC port — 50000, Stream port — 50001 (значения по умолчанию, менять не нужно). - В расширенных настройках есть Auto-start server (стартовать вместе с игрой) и Auto-accept new clients (не спрашивать разрешение на каждое подключение). - Кнопка Start server — лампочка становится зелёной.
Клиент ставится обычным образом: pip install krpc. Отдельная деталь на корабль не нужна: kRPC работает с активным аппаратом, каким бы он ни был.
Первый скрипт
import krpc
conn = krpc.connect(name="Привет")
vessel = conn.space_center.active_vessel
print(vessel.name)
print(vessel.flight().mean_altitude, "м")
print(vessel.orbit.apoapsis_altitude, "м")
Ключевая вещь kRPC — потоки (streams). Каждый вызов vessel.flight().mean_altitude — это запрос по сети; в цикле управления так делать нельзя. Поток регистрируется один раз, дальше сервер сам шлёт обновления, а чтение значения становится локальным:
altitude = conn.add_stream(getattr, vessel.flight(), "mean_altitude")
apoapsis = conn.add_stream(getattr, vessel.orbit, "apoapsis_altitude")
print(altitude(), apoapsis()) # вызов как функции — свежее значение
Автозапуск
Скелет вывода на орбиту — прямой аналог ascent.ks из kOS: готовые рецепты:
import time
import krpc
turn_start, turn_end, target = 250, 45000, 90000
conn = krpc.connect(name="Автозапуск")
vessel = conn.space_center.active_vessel
altitude = conn.add_stream(getattr, vessel.flight(), "mean_altitude")
apoapsis = conn.add_stream(getattr, vessel.orbit, "apoapsis_altitude")
vessel.control.sas = False
vessel.control.rcs = False
vessel.control.throttle = 1.0
vessel.control.activate_next_stage()
vessel.auto_pilot.engage()
vessel.auto_pilot.target_pitch_and_heading(90, 90)
turn_angle = 0
while apoapsis() < target * 0.9:
if turn_start < altitude() < turn_end:
frac = (altitude() - turn_start) / (turn_end - turn_start)
new_angle = frac * 90
if abs(new_angle - turn_angle) > 0.5: # не дёргать автопилот каждый тик
turn_angle = new_angle
vessel.auto_pilot.target_pitch_and_heading(90 - turn_angle, 90)
time.sleep(0.1)
vessel.control.throttle = 0.25
while apoapsis() < target:
pass
vessel.control.throttle = 0.0
print("Апоцентр набран")
Дальше — узел циркуляризации: vessel.control.add_node(ut + vessel.orbit.time_to_apoapsis, prograde=delta_v), длительность прожига по формуле Циолковского через vessel.available_thrust, vessel.specific_impulse и vessel.mass, наведение через auto_pilot.reference_frame = node.reference_frame. Перемотка времени доступна прямо из кода: conn.space_center.warp_to(t). Есть и отдельный сервис для Kerbal Alarm Clock — будильники ставятся программно.
Что выбрать
| Задача | kOS | kRPC |
|---|---|---|
| Скрипт живёт на борту, работает без тебя | да | нет — клиент должен быть запущен |
| Ограничения связи и памяти как часть игры | да | нет, их не существует |
| Загрузочный скрипт на спутнике | да | нет |
| Матрицы, оптимизация, графики | нет | да |
| Сбор телеметрии в CSV, разбор полёта | нет | да |
| Отладчик, тесты, нормальный редактор | нет | да |
| Серия из десяти запусков одним прогоном | тяжело | да |
| Управление с другого компьютера | нет | да |
| Ничего не ставить вне игры | да | нет, нужен Python |
Практический вывод для «Оператора»: kOS остаётся основным инструментом. Он часть игры — бортовой компьютер с реальными ограничениями, ради которых сборка и собрана. kRPC берут, когда задача перестаёт быть игровой и становится инженерной: посчитать оптимальный профиль подъёма, построить график расхода дельта-в, прогнать двадцать вариантов ракеты и сравнить цифры.
Ставить его «на всякий случай» смысла нет. Ставить, когда упёрся в потолок kerboscript, — да.