KerboScript в примерах и задачах. Часть 6. Только прилетели - сразу сели.

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

Как бы ни было интересно исследование планет с орбиты, чтобы получать больше профита в виде баллов науки, нужно иногда спускаться с небес на землю. Этим и займёмся.

Здесь рассмотрю только ракетный способ посадки и только на планеты без плотной атмосферы (т.е. все стоковые планеты, кроме Кербина, Евы, Джула и Лейт; на Дюну способ посадки подойдёт после некоторой доработки напильником). Рассматриваться будет посадка с орбиты в точку с заданными координатами, чтобы разобрать использование встроенной структуры GEOCOORDINATES. Задача посадки корабля в заданную точку, с точки зрения практического приложения, наиболее ценна для строительства наземных баз.

Часто обсуждаемые на около-KSP-шных ресурсах подходы для посадки аппаратов:
  1. Suicide burn. Состоит во включении двигателя на 100% мощности, удерживая при этом вектор тяги строго против вектора скорости относительно поверхности. При правильном расчёте момента включения скорость гасится ровно в момент касания поверхности.
    Преимущества: в теории, это способ посадки с минимальными затратами топлива; для выполнения не требуется возможность дросселирования и повторного запуска двигателя.
    Недостатки: сложно рассчитать правильный момент включения; ещё сложнее рассчитать начальную орбиту так, чтобы сесть в заданной точке; высокая чувствительность точки посадки к ошибкам управления (неправильный момент начала прожига, отличие угла тяга-скорость от 180°) и невозможность их исправления; из-за движения по пологой дуге довольно близко к поверхности, есть риск столкнуться с горой, т.е. не вся поверхность доступна для посадки.
  2. Торможение "буквой Г". Полное гашение горизонтальной скорости, вертикальное падение на поверхность, затем полное гашение вертикальной скорости.
    Преимущества: проще всего для расчётов; при достаточной начальной высоте полное отсутствие риска столкновения с горой или стеной кратера; если гашение вертикальной скорости делается через suicide burn, можно обойтись двигателем без дросселирования.
    Недостатки: самый неэффективный способ, с точки зрения затрат топлива; требует, как минимум, двух включений двигателя.
  3. Zero-lift maneuver (снижение с нулевой подъёмной силой). Аппарат ориентируется таким образом, чтобы обеспечить снижение с постоянной вертикальной скоростью до полного гашения горизонтальной скорости. Затем идёт вертикальный спуск с торможением. По сути, является "взлётом на орбиту наоборот".
    Преимущества: если двигатель дросселируется, то легко можно поддерживать заранее рассчитанное горизонтальное ускорение, что упрощает посадку в заданной точке; при правильном расчёте можно после гашения горизонтальной скорости сразу перейти на suicide burn без необходимости перезапуска двигателя; широкие возможности для управления и коррекции траектории спуска.
    Недостатки: не так эффективен по затратам топлива, как suicide burn в чистом виде; для посадки в заданной точке требуется либо дросселируемый двигатель, либо сложный баллистический расчёт.
Из списка преимуществ и недостатков должно быть более-менее ясно видно, что в реальности наиболее популярным способом обычно является что-то типа третьего варианта. Экономия топлива - это хорошо, но ей жертвуют в пользу возможности компенсировать отклонения в характеристиках двигателя, массе аппарата и прочих параметров полёта от расчётных, что невозможно при реализации suicide burn в чистом виде.

Здесь рассмотрю вариацию последнего способа, которую можно описать как "снижение с постоянным ускорением". Спуск будет организован так, чтобы ускорения как вдоль локальной горизонтали, так и вдоль локальной вертикали были постоянны. Такой способ ощутимо экономнее посадки "буквой Г" на тела размером с Муну и больше. Для тел с низкой гравитацией экономия топлива будет менее заметной, и посадка с полным гашением сначала горизонтальной, а потом вертикальной скорости может быть удобнее с точки зрения простоты расчётов.

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

Процедура посадки, таким образом, состоит из следующих этапов.
1) Дождаться, пока желаемая точка посадки оказывается в пределах возможностей коррекции наклонения.
2) Сделать коррекцию наклонения, желательно, совместив её с торможением до суборбитальной траектории. Делается это, когда до посадки остаётся пройти дугу 90°.
3) Задать желаемую величину горизонтального ускорения. В случае TWR > 1 всё более-менее просто, достаточно взять ah = [(T/m)2 - g2]1/2, в этом случае гарантированно тяги хватит и на компенсацию ускорения свободного падения, и на замедление по горизонтали. При TWR < 1 задача немного усложняется, но при условии увеличения TWR по мере опорожнения баков до величины > 1 иногда всё-таки возможна мягкая посадка.
4) Дождаться комбинации горизонтальной скорости vh и расстояния lground до точки посадки, удовлетворяющей условию lground = vh2/(2ah) - начав активный участок снижения в этой точке, мы гасим горизонтальную скорость ровно над нужным участком.
5) Вертикальное ускорение нужно определить таким образом, чтобы после окончания гашения горизонтальной скорости переходить насколько возможно ближе к режиму suicide burn (как это сделать - см. дальше)
6) Рулить и управлять тягой таким образом, чтобы поддерживать всегда заданные значения ускорений по горизонтали и вертикали. Поскольку высота и расстояние по поверхности до заданной точки посадки должны меняться по известному закону, их можно удерживать на нужных значениях через ПИД-регуляторы. Ещё одним ПИД-регулятором нужно корректировать боковое отклонение от цели.
7) Дождаться гашения горизонтальной скорости, развернуться соплом вниз и выполнить вертикальное снижение. Если всё рассчитано правильно, сесть должны одним куском.

