kerbal.ruвики сборки «Оператор»
Оператор / Вики / Автоматика

Телеметрия: разбирать полёт по числам

Как заставить kOS писать телеметрию в файл на диске, где этот файл лежит, что с ним делать после посадки и почему для архива нужна связь.

Терминал kOS прокручивается и всё забывает. Если полёт не удался, вопрос «почему» упирается в ощущения: «вроде рано начал разворот». Телеметрия превращает ощущения в числа — и, что важнее, в файл на диске, который можно открыть таблицей или отдать на разбор ассистенту (Нейросеть как второй пилот).

Куда пишем: два тома

Том Что это Где на диске Нюанс
0: Архив (общий) <KSP>/Ships/Script/ Виден снаружи игры. Нужна связь с КЦК
1: Локальный диск процессора внутри сейва Работает всегда, но снаружи не прочитать

Ключевой момент: архив в kOS работает через связь. В карьере с CommNet аппарат без канала до Кербина архив не видит — запись в 0: упадёт. Отсюда рабочая схема: пишем в локальный том 1:, а как связь появилась — копируем в архив.

// пишем локально, потом переносим
LOG line TO "1:/flight.csv".
// ...после полёта, при живой связи:
COPYPATH("1:/flight.csv", "0:/flight.csv").

Если играешь без требования связи для зондов (см. Настройки: сложность и моды), можно писать сразу в 0: и не морочиться.

Простой логгер

Кладём рядом со скриптом полёта и запускаем перед стартом. Пишет строку раз в полсекунды в формате CSV.

// lib_log.ks — телеметрия взлёта
SET logFile TO "1:/ascent.csv".
IF EXISTS(logFile) { DELETEPATH(logFile). }
LOG "t,alt,vspd,spd,ap,pe,mass,thrust" TO logFile.

SET t0 TO TIME:SECONDS.
SET logging TO TRUE.

FUNCTION logTick {
  SET line TO ROUND(TIME:SECONDS - t0, 1)
    + "," + ROUND(SHIP:ALTITUDE, 0)
    + "," + ROUND(SHIP:VERTICALSPEED, 1)
    + "," + ROUND(SHIP:VELOCITY:SURFACE:MAG, 1)
    + "," + ROUND(SHIP:APOAPSIS, 0)
    + "," + ROUND(SHIP:PERIAPSIS, 0)
    + "," + ROUND(SHIP:MASS, 2)
    + "," + ROUND(SHIP:AVAILABLETHRUST, 1).
  LOG line TO logFile.
}

Вызов из основного цикла скрипта взлёта:

UNTIL SHIP:APOAPSIS > targetAp {
  logTick().
  WAIT 0.5.
}

Полсекунды — разумный шаг: файл за подъём выходит на пару сотен строк, а картина видна. Писать каждый такт физики бессмысленно, только раздуешь файл.

Что логировать под задачу

Задача Что писать
Взлёт время, высота, вертикальная скорость, апоцентр, тяга, масса
Циркуляризация время, апоцентр, перицентр, оставшийся Δv узла
Посадка радарная высота (ALT:RADAR), вертикальная скорость, тяга, масса
Энергобаланс SHIP:RESOURCES по ЭЧ, освещённость, время в тени
Долгий перелёт раз в минуту: время, положение, ресурсы — иначе файл разбухнет

После полёта

Файл лежит в Ships/Script/ — это обычная папка. Дальше три пути:

  1. Открыть таблицей. CSV импортируется в любой редактор, строишь график «высота от времени» и сразу видишь, где профиль ушёл.
  2. Сравнить два полёта. Один и тот же скрипт с разными параметрами — два файла рядом, разница видна по числам, а не по памяти.
  3. Отдать ассистенту. Это самый быстрый разбор: файл читается снаружи игры, и по нему видно, на какой секунде тангаж ушёл раньше времени или где кончилась тяга. Подробно — в Нейросеть как второй пилот.

Гигиена

  • Чисти старые файлы: DELETEPATH("1:/ascent.csv") в начале скрипта, иначе логи склеятся и разбор превратится в кашу.
  • Не логируй в тени связи. Если пишешь в 0: и потеряешь канал — скрипт упадёт с ошибкой тома. Локальный 1: надёжнее.
  • Помни про размер локального диска. У процессоров он маленький (от 5 000 байт у младших моделей); длинный лог туда не влезет. Для долгих миссий пиши реже или сразу в архив.
  • Заголовок в начале файла. Одна строка с именами колонок экономит кучу времени и тебе, и любому, кто будет разбирать лог.

Правило простое: если после полёта ты не можешь ответить числом на вопрос «почему», значит, в следующий раз нужен лог.

Связанные статьи