主要内容

可视化自定义飞行日志

配置flightLogSignalMapping对象来可视化自定义飞行日志中的数据。

加载自定义飞行日志

在本例中,假设飞行数据已经被解析为MATLAB®并存储为MAT文件。的配置flightLogSignalMapping对象,以便它能够正确处理保存在MAT文件中的日志数据并将其可视化。数据,customFlightData.mat,存储一个包含3个字段的结构。Fs为存储在MAT文件中的信号的采样频率。IMU轨迹是包含实际航班信息的矩阵。轨迹数据和IMU数据基于模拟飞行,该飞行遵循一个投影矩形路径xy飞机。

customData = load()“customFlightData.mat”);logData = customData.logData
logData =带有字段的结构体:IMU: [2785×9 double] Fs: 100轨迹:[2785×10 double]

IMUlogData是一个n- × 9矩阵,其中前3列是加速度计读数 / 年代 2 。接下来的三列是陀螺仪读数 rad / 年代 ,最后三列是磁力计的读数 μ T

logData。IMU(1:5, :)
ans =5×90.8208 0.7968 10.7424 0.0862 0.0873 0.0873 0.0862 327.6000 297.6000 283.8000 0.8016 0.8160 10.7904 0.0883 0.0873 0.0862 327.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

轨迹logData是一个n- x -9矩阵,前3列是XYZ NED坐标 。接下来的三列是在XYZ NED方向上的速度 / 年代 ,后4列为四元数,描述无人机从惯性NED坐标系到本体坐标系的旋转。每一行都是定义了所有这些参数的轨迹的一个点。

: logData.Trajectory (1:5)
ans =5×100.0200 0 -0.0000 0.0000 0 -0.0036 1.0000 0 -0.0000 0.0400 0 -4.0001 1.0000 0 -0.0072 1.0000 0 -0.0000 0.0600 0 -4.0002 2.0000 0 -0.0108 1.0000 0 -0.0000 0.0800 0 -4.0003 2.0000 0 -0.0143 1.0000 0 -0.0000 0.1000 0 -4.0004 2.0000 0 -0.0179 1.0000 0 -0.0001

可视化自定义飞行日志使用预定义的信号格式和绘图

创建一个flightLogSignalMapping对象,没有输入参数,因为自定义日志格式不遵循标准。ulog”或“tlog”定义。

customplot = flightLogSignalMapping;

该对象有一组可以映射的预定义信号。通过映射这些预定义的信号,您可以访问一组预定义的图。注意,一些信号带有“#”符号后缀。对于这些信号,您可以选择添加整数作为信号名称的后缀,以便飞行日志绘图仪可以处理多个此类信号,例如二次IMU信号和气压计读数。调用信息

%预定义信号信息(customPlotter“信号”
ans =18×4表SignalName IsMapped SignalFields FieldUnits  _____________________ ________ __________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________ " 访问,Accel #“false”AccelX AccelZ”“米/秒^ 2米/秒^ 2米/秒^ 2”“空速#“false”PressDiff IndicatedAirSpeed,温度”“爸爸,米/秒,degree " "AttitudeEuler" "Roll, Pitch, Yaw" "rad, rad, rad" " attitude " 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”纬度,经度,高度,水平速度,CourseAngle, SatellitesVisible”“学位,学位,m, m / s,学位,N / A”“陀螺#“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, v, 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
%预定义图信息(customPlotter“阴谋”
ans =10×4表PlotName ReadyToPlot MissingSignals RequiredSignals  _______________________ ___________ ____________________________________ ____________________________________ " 态度“false”AttitudeEuler AttitudeRate,陀螺#”“AttitudeEuler AttitudeRate,陀螺#”“AttitudeControl“false”AttitudeEuler, AttitudeTargetEuler”“AttitudeEuler AttitudeTargetEuler”“电池”假“电池”“电池”“指南针“false”AttitudeEuler,杂志#,GPS #”“AttitudeEuler杂志#,“GPS2D”假“GPS#”“GPS#”“高度”假“气压计#,GPS#, LocalNED”“气压计#,GPS#, LocalNED”“速度”假“GPS#,空速#”“GPS#,空速#”“轨迹”假“LocalNED, LocalNEDTarget”“轨迹”假“LocalNED, LocalNEDTarget”“轨迹”假“LocalNED, LocalNEDTarget”“轨迹”假“LocalNED, LocalNEDTarget”“轨迹”假“LocalNED, LocalNEDTarget”“轨迹”假“LocalNEDVel, LocalNEDVelTarget”“轨迹”假“LocalNEDVel, LocalNEDVelTarget”“轨迹”假“LocalNEDVel, LocalNEDVelTarget”“轨迹”假“LocalNEDVel, LocalNEDVelTarget”

flightLogSignalMapping对象在可视化数据之前,需要知道数据是如何存储在飞行日志中的。类中访问相关信息的函数句柄与信号名相关联logData,你必须使用映射信号mapSignal。每个信号被定义为一个时间戳向量和一个信号值矩阵。

例如,映射陀螺#信号,定义一个timeAccess函数手柄根据传感器数据采样频率。这个函数句柄使用数据的全局时间戳间隔为信号值生成时间戳向量。

timeAccess = @(x)seconds(1/x. fs *(1:size(x. imu)));

接下来,检查必须为控件定义哪些字段陀螺#信号使用信息

信息(customPlotter“信号”“陀螺#”
ans =1×4表SignalName IsMapped SignalFields FieldUnits  __________ ________ _____________________ _____________________ " 陀螺#“false”GyroX、GyroY GyroZ”“rad / s, rad / s, rad / s”

陀螺#信号需要三列,包含XYZ轴的陀螺仪读数。定义gyroAccess函数句柄,并将其映射为timeAccess使用mapSignal

gyroAccess = @(x)x. imu (:,4:6);mapSignal (customPlotter“陀螺”、timeAccess gyroAccess);

同样,为飞行日志中存在的数据映射其他预定义信号。为数据定义值函数句柄。使用相同的映射信号timeAccess时间戳矢量函数。

% IMU数据存储加速度计和磁力计数据。accelAccess = @(x) x.m u (:,1:3);magAccess = @(x)x. imu (:,7:9)*1e-2;%本地NED坐标飞行轨迹% XYZ坐标nedAccess = @(x)x轨迹(:, 1:3);% XYZ速度nevelaccess = @(x)x。轨迹(:4:6);%滚转俯仰偏航旋转从四元数转换attitdeaccess = @(x)翻转(quat2eul(x);轨迹(:7:10)),2);%为自定义数据配置flightLogSignalMappingmapSignal (customPlotter“加速”, timeAccess, acceleraccess);mapSignal (customPlotter“杂志”, timeAccess, magAccess);mapSignal (customPlotter“LocalNED”, timeAccess, nedAccess);mapSignal (customPlotter“LocalNEDVel”, timeAccess, nevelaccess);mapSignal (customPlotter“AttitudeEuler”, timeAccess, attitudeAccess);

一旦所有信号都被映射出来,customPlotter准备根据存储在日志中的信号数据生成图。要快速检查信号是否被正确映射,调用checkSignal并指定logData。

checkSignal (customPlotter logData);
-------------------------------------------- SignalName:陀螺通过  -------------------------------------------- SignalName: Accel通过  -------------------------------------------- SignalName:杂志通过  -------------------------------------------- SignalName: LocalNED通过  -------------------------------------------- SignalName: LocalNEDVel通过  -------------------------------------------- SignalName: AttitudeEuler通过

要获得映射信号的预览,请选择checkSignal中的预览选项。

checkSignal (customPlotter logData,“预览”“上”“信号”“加速”);
-------------------------------------------- SignalName: Accel通过按一个键继续或“q”辞职。图形需要对焦。

要可视化飞行日志数据,请呼叫显示并指定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。v”“LocalNEDVel。款”]);

