Моделирование автопилота на авиасимуляторе
Можно ли использовать продольно расположенный полупроводниковый гироскоп, который измеряет угловую скорость разворота самолета, для удержания крена? Проверим это на авиасимуляторе с внешним автопилотом. А также хотелось бы проверить алгоритмы управления самолетом. Такую возможность предоставляет авиасимулятор XPLANE.
Рис. 1
Почему именно XPLANE? Он позволяет выводить данные с датчиков симулируемого самолета в другие программы или компьютеры различными средствами. Я для этого выбрал UDP протокол. На рис. 1 представлена структурная схема комплекса симуляции. Пример одного полета можно увидеть в видео. В ролике продемонстрирован ручной взлет, вывод самолета из штопора при падении, пролет по маршруту, развороты с потерей высоты и с набором высоты, посадка самолета, ручное управление курсом и высотой, а также содержатся инструкции по настройке X-Plane симулятора и программы автопилота.
PPJOY и VSPE.
Для управления самолетом в симуляторах обычно используется джойстик. Для обучения управлению радиоуправляемыми самолетам также применяются соответствующие симуляторы. Для сопряжения стандартных пультов радиоуправления с симуляторами существует программа PPJOY, которая преобразует входной поток данных интерфейса RS232, созданному по определенным правилам, в сигналы управления виртуального джойстика. Программа также содержит и драйвер, который определяется в системе как джойстик. Описание программы PPJOY можно найти в свободном доступе в интернете. Здесь можно найти программу, которая может работать с Win7. К сожалению, драйвер (64b), входящий в программу не имеет цифровой подписи и поэтому приходиться запускать систему в тестовом режиме. Стандартный поток для PPJOY обычно формируется специальным модулем на каком-нибудь контроллере (например, PIC), который подключается к выходу «тренер» пульта ДУ, где применяется протокол PPM. В данном проекте поток в соответствие со стандартом RS232 формирует непосредственно программа автопилота. Разработка начиналась с замыкания петли ОС через внешние физические COM — порты компьютера. При этом есть возможность использовать разные компьютеры для симулятора и автопилота, что актуально для очень слабых компьютеров. Сейчас, в связи с массовым отсутствием на компьютерах COM-портов и достаточно большой мощностью компьютеров, когда даже самые слабые компьютеры способны работать в такой системе, используется программа VSPE (Virtual Serial Port Emulator). Программа позволяет внутри компьютера создавать пары портов, и не использовать внешние порты. Для нормальной работы программы вероятно сначала придется создать с помощью средств Windows соответствующие COM-порты, а потом уже можно их использовать в программах VSPE и PPJOY. Аппаратные преобразователи для пультов радиоуправления появились с разными правилами преобразования, поэтому необходимо в программе PPJOY выбрать режим с частотой потока 19200 б/с. именно такой вариант реализован в программе автопилота.
UDP
Для получения данных с датчиков самолета X-Plane симулятор настраивается в режим выдачи данных по сетевому UDP протоколу. Для этого необходимо, как показано в фильме, настроить симулятор выдавать данные с «датчиков» самолета через сеть на выбранный IP-адрес и указанный порт. В данном случае используется локальный IP адрес 127.0.0.1 и порт 49001 и выдача данных с темпом 20 раз в секунду. Кроме этой настройки необходимо правильно выбрать датчики, с которых необходимо передавать данные в автопилот. Необходимо в симуляторе установить вывод поля 02 (скорость, вертикальная скорость), 16 (угловые скорости), 17 (тангаж, крен, курсы) и 18 (широта, долгота, высота). Также можно настроить вывод этих параметров на экран.
Автопилот
Программа автопилота написана в среде Borland C++ Builder 6. Поле «Приборы» (Рис. 11) показывает исходные данные с датчиков, которые обновляются 20 раз в секунду. Здесь мы видим Pitch (Тангаж, градусы), который вычисляется по акселерометру в радиоуправляемом самолете, Roll (Крен, градусы), который вычисляется по продольно установленному гироскопу, измеряющему скорость разворота самолета. Нужно тут заметить, что тангаж в симуляторе я тут беру настоящий, а не с акселерометра, хотя в настоящем самолетике тангаж я вычисляю по акселерометру, а это означает, что резкое ускорение при разгоне самолет будет «чувствовать» как добавку к положительному тангажу. Это хорошо видно в видеофрагментах испытаний: при разгоне самолет сразу же приподнимает хвост. Это отличие от реальности. А вот крен действительно вычисляется по угловой скорости разворота самолета. Вычисленное значение крена и демонстрируется в виде условного авиагоризонта в правом нижнем углу программы. (Рис. 2) Значение тангажа показывает слайдер в центре авиагоризонта. Следующее окошечко — это воздушная скорость, значение которой обычно получают с трубки Пито, следующее окно — это курс, которые мы получаем от магнитного компаса, следующее поле — это высота. Ниже панель GPS.
Рис. 2
Checkbox GPS включает полет по маршруту, записанному в таблице. При этом поля Requested Heading, Requested Altitude и Requested Speed заполняются автоматически из структуры
typedef struct WPNT { int pid; int speed; int altitude; int heading; int latitude; int longitude; }WPNT;
В демонстрации структура содержит пример маршрута около аэропорта Los Angeles. (Рис. 3)
Для изменения маршрута необходимо изменить структуру и перекомпилировать проект. Если GPS выключен, то эти поля можно заполнить вручную. Активация значения в поле происходит при двойном клике мышки. Checkbox Return позволяет вернуться к точке, запомненной при нажатии кнопки Store Point.
Рис. 3
WayPoint — номер точки маршрута; Distance — дистанция до следующей маршрутной точки; Calculated Time — приблизительное время достижения следующей точки (приблизительно потому что не учитывается скорость ветра), и далее — координаты GPS широта-долгота. Справа вверху панель UDP сервера. Ниже нее панель управления портом RS232. Здесь следует менять только номер порта. Остальные параметры жестко определены взаимодействием с виртуальным джойстиком.
Параметры панели Autopilot:
Легенда: RW — change allowed, RO — only for look, RWP- change allowed partially
Kst_roll (RW) — статический коэффициент усиления петли ОС (обратной связи) по крену
Kast_roll (RW) -астатический коэффициент усиления петли ОС по крену
Kfar_roll (RW) — коэффициент триммирования по крену
Kst_hdg (RW) — статический коэффициент усиления по удержанию курса
Kаst_hdg (RW) — астатический коэффициент усиления по удержанию курса
Time (RO) — время в полете, секунды.
Requested Heading (RWP) — запрошенный курс, градусы (Вручную или из таблицы если GPS вкл)
Head_Err (RO) — Ошибка по курсу, градусы
RollTrim (RO) — поправка триммирования по крену
HVariation (RO) — скорость изменения курса гардус/сек.
Keep_Roll (RO) — удерживаемый крен, градусы
Ailerons (RO) — положение элеронов самолета
Requested Altitude (RWP) — запрошенная высота, футы (Вручную или из таблицы если GPS вкл)
Alt_Err (RO) — Ошибка по высоте, футы
PitchTrim (RO) — поправка триммирования по тангажу
AVariation (RO) — скорость изменения высоты футов/сек.
Keep_Pitch (RO) — удерживаемый тангаж (градусы)
Elevator (RO) — положение руля высоты самолета
Kstpitch (RW) — статический коэффициент усиления петли ОС по тангажу
Kast pitch (RW) -астатический коэффициент усиления петли ОС по тангажу
Kfar_ pitch (RW) — коэффициент триммирования по тангажу
Kst_alt (RW) — статический коэффициент усиления по удержанию высоты
Kаst_alt (RW) — астатический коэффициент усиления по удержанию высоты
Rudder (RO) — положение руля направления самолета
Requested Speed (RWP) — запрошенная скорость, миль/час (knots) (Вручную или из таблицы (GPS вкл))
Speed_Err (RO) — ошибка по скорости (knots)
SVariation (RO) — скорость изменения скорости (knots)
Keep_Throttle (RO) — удерживаемая скорость (knots)
Throttle (RO) — положение РУД
Kst_speed (RW) — статический коэффициент усиления по удержанию скорости
Kast_speed (RW)- астатический коэффициент усиления по удержанию скорости
Calibrate — ChechBox включения калибровки джойстика
AP0 — CheckBox режим 0 автопилота — удержание крена = 0 и тангажа = 0
AP1- CheckBox режим 1 — удержание текущей высоты и текущего курса
AP2- CheckBox режим 2 — удержание курса и высоты по таблице (GPS вкл.) или по установленным значениям (GPS откл.)
AT — CheckBox — автомата тяги
Около «авиагоризонта» есть слайдеры, с их помощью можно вручную управлять самолетом в случае отключения автопилота или автомата тяги. Справа с краю есть еще три слайдера, это составляющие управления рулем высоты: (выведены для отладки)
верхний — статическая составляющая TrackAltErr
средний — астатическая составляющая TrackVarErr
средний — составляющая триммирования TrackTrim
В поле внизу выводится текущий лог:
DST — дистанция до следующей точки в футах (C-B на рис. 13)
HDG — курс непосредственно на следующую маршрутную точку (С-B на рис. 13)
THDG — курс, с которым следует подлететь к следующей точке (А-B на рис. 13)
OFF — смещение от требуемой траектории в футах (расстояние от точки С до линии AB Рис. 13)
SP — требуемая воздушная скорость полета
ALT — требуемая высота полета
WP — следующая путевая точка
GPS
На Рис. 4 представлен алгоритм работы автопилота по удержанию курса. Предположим, что задание — пролет из точки А в точку B. Предположим, что самолет оказался почему-то в точке «С». Существуют различные варианты достижения точки B. Например, можно лететь непосредственно на нее курсом HDG, но тогда подход к точке будет выполнен с неправильного курса. Если, например, здесь полоса для посадки, то посадка точно не получится. Поэтому здесь реализован алгоритм, при котором, если самолет очень далеко от заданной траектории, то он летит по кратчайшему расстоянию перпендикулярно THDG (True HDG). Как только он подойдет на определенной расстояние диаметра разворота к THDG, автопилот начнет менять этот курс (Requested Heading), который постепенно сравняется c THDG. Таким образом, к моменту, когда отклонение от маршрута (OFF) станет нулевым все четыре курса: Current Heading (текущий курс самолета на панели Приборы), Requested Heading, THDG и HDG на нижней панели должны сойтись и показывать одно и то же. Такой алгоритм сейчас приводит к тому, что пока самолет не достигнет заданной точки он «не думает» о следующей, и получается большая ненужная петля. Решением может быть переход к следующей точке на расстоянии двойного радиуса разворота самолета. На данный момент условия принятия решения о достижении точки начинают проверятся при приближении самолета к заданной точке на расстояние меньшее чем
Рис. 4
радиус разворота RadRazv. Решение о переходе к следующей точке принимается либо при сближении с ней менее чем на 50 ft либо при начале удаления от этой точки, если самолет не попал в круг радиусом 50 ft. Это наиболее интересные моменты работы программы.
Триммирование
Как оказалось, фраза «снять усилие со штурвала» оказалась не пустым звуком. Все попытки сделать систему обратной связи по тангажу так, чтобы точно удерживать высоту, и при этом охватить весь диапазон изменений режимов полета, оказались тщетны. Либо самолет входит неустойчивый режим с колебаниями по высоте при большом усилении петли ОС, либо не точно удерживает высоту. Кроме того, при большой скорости подъемная сила может стать настолько большой, что руль высоты не справляется (из-за недостаточного коэффициента усиления петли ОС), и самолет начинает все время набирать высоту. Либо снижается, не имея возможности выйти на большие углы атаки при маленькой скорости. Таким образом применена система триммирования руля высоты со следующим алгоритмом:
• Eсли есть задание увеличивать высоту и высота действительно растет, то триммирование не производится.
• Если есть задание увеличить высоту, но она падает, или не меняется, то начинается триммирование стабилизатора в набор, пока не начнется набор высоты.
• Если требуется снижение и происходит снижение, то триммирование не производится
• Если требуется снижение, но при этом высота не меняется или идет набор высоты, то начинается триммирование руля высоты вниз.
Триммирование производится значительно медленнее, чем управление автопилота 0, поэтому самовозбуждение петли обратной связи не происходит.
Посадка
Как известно, самым сложным элементом полета является посадка. Поскольку мой автопилот предназначен для радиоуправляемой модели, требования к посадке можно упростить. Здесь посадка выполняется в режиме планирования. При этом автопилоту дается задание при подлете к месту посадки (посадочный курс удерживается по GPS) удерживать скорость 0 и высоту, например, около 200 ft — немного больше чем высота полосы. При этом автопилот удерживает самолет в правильном полетном положении, постепенно увеличивая при снижении угол атаки. Такая посадка не годится для тяжелых самолетов, для них нужно требовать не нулевую скорость, а минимальную для данной конфигурации самолета, не достигая при этом сверхкритических углов атаки. В фильме можно увидеть посадку и также увидеть, как работают алгоритмы автопилота при триммировании и пролете по маршруту. Это в симуляторе. Посадку реального самолета можно увидеть в испытании 17.10.2017. Она произошла не штатно из-за разряда аккумулятора, но вполне красиво, т.е. так, как и задумано.