KerboScript в примерах и задачах. Часть 5. Выход на орбиту. Опять.

В этой части посмотрим, как при помощи управления с обратной связью выйти на орбиту с требуемой ориентацией в пространстве. Приложений для такой задачи может быть множество - это и выполнение контрактов по выводу спутников, и спасение незадачливых кербалов, и запуск орбитальных сканеров, и выход на опорные орбиты для запуска к другим планетам и спутникам (особенно если стартовать не с Кербина). Конечно, в принципе можно сначала выйти на орбиту как попало, а потом выходить в нужную плоскость орбитальным маневрированием. Но это весьма затратно, поэтому целесообразно по возможности выходить в требуемую плоскость прямо со старта.

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

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

Теория старта на нужное наклонение описана, например, тут. Сделаю здесь краткую выжимку.
1) Плоскость орбиты пересекает сферу планеты по окружности с центром в центре планеты.

2) Если меридиан пересекает орбиту с наклонением i на широте φ, то путевой угол ξ между меридианом и орбитальной скоростью (азимут вектора орбитальной скорости на этой широте) определяется соотношением
(что демонстрируется методами линейной алгебры, но здесь вывод приводить не буду)
Из этой формулы как раз следует, что должно выполняться условие |cos i| ≤ |cos φ|, т.е. минимальное наклонение равно широте места старта по модулю, а максимальное 180° минус широта места старта.
В стоковой игре космодром можно считать находящимся на экваторе, поэтому доступны, по сути, любые наклонения, а sin ξ = cos i, т.е. ξ = 90° - i.

3)Ракета, стоящая на поверхности, имеет орбитальную скорость, направленную на восток, и равную по модулю
где Rbody - радиус тела, с которого ракета стартует, Trot - длительность звёздных суток на этом теле. Для оценки азимута, под которым нужно пускать ракету на круговую орбиту с заданным наклонением, можно представить выход на орбиту как мгновенный подъём аппарата на высоту орбиты и добавку к скорости поверхности некоторого вектора до орбитальной скорости. Векторная диаграмма:
Рисунок 1. К расчёту азимута пуска.

Из диаграммы ясно, как вычислить азимут пуска Az:

Вывод:
В идеальном случае (если планета не вращается) потребовалось бы держать курс всё время по азимуту ξ(i, φ), в реальности нужно делать компенсацию вращения планеты. Поэтому со старта разворачиваем ракету по азимуту Az, а потом по ходу дополнительно подтягиваем путевой угол к азимуту ξ(i, φ) управлением по курсу. Осуществить это подруливание можно при помощи ПИД-регулятора, где в качестве ошибки брать разность истинного курса в данный момент и ξ(i, φ).

Альтернативно можно разложить скорость на две компоненты: лежащую в плоскости с заданным наклонением и "боковую", т.е. ортогональную этой плоскости. В этом случае боковая компонента орбитальной скорости и будет ошибкой управления, которую требуется обнулить. Это также можно сделать ПИД-регулятором.

Мне больше нравится второй способ, поэтому привожу его реализацию.
Управление ракетой по тангажу производится тем же способом, что представлен в первой части. Добавляется управление по курсу, которое делается ПИ-регулятором.
Дополнительная хитрость: после того, как "боковая" скорость зануляется, необходимое наклонение орбиты достигнуто. Это значит, что дальше нужно просто держать курс по азимуту ξ(i, φ). Но в регуляторе накопится ошибка в интегральной компоненте, поскольку со старта до этого момента боковая скорость всегда была на восток, и регулятор будет продолжать тянуть скорость дальше на запад. Чтобы этого не происходило, при попадании на правильное наклонение обнулим интегральную компоненту регулятора и дальше движемся по курсу ξ(i, φ).



Для выхода в нужную орбитальную плоскость, т.е. на требуемое наклонение с требуемой долготой восходящего узла, нужно стартовать в тот момент, когда космодром проходит под орбитальной плоскостью. Чтобы определить эту плоскость, вспомним, что долгота восходящего узла отсчитывается от вектора, называемого в kOS SOLARPRIMEVECTOR. Чтобы получить нормаль к плоскости орбиты, нужно повернуть вектор полярной оси планеты (т.е. V(0,1,0) в kOS), на наклонение орбиты вокруг вектора восходящего узла. А чтобы получить вектор восходящего узла, нужно повернуть SOLARPRIMEVECTOR на долготу восходящего узла против часовой стрелки. Получается такая функция:
function DirANNorm {
// forevector - линия узлов, upvector - нормаль
  parameter lan, incl.
  local basedir to lookdirup(SolarPrimeVector, V(0,1,0)).
  // углы поворота будут со знаком минус,
  // т.к. в игре положительное направление вращения по часовой стрелке
  set basedir to angleaxis(-lan, V(0,1,0))*basedir.
  set basedir to angleaxis(-incl, basedir:forevector)*basedir.
  return basedir.
}
"Точка старта проходит под плоскостью орбиты" означает, что угол между вектором от центра планеты к точке старта равен 90° (в реальности так сложно попасть, поэтому пусть будет "близок к 90°").