Теперь разбираем по пунктам более подробно.

1. Дождаться нужного положения точки посадки относительно орбиты.

Пусть вектор нормали к плоскости орбиты n, максимальная возможность коррекции плоскости составляет αmax градусов. Расстояние на поверхности, на которое возможна боковая коррекция, в этом случае составляет dmax = R×sin αmax, где R - радиус планеты. Если точка посадки находится от плоскости на расстоянии меньше dmax, коррекция допустима. Расстояние от точки до плоскости находится по формуле d = |(Rland·n)|, где Rland - радиус-вектор точки в системе координат с началом в центре планеты.
Осталась задача: найти радиус-вектор точки посадки по известным географическим координатам (широте и долготе).
В kOS для этого встроен тип данных GEOCOORDINATES, имеющий следующие поля:
LAT     // широта в градусах
LNG     // долгота в градусах
DISTANCE     // расстояние в метрах от активного корабля
TERRAINHEIGHT     // высота поверхности над уровнем моря
HEADING     // абсолютный азимут от корабля
BEARING     // на сколько градусов нужно повернуть нос корабля, чтобы он смотрел на заданную точку
POSITION     // координаты точки на поверхности (вектор)
ALTITUDEPOSITION     // координаты точки на заданной высоте над поверхностью
VELOCITY     // скорость точки на поверхности за счёт вращения планеты (OrbitableVelocity, чтобы получить вектор, нужно взять COORD:VELOCITY:ORBIT)
ALTITUDEVELOCITY // скорость точки на заданной высоте над поверхностью (OrbitableVelocity, чтобы получить вектор, нужно взять COORD:ALTITUDEVELOCITY(H):ORBIT)
Задать переменную этого типа можно следующими способами:
1) по заданным широте и долготе - функцией LATLNG(lat, lng);
2) получив координаты объекта на орбите через суффикс orbitable:GEOPOSITION (привязывает координаты к телу, в сфере действия которого в текущий момент находится объект, т.е. Mun:geoposition будет возвращать координаты, привязанные к Кербину, Duna:geoposition - к Солнцу);
3) функцией body:GEOPOSITIONOF(position), которая возвращает координаты, привязанные к телу, указанному как body (Sun:GEOPOSITIONOF(ship:position) вернёт координаты на Солнце, над которыми в данный момент находится корабль, вне зависимости от текущей сферы действия).

Расстояние точки с заданными координатами до плоскости, заданной нормалью:
function GeoDist {
  parameter geocoord.
  parameter normvec to V(0,1,0).
  return abs( vdot(geocoord:position, normvec:normalized) ).
}
 
При расчёте положения точки посадки относительно орбиты нужно, конечно, учесть суточное вращение планеты. Оно приводит к повороту точки с фиксированными широтой и долготой на восток с течением времени.

Рисунок 1. Сдвиг точки посадки за счёт суточного вращения.

Как видно из рисунка 1, чтобы попасть в цель, орбита после коррекции должна проходить восточнее, чем точка посадки в момент коррекции. Величина сдвига по долготе Δφ за время Δt равна Δφ = 360°/Trot×Δt. Trot - длительность звёздных суток.

Отсюда следует, что нужно дожидаться попадания на заданное расстояние от плоскости орбиты не точки посадки, а точки с широтой точки посадки и долготой, большей на Δφ = 360°/Trot×Δt. Δt - это время, через которое аппарат пройдёт над точкой посадки; оно определяется углом между радиус-вектором аппарата и проекцией радиус-вектора точки посадки на орбитальную плоскость. Угол отсчитывается в направлении движения спутника. Для вычисления угла удобно пользоваться функцией ARCTAN2(y, x) - она возвращает угол между осью X и радиус-вектором (x, y) в двухмерном пространстве с учётом знака этого угла (ARCTAN2(1, 0) = 90°, ARCTAN2(-1, 0) = -90°). Свойство этой функции состоит в том, что ARCTAN2(Rsinα, Rcosα) = α, где R - произвольное положительное число. Для двух векторов R1 и R2 выполняются равенства |[R1×R2]| = |R1|·|R2|sinα, (R1·R2) = |R1|·|R2|cosα. Значит, для нахождения угла между двумя векторами в орбитальной плоскости нужно брать ARCTAN2(y, x), где y - проекция векторного произведения векторов на нормаль к орбите, x - скалярное произведение этих же векторов.

