可视化自定义飞行日志

通过配置flightLogSignalMapping可从自定义的飞行日志中可视化数据。

加载自定义的飞行日志

在本例中,假设飞行数据已经被解析到MATLAB®中,并存储为M文件。本示例重点介绍如何配置flightLogSignalMapping,以便它能够正确地处理保存在M文件中并将日志数据可视化。customFlightData.mat存储包含3个字段的结构.Fs是信号的抽样频率,它存储在MAT文件里。IMUTrajectory是包含实际飞行信息的矩阵。弹道数据和IMU数据是基于一个模拟飞行器,它沿着xy平面上的一个投影矩形路径飞行。

customData = load("customFlightData.mat");
logData = customData.logData

logData = struct with fields:
IMU: [2785×9 double]
Fs: 100
Trajectory: [2785×10 double]

logData中的IMU字段是一个n × 9矩阵,其中前3列是加速度计读数,单位是m/s^2,第4~6列是以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

LogData中的轨迹字段是一个n×9的矩阵,前3列是m中的XYZ NED坐标,后3列是以m/s为单位的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"

在将数据可视化之前,flightLogSignalMapping对象需要知道数据是如何存储在飞行日志中的。为了将信号名与访问logData中相关信息的函数句柄关联,你需要用mapSignal映射信号。每个信号被定义为一个时间戳向量和一个信号值矩阵。
举个例子,为了映射Gyro#信号,基于传感器数据采样频率来定义timeAccess函数句柄。这个函数句柄使用数据的全局时间戳间隔为信号值生成时间戳向量。

timeAccess = @(x)seconds(1/x.Fs*(1:size(x.IMU)));

接下来,使用info检查哪些字段必须为Gyro#信号定义。

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函数句柄,并使用mapSignal将其映射为timeAccess

gyroAccess = @(x)x.IMU(:,4:6);
mapSignal(customPlotter,"Gyro",timeAccess,gyroAccess);

同样,将其他预定义信号映射到飞行日志中的数据。为数据定义value函数句柄。使用相同的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中选择预览选项

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(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:3x = 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));endhold(ax, "off");title("Periodogram Using FFT");xlabel("f (Hz)");ylabel("Power/Frequency (dB/Hz)");legend("AccelX", "AccelY", "AccelZ");
end

【MATLAB UAV Toolbox】使用指南(三)相关推荐

  1. MATLAB Robotics toolbox工具建立三自由度机械臂 借鉴了各个博客主

    clear; clc; %建立机器人模型 %定义连杆的D-H参数 %       theta    d        a        alpha     offset L1=Link([0     ...

  2. 【MATLAB Image Processing Toolbox 入门教程三】快速入门之“在多光谱图像中寻找植被”

    [MATLAB Image Processing Toolbox 入门教程三] 本篇摘要 一.从多光谱图像文件导入彩色红外通道 二.构建近红外光谱散射图 三.计算植被系数并显示其定位 四.综合实例部分 ...

  3. Matlab概率统计编程指南

    Matlab概率统计编程指南 第4章 概率统计 本章介绍MATLAB在概率统计中的若干命令和使用格式,这些命令存放于MatlabR12\Toolbox\Stats中. 4.1 随机数的产生 4.1.1 ...

  4. MATLAB Robotic Toolbox 机器人工具箱示例

    程序是基于Matlab2016a,工具箱版本为Robotic Toolbox 10.2 参考博客: MATLAB机器人工具箱使用 Matlab Robotic Toolbox V9.10工具箱(三): ...

  5. 基于Matlab Robotics Toolbox的Dobot机械臂运动规划(1)

    [基于Matlab Robotics Toolbox的Dobot机械臂运动规划] 系列文章是我在学习robotics toolbox中所做工作的记录,方便自己后面复习.改进. 基于Matlab R20 ...

  6. MATLAB m_map工具包的安装“三步走”

    m_map官方网站:M_Map: A Mapping package for Matlabhttps://www.eoas.ubc.ca/~rich/map.html m_map工具包下载链接:htt ...

  7. 机器人与matlab—Robotics Toolbox—01空间位姿描述

    机器人学与matlab-Robotics Toolbox-01空间位姿描述 1.二维空间位姿描述 2.三维空间位姿描述 2.1 正交旋转矩阵 2.2 三角度表示法(欧拉角.RPY角) 2.3 等效轴角 ...

  8. 焊接机器人——6自由度焊接机器人solidworks设计、D-H模型参数及matlab robotics toolbox模型仿真与验证

    1 设计思路 焊接机器人在点与点之间移位时速度要快捷,动作要平稳,定位要准确,以减少移位的时间,提高工作效率. 考虑到各种被焊接工件的外型特点,首先我们必须保证机械臂能在达到空间中的所有位置(能够有较 ...

  9. 怎么用matlab计算机械手运动,Matlab Robotics ToolBox 实战 -- 斯坦福机械手运动学建模及分析...

    这同样是<机器人技术基础>课程实验中的一个,题目比较开放,只要求对任一坐标形式的机械臂进行研究即可.下面是详细介绍: 一.选定建模对象 选定球坐标机器人--斯坦福机械手臂(参考<机器 ...

最新文章

  1. winform模拟登陆网页_【教程】模拟登陆网站 之 C#版(内含两种版本的完整的可运行的代码)...
  2. 2018-2019-2 20165330《网络对抗技术》Exp9 Web安全基础
  3. Excel中R1C1引用样式
  4. Python入门教学之(转义字符与原字符)
  5. Java面向对象编程篇5——枚举
  6. 如何使用python进行批处理
  7. 12 大 AI App 技术创意,教你如何在 2020 年赚到钱
  8. Java发令枪ConcurrentExecutor之控制线程数,并发数
  9. raise NotImplementedError
  10. android 5.0rom官方,Android 5.0刷机包开放下载 升级需谨慎
  11. 2020年10月24日=996 程序员节日快乐
  12. 计算机数学位数,有效位数
  13. 文件服务器要备案么,icp备案一定要云服务器吗
  14. 一段美好的记忆,一份真挚的感情,已经远去......
  15. 域名前缀和后缀html,为什么域名前要加www前缀,www是什么意思? - 立金哥
  16. 如何建语料库_如何建设语料?
  17. 手机屏幕常见故障_手机测试常见问题总结!
  18. 出现连接路由器的电脑不能上网,而手机可以上网的问题的一种解决方法
  19. 以作回顾、以作借鉴、以作鼓励
  20. 2021江苏连云港高考成绩查询时间,2021年江苏连云港高考时间:6月7日至9日

热门文章

  1. Android第一天 安装Android Studio 3.5
  2. 如何利用echarts3绘制梯形波图
  3. 半导体激光器的发展趋势
  4. android 图片转换成base64
  5. HTC G7上网设置和简单操作
  6. 国内的房地产ERP系统能够上线吗,实施效益如何
  7. 江哥带你玩转C语言 | 07 - C语言流程控制
  8. CocosCreator 音效管理
  9. 效率 | 命令行备忘工具navi,快速调用复杂命令
  10. 商城模板网站html5手机端_玩转手机网站建设,选择模板还是不选择模板呢?