Теория и практика межпланетных перелетов. Часть 3. Программа "Звездочет"

Kerbal Space Program » Гайды

В этой статье, по крайней мере в этой, я не буду глубоко лезть в формулы и ручные расчеты. Для того, чтобы разжевать все алгоритмы, лежащие в основе работы программы, надо написать довольно толстый учебник, включающий в себя основы астрономии, описание задачи Ламберта, численные методы и многое другое. Я покажу, как используя данную поделку и встроенный инструментарий 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 дней (кербальских дней!), что чуть менее чем два кербальских года. Стартовое окно обязательно появится в течении этого периода.

Теория и практика межпланетных перелетов. Часть 3. Программа "Звездочет"


Рядом со списком планет можно указать высоту опорной орбиты вокруг планеты отправления и число витков по этой орбите, которые вы хотите выполнить перед разгоном на межпланетную траекторию. Время этих витков будет учтено при расчете даты старта.

Важный параметр - угол 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.: Программа не предназначена для полетов с к Мун и Минмусу. Но, можно перелететь с Мун на Минмус находясь на её орбите. Можно летать между спутниками Джула. Короче говоря, от планеты к планете, и от спутника к спутнику рассчитывать траектории можно. При перелете между спутниками в роли солнца выступает планета-хозяин.
Теория и практика межпланетных перелетов. Часть 4. Выход на орбиту с заданной ориентацией в пространстве
Теория и практика межпланетных перелетов. Часть 4. Выход на орбиту с заданной ориентацией в пространстве
23 окт 2015 в 02:18, Гайды
Теория и практика межпланетных перелетов. Часть 1.
2 окт 2015 в 21:49, Гайды
  1. Басила

    Басила 13 октября 2015 12:03

    Еще не читал, но яростно плюсую.

    ЗЫ. Уже прочитал. Шикарно просто. Всегда напрягали автоматические трансферы МЖ - сам не умею, полностью завишу от местами очень странно работающего мода. А тут все так по-взрослому :)
    А насколько сложно расчитывать время начала прожига, если допустим делать его в три витка? Ну вот ионник например, и к Илу - за один раз не очень хорошо разгоняться, лучше поделить дельту прожига на три или четыре включения. Или сильно сложно учитывать изменяющий период обращения? Шикарно было бы, еще одна фишка в которую не смогут МЖ и ТВР )

  2. Major Tom

    Major Tom 13 октября 2015 12:58

    есть программа Transfer Window PLanner гораздо удобнее, где визуально представлена информация о дате отбытия, параметрах орбиты для отлета и ДЕЛЬТЕ (чего я тут не увидел), кроме того она интегрирована в существующий кербинский "будильник-планировщик" от того же автора.
    forum.kerbalspaceprogram.com/threads/93115-0-24-2-Transfer-Window-Planner-v1-0-1
    -0-%28Sept-9%29
    я мимо прохожу.

  3. maisvendoo

    maisvendoo @Дмитрий 13 октября 2015 13:51 Автор

    Я знаю.
    1) Моя точнее
    2) TWP при наступлении даты старта имеет неприятное свойство - постоянно переносить старт на два года вперед.
    3) TWR не умеет параболические и гиперболические трансферы. Моя умеет. Конечно - много дельты. Но для полноты картины
    4) Разве TWP дает рекомендацию по параметрам опорной орбиты? Наклонение, положение восходящего узла? А это нужно для точного выведения на трансфер. TWP дает дельту, а вдоль какого вектора эту дельту жечь?

    Цитата: Major Tom
    где визуально представлена информация о дате отбытия, параметрах орбиты для отлета и ДЕЛЬТЕ (чего я тут не увидел)


    Есть и дельта и все даты. Что до областей дельта-дата, так чего же вы хотите от первого бета-релиза? Будет.

    P.S.: Каждому удобнее своё. Вам удобнее TWP - разве кто-то против? У меня свой взгляд на вопрос, думаю тоже никто не против, а только польза

  4. Rumatu

    Rumatu 13 октября 2015 14:06

    А Depature и Arrival местами не перепутаны?

  5. Jenyaza01

    Jenyaza01 @Евгений 13 октября 2015 14:13

    ОО, круто, всё уже серьёзно )

  6. maisvendoo

    maisvendoo @Дмитрий 13 октября 2015 14:16 Автор

    Цитата: Rumatu
    А Depature и Arrival местами не перепутаны?

    Действительно - ПЕРЕПУТАНЫ angry

    Вот черт... departure - "вылет из", arrival - "прибытие в". Понадеялся на память не стал гуглить перевод :(

    Перекомпилю и перезалью, что делать. Спасибо

    P.S.: Исправил. Перезалил, добавил коммит в репозиторий. Через некоторое время поменяю в статье



  7. nikollor

    nikollor @Ник 13 октября 2015 15:40

    Затычку бы повесил на трансферы типа "Мун-Дюна", а то окно эксепшена раздаражает жуть...

  8. maisvendoo

    maisvendoo @Дмитрий 13 октября 2015 16:30 Автор

    Да, это надо сделать. Где-то там есть проверка на одинаковое Reference Body у точек отправления и прибытия, но видимо я забыл её обработать

  9. Major Tom

    Major Tom 13 октября 2015 19:36

    Убедительные разъяснения убедительны. Уважаю людей которые могут аргументированно отстоять свою точку зрения. Плюс за это. Только дельту в финальный релиз добавьте пожалуйста. Ибо надо

  10. Axmetov

    Axmetov @Михаил Ахметов 13 октября 2015 23:56

    На сайт пришел одновременно программист и астроном 80-уровня. Дядя, ты просто невероятно крут!!! Респектище!!!

  11. Gentleman

    Gentleman @Легион имя мне, ибо нас много. 14 октября 2015 00:14

    Плюс. Пока еще полностью не осилил, сказалась нехватка времени, но завтра я в компании чая перечитаю все это дело в целях повышение собственной образованности. Огромное спасибо Вам за колоссальный труд!

  12. maisvendoo

    maisvendoo @Дмитрий 14 октября 2015 08:10 Автор

    Цитата: Басила
    А насколько сложно расчитывать время начала прожига, если допустим делать его в три витка? Ну вот ионник например,

    Намного сложнее.
    Расчет траектории по двум известным положениям в пространстве - в математике это называют краевой задачей для системы дифференциальных уравнений движения. Один из методов решения - метод стрельбы, как раз и описан в статье.

    Так вот в случае полета с большой тягой нам уже известно решение уравнений движения - эллипсы, параболы, гиперболы. При полете на ионнике с малой тягой придется интегрировать дифуры, да ещё и отслеживать попадание траектории в нужные точки.

    Что-то подобное, приближенные методы есть у Левантовского в "Механике космических полетов". Сам пока не думал о малой тяге, хотя направление перспективное

  13. Degrizai

    Degrizai 14 октября 2015 14:28

    Много плюсов за вагон матана, ЧСХ.

    И очень прошу в следующем гайде научить нерадивых пейлотов приорбитиваться в заданной точке планет...

  14. Bradley_

    Bradley_ 14 октября 2015 15:40

    Это ведь не гайд по трансферам, это матан для продвинутых.

  15. maisvendoo

    maisvendoo @Дмитрий 14 октября 2015 15:43 Автор

    Не очень понимаю, где тут матан? Одна формула в статье и та для галочки.

    Что до схемы, ну, черт побери, рассказывать о полетах к другим планетам, как правильно это делать, экономно и без геморроя и не показать как выглядит траектория полета... Это всё равно что на машине ездить с завязанными глазами.

    Всё что написано, напрямую связано с тем, как потратить меньше дельты. Если посмотреть скрины маневров, то общая дельта от орбиты Кербина до Орбиты Дюны составила 1769,28 м/с. И это потому, что я поленился получше сделать первую коррекцию. Возможно тогда вторая на 75 м/с и не понадобилась бы. Я думаю, такая дельта - это неплохо.

    А на ютубе можно найти ролики, где во время маневрирования при подходе к Дюне жгут дельту сотнями-тысячами, и называют это "гайдом"... Не знаю, если теперь матаном называют элементарную схемку на понимание и иллюстрацию принципа, то я, видимо отстал от жизни

  16. Fell-x27

    Fell-x27 @Денис 14 октября 2015 16:08

    Цитата: Degrizai
    Много плюсов за вагон матана, ЧСХ.

    И очень прошу в следующем гайде научить нерадивых пейлотов приорбитиваться в заданной точке планет...

    Мод есть, называется Trajectories, как раз для таких вещей.

  17. maisvendoo

    maisvendoo @Дмитрий 14 октября 2015 16:34 Автор

    Цитата: Fell-x27
    Мод есть, называется Trajectories,

    Он установлен у меня, на скринах видно, но при полете в атмосфере в капсуле, почему то не попадает. Ч. я. н. д.? Как ни крутил настройки, все равно мажет, в основном недолет.

    Если я верное понимаю смысл этого мода, то он показывает траекторию полета с учетом движения в атмосфере. И, наверное, с поправкой на вращение планеты. Соответственно мы знаем место где плюхнемся и можем подобрать точку торможения для схода с орбиты. Ещё там есть возможность выставить угол атаки в различных слоях атмосферы, что наводит на мысль об учете аэродинамического качества (отношение между подъемной силой и лобовым сопротивлением). Вроде все прозрачно, но на низких высотах точка посадки уплывает в сторону недолета и хоть ты терсни

  18. Sergios

    Sergios @Сергей 14 октября 2015 16:38

    Предлагаю в конце каждого поста добавить пример матана, например вот: решение простеньких задач самого простого раздела математического анализа:

  19. Басила

    Басила 14 октября 2015 17:14

    А если жестко дискретизировать для упрощения? Допустим, есть дельта для трансфера, делится на 2-3-4... части, изменение параметров стартовой орбиты после каждого импульса считается легко, время, потраченное на дробный прожиг с облетами - тоже. Какое-то частное решение можно, наверное прикрутить? Прямо вот мечта :)
    Потому что сейчас приходится или жутко приблизительно с последующей затратной коррекцией, либо для компенсации погрешностей от длинного прожига надо стартовать с высокой орбиты, на которую тоже надо тратиться. В итоге плюешь на ионники и делаешь химию или ядерники :)

    Хотя да, тут как раз матан понадобится. А я его очень некстати благополучно забыл 20 лет назад :)

  20. maisvendoo

    maisvendoo @Дмитрий 14 октября 2015 18:00 Автор

    Обязательно над этим подумаю

  21. maisvendoo

    maisvendoo @Дмитрий 15 октября 2015 00:12 Автор

    Исправил указанный глюк. Всего-то в обработчик кнопки Search надо было добавить

    // Check same reference body!!!
    if (Bodies[dep_idx].get_ref_body() != Bodies[arr_idx].get_ref_body())
    {
    labelNoTransfer.Text = "Bodies must have same reference body!\nPlease, change other bodies";
    return;
    }


    Ну и так, подчистил код, немного рефакторинга. Добавил отсутствующее сообщение о том, что трансфер невозможен, а то в этом случае программа хранила многозначительное молчание.

    P.S.: Вроде явных глюков нет, может выложить на буржуйском форуме...? Только вот мой инглиш, да...

  22. Degrizai

    Degrizai 15 октября 2015 07:07

    Блин, да я вообще образно выразился! poker

  23. Degrizai

    Degrizai 15 октября 2015 07:08

    Пробовал ставить. Кербалы на него орут благим матом и не принимают на борт. Вообще.
    Приходится косплеить из себя олдфага и летать на стоке <_<

  24. lllypa

    lllypa @Александр 18 октября 2015 20:07

    Обалденно. С матаном и тем не менее на пальцах и доходчиво, так что все понятно. Отлично. слов просто нет скзать ольше нечего.
    С нетерпением жду интеграции в сам КСП и расширения функционала. Однако про юзабилити тоже советую не забывать. В том же плагине от alex.github (лень искать правильное название), все множество варинатов показано цветом что есть очень удобно.

  25. Lemuel Hogben

    Lemuel Hogben @Палег 13 ноября 2015 17:16

    Привет! А это можно как-то собрать под *nix?

  26. nikollor

    nikollor @Ник 13 ноября 2015 19:10

    Так он ж исходники на шарпе выложил - бери да собирай.

  27. el_Chupacabra

    el_Chupacabra @Тарас 29 июня 2016 12:26

    Доброго времени суток. А существуют в природе конфиги этой программы под РСС?

{login}
  • bowtiesmilelaughingblushsmileyrelaxedsmirk
    heart_eyeskissing_heartkissing_closed_eyesflushedrelievedsatisfiedgrin
    winkstuck_out_tongue_winking_eyestuck_out_tongue_closed_eyesgrinningkissingstuck_out_tonguesleeping
    worriedfrowninganguishedopen_mouthgrimacingconfusedhushed
    expressionlessunamusedsweat_smilesweatdisappointed_relievedwearypensive
    disappointedconfoundedfearfulcold_sweatperseverecrysob
    joyastonishedscreamtired_faceangryragetriumph
    sleepyyummasksunglassesdizzy_faceimpsmiling_imp
    neutral_faceno_mouthinnocent
Последние сообщения с форума
Loading...

Нашли ошибку?
Вы можете сообщить об этом администрации.
Выделив текст нажмите Ctrl+Alt