Поскольку прохождение угла α по орбите занимает время Δt = Torb×α/360°, то место, где окажется точка посадки в момент ближайшего к ней прохождения аппарата на текущем витке, сдвинуто от текущего положения точки посадки по долготе на Δφ = 360°/Trot×Δt = α×Torb/Trot.

Таким образом, ожидание положения точки посадки относительно орбиты реализуется следующим кодом:

2. Поворот орбиты так, чтобы она прошла над нужной точкой.

 С точки зрения затрат топлива, поворот орбиты выгоднее всего делать примерно за 90° до посадки. При проведении коррекции необходимо учесть вращение тела. Кроме этого, выгодно изменение плоскости совмещать с другим орбитальным манёвром, например, торможением до суборбитальной траектории.

Расчёт коррекции:

3. Установка максимального горизонтального ускорения. 

 Предположим, этот шаг сделан, и нужная величина (по модулю) записана в переменной maxah.

4. Ожидание такого расстояния до цели, чтобы с заданным ускорением затормозить точно над ней.

Если со скорости v0 тормозить с постоянным ускорением ah, то пойденный путь к моменту остановки, согласно кинематическим формулам, будет равен s = |v02/(2×ah)|. Т.е. всё, что нужно сделать - дождаться, когда горизонтальная скорость и расстояние до точки посадки будут удовлетворять этому соотношению.   

5. Расчёт необходимого вертикального ускорения, чтобы после гашения горизонтальной скорости аппарат оказался на высоте suicide burn-а.

Здесь нужно решить сложное уравнение.
При движении с начальной высоты h0 с начальной вертикальной скоростью v0v и вертикальным ускорением av, за время tstop корабль окажется на высоте
h1 = h0 + v0v·tstop + av·t2stop/2 

Скорость при этом будет равна
v1v = v0v + av·tstop

Чтобы не тратить лишнее топливо, нужно, чтобы эти высота и скорость соответство переходу в suicide burn сразу же после гашения горизонтальной скорости, т.е.
h1 = hground + v21v/[2(T/m - g)],

где T - тяга двигателя, m - масса корабля (нужно брать оценку на момент посадки), g - ускорение свободного падения, hground - высота поверхности в точке посадки.

Из этих трёх выражений получается квадратное уравнение относительно av, решение которого даёт нужное ускорение.    

 6. Активный участок снижения. 

Требуемая тяга складывается из трёх компонент: в горизонтальном направлении определяется нужным горизонтальным ускорением; в вертикальном направлении нужно обеспечить снижение с постоянным ускорением, при учёте силы тяжести и центробежной силы; в боковом направлении нужно стараться держать горизонтальную компоненту скорости относительно поверхности всё время направленной на точку посадки.

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

7. Терминальный участок - вертикальное снижение.

Для простоты, на этом участке будет поддерживаться такое ускорение, чтобы при касании поверхности точно погасить скорость. Формула для расчёта аналогична формуле из п. 4.

Управляющий блок

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

Демонстрация работы на примере посадки возле арки с орбиты наклонением 45 градусов:
[media=//www.youtube.com/watch?v=Zzj1nlqAIuc]

Eve Mk2s
28 июн 2017 в 12:19, Сохранения
Pelican Mk1p
6 июн 2017 в 13:02, Сохранения
  1. Reistlyn

    Reistlyn 25 июня 2017 12:31

    Уже пора-бы сделать крафт с полным автопилотом:
    1. Взлет с Кербина;
    2. Полет к Муне с посадкой и сбором науки;
    3. Полет от Муны к Минмусу с посадкой и сбором науки;
    4. Возврат на Кербин.

    1. Pand5461

      Pand5461 25 июня 2017 14:32 Автор

      Пилится, но из-за неэкваториального старта с расчётом стартовых окон сложности возникают.

      1. Reistlyn

        Reistlyn 25 июня 2017 14:37

        Ну для Мун и Минмус можно окна особо не ждать до старта, сначала выход на НОО, потом покрутить до окна.

  2. Novi4ok

    Novi4ok 29 июня 2017 18:13

    еее реалистичност, плюс канешна

  3. Cube112

    Cube112 @Не указано 9 июля 2017 00:53

    Разве не в том суть игры , чтоб самому на глаз взлетать, маневры строить и ломать ножки при посадке?

    1. KMS

      KMS @Александр 9 июля 2017 12:59

      Суть игры - она у каждого своя. В том и ценность KSP.

    2. Pand5461

      Pand5461 11 июля 2017 10:23 Автор

      Ну, с автопилотом бывают другие фейлы.

{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
Последние сообщения с форума
  • Автор
    Тема в разделе: Новости
    Просмотров: 75742
    Ответов: 0
  • Автор
    Тема в разделе: Вопросы по игре
    Просмотров: 1577030
    Ответов: 12701
  • Автор
    Тема в разделе: В ангаре у Боба
    Просмотров: 9696
    Ответов: 55
  • Автор
    Тема в разделе: Технические вопросы
    Просмотров: 26013
    Ответов: 68
  • Автор
    Тема в разделе: Моды
    Просмотров: 2157
    Ответов: 2
    Все сообщения..
    Полный список последних сообщений
    Loading...

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