Добрых шестичасовых суток!
Хочу представить вам свои наработки по созданию автоматического пилотирования на основе скриптов kOS. Сегодня речь пойдет об автоматической посадке на Кербин …постойте! – скажут некоторые – во-первых, в чем сложности посадки на Кербин?! – есть же парашюты; а во-вторых, есть MechJeb. Правильно, ни то и ни другое не мешает нам расслабиться и наслаждаться жизнью, т.е. полетом. Но мы были бы не мы, если бы не ставили перед собой дополнительных задач, которые помогают нам смотреть шире на обыденные для нас вещи.
Итак, автоматическая посадка на Кербин без парашютов и MechJeb’а, имея в наличии всего лишь kOS-процессор на борту и скрипт посадки “landing.ks”.
Немного школьной физики и о том, как работает автопилот. За основу взята формула равноускоренного движения:
По-хорошему, падение тела в атмосфере не является равноускоренным движением, так как имеется зависимость ускорения свободного падения от высоты и наличия гравитационных аномалий, и как самое главное, есть сопротивление воздуха. Если первое практически незаметно на малых высотах, то сопротивление атмосферы дает ощутимое изменение в скорости падения. Но и этим мы можем пренебречь, если вести расчет в каждый момент времени полета/приземления.
Какие же данные нам необходимы на входе, а какие на выходе нашего расчета? Самое главное, что нам нужно, получить значение тяги двигателя в заданный момент времени. Направление/наклон корабля доверим встроенному SAS, но в будущем будем высчитывать нужные вектора сами. Соответственно на входе у нас будут:
Таким образом, необходимо рассчитать значение ускорения корабля из формулы равноускоренного движения, при минимальном времени прожига - t min. Если с остальными входными данными все якобы понятно, то t min нам необходимо вычислить из формулы конечной скорости.
Из формулы h получаем ускорение a:
Где текущее ускорение зависит от разности векторов сил тяги и притяжения, и выражается:
Throttle – это текущее значение дросселя тяги корабля в % от максимальной maxFp. Отсюда:
Запихиваем эту формулу в цикл:
until ship:status = "LANDED" or ship:status = "SPLASHED" or ship:status = "PRELAUNCH"
и получаем постоянное вычисление тяги до момента мягкой посадки.
Теперь от теории к практике.
Мы запустим небольшой лендер на НКО и посадим его при помощи скрипта.
Копируем наш скрипт в память корабля, т.к. потом связи у нас не будет (антенну я благополучно забыл установить на лендер). Проверяем наличие файла командой list.
Тестируем скрипт, запускаем прямо на "стартовом столе"!
Скрипт сообщает, что корабль приземлился успешно, но он то не знает, что мы еще не стартовали. Так что вперед!
Выводим на НКО.
И прожигаем остаток топлива РН для маневра торможения и схода с НКО.
Сбрасываем обтекатели и отстыковываемся.
Проводим маневр аэроторможения и молимся о том, чтобы не сгореть и не попасть к кракену.
После успешного торможения в верхних слоях атмосферы, готовимся запустить наш автопилот.
Джеб в предвкушении.
Запускаем скрипт, после чего лендер разворачивается в ретрогрейд и на экране kOS появляются текущие параметры полета.
В нужный момент скрипт активирует двигатели и начинается сброс скорости. К примеру, было потрачено 510 единиц дельты на весь маневр торможения.
В итоге, наш аппарат приземляется и автопилот отключается.
P. S. Подводные камни.
Как всегда, не все так прекрасно, как очень хочется. Нельзя просто так запустить скрипт на любом аппарате, удобном для посадки на Кербине, или еще где. Необходимо учесть два параметра, разных для каждого аппарата.
1. Измерение высоты полета над поверхностью не учитывают высоту самого крафта, в следствии чего расчетная финальная высота в реальности оказывается ниже уровня земли, и мы получаем не очень мягкую посадку.
2. Инертность работы скрипта ведет к зависанию аппаратов с двигателями с большим TWR над поверхностью земли, т.к. импульсы тяги больше, чем нужно, и скрипт вылетает из-за потери ретрогрейда.
Если в решении второй проблемы я ввел в скрипт программный лимит тяги (эмпирически выведен лимит в TWR=2), то для решения первой приходится вводить данные о высоте крафта в скрипт, а точнее высоту расположения командного модуля относительно самой нижней точки крафта.
Пока все. Спасибо за внимание.
Скрипт landing.ks