Этот способ позволяет понять, можно уже стартовать или надо подождать. Есть и другой способ, с помощью которого можно определить, сколько именно осталось ждать.

Определим "виртуальную" плоскость орбиты, которая получится, если из данной точки мгновенно попасть на нужное наклонение. Для этого нужно, чтобы орбитальная скорость была направлена по уже определённому азимуту ξ(i, φ). Это направление легко получить из kOS как Vvirt = heading(xi, 0):vector. После чего находим нормаль к этой виртуальной орбите как nvirt = [Rship × Vvirt] и линию узлов как ANvirt = [V(0,1,0) × nvirt]. Угол между ANvirt и SOLARPRIMEVECTOR - это долгота восходящего узла, если стартовать прямо сейчас. Время, которое нужно подождать, равно, очевидно,
Δt = (LANdesired - LANvirt) Trot / (2π).
Желательно, конечно, стартовать не прямо в это время, а чуть пораньше (в стоке - примерно на минуту, в реальности с Земли примерно за 5 минут), т.к. поворот орбитальной скорости в нужную плоскость происходит не мгновенно.

Кроме старта в правильно подобранное время, неплохо бы придумать алгоритм, который бы постепенно приводил ракету в заданную плоскость. В этом видео предлагается рулить согласно уравнению пересечения плоскости со сферой в координатах "широта-долгота". Я предлагаю альтернативный метод: рулить на основе расстояния от нужной плоскости.

Расстояние от ракеты до произвольной плоскости, проходящей через центр планеты, равно
d = (Rship · n),
где n - вектор нормали к плоскости. Это расстояние будет со знаком, и однозначно определяет, в какую сторону нужно рулить:
при d > 0 нужно брать азимут больше ξ(i, φ);
при d < 0 нужно брать азимут меньше ξ(i, φ).

Для такого подруливания опять будем использовать ПИД-регулятор.


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



В следующей части рассмотрим использования ПИД-регуляторов при программировании посадки на безатмосферные тела.




