Сконфигурируйте flightLogSignalMapping
объект для визуализации данных из пользовательского журнала рейсов.
В этом примере принято, что рейсы уже анализируются в MATLAB ® и хранятся как файл MAT. Этот пример посвящен конфигурированию flightLogSignalMapping
объект так, чтобы он мог правильно обрабатывать данные журнала, сохраненные в файле MAT, и визуализировать его. Данные, customFlightData.mat
, сохраняет структуру, содержащую 3 поля. Fs
- частота дискретизации сигналов, сохраненных в файле MAT. IMU
и Trajectory
являются матрицами, содержащими фактическую информацию о рейсе. Данные траектории и данные БИНС основаны на моделируемом рейсе, который следует по проективному прямоугольному пути на XY-плоскости.
customData = load("customFlightData.mat");
logData = customData.logData
logData = struct with fields:
IMU: [2785×9 double]
Fs: 100
Trajectory: [2785×10 double]
The 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
The Trajectory
поле в logData
является матрицей n на 9, с первыми 3 столбцами являются координаты XYZ NED в . Следующие 3 столбца являются скоростью в направлении XYZ NED в , и последние 4 столбца являются кватернионами, описывающими вращение БПЛА от инерционной системы координат 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"
The flightLogSignalMapping
объект должен знать, как данные хранятся в журнале рейсов, прежде чем он сможет визуализировать данные. Чтобы связать имена сигналов с указателями на функцию, которые получают доступ к релевантной информации в logData
, вы должны сопоставить сигналы используя mapSignal
. Каждый сигнал задан как вектор временной метки и матрица значений сигналов.
Например, чтобы сопоставить Gyro#
signal, задайте 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"
The 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);
Для анализа журнала деталей mod задайте больше сигналов и добавьте больше графиков, кроме предопределенных графиков, хранимых в 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