定义一个自定义函数句柄来生成图形句柄(参见下面的函数定义)。此函数使用。生成一个周期图fft以及其它函数对加速度数据的处理和绘图。函数返回一个函数句柄。

updatePlot (customPlotter“plotFFTAccel”@ (acc) plotFFTAccel (acc),“加速”);

检查customPlotter现在包含一个新的信号和两个新的绘图使用信息

信息(customPlotter“信号”
ans =19×4表SignalName IsMapped SignalFields FieldUnits  _____________________ ________ __________________________________________________________________________________________________________________________________________________________________________________________________________ ___________________________________________________ " Accel“true”AccelX、访问AccelZ”“米/秒^ 2,m / s ^ 2米/秒^ 2”“AttitudeEuler“true”卷,音高,偏航”“rad, rad, rad”“陀螺”真正的“GyroX, GyroY, GyroZ”“rad / s, rad / s,“HighAccel”true“AccelGreaterThan11”“N/A”“LocalNED”true“X, Y, Z”“m, m, m”“localnevel”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”“”false“BodyRotationRateX, BodyRotationRateX, BodyRotationRateZ”“rad/s, rad/s, rad/s”“”false“RollTarget, PitchTarget, YawTarget”“rad, rad, rad”“气压计#”false“PressAbs, PressAltitude”温度“Pa, m,度”“电池”假“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,剩余容量”“v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v, v,剩余容量”“GPS#”假“纬度,Longitude,海拔,地面速度,航向角,卫星可见度”“度,度,m, m/s,度,N/A”“LocalENU”假“X, Y, Z”“m, m, m”“localenuget”假“XTarget”,YTarget, ZTarget" "m, m, m" "LocalENUVel" false "VX, VY, VZ" "m/s, m/s, m/s"
信息(customPlotter“阴谋”
ans =12×4表PlotName ReadyToPlot MissingSignals RequiredSignals  _______________________ ___________ _____________________ ____________________________________ " ”AnalyzeAccel“true”“HighAccel LocalNEDVel”“态度”真正的“AttitudeRate”“AttitudeEuler AttitudeRate,陀螺#”“AttitudeControl“true”AttitudeTargetEuler”“AttitudeEuler AttitudeTargetEuler”“指南针”真正的“GPS #”“AttitudeEuler,杂志#,GPS # "高度"真正的"晴雨表#,GPS # #”“晴雨表,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#,空速#" "GPS#,空速#" "GPS#,空速#"

指定要绘制的绘图名称。调用显示使用“PlotsToShow”使加速度数据的分析可视化。

accelAnalysisProfile = [“AnalyzeAccel”“plotFFTAccel”];acceleranalysisplots = show(customPlotter, logData,“PlotsToShow”, accelAnalysisProfile);

控件的使用方法flightLogSignalMapping对象来查看预定义的信号和图,以及自定义您自己的飞行日志分析图。

分析加速度数据函数定义

函数h = plotFFTAccel(acc)“名称”“AccelFFT”);Ax = newplot(h);v = acc.Values{1};Fs = v.Properties.SampleRate;N = floor(length(v.AccelX)/2)*2;(ax,“上”);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, frequency, 10*log10(psdx));结束(ax,“关闭”);标题(使用FFT的周期图);包含(“f (Hz)”);ylabel (“功率/频率(dB / Hz)”);传奇(“AccelX”“访问”“AccelZ”);结束