В этом примере показано, как преобразовать самолет с неподвижным крылом в модель в пространстве состояний линейного независимого от времени (LTI) для линейного анализа.
Этот пример описывает:
Импорт и заполнение данных из файла DATCOM.
Построение самолета с неподвижным крылом из данных DATCOM.
Вычисление статической устойчивости самолета с неподвижным крылом.
Линеаризация самолета с неподвижным крылом вокруг начального состояния.
Проверка статического анализа устойчивости с динамическим ответом.
Изоляция передаточной функции лифта к тангажу и разработка контроллера обратной связи для лифта.
Этот пример использует файл DATCOM, созданный для Неба самолет Хогга.
Во-первых, импортируйте выходной файл DATCOM с помощью datcomimport.
allData = datcomimport('astSkyHoggDatcom.out', false, 0);
skyHoggData = allData{1}
skyHoggData = struct with fields:
case: 'SKYHOGG BODY-WING-HORIZONTAL TAIL-VERTICAL TAIL CONFIG'
mach: [0.1000 0.2000 0.3000 0.3500]
alt: [1000 3000 5000 7000 9000 11000 13000 15000]
alpha: [-16 -12 -8 -4 -2 0 2 4 8 12]
nmach: 4
nalt: 8
nalpha: 10
rnnub: []
hypers: 0
loop: 2
sref: 225.8000
cbar: 5.7500
blref: 41.1500
dim: 'ft'
deriv: 'deg'
stmach: 0.6000
tsmach: 1.4000
save: 0
stype: []
trim: 0
damp: 1
build: 1
part: 0
highsym: 1
highasy: 0
highcon: 0
tjet: 0
hypeff: 0
lb: 0
pwr: 0
grnd: 0
wsspn: 18.7000
hsspn: 5.7000
ndelta: 5
delta: [-20 -10 0 10 20]
deltal: []
deltar: []
ngh: 0
grndht: []
config: [1x1 struct]
version: 1976
cd: [10x4x8 double]
cl: [10x4x8 double]
cm: [10x4x8 double]
cn: [10x4x8 double]
ca: [10x4x8 double]
xcp: [10x4x8 double]
cma: [10x4x8 double]
cyb: [10x4x8 double]
cnb: [10x4x8 double]
clb: [10x4x8 double]
cla: [10x4x8 double]
qqinf: [10x4x8 double]
eps: [10x4x8 double]
depsdalp: [10x4x8 double]
clq: [10x4x8 double]
cmq: [10x4x8 double]
clad: [10x4x8 double]
cmad: [10x4x8 double]
clp: [10x4x8 double]
cyp: [10x4x8 double]
cnp: [10x4x8 double]
cnr: [10x4x8 double]
clr: [10x4x8 double]
dcl_sym: [5x4x8 double]
dcm_sym: [5x4x8 double]
dclmax_sym: [5x4x8 double]
dcdmin_sym: [5x4x8 double]
clad_sym: [5x4x8 double]
cha_sym: [5x4x8 double]
chd_sym: [5x4x8 double]
dcdi_sym: [10x5x4x8 double]
Затем подготовьте интерполяционные таблицы DATCOM.
Интерполяционные таблицы DATCOM могут иметь отсутствующие значения из-за таблиц, только заполняющих одно значение для целого столбца.
Эти недостающие данные представлены в интерполяционных таблицах как значение 99999 и могут быть заполнены с помощью "предыдущего" метода fillmissing.
В этом примере, , , , и имейте недостающие данные.
skyHoggData.cyb = fillmissing(skyHoggData.cyb, "previous", "MissingLocations", skyHoggData.cyb == 99999); skyHoggData.cnb = fillmissing(skyHoggData.cnb, "previous", "MissingLocations", skyHoggData.cnb == 99999); skyHoggData.clq = fillmissing(skyHoggData.clq, "previous", "MissingLocations", skyHoggData.clq == 99999); skyHoggData.cmq = fillmissing(skyHoggData.cmq, "previous", "MissingLocations", skyHoggData.cmq == 99999);
С недостающими заполненными данными может быть создан самолет с неподвижным крылом.
Во-первых, самолет с неподвижным крылом подготовлен с желаемым именем самолета.
Опционально, имя самолета может быть извлечено из поля "случая" на struct DATCOM путем передачи пустого объекта фиксированного крыла.
skyHogg = Aero.FixedWing(); skyHogg.Properties.Name = "Sky_Hogg"; skyHogg.DegreesOfFreedom = "3DOF"; [skyHogg, cruiseState] = datcomToFixedWing(skyHogg, skyHoggData);
datcomToFixedWing преобразует все совместимые данные из datcom struct в объект фиксированного крыла и его состояние. Однако возвращенному состоянию все еще нужна обработка, чтобы получить желаемые начальные условия самолета.
В этом примере, среде, массе, инерции, скорости полета и центре корректировки потребности давления.
h = 2000; [T, a, p, rho] = atmoscoesa(convlength(h, "ft", "m")); cruiseState.AltitudeMSL = h; cruiseState.Environment.Temperature = convtemp(T,"K", "R"); cruiseState.Environment.SpeedOfSound = convvel(a, "m/s", "ft/s"); cruiseState.Environment.Pressure = convpres(p, "pa", "psf"); cruiseState.Environment.Density = convdensity(rho, "kg/m^3", "slug/ft^3"); cruiseState.U = 169.42; cruiseState.Mass = 1299.214; cruiseState.Inertia.Variables = [5787.969 0 117.64;0 6928.93 0;-117.64 0 11578.329]; cruiseState.CenterOfPressure = [0.183, 0, 0];
Выполнение статического анализа устойчивости помогает определить динамическую устойчивость системы, не вычисляя ответ динамической системы.
stability = staticStability(skyHogg, cruiseState)
stability=6×8 table
U V W Alpha Beta P Q R
________ _________ ________ ________ _________ _________ ________ _________
FX "Stable" "" "" "" "" "" "" ""
FY "" "Neutral" "" "" "" "" "" ""
FZ "" "" "Stable" "" "" "" "" ""
L "" "" "" "" "Neutral" "Neutral" "" ""
M "Stable" "" "" "Stable" "" "" "Stable" ""
N "" "" "" "" "Neutral" "" "" "Neutral"
Со статически устойчивыми силами и моменты, с возмущениями, чтобы передать и вертикальные скорости и возмущения к углу нападения, динамическая устойчивость системы стремится к колебанию, установившемуся при беспокойстве прямых и вертикальных скоростей.
Чтобы проверить это поведение, используйте Control System Toolbox™.
Чтобы использовать инструменты в Control System Toolbox™, линеаризуйте самолет вокруг состояния.
Это сделано при помощи линеаризовать метода с тем же состоянием круиза как прежде.
linSys = linearize(skyHogg, cruiseState)
linSys = A = XN XD U W Q XN 0 0 1 0 0 XD 0 0 0 1 0 U 0 1.319e-06 -0.001714 -0.0007608 0 W 0 0 -0.002705 -0.3319 2.557 Q 0 0 0.02379 -2.495 -26.41 Theta 0 0 0 0 1 Theta XN -2.586e-07 XD -2.957 U -0.5617 W -4.867e-08 Q 0 Theta 0 B = Delta XN 0 XD 0 U -0.0004314 W -0.02084 Q -2.321 Theta 0 C = XN XD U W Q Theta XN 1 0 0 0 0 0 XD 0 1 0 0 0 0 U 0 0 1 0 0 0 W 0 0 0 1 0 0 Q 0 0 0 0 1 0 Theta 0 0 0 0 0 1 D = Delta XN 0 XD 0 U 0 W 0 Q 0 Theta 0 Continuous-time state-space model.
С линейной созданной моделью в пространстве состояний можно построить динамическое поведение системы.
Чтобы проверить статические результаты устойчивости с динамическим поведением системы, постройте модель пробела состояний против начальных условий.
Чтобы вызвать возмущение в системе, 5 шагов степени в течение 1 секунды добавляются к сигналу лифта.
x0 = getState(cruiseState, linSys.OutputName); t = linspace(0, 50, 500); u = zeros(size(t)); u(t > 1 & t < 2) = 5; lsim(linSys,u,t,x0)
Как ожидалось от статического анализа устойчивости, скорости полета и уровня тангажа устойчиво при ответе на небольшое возмущение в лифте.
В дополнение к статической верификации устойчивости, изолируя поверхности управления к их намеченному динамическому ответу может помочь спроектировать контроллеры, характерные для отдельных поверхностей.
В этом случае существует только одна поверхность управления, лифт.
Лифт управляет ответом тангажа самолета. Чтобы показать ответ тангажа, изолируйте вход лифта к углу тангажа к передаточной функции лифта.
linSysElevatorTF = tf(linSys(6,1))
linSysElevatorTF = From input "Delta" to output "Theta": -2.321 s^3 - 0.7222 s^2 - 0.001232 s - 8.935e-09 ------------------------------------------------------------------ s^5 + 26.75 s^4 + 15.19 s^3 + 0.03932 s^2 + 0.008227 s + 5.712e-08 Continuous-time transfer function.
step(linSysElevatorTF)
Как видно графиком шага, ответ тангажа на вход лифта имеет нежелательную колебательную природу и большую установившуюся ошибку.
Путем добавления контроллера обратной связи ПИДа во вход лифта может быть достигнут намного более желательный ответ тангажа.
C = pidtune(linSysElevatorTF, "PID")
C = 1 Ki * --- s with Ki = -0.000524 Continuous-time I-only controller.
elevatorFeedback = feedback(linSysElevatorTF * C, 1)
elevatorFeedback = From input to output "Theta": 0.001217 s^3 + 0.0003786 s^2 + 6.459e-07 s + 4.684e-12 ------------------------------------------------------------------------ s^6 + 26.75 s^5 + 15.19 s^4 + 0.04053 s^3 + 0.008605 s^2 + 7.03e-07 s + 4.684e-12 Continuous-time transfer function.
step(elevatorFeedback)