Сконфигурируйте flightLogSignalMapping
объект визуализировать данные из пользовательского журнала рейса.
В этом примере это принято, что полетные данные уже анализируются в MATLAB® и хранятся как файл MAT. Этот пример фокусируется на конфигурировании flightLogSignalMapping
возразите так, чтобы это могло правильно обработать данные логов, сохраненные в файле MAT, и визуализировать его. Данные, customFlightData.mat
, хранит структуру, которая содержит 3 поля. Fs
частота дискретизации сигналов, сохраненных в файле MAT. IMU
и Trajectory
матрицы, содержащие фактическую информацию о рейсе. Данные о траектории и данные IMU основаны на симулированном рейсе, который следует за спроектированным прямоугольным контуром на XY-плоскости.
customData = load("customFlightData.mat");
logData = customData.logData
logData = struct with fields:
IMU: [2785×9 double]
Fs: 100
Trajectory: [2785×10 double]
IMU
поле в logData
n-9 матрица, где первые 3 столбца являются показаниями акселерометра в . Следующие 3 столбца являются показаниями гироскопа в , и последние 3 столбца являются показаниями магнитометра в .
logData.IMU(1:5, :)
ans = 5×9
0.8208 0.7968 10.7424 0.0862 0.0873 0.0862 327.6000 297.6000 283.8000
0.8016 0.8160 10.7904 0.0883 0.0873 0.0862 327.6000 297.6000 283.8000
0.7680 0.7680 10.7568 0.0862 0.0851 0.0851 327.6000 297.6000 283.8000
0.8208 0.7536 10.7520 0.0873 0.0883 0.0819 327.6000 297.6000 283.8000
0.7872 0.7728 10.7328 0.0873 0.0862 0.0830 327.6000 297.6000 283.8000
Trajectory
поле в logData
n-9 матрица, с первыми 3 столбцами координаты КСИЗА НЕДА в . Следующие 3 столбца являются скоростью в направлении КСИЗА НЕДА в , и последние 4 столбца являются кватернионами, описывающими вращение UAV от инерции система координат NED к системе координат тела. Каждая строка является одной точкой траектории всеми этими заданными параметрами.
logData.Trajectory(1:5,:)
ans = 5×10
0.0200 0 -4.0000 2.0000 0 -0.0036 1.0000 0 0 -0.0000
0.0400 0 -4.0001 2.0000 0 -0.0072 1.0000 0 0 -0.0000
0.0600 0 -4.0002 2.0000 0 -0.0108 1.0000 0 0 -0.0000
0.0800 0 -4.0003 2.0000 0 -0.0143 1.0000 0 0 -0.0000
0.1000 0 -4.0004 2.0000 0 -0.0179 1.0000 0 0 -0.0001
Создайте flightLogSignalMapping
объект без входного параметра начиная с пользовательского формата журнала не делает в соответствии со стандартом "ulog"
или "tlog"
определение.
customPlotter = flightLogSignalMapping;
Объект имеет предопределенный набор сигналов, что можно сопоставить. Путем отображения этих предопределенных сигналов вы получаете доступ к набору предопределенных графиков. Заметьте, что несколько сигналов имеют "#" суффикс символа. Для этих сигналов можно опционально добавить целые числа как суффиксы к именам сигнала так, чтобы логарифмический плоттер рейса мог обработать сигналы кратного этого вида, такие как вторичные сигналы IMU и показания барометра. Вызовите info
.
% Predefined signals info(customPlotter, "Signal")
ans=18×4 table
SignalName IsMapped SignalFields FieldUnits
_____________________ ________ __________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________
"Accel#" false "AccelX, AccelY, AccelZ" "m/s^2, m/s^2, m/s^2"
"Airspeed#" false "PressDiff, IndicatedAirSpeed, Temperature" "Pa, m/s, degreeC"
"AttitudeEuler" false "Roll, Pitch, Yaw" "rad, rad, rad"
"AttitudeRate" false "BodyRotationRateX, BodyRotationRateY, BodyRotationRateZ" "rad/s, rad/s, rad/s"
"AttitudeTargetEuler" false "RollTarget, PitchTarget, YawTarget" "rad, rad, rad"
"Barometer#" false "PressAbs, PressAltitude, Temperature" "Pa, m, degreeC"
"Battery" false "Voltage_1, Voltage_2, Voltage_3, Voltage_4, Voltage_5, Voltage_6, Voltage_7, Voltage_8, Voltage_9, Voltage_10, Voltage_11, Voltage_12, Voltage_13, Voltage_14, Voltage_15, Voltage_16, RemainingCapacity" "v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, %"
"GPS#" false "Latitude, Longitude, Altitude, GroundSpeed, CourseAngle, SatellitesVisible" "degree, degree, m, m/s, degree, N/A"
"Gyro#" false "GyroX, GyroY, GyroZ" "rad/s, rad/s, rad/s"
"LocalENU" false "X, Y, Z" "m, m, m"
"LocalENUTarget" false "XTarget, YTarget, ZTarget" "m, m, m"
"LocalENUVel" false "VX, VY, VZ" "m/s, m/s, m/s"
"LocalENUVelTarget" false "VXTarget, VYTarget, VZTarget" "m/s, m/s, m/s"
"LocalNED" false "X, Y, Z" "m, m, m"
"LocalNEDTarget" false "XTarget, YTarget, ZTarget" "m, m, m"
"LocalNEDVel" false "VX, VY, VZ" "m/s, m/s, m/s"
⋮
% Predefined plots info(customPlotter,"Plot")
ans=10×4 table
PlotName ReadyToPlot MissingSignals RequiredSignals
_______________________ ___________ ____________________________________ ____________________________________
"Attitude" false "AttitudeEuler, AttitudeRate, Gyro#" "AttitudeEuler, AttitudeRate, Gyro#"
"AttitudeControl" false "AttitudeEuler, AttitudeTargetEuler" "AttitudeEuler, AttitudeTargetEuler"
"Battery" false "Battery" "Battery"
"Compass" false "AttitudeEuler, Mag#, GPS#" "AttitudeEuler, Mag#, GPS#"
"GPS2D" false "GPS#" "GPS#"
"Height" false "Barometer#, GPS#, LocalNED" "Barometer#, GPS#, LocalNED"
"Speed" false "GPS#, Airspeed#" "GPS#, Airspeed#"
"Trajectory" false "LocalNED, LocalNEDTarget" "LocalNED, LocalNEDTarget"
"TrajectoryTracking" false "LocalNED, LocalNEDTarget" "LocalNED, LocalNEDTarget"
"TrajectoryVelTracking" false "LocalNEDVel, LocalNEDVelTarget" "LocalNEDVel, LocalNEDVelTarget"
flightLogSignalMapping
возразите должен знать, как данные хранятся в журнале рейса, прежде чем это сможет визуализировать данные. Сопоставлять имена сигнала с указателями на функцию, которые получают доступ к релевантной информации в logData
, необходимо сопоставить сигналы с помощью mapSignal
. Каждый сигнал задан как вектор метки времени и матрица значения сигналов.
Например, чтобы сопоставить Gyro#
предупредите, задайте timeAccess
указатель на функцию на основе частоты выборки данных датчика. Этот указатель на функцию генерирует вектор метки времени для значений сигналов с помощью глобального интервала метки времени для данных.
timeAccess = @(x)seconds(1/x.Fs*(1:size(x.IMU)));
Затем проверяйте, какие поля должны быть заданы для Gyro#
сигнал с помощью info
.
info(customPlotter,"Signal","Gyro#")
ans=1×4 table
SignalName IsMapped SignalFields FieldUnits
__________ ________ _____________________ _____________________
"Gyro#" false "GyroX, GyroY, GyroZ" "rad/s, rad/s, rad/s"
Gyro#
предупредите нуждается в трех столбцах, содержащих показания гироскопа для осей XYZ. Задайте gyroAccess
указатель на функцию соответственно и карта это с timeAccess
использование mapSignal
.
gyroAccess = @(x)x.IMU(:,4:6);
mapSignal(customPlotter,"Gyro",timeAccess,gyroAccess);
Точно так же сопоставьте другие предопределенные signalsfor данные, которые присутствуют в журнале рейса. Задайте указатели функции ценности для данных. Сопоставьте сигналы с помощью того же timeAccess
добавьте метку времени к вектор-функции.
% IMU data stores accelerometer and magnetometer data. accelAccess = @(x)x.IMU(:,1:3); magAccess = @(x)x.IMU(:,7:9)*1e-2; % Flight trajectory in local NED coordinates % XYZ coordinates nedAccess = @(x)x.Trajectory(:, 1:3); % XYZ celocities nedVelAccess = @(x)x.Trajectory(:, 4:6); % Roll Pitch Yaw rotations converted from a quaternion attitudeAccess = @(x)flip(quat2eul(x.Trajectory(:, 7:10)),2); % Configure flightLogSignalMapping for custom data mapSignal(customPlotter, "Accel", timeAccess, accelAccess); mapSignal(customPlotter, "Mag", timeAccess, magAccess); mapSignal(customPlotter, "LocalNED", timeAccess, nedAccess); mapSignal(customPlotter, "LocalNEDVel", timeAccess, nedVelAccess); mapSignal(customPlotter, "AttitudeEuler", timeAccess, attitudeAccess);
Если все сигналы сопоставлены, customPlotter
готово сгенерировать графики на основе данных сигнала, сохраненных в журнале. Быстро проверять, сопоставлены ли сигналы правильно вызов checkSignal и задают logData.
checkSignal(customPlotter,logData);
-------------------------------------------- SignalName: Gyro Pass -------------------------------------------- SignalName: Accel Pass -------------------------------------------- SignalName: Mag Pass -------------------------------------------- SignalName: LocalNED Pass -------------------------------------------- SignalName: LocalNEDVel Pass -------------------------------------------- SignalName: AttitudeEuler Pass
Чтобы получить предварительный просмотр сопоставленного сигнала выбирают опцию предварительного просмотра в checkSignal.
checkSignal(customPlotter,logData,'Preview',"on",'Signal',"Accel");
-------------------------------------------- SignalName: Accel Pass Press a key to continue or 'q' to quit. Figure needs to be in focus.
Чтобы визуализировать данные логов рейса, вызовите show
и задайте logData
. Все графики, доступные на основе сопоставленных сигналов, показывают в цифрах.
predefinedPlots = show(customPlotter,logData);
Поскольку ультрасовременные детали регистрируют анализ, задают больше сигналов и добавляют больше графиков кроме предопределенных графиков, сохраненных в flightLogSignalMapping
. Задайте указатель на функцию, который фильтрует ускорения, больше, чем 1.
accelThreshold = @(x)(vecnorm(accelAccess(x)')>11)'; mapSignal(customPlotter, "HighAccel", timeAccess,accelThreshold, "AccelGreaterThan11", "N/A");
Вызовите updatePlot
добавить пользовательские графики. Задайте логарифмический объект плоттера рейса и имя для графика в качестве первых двух аргументов. Чтобы задать временные ряды данных, используйте "Timeseries"
в качестве третьего аргумента, и затем перечисляют данные.
updatePlot(customPlotter, "AnalyzeAccel","Timeseries",["HighAccel.AccelGreaterThan11", "LocalNEDVel.VX", "LocalNEDVel.VY", "LocalNEDVel.VZ"]);
Задайте пользовательский указатель на функцию для генерации указателя фигуры (см. функциональное определение ниже). Эта функция генерирует периодограмму с помощью fft
и другие функции на ускоряющих данных и строят их. Функция возвращает указатель на функцию.
updatePlot(customPlotter, "plotFFTAccel",@(acc)plotFFTAccel(acc),"Accel");
Проверяйте тот customPlotter
теперь содержит новый сигнал и два новых графика с помощью info
.
info(customPlotter, "Signal")
ans=19×4 table
SignalName IsMapped SignalFields FieldUnits
_____________________ ________ __________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________
"Accel" true "AccelX, AccelY, AccelZ" "m/s^2, m/s^2, m/s^2"
"AttitudeEuler" true "Roll, Pitch, Yaw" "rad, rad, rad"
"Gyro" true "GyroX, GyroY, GyroZ" "rad/s, rad/s, rad/s"
"HighAccel" true "AccelGreaterThan11" "N/A"
"LocalNED" true "X, Y, Z" "m, m, m"
"LocalNEDVel" true "VX, VY, VZ" "m/s, m/s, m/s"
"Mag" true "MagX, MagY, MagZ" "Gs, Gs, Gs"
"Airspeed#" false "PressDiff, IndicatedAirSpeed, Temperature" "Pa, m/s, degreeC"
"AttitudeRate" false "BodyRotationRateX, BodyRotationRateY, BodyRotationRateZ" "rad/s, rad/s, rad/s"
"AttitudeTargetEuler" false "RollTarget, PitchTarget, YawTarget" "rad, rad, rad"
"Barometer#" false "PressAbs, PressAltitude, Temperature" "Pa, m, degreeC"
"Battery" false "Voltage_1, Voltage_2, Voltage_3, Voltage_4, Voltage_5, Voltage_6, Voltage_7, Voltage_8, Voltage_9, Voltage_10, Voltage_11, Voltage_12, Voltage_13, Voltage_14, Voltage_15, Voltage_16, RemainingCapacity" "v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, %"
"GPS#" false "Latitude, Longitude, Altitude, GroundSpeed, CourseAngle, SatellitesVisible" "degree, degree, m, m/s, degree, N/A"
"LocalENU" false "X, Y, Z" "m, m, m"
"LocalENUTarget" false "XTarget, YTarget, ZTarget" "m, m, m"
"LocalENUVel" false "VX, VY, VZ" "m/s, m/s, m/s"
⋮
info(customPlotter, "Plot")
ans=12×4 table
PlotName ReadyToPlot MissingSignals RequiredSignals
_______________________ ___________ _____________________ ____________________________________
"AnalyzeAccel" true "" "HighAccel, LocalNEDVel"
"Attitude" true "AttitudeRate" "AttitudeEuler, AttitudeRate, Gyro#"
"AttitudeControl" true "AttitudeTargetEuler" "AttitudeEuler, AttitudeTargetEuler"
"Compass" true "GPS#" "AttitudeEuler, Mag#, GPS#"
"Height" true "Barometer#, GPS#" "Barometer#, GPS#, LocalNED"
"Trajectory" true "LocalNEDTarget" "LocalNED, LocalNEDTarget"
"TrajectoryTracking" true "LocalNEDTarget" "LocalNED, LocalNEDTarget"
"TrajectoryVelTracking" true "LocalNEDVelTarget" "LocalNEDVel, LocalNEDVelTarget"
"plotFFTAccel" true "" "Accel"
"Battery" false "Battery" "Battery"
"GPS2D" false "GPS#" "GPS#"
"Speed" false "GPS#, Airspeed#" "GPS#, Airspeed#"
Задайте, какие имена графика вы хотите построить. Вызовите show
использование "PlotsToShow"
визуализировать анализ ускоряющих данных.
accelAnalysisProfile = ["AnalyzeAccel", "plotFFTAccel"]; accelAnalysisPlots = show(customPlotter, logData, "PlotsToShow", accelAnalysisProfile);
Этот пример показал, как использовать flightLogSignalMapping
возразите, чтобы посмотреть на предопределенные сигналы и графики, а также настроить ваши собственные графики для логарифмического анализа рейса.
function h = plotFFTAccel(acc) h = figure("Name", "AccelFFT"); ax = newplot(h); v = acc.Values{1}; Fs = v.Properties.SampleRate; N = floor(length(v.AccelX)/2)*2; hold(ax, "on"); for idx = 1:3 x = v{1:N, idx}; xdft = fft(x); xdft = xdft(1:N/2+1); psdx = (1/(Fs*N)) * abs(xdft).^2; psdx(2:end-1) = 2*psdx(2:end-1); freq = 0:Fs/length(x):Fs/2; plot(ax, freq, 10*log10(psdx)); end hold(ax, "off"); title("Periodogram Using FFT"); xlabel("f (Hz)"); ylabel("Power/Frequency (dB/Hz)"); legend("AccelX", "AccelY", "AccelZ"); end