В этой статье, по крайней мере в этой, я не буду глубоко лезть в формулы и ручные расчеты. Для того, чтобы разжевать все алгоритмы, лежащие в основе работы программы, надо написать довольно толстый учебник, включающий в себя основы астрономии, описание задачи Ламберта, численные методы и многое другое. Я покажу, как используя данную поделку и встроенный инструментарий KSP (ну ещё и MechJeb) спланировать полет от Кербина к другой планете.
Скачать данное "чудо инженерной мысли"
можно по ссылке. Для установки просто распакуйте содержимое архива куда вам нужно. Правда, для работы нужен .Net Framework 4.0, и если его нет, как например при работе в Win XP, то придется установить его. Инсталатор с автоматическим подтягивание .Net я пока е запилил. Программа доступна по лицензии GNU GPL v2.0, а значит вы можете получить её исходники
вот тутUpdate 15/10/2015: Исправил досадный баг с вывалом при попытке построения трансфера с планеты к спутнику. Хотя, в будещем можно будет такой расчет добавить... Бинарник перезалил, гит откоммитил
Перейдем к делу
1. Интерфейс планировщика и расчет выгодной траектории к Дюне
Главное окно планировщика изображено на рисунке. Планету-цель (Departure body) и планету отправления (Arrival body) выбираем в выпадающих списках слева вверху. В окошках, озаглавленных Transfer windows search time interval выставляем диапазон дат, в котором следует произвести поиск стартовых окон. В верхней строке ставим текущую дату, в нижней, предполагаемую, до которой обязательно будет какое-то стартовое окно. Эту дату ставим "на глазок", исходя из личного опыта. Скажем, мы знаем, что для полета на Дюну стартовые окна проскакивают в среднем раз в два года. А можно и не на глазок: есть такое понятие как
синодический период обращения - промежуток времени, через который повторяется взаимное расположение планет. Для Дюны он чуть более 800 дней (кербальских дней!), что чуть менее чем два кербальских года. Стартовое окно обязательно появится в течении этого периода.
Рядом со списком планет можно указать высоту опорной орбиты вокруг планеты отправления и число витков по этой орбите, которые вы хотите выполнить перед разгоном на межпланетную траекторию. Время этих витков будет учтено при расчете даты старта.
Важный параметр - угол Psi. Смысл этого параметра показан на рисунке - это угол между условной точкой лежащей противоположно планете отправления (оппозитная точка) и фактической точной встречи с планетой-целью на её орбите. Чтобы было поятно в чем смысл и для объяснения общих принципов построения неплоских траекторий перелета смотрим картинку
Зеленая плоскость - плоскость орбиты планеты отправления, в случае с Кербином она совпадает с плоскостью эклиптики. В случае другой планеты - может не совпадать, но это не принципиально, а для простоты положим что совпадает (программа строит трансфер для произвольных орбит). Желтая плоскость - плоскость орбиты планеты цели, которая пересекает эклиптику по прямой, обозначенной хитрыми астрономическими закорюкамим - восходящий и нисходящий узлы. Чтобы перелететь от одной планеты к другой, нам, в общем случае, придется лететь в третьей плоскости - красная плоскость орбиты трансфера. Эта орбита пересечет орбиту цели в точке A. В зависимости от момента запуска целлевая планета D может оказаться в точке A, может не долететь до неё (как на рисунке), а может и перелететь. Разность долгот планеты D и точки прибытия A будем называть ошибкой прицеливания по долготе (угол Lambda_err или A1D1S на чертеже).
Из-за наклонения орбиты цели, при перелете по эллипсу Гомана, для достижения оппозитной точки O, мы будем вынуждены лететь по орбите, наклоненной на 90 градусов к эклиптике. А это крайне энергетически не выгодно. Поэтому, прилететь в оппозитную точку O мы можем только если она лежит в узле орбиты. В противном случае, получить меньшее наклонение трансферной траектории можно не долетев до оппозитной точки на угол Psi (угол показан на рисунке между отрезками SO1 и SA1). За это придется заплатить более вытянутой трансферной орбитой и более высокой скоростью запуска, но как мы увидим, оптимальная скорость запуска не обязательно попадает строго в оппозит. Регулируя угол Psi в программе можно интерактивно изменять трансферную орбиту, добиваясь нужных параметров. Угол можно ввести вручную или воспользоваться кнопочками "+" и "-" чтобы быстро прибавить/отнять от текущего значение шаг, задаваемый в соседнем окошке dPsi. при этом траектория автоматически пересчитывается. Можно подобрать Psi при котором будет минимальна "дельта", необходимая для старта.
Обратим внимание как теперь складываются скорости. по орбите мы полетим со скорость Va. Часть скорости - скорость исходной планеты Vk у нас уже имеется. Значит, чтобы выйти на нужную траекторию нам надо вылететь из сферы действия планеты отправления со скоростью Vro. Видно, что она будет больше, чем при компланарном перелете. Так что вытягивая эллипс перелета, но уменьшая при этом угол наклона трансферной орбиты, мы не тратим "дельту", а экономим её.
Как происходит расчет в программе:
1. Задается дата старта.
2. Исходя из Psi расчитывается положение точки прибытия и строится эллитическая (или праболическая/гиперболическая) траектория перелета.
3. Вычисляется время перелета.
4. Вычисляется положение планеты цели в момент прибытия корабля в точку встречи.
5. Оценивается ошибка по долготе. Если она не равна нулю, а скажем больше нуля - недолет, идем к пункту 1, сдвигая дату старта, и так, пока не получим перелет. Дата последнего недолета и первого перелета - границы интервала, в котором будет попадание.
6. Уточняем дату перелета (я использовал метод половинного деления для решения уравнения
корень которого - и есть дата отлета. При этом учитывается, что планеты и корабль движутся неравномерно по эллипсам, а формулы для расчета движения по таким орбитам вы видели во второй части :). Так что задачка довольно сложна и называется частной задачей Ламберта. Частная она потому, что рассматривает лишь траектории, старт на которые происходит из их перицентра (в случае внешней планеты-цели) или апоцентра (в случае внутренней планеты-цели). Так что в программке рассматриваются не все возможные траектории.
Но её возможностей уже хватает, чтобы летать красиво. Попробуем слетать.
Сначала я построил такую траекторию
Почему? Большая же дельта - аж 1206.27 м/с (смотрим зону окна с заголовком Search result, параметр prograde dV). Обратите внимание на параметр low orbit inc - наклонение опорной орбиты: он равен нулю. Это значит, что при старте с Кербина мы должны вылетать с экваториальной орбиты. Учитывая, что выйти на заданное наклонение орбиты довольно тяжело, а негодяй-MechJeb при выведение на орбиту с наклонением, скажем 2 градуса тупо ставит курс 90 - 2 = 88 градусов и не регулирует его (хотя надо управлять по рысканию!) точно выйти на орбиту у нас не выйдет. А на экваториальную выйти проще всего, и мы экономим топливо нижних ступеней, значит можем залить чуть больше в верхние.
Получилась траектория, на которую следует выйти в момент времение Arrival Date. Это НЕ дата старта! Это момент времени выхода из сферы влияния Кербина, момент выходя на Солнечную орбиту. А до этого, нам ещё три дня лететь от Кербина по гиперболе, поэтому время старта - eject time, там учитывается отлет от Кербина. Кроме того, там учитыватеся и число полных витков, совершенных на опорной орбите до запуска (задается в окошке Wait turns). Еще из eject time надо вычесть время выведения на орбиту, но это уже сами. Поучится дата, когда надо стартовать с поверхности Кербина.
В окне программы отображается траектория перелета. Красные точки - положения планет в начале перелета, синие - их положение в конце. Видим, что прибудем к Дюне в районе восходящего узла её орбиты. Отсюда и нулевые наклонения орбиты трансфера и опорной орбиты. К Дюне мы прибываем через 147 дней поле запуска.
НО! При проверке в KSP меня ждала засада, в виде оказавшейся на пути Мун. Ведь эта чертовка летает в плоскости эклиптики, иногда попадает на траектории покидания (Айк у Дюны ведет себя ещё неприличнее). И мы, вопервых, теряем скорость, во вторых не видим, попадаем мы по Дюне или нет, в планировщике KSP.
Пришлось отказаться от экваториальной орбиты и сделать орбиту под углом 2 градуса, дабы перепрыгнуть "гадину". При этом восходящий узел, нисходящий узел, Кербол и Кербин должны находится на одной прямой. Восходящий узел болжен располагаться а точке, находящейся над ночной стороной Кербина. При этом получилась гораздо меньшая дельта, но гораздо большее время перелета (Transfer time)
Теперь время перелета - 264 дня. И вообще - чем больше время перелета, тем, как правило, меньше потребная дельта.
2. Проверяем теорию практикой - Go to Duna!
Теперь идем в KSP и выставляем маневр
Заметьете - я выставил расчитанную дельту в прогрейд и не трогал её. Я варьировал лишь время запука, используя Shift time в редакторе маневра межджеба. И попадаю таки в Дюну, правда дистанция сближения в 25000 км не радует.
Погрешность обусловлено тем, что алгоритм расчета не учитывает
1. Движение в сфере дейтсвия Дюны. Попадание рассчитывается "в точку" а не планету с гравитацией. Пока так, для простоты, потом посмотрим.
2. Не учтено, что двигаясь по наклонной низкой орбите а потом и по гиперболе, мы выходим из эклиптики и стартуем не из её плоскости, а несколько более высокой точки. Учесть довольно тяжело.
3. Даже при использовании данных игры мои расчеты слегка расходятся с рачетами в самой игре. Для добычи параметров планет писал небольшой мод, выдирающий эти данные и записывающий в XML-файл. Этот файл потом легко парсить в C#.
Так что с учетом этих факторов - точность нормальная. Потом откорректируем. Посмотрим на маневр сверху
и найдем, что полученный трансфер похож на тот, что построил "Звездочет". Ну что же - жгём!
После разгона ещё раз проверяем траекторию, и убеждаемся, что всё в порядке
Тем не менее, нам потребуется коррекция. Впереди маячит узел орбиты - идеальная точка. Там мы подправим и плоскость орбиты и радиальную проекцию скорости, чтобы свести к минимуму отклонение от точки сближения с Дюной.
Я спешил, поэтому не подобрал нормальную коррекцию. Можно было вообще свести отклонения к минимуму, но это я продемострирую как-нибудь потом. Пока делаем маневр, после которого мы сближаясь с Дюной оказываемся вот в таком положении
Радиальным импульсом опускаем перицентр орбиты сближения до 70 км
Ну и после торможения до круговой орбиты празднуем прибытие к Дюне
Заключение
Программа выполнена отдельной для отладки. Потом, вероятно, я превращу её в мод. Это не сложно, ибо все расчеты выполнены в виде отдельной библиотеки и отвязаны от юзер-интерфейса. Для мода надо лишь написать интерфейс. Ну и воспользоваться функциями игры для определения положения планет. Чтобы строить трансферы точнее. Пока отдаю как есть, пользуйтесь на здоровье. Проект, я надеюсь будет развиваться.
Продолжение следует...
P.S.: Программа не предназначена для полетов с к Мун и Минмусу. Но, можно перелететь с Мун на Минмус находясь на её орбите. Можно летать между спутниками Джула. Короче говоря, от планеты к планете, и от спутника к спутнику рассчитывать траектории можно. При перелете между спутниками в роли солнца выступает планета-хозяин.