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

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

Здесь рассмотрю только ракетный способ посадки и только на планеты без плотной атмосферы (т.е. все стоковые планеты, кроме Кербина, Евы, Джула и Лейт; на Дюну способ посадки подойдёт после некоторой доработки напильником). Рассматриваться будет посадка с орбиты в точку с заданными координатами, чтобы разобрать использование встроенной структуры 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 градусов:



- + +15
У Вас НЕТ прав на выставление оценки для этой новости.
Для выставлени оценки необходимо пройти регистрацию на сайте.
Если Вы уже зарегистрировались, то войдите на сайт.
  1. Выкл.
    Это Reistlyn Reistlyn - #10 0
    +2
    Уже пора-бы сделать крафт с полным автопилотом:
    1. Взлет с Кербина;
    2. Полет к Муне с посадкой и сбором науки;
    3. Полет от Муны к Минмусу с посадкой и сбором науки;
    4. Возврат на Кербин.
    »
    Написано:
    Группа: Модераторы, Публ/Комм: 41/331
     
    1. 8
      Это Pand5461 Pand5461 - #20 0
      0
      Пилится, но из-за неэкваториального старта с расчётом стартовых окон сложности возникают.
      »
      Написано:
      Группа: Хорошие люди, Публ/Комм: 10/39
       
      1. Выкл.
        Это Reistlyn Reistlyn - #30 0
        0
        Ну для Мун и Минмус можно окна особо не ждать до старта, сначала выход на НОО, потом покрутить до окна.
        »
        Написано:
        Группа: Модераторы, Публ/Комм: 41/331
         
  2. 2
    Это Novi4ok Novi4ok - #40 0
    0
    еее реалистичност, плюс канешна
    »
    Написано:
    Группа: Посетители, Публ/Комм: 0/4
     
  3. 0
    Это Cube112 Cube112 - #50 0
    0
    Разве не в том суть игры , чтоб самому на глаз взлетать, маневры строить и ломать ножки при посадке?
    »
    Написано:
    Группа: Посетители, Публ/Комм: 0/2
    Илон Маск - Рептилоид
     
    1. Выкл.
      Это KMS KMS - #60 0
      +4
      Суть игры - она у каждого своя. В том и ценность KSP.
      »
      Написано:
      Группа: Модераторы, Публ/Комм: 0/31
       
    2. 8
      Это Pand5461 Pand5461 - #70 0
      0
      Ну, с автопилотом бывают другие фейлы.
      »
      Написано:
      Группа: Хорошие люди, Публ/Комм: 10/39
       
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Чат
  • Трансляции
  • Информация
    На какой стороне Силы Вы?
Последние комментарии
  • Коловратка Коловратка написал в
    История танкостроения (всего 3 комм.)
    ООО!11!!1! Годнотищаа. Ток башня КВ чуть поуже должна быть со лба. Лии вообще дико похож, но всё таке плосковата башня у тигра. Да и резонанс отдачи орудий, хотя это технические тонкости уже.

    Можно ведь с двумя подшипниками сделать пушку что бы у леопарда не шаталась, ну не знаю, стяжкой например, я так делал и робило!
  • Makc_Gordon Makc_Gordon написал в
    История танкостроения (всего 3 комм.)
    Пока не знаю. Может никогда, посмотрю на реакцию зрителей на этом ролике. Обычно техника второй мировой более интересна чем послевоенные ОБТ. Да и с этим роликом у меня куча гемороая, чуть не сдох пока запилил. А еще с авторскими правами народ совсем с ума сошел. Нельзя Гимн СССР, Полюшко поле и тп, потому что скупили гады права на все песни. Там слышно шорохи грампластинок, но все равно АП есть.
  • alexoff alexoff написал в
    История танкостроения (всего 3 комм.)
    А остальные годы когда будут?
  • BYaka BYaka написал в
    ΔVcalculator (ОБНОВЛЕНИЕ 1.1) (всего 13 комм.)
    круто круто. жаль в сток я не играю давно, а для rss+ro тут придется сильно допиливать. небесные тела и ввод параметров движка вручную это нестрашно. а вот когда я в своем недокалькуляторе попытался прикрутить учет испаряющегося окисла... вообщем хз как это удобно сделать, так и приходится все ручками подсчитывать.

    кстати а расчет суицидал берна у тебя реализован? ябы позаимствовал^^

    и присоединяюсь к просьбе запиливания всего этого добра в гуглодоксы. куда лучше, чем скачиваемый файл
  • Secairus12 Secairus12 написал в
    Карьерный самосвал СДМЗ-17М ЖЭ ... (всего 16 комм.)
    Страна Картохи? Минское Море? Один усатый правитель? Где-то я это уже слышал...
  • KTO_TO KTO_TO написал в
    ТАКР Адмирал Кузнецов (всего 15 комм.)
    может быть за крыльями чугуний?
Все комментарии
Обновления на форуме
117 Всего
5 Польз.
111 Гостей
Яндекс, Google, Foton-X, serjey2128, Alexa, Shared, DynamicInd, Kerbuvim
Онлайн список
Новостей на страницу:
Наверх