Перед вами длиннопост, в котором подробно рассказано, с чем нужно есть такой мод как kOS.
Данный гайд является точным переводом
официальной документации за авторством erendrake'а. Ничего не было привнесено, по возможности сохранена стилистика повествования автора. Критика, как и замечания от GrammarNazi приветствуются (в разумных пределах :)).
Вминание! ввиду того, что с крайним релизом сломали внутриигровой редактор программ, предлагается писать ваши скрипты во внешнем текстовом редакторе и помещать их непосредственно в архив мода. Сей процесс подробно описан в Шаге 8 Первого примера.
Первые шаги в kOSГайд по быстрому старту в Kerbal Operating System.
(Этот документ написан для тех, кто только начинает использовать kOS. Предполагается, что вы уже играли в KSP и знаете как управлять ракетой в ручном режиме. Кроме того, НЕ предполагается, что вы гуру программирования, так что вам будут рассказаны некоторые базовые первые шаги).
Первый пример: Hello WorldСогласно великой традиции учебников по программированию, первый пример будет посвящен написанию скрипта, который не делает ничего, а лишь выводит на экран надпись "Hello World". Цель этого примера - показать, куда следует помещать файлы, как обращаться с ними и как запускать их на корабле.
(Вы можете использовать kOS и в режиме карьеры, но необходимые детали не доступны на старте и их придется изучать, так что пример использует режим песочницы для упрощения).
Соберите корабль, содержащий непилотируемый командный модуль, батарею на несколько сот единиц заряда, что-нибудь, что позволит заряжать батарею, например, солнечные батареи, и "Comptronix CX-4181 Scriptable Control System". (С этого момента и далее для краткости будет обозначаться как "SCS".) SCS располагается во вкладке "Control" в редакторе (там же, где трастеры RCS и гироскопы).
Поместите корабль на стартовый стол. Для этого первого примера совершенно не важно, способен ли корабль оторваться от стола, или даже есть ли у него вообще двигатели.
Кликните правой клавишей мыши (ПКМ) по SCS на корабле, а затем нажмите кнопку "Open Terminal".
Обратите внимание, что если терминал полупрозрачный, значит в данный момент он не выбран. Если вы щелкните по терминалу мышкой, то все, что вы будете вводить с клавиатуры будет направлено в терминал, а НЕ на управление кораблем. Другими словами, если вы будете нажимать WASD, вы получите слово "wasd" на терминале, не смотря на то, что эти клавиши должны управлять кораблем. Что бы переключиться на ручное управление игрой, а не ввод в терминал, щелкните мышью где угодно вне окна терминала.
Сейчас вы должны видеть олдскульно выглядящий текстовый терминал, как на картинке ниже. Наберите строку:
CLEARSCREEN. PRINT "==HELLO WORLD==".
в терминал (убедитесь, что вы расставили все точки (".") как в примере) и нажмите ENTER. Обратите внимание, что вы можете печатать как в верхнем, так и в нижнем регистре. kOS это пофиг.
Терминал ответит вам следующим:
Ну как-то так: введите следующую команду.
EDIT HELLO.
(Не забудьте точку! Все команды kOS должны заканчиваться точкой. Опять же, kOS не обращает внимания на регистр вводимого. Хоть капс зажимайте.)
Сейчас вы должны увидеть окно редактора, выглядящее примерно так (только без текста внутри, ведь вы создаете пустой файл):
Введите следующий текст в окно редактора:
PRINT "=========================================".
PRINT " HELLO WORLD".
PRINT "THIS IS MY FIRST SCRIPT IN kOS.".
PRINT "=========================================".
Кликните "Save", а затем "Exit" во всплывающем окне редактора.
- Заметка на полях: Шрифт редактора - Опытные программисты могут заметить, что в редакторе используется пропорциональный шрифт, а не моноширинный, что не идеально для программирования. Вы правы, но с этим ничего нельзя поделать ввиду множества технических причин, которые слишком сложны, что бы сейчас в них вникать.
Теперь введите следующее в терминал и нажмите ENTER:
RUN HELLO.
Вы увидите выполнение программы, как на картинке ниже.
Что бы посмотреть, где программа "HELLO" сохранена, исполните команду "LIST FILES":
LIST FILES.
(Имейте ввиду, что стандартный вывод для команды LIST это именно вывод списка файлов, так что если хотите, можете опустить слово "FILES".)
Выглядеть это должно примерно так:
Это список всех файлов на выбранном в данный момент томе (VOLUME). По умолчанию, когда вы запускаете новый корабль, текущий том будет назван "1", и это том, который хранится на ТОЙ части SCS, на которой вы выполняли все эти команды.
Это локальный том (локальный жесткий диск, если угодно) конкретно этой SCS. Локальные тома, как этот, как правило, сильно ограничены в объеме хранимых данных. Это хорошо видно в графе Free space remaining текущего вывода.
Если вам интересно, где данные хранятся
физически на вашем компьютере, они представлены секцией внутри постоянного файла вашего сохранения, как часть данных, ассоциированных с деталью SCS. Это важно, потому что это значит, что вы не можете получить доступ к своим программам с другого корабля, и если этот корабль сломается, а деталь SCS взорвется, вы потеряете программу.
Да. Да, это возможно.
Есть другой том, который существует всегда. Он есть Архив (Archive), он же том 0 (Volume 0) (оба названия могут быть использованы в программах). Концептуально Архив хранится где-то на Кербине, в KSC, а не на вашем корабле. У него бесконечный объем и он не исчезнет вместе с вашим кораблем. КРОМЕ ТОГО, он существует вне зависимости от сохранения - если вы запустите одну сохраненную игру, поместите файл в Архив, а затем запустите другую сохраненную игру, в ней тоже будет этот файл.
Что бы использовать архив, сначала нужно представить вам новую команду: SWITCH TO. Команда SWITCH TO позволяет выбрать том, с которым вы будете работать.
Что бы работать с архивом и создать новый "hello world" там, исполните следующие команды и посмотрите, как они работают:
SWITCH TO 0.
EDIT HELLO2. //создайте новый файл, который просто говорит: PRINT "hi again".
LIST FILES.
RUN HELLO2.
SWITCH TO 1.
LIST FILES.
RUN HELLO.
Но где же оно хранится за кадром? Архив на данный момент несколько нарушает общий дизайн модов KSP, которые хранят все свои данные в папке GameData. Архив kOS на данный момент хранится в папке Plugins/PluginData/Archive домашней директории KSP, не в GameData.
Если файл сохранен в Архиве, он может быть отредактирован в
любом внешнем текстовом редакторе на ваш выбор вместо использования внутриигрового редактора kOS. Обычно, это гораздо лучшее решение, если вы начали делать с помощью kOS что-то более-менее сложное. Так же вы можете создавать новые файлы в папке архива. Просто убедитесь, что они заканчиваются расширением *.txt, иначе kOS их не увидит.
Дополнительное чтение о файлах и томах:
- [url=http://]Тома[/url]
- [url=http://]Управление файлами[/url]
Второй пример: Делаем что-нибудь реальное.О'кей, это все базовые установки, но вы, наверное, уже хотите какого-нибудь реального примера, который сделает что-то реально стильное.
Этот пример покажет самое простое, самое основное использование kOS, просто что бы было с чего начинать. В этом примере мы напишем программу, которая будет запускать корабль, используя все более и более сложные проверки. kOS может быть использован на любой стадии полета корабля - запуск, вывод на круговую орбиту, стыковка, посадка… и по сути, запуск - это одна из самых простых задач пилотирования, которые могут быть выполнены без необходимости сильной автоматизации. Где kOS действительно засияет во всей красе, так это в реализации чувствительных задач, таких как посадка, или стыковка, или выдерживание высоты. Это задачи, в которых молниеносная реакция компьютерного скрипта может принести реальную выгоду.
Но в этом примере мы просто покажем, с чего вы можете начать - мы напишем пример запуска.
Создайте любую ракету, способную выйти на орбиту, которая уложится в следующие критерии:
- Используются ТОЛЬКО жидкостные двигатели. В этом примере будет предполагаться именно этот случай. kOS может работать и с твердотопливными ускорителями, но ради простоты примера, мы будем использовать только жидкостные.
- Правильный список ступеней. (Убедитесь, что вам не нужно вручную кликать правой клавишей по частям, что бы запустить следующую ступень, а так же нет нужды для этого использовать Action Groups).
- Убедитесь, что корабль имеет достаточные средства стабилизации, что бы не болтаться сильно.
- Корабль должен содержать, по меньшей мере, следующие детали:
- Батарея, емкостью не менее 400 единиц
- Возможность зарядки, эквивалентная хотя бы 6 солнечным панелям или одному РИТЭГу
- Деталь kOS SCS где-то ближе к верхушке, где она не будет отстрелена вместе с одной из ступеней
О'кей, наберите нижеследующие строки
во внешнем текстовом редакторе на ваш выбор (т.е. Блокнот в Windows или TextEdit на Mac, или любом другом, на вашу фантазию).
// Мой первый лончер
//
SET countdown TO 10.
PRINT "Counting down:".
UNTIL countdown = 0 {
PRINT "..." + countdown.
SET countdown TO countdown - 1.
WAIT 1. // Ставит скрипт на паузу на 1 секунду
}.
Видите эти штуки с двумя слэшами ("//")? Это комментарии на языке Kerboscript, и это способ написать строки в программе, которые ничего не делают - они там для людей, таких как вы, которые хотят понять, что вообще происходит. В этом примере, в общем-то, нет необходимости набирать то, что отмечено двумя слэшами. Они там лишь для удобства вашего чтения, и вы можете их пропустить, если хотите.
Сохраните файл в папке Plugins/PluginData/Archive (там, где установлена ваша KSP) под именем "hellolaunch.txt". НЕ сохраняйте его нигде внутри GameData/kOS/. НЕ СТОИТ. Согласно стандарту, нормальные моды для KSP должны хранить свои файлы в GameData/[имя мода], но kOS хранит архив вне папки GameData, потому что там лежат данные игрока - ваши данные, а не данные мода.
Сохраняя файл в Plugins/PluginData/Archive, вы, вообще говоря, сохраняете их на вашем архивном томе. kOS увидит его немедленно и без задержки, и вам не нужно перезапускать игру. Если вы напишете
SWITCH TO 0.
LIST FILES.
после сохранения файла в вашем текстовом редакторе, вы увидите ваш "hellolaunch.txt". (Вне игры ваш файл должен иметь расширение *.txt, но в игре вы не увидите его расширения.)
O'кей, теперь скопируйте файл на ваш локальный привод и попробуйте запустить его оттуда.
SWITCH TO 1.
COPY HELLOLAUNCH FROM 0.
RUN HELLOLAUNCH.
Пока ваша программа не делает ничего, кроме обратного отсчета от 10 до 0. Немного разочаровывающе, но мы ведь еще не написали оставшуюся часть.
Вы, наверное, обратили внимание, что все, что вы сделали - это переключились на локальный том (1), затем скопировали программу из архива (0) на локальный том (1), и только потом запустили ее с локального тома (1). Технически, в этом нет необходимости. Вы вполне можете запускать программы прямо из архива. Но для тех, кто ищет от KSP ролевой составляющей, имеет смысл никогда не запускать программы прямо из архива, а, вместо этого, копировать их на корабль для запуска.
О'кей, идем обратно в
текстовый редактор и добавляем еще несколько строк в "hellolaunch.txt" так, что бы теперь он выглядел вот так:
// Мой первый лончер.
//
SET countdown TO 10.
PRINT "Counting down:".
UNTIL countdown = 0 {
PRINT "..." + countdown.
SET countdown TO countdown - 1.
WAIT 1. // Ставит здесь скрипт на паузу на одну секунду.
}.
PRINT "Main throttle up. 2 seconds to stabalize it.".
LOCK THROTTLE TO 1.0. // 1.0 это максимум, 0.0 это отсутствие.
WAIT 2. // даем время тяге выровняться.
UNTIL SHIP:MAXTHRUST > 0 {
WAIT 0.5. // Пауза в пол секунды между попытками откинуть ступень.
PRINT "Stage activated.".
STAGE. // То же самое, что нажать ПРОБЕЛ.
}.
WAIT UNTIL SHIP:ALTITUDE > 70000. // Пауза, пока корабль не наберет достаточную высоту.
//
// Обратите внимание, что важно не дать скрипту завершить работу
// прямо здесь. Как только kOS закончит выполнение скрипта, он "отпустит"
// все управление для ручного пилотирования, что бы вы смогли вручную
// управлять своей ракетой. Если программа просто закончится здесь,
// это может привести к падению тяги до нуля.
Сохраните измененный "hellolaunch.txt" и заново скопируйте его на ваш корабль, который должен все еще стоять на стартовом столе, а потом запустите, примерно так:
COPY HELLOLAUNCH FROM 0.
RUN HELLOLAUNCH.
Эй! Теперь оно что-то делает! Оно запускает первую ступень и стартует!
Но… Но подождите… Он ведь не контролирует положение ракеты и она летит куда ей вздумается…
Вполне вероятно, что вы разбились, исполняя этот скрипт, потому что он не делал ничего с рулевым управлением, так что он скорее всего дал ракете упасть.
Итак, что бы исправить имеющуюся проблему, добавим в скрипт рулевое управление.
Легкий способ контролировать рулевое управление - использовать команду LOCK STEERING.
Как только вы освоите основы kOS, вам следует прочитать [url=http://]документацию по техникам рулевого управления кораблем[/url], но это более продвинутая тема, которую мы оставим на потом.
Способ использования команды LOCK STEERING заключается в штуке, которую называют [url=http://]вектор[/url] (VECTOR) или [url=http://]направление[/url] (DIRECTION). В kOS встроены некоторые направления, одно из которых есть "UP" (вверх).
"UP" - это направление, нацеленное всегда в небо (центр голубой части навбола).
Что бы быть направленным всегда вверх, просто сделайте следующее:
LOCK STEERING TO UP.
Так что если вы добавите эту строчку в ваш скрипт, вы получите нечто, что удерживает вашу ракету всегда направленной вверх и не дает ей отклоняться. Добавьте эту строку сразу после строки, задающей тягу, примерно так:
// Мой первый лончер.
//
SET countdown TO 10.
PRINT "Counting down:".
UNTIL countdown = 0 {
PRINT "..." + countdown.
SET countdown TO countdown - 1.
WAIT 1. // Ставит здесь скрипт на паузу на одну секунду.
}.
PRINT "Main throttle up. 2 seconds to stabalize it.".
LOCK THROTTLE TO 1.0. // 1.0 это максимум, 0.0 это отсутствие.
//
//
LOCK STEERING TO UP.
//
//
WAIT 2. // даем время тяге выровняться.
UNTIL SHIP:MAXTHRUST > 0 {
WAIT 0.5. // Пауза в пол секунды между попытками откинуть ступень.
PRINT "Stage activated.".
STAGE. // То же самое, что нажать ПРОБЕЛ.
}.
WAIT UNTIL SHIP:ALTITUDE > 70000. // Пауза, пока корабль не наберет достаточную высоту.
//
// Обратите внимание, что важно не дать скрипту завершить работу
// прямо здесь. Как только kOS закончит выполнение скрипта, он "отпустит"
// все управление для ручного пилотирования, что бы вы смогли вручную
// управлять своей ракетой. Если программа просто закончится здесь,
// это может привести к падению тяги до нуля.
Как и всегда, скопируйте это и запустите. Если ваша ракета упала во время предыдущего запуска (а она скорее всего это сделала), просто вернитесь (revert) в VAB и перезапустите ее.
ЗАМЕТКА: Из-за некоторых багов, иногда перезапуск со стартового стола (revert to the launchpad) работает не вполне корректно и нужно перезапускать из VAB. SWITCH TO 1. //Уже пора бы привыкнуть ;)
COPY HELLOLAUNCH FROM 0.
RUN HELLOLAUNCH.
Теперь вы должны видеть то же, что и ранее, но ваша ракета будет все время направлена вверх.
Но постойте. Теперь оно отрабатывает только первую ступень и останавливается, не запуская следующую ступень. Как это исправить?Логика того, когда и как запускать ступени может быть интересной и забавной штукой для самостоятельного написания. Этот пример сохранит ее очень простой, и здесь как раз важно, что бы ваша ракета содержала только двигатели на жидком топливе. Если ваша ракета содержит ТТУ, для корректного запуска вам понадобится более сложный скрипт, чем дает этот учебник.
Что бы добавить логику отстрела ступеней мы представляем новую концепцию, называемую триггером "WHEN" (когда). Что бы увидеть полную документацию по ней, когда вы закончите этот учебник, посмотрите [url=http://]страничку "Управление потоком"[/url].
Быстрое и простое объяснение: WHEN-секция - это короткая секция кода, которая будет выполнена ПОЗЖЕ, чем прямо сейчас. Она создает фоновую проверку, которая будет постоянно проверять выполнение некоторого условия, и когда оно будет выполнено, основная программа будет прервана, что бы она ни делала, и будет исполнено тело WHEN-секции кода, после чего будет продолжено выполнение основного текста программы.
С использованием WHEN-триггеров связано несколько сложных опасностей, которые могут привести к подтормаживанию и полному зависанию KSP, если вы будете неосторожны, но их объяснение выходит за рамки этого учебника. Но если вы собираетесь использовать WHEN-триггеры самостоятельно, вам стоит прочитать секцию об этом операторе на [url=http://]страничке "Управление потоком"[/url].
WHEN-триггер, который мы добавим к нашему скрипту выглядит примерно так:
WHEN STAGE:LIQUIDFUEL < 0.001 THEN {
PRINT "No liquidfuel. Attempting to stage.".
STAGE.
PRESERVE.
}.
Здесь сказано: "Когда количество жидкого топлива в текущей ступени будет настолько мало, что его может уже и не быть (<0.001), нужно активировать следующую ступень". Ключевое слово PRESERVE говорит: "Не прекращать проверку этого условия просто потому, что оно уже однажды сработало. Проверять нужно и дальше, до судного дня".
Проверка 0".
Теперь ваш скрипт должен выглядеть так:
// Мой первый лончер.
//
SET countdown TO 10.
PRINT "Counting down:".
UNTIL countdown = 0 {
PRINT "..." + countdown.
SET countdown TO countdown - 1.
WAIT 1. // Ставит здесь скрипт на паузу на одну секунду.
}.
PRINT "Main throttle up. 2 seconds to stabalize it.".
LOCK THROTTLE TO 1.0. // 1.0 это максимум, 0.0 это отсутствие.
//
//
LOCK STEERING TO UP.
//
//
WAIT 2. // даем время тяге выровняться.
WHEN STAGE:LIQUIDFUEL < 0.001 THEN {
PRINT "No liquidfuel. Attempting to stage.".
STAGE.
PRESERVE.
}.
WAIT UNTIL SHIP:ALTITUDE > 70000. // Пауза, пока корабль не наберет достаточную высоту.
//
// Обратите внимание, что важно не дать скрипту завершить работу
// прямо здесь. Как только kOS закончит выполнение скрипта, он "отпустит"
// все управление для ручного пилотирования, что бы вы смогли вручную
// управлять своей ракетой. Если программа просто закончится здесь,
// это может привести к падению тяги до нуля.
Опять перезапустите ракету, скопируйте скрипт и запустите его.
На этот раз вы должны увидеть как активируются ваши верхние ступени. (Опять же, если предположить, что вы сделали всю ракету только на жидком топливе).
О'кей, все это круто, но оно все еще летит по прямой верх! Как быть с гравитационным поворотом?Что ж, истинный и правильный гравитационный поворот - это довольно сложный матан, который лучше оставить читателю в качестве самостоятельного упражнения, памятуя о том, что цель kOS - позволить вам написать свой СОБСТВЕННЫЙ автопилот, а не написать его за вас. Но что бы дать вам примеры базовых команд, давайте просто сделаем очень грубое приближение гравитационного поворота, к которому прибегают большинство новичков в KSP, когда только учатся летать в первый раз:
- Летим прямо до высоты 10000 метров.
- Поворачиваем на 45 градусов вниз на восток до высоты в 40000 метров.
- Ускоряемся горизонтально на восток после этого.
Что бы это работало, мы представляем вам новый способ задания направления - функцию HEADING.
Когда бы вы ни вызвали функцию HEADING(a,b), она задаст ориентацию как на навболе:
- Направиться по компасу на A.
- Отклониться вверх от уровня горизонта на B градусов.
Так, например, HEADING(45,10) нацелит вас на северовосток и на 10 градусов над горизонтом.
Комбинируя это с командой WHEN мы получим следующий фрагмент кода:
WHEN SHIP:ALTITUDE > 10000 THEN {
PRINT "Starting turn. Aiming to 45 degree pitch.".
LOCK STEERING TO HEADING(90,45). //на восток, тангаж 45 градусов.
}.
WHEN SHIP:ALTITUDE > 40000 THEN {
PRINT "Starting flat part. Aiming to horizon.".
LOCK STEERING TO HEADING(90,0). //на восток, горизонтально.
}.
Обратите внимание на отсутствие здесь команды PRESERVE, в отличие от предыдущего примера с WHEN. Это потому, что нам этот триггер нужен только один раз и больше никогда не понадобится. Нет никакого смысла напоминать kOS сбрасывать положение к одному и тому же значению раз за разом, пока выполняется скрипт.
Теперь если вы вставите этот новый фрагмент в скрипт, мы получим миленький и стильненький пример запускающего скрипта. Обратите внимание, что этот фрагмент кода будет работать даже если вы вставите его в начало скрипта, потому что он задает триггеры, которые сработают ПОЗЖЕ, когда будет выполнено условие. Триггеры не будут выполнены вотпрямщас.
// Мой первый лончер.
//
WHEN SHIP:ALTITUDE > 10000 THEN {
PRINT "Starting turn. Aiming to 45 degree pitch.".
LOCK STEERING TO HEADING(90,45). //на восток, тангаж 45 градусов.
}.
WHEN SHIP:ALTITUDE > 40000 THEN {
PRINT "Starting flat part. Aiming to horizon.".
LOCK STEERING TO HEADING(90,0). //на восток, горизонтально.
}.
SET countdown TO 10.
PRINT "Counting down:".
UNTIL countdown = 0 {
PRINT "..." + countdown.
SET countdown TO countdown - 1.
WAIT 1. // Ставит здесь скрипт на паузу на одну секунду.
}.
PRINT "Main throttle up. 2 seconds to stabalize it.".
LOCK THROTTLE TO 1.0. // 1.0 это максимум, 0.0 это отсутствие.
//
//
LOCK STEERING TO UP.
//
//
WAIT 2. // даем время тяге выровняться.
WHEN STAGE:LIQUIDFUEL < 0.001 THEN {
PRINT "No liquidfuel. Attempting to stage.".
STAGE.
PRESERVE.
}.
WAIT UNTIL SHIP:ALTITUDE > 70000. // Пауза, пока корабль не наберет достаточную высоту.
//
// Обратите внимание, что важно не дать скрипту завершить работу
// прямо здесь. Как только kOS закончит выполнение скрипта, он "отпустит"
// все управление для ручного пилотирования, что бы вы смогли вручную
// управлять своей ракетой. Если программа просто закончится здесь,
// это может привести к падению тяги до нуля.
Вот как это выглядит в действии:
И до самого конца:
Если предположить, что вы сделали корабль, у которого достаточно топлива и энергии, что бы взобраться на орбиту, в принципе, этот скрипт вытащит вас из атмосферы. Скорее всего, корабль все равно упадет обратно, потому что скрипт никак не убеждается в том, что корабль набрал достаточную для поддержания орбиты скорость.
Как вы, наверное, заметили, этому скрипту еще далеко до того, что бы стать по-настоящему ХОРОШИМ автопилотом. Подумайте о следующих опциях, которые вы могли бы добавить сами, когда вы сильнее подружитесь с kOS:
- Вы можете изменить логику рулевого управления, что бы делать более плавный гравитационный поворот, постоянно подстраивая тангаж в операторе HEADING в соответствии с какой-либо математической формулой.
- Вы можете завершить запускающий скрипт проверкой, что ваш корабль вышел из атмосферы и перешел на стабильную орбиту, а не просто выключился после 70000 км и дрейфует.
- Этот скрипт тупо удерживает тягу на максимуме на протяжении всего подъема. Вы можете его усложнить, подстраивая тягу при необходимости, что бы избежать избыточного расхода энергии на преодоление атмосферного трения. (Между прочим, стоковая аэродинамика KSP устроена так, что оптимально движение с терминальной скоростью).
- С более сложными проверками на ступенях этот скрипт мог бы работать и с твердотопливными ускорителями.
- С еще более замысловатыми проверками можно заставить этот скрипт с более мудреными методами разделения ступеней, например с пакетной схемой (asparagus).
- Используя команду PRINT AT вы можете устроить вывод необходимой информации на экран терминала, пока работает скрипт.