Визуализируйте пользовательский журнал рейса

Сконфигурируйте 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 столбца являются показаниями акселерометра в m/s2. Следующие 3 столбца являются показаниями гироскопа в rad/s, и последние 3 столбца являются показаниями магнитометра в μT.

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 столбцами координаты КСИЗА НЕДА в m. Следующие 3 столбца являются скоростью в направлении КСИЗА НЕДА в m/s, и последние 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