- + +17
У Вас НЕТ прав на выставление оценки для этой новости.
Для выставлени оценки необходимо пройти регистрацию на сайте.
Если Вы уже зарегистрировались, то войдите на сайт.
  1. 4
    Это Andeeez Andeeez - #10 0
    +1
    Я сваливаю, всего доброго.
    »
    Написано:
    Группа: Посетители, Публ/Комм: 6/150
     
  2. 18
    Это Bradley_ Bradley_ - #20 0
    +2
    ЛОл, жЫрный курсив сломался)))
    »
    Написано:
    Группа: Хорошие люди, Публ/Комм: 0/355
    Маленький шаг одного огурца - но гигантский скачок всего огорода!
    Канал на твиче:http://www.twitch.tv/bradley___
    А еще я у мамы писатель: ХОНК
    VIVA LA KOLOBKA!!!
     
  3. 0
    Это Tractorist Tractorist - #30 0
    0
    А как вывести спутник на стационарную орбиту, так чтобы он оказался над ЦУП?
    »
    Написано:
    Группа: Посетители, Публ/Комм: 0/2
     
    1. 8
      Это Pand5461 Pand5461 - #40 0
      +2
      Аналогично этому методу. Только целью для перехвата является не реальный спутник, а виртуальная точка на долготе ЦУПа с периодом обращения KERBIN:ROTATIONPERIOD. Как рассчитать высоту орбиты исходя из периода обращения - тут. Долготу ЦУПа можно узнать, напечатав SHIP:LONGITUDE, пока аппарат на стартовом столе.
      »
      Написано:
      Группа: Хорошие люди, Публ/Комм: 10/39 [Онлайн]
       
  4. 0
    Это Tractorist Tractorist - #50 0
    0
    Это я понял. А как задать виртуальную точку на долготе ЦУП в качестве цели для перехвата?
    »
    Написано:
    Группа: Посетители, Публ/Комм: 0/2
     
    1. 8
      Это Pand5461 Pand5461 - #60 0
      +3
      Как во второй части гайда, только за φ0sat и φ0tgt берётся просто долгота. Только нужно следить, чтобы φ0tgt - φ0sat была положительной величиной. Если нет - то прибавлять 360 градусов до тех пор, пока не станет.
      »
      Написано:
      Группа: Хорошие люди, Публ/Комм: 10/39 [Онлайн]
       
  5. 3
    Это Sifno Sifno - #70 0
    +2
    Вернулся посмотреть, что нового в КСП добавили за последние пару лет.
    Жаль, того о чем я мечтал так и нет. Но благодаря тебе подметил себе этот мод.

    Предвкушаю ближайшую неделю матана. В планах запилить автоматическую посадку на плавающую платформу отработанных ступеней. Шоб как Фалькон9 в Спейс Икс.

    Но для начало придется научиться предсказывать траекторию в атмосфере.
    Видел тему полугодовалой давности про давление и интегралы, но к сожалению ничего полезного там не почерпнул. Придется идти с нуля своим опытом.

    Скорее всего буду выкладывать все на форум. Рассчитываю на кооперацию.

    Ах да, Задача Годдарда мною до сих пор не решена. Время пришло.

    А также расчет трех-импульсных переходов
    »
    Написано:
    Группа: Хорошие люди, Публ/Комм: 9/16
     
    1. 38
      Это Sokol290_KSP Sokol290_KSP - #80 0
      0
      ААААААААААААААААААААААААААААААААА

      ЭТО СИФНО!1111111
      »
      Написано:
      Группа: Добровольцы, Публ/Комм: 36/689
      Мир и беден и богат.
       
    2. 126
      Это Mr. Tin Mr. Tin - #90 0
      0
      Боже ты мой! Легенды возвращаются! Привет Сифно! ))))))
      »
      Написано:
      Группа: Модераторы, Публ/Комм: 16/1 159
      Мяу-мяу, мир захватят кисульки! :3
      Не испытывай страха перед мраком ночи,
      Из последних сил сопротивляйся окончанию дня;
      Восстань, подави умирание света.©
      Моя гордость!
       
    3. 8
      Это Pand5461 Pand5461 - #100 0
      0
      Про эту тему? Там что-то автор замолчал, да.

      Ежели оживишь вопрос, мне бы интересно тоже было пообсуждать. В атмосфере я летать прицельно пока не научился. Более-менее решил только задачу вертикального suicide burn-а.

      Пара советов, чтобы не ходить по граблям.
      1) Для атмосферного управления лучше сначала закодить более-менее работающие эвристики, чем пытаться сразу решить задачу "правильно". Не то есть риск, что всё закончится, как и в той форумной теме, задолго до попадания в космос.
      2) Если соберёшься численно интегрировать, схему Эйлера лучше сразу отбрасывать - точность у неё так себе. Схемы Верле или предиктор-корректор вычислений требюет примерно столько же, но уже гораздо точнее.
      »
      Написано:
      Группа: Хорошие люди, Публ/Комм: 10/39 [Онлайн]
       
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Чат
  • Трансляции
  • Информация
    На какой стороне Силы Вы?
Последние комментарии
  • Secairus12 Secairus12 написал в
    ТАКР Адмирал Кузнецов (всего 13 комм.)
    Судя по деталям крыльев, картон.
    (автор, если что - мне очень даже нра)
  • lllypa lllypa написал в
    ΔVcalculator (ОБНОВЛЕНИЕ 1.1) (всего 12 комм.)
    О! это мысль. пожалуй сделаю.

    Кинь в меня, пожалуйста, конфигом РСС. Делов по его вкорячиванию на час-полтора.. Зато хорошее дело.
  • Soul Soul написал в
    ΔVcalculator (ОБНОВЛЕНИЕ 1.1) (всего 12 комм.)
    Тоже вариант, чёта не подумал... И правится быстро, и доступно всем без скачивания.
  • Басила Басила написал в
    ΔVcalculator (ОБНОВЛЕНИЕ 1.1) (всего 12 комм.)
    А что мешает на гугульдокс запихнуть табличку и юзать её из бравзера?) мне дома офис лень ставить, в тех редких случаях, когда он нужен - так и делаю)
  • KTO_TO KTO_TO написал в
    ТАКР Адмирал Кузнецов (всего 13 комм.)
    а броня хорошая? (у реплики)
  • KTO_TO KTO_TO написал в
    Мод SSTO Parts Plus - тест (всего 6 комм.)
    ладно, ты мне нурсы сделал
Все комментарии
Обновления на форуме
136 Всего
5 Польз.
131 Гостей
Google, Яндекс, aleksei1, Rsa, KTO_TO, Secairus12, Alexa, SpacePixel
Онлайн список
Новостей на страницу:
Наверх