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

Kerbal Space Program » Сохранения

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

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

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

Теория старта на нужное наклонение описана, например, тут. Сделаю здесь краткую выжимку.
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 секунд до поворота космодрома в орбитальную плоскость. Для других аппаратов это время может быть немного другим, в зависимости от длительности участка вывода.



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



ΔVcalculator (ОБНОВЛЕНИЕ 1.1)
8 авг 2017 в 22:41, Сохранения
Eve Mobile Launchpad: летим к Ив на астероиде.
11 июн 2017 в 22:07, Сохранения
  1. Andeeez

    Andeeez Гость 10 июня 2017 11:20

    Я сваливаю, всего доброго.

  2. Bradley_

    Bradley_ 10 июня 2017 15:23

    ЛОл, жЫрный курсив сломался)))

  3. Tractorist

    Tractorist @Александр 12 июня 2017 16:38

    А как вывести спутник на стационарную орбиту, так чтобы он оказался над ЦУП?

    1. Pand5461

      Pand5461 12 июня 2017 17:23 Автор

      Аналогично этому методу. Только целью для перехвата является не реальный спутник, а виртуальная точка на долготе ЦУПа с периодом обращения KERBIN:ROTATIONPERIOD. Как рассчитать высоту орбиты исходя из периода обращения - тут. Долготу ЦУПа можно узнать, напечатав SHIP:LONGITUDE, пока аппарат на стартовом столе.

  4. Tractorist

    Tractorist @Александр 12 июня 2017 18:44

    Это я понял. А как задать виртуальную точку на долготе ЦУП в качестве цели для перехвата?

    1. Pand5461

      Pand5461 12 июня 2017 20:34 Автор

      Как во второй части гайда, только за φ0sat и φ0tgt берётся просто долгота. Только нужно следить, чтобы φ0tgt - φ0sat была положительной величиной. Если нет - то прибавлять 360 градусов до тех пор, пока не станет.

  5. Sifno

    Sifno @Павел 15 июня 2017 14:08

    Вернулся посмотреть, что нового в КСП добавили за последние пару лет.
    Жаль, того о чем я мечтал так и нет. Но благодаря тебе подметил себе этот мод.

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

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

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

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

    А также расчет трех-импульсных переходов

    1. Sokol290_KSP

      Sokol290_KSP 15 июня 2017 14:13

      ААААААААААААААААААААААААААААААААА

      ЭТО СИФНО!1111111

    2. Mr. Tin

      Mr. Tin 15 июня 2017 14:57

      Боже ты мой! Легенды возвращаются! Привет Сифно! ))))))

    3. Pand5461

      Pand5461 15 июня 2017 20:47 Автор

      Про эту тему? Там что-то автор замолчал, да.

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

      Пара советов, чтобы не ходить по граблям.
      1) Для атмосферного управления лучше сначала закодить более-менее работающие эвристики, чем пытаться сразу решить задачу "правильно". Не то есть риск, что всё закончится, как и в той форумной теме, задолго до попадания в космос.
      2) Если соберёшься численно интегрировать, схему Эйлера лучше сразу отбрасывать - точность у неё так себе. Схемы Верле или предиктор-корректор вычислений требюет примерно столько же, но уже гораздо точнее.

{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
Последние сообщения с форума
  • Автор
    Тема в разделе: Технические вопросы
    Просмотров: 24259
    Ответов: 68
  • Автор
    Тема в разделе: Моды
    Просмотров: 1460
    Ответов: 2
  • Автор
    Тема в разделе: В ангаре у Боба
    Просмотров: 206238
    Ответов: 1484
  • Автор
    Тема в разделе: Игровой процесс
    Просмотров: 1647
    Ответов: 1
  • Автор
    Тема в разделе: Модераторский раздел
    Просмотров: 7608
    Ответов: 21
    Все сообщения..
    Полный список последних сообщений
    Loading...

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