【Tool】Matlab 数据分析可视化

一、问题描述

近期围绕imu总是出现问题,自己整理了一下将数据可视化的工具

二、imu 类

1. 待处理数据格式

#  yaw     roll        pitch     time
-2.08131 -0.0741765 0.0200713 121.281000000
-2.08724 -0.0745256 0.0197222 121.301000000
-2.093 -0.0757473 0.018326 121.321000000
-2.09789 -0.0774926 0.0164061 121.341000000
-2.10138 -0.0792379 0.0144862 121.361000000
-2.10452 -0.0808087 0.0122173 121.381000000
-2.10836 -0.082205 0.0102974 121.401000000
-2.11377 -0.0834267 0.00820305 121.421000000
-2.1204 -0.0842994 0.00663225 121.441000000
-2.1286 -0.084823 0.00523599 121.461000000
-2.13873 -0.0849975 0.00418879 121.481000000

2. matlab 源程序

clc;
% 0: 选择对话框          1:文件路径(默认)
mode=1;% 选择打开文件方式
switch mode
% 选择对话框打开文件case 0  [filename, pathname] = uigetfile('*.txt', 'Select the IMU data log file');if isequal(filename, 0)disp('User selected Cancel');return;elsedisp(['User selected ', fullfile(pathname, filename)]);end% 打开文件路径获取文件case 1%         file_name="all_roate";file_name="sensor_data_2";pathname="/home/work/IMU/imu_rviz/imu_data/";file=file_name+".txt";otherwisedisp("Other Case ...");
end% 完整的文件路径
filepath = fullfile(pathname, file);
data = importdata(filepath);%*************************************  计算当前角度 ***********************************************
% 提取yaw, roll, pitch和时间
y_yaw = data(:, 1);     % 第1列是yaw
y_roll = data(:, 2);    % 第2列是roll
y_pitch = data(:, 3);   % 第3列是pitch
x_time = data(:, 4);    % 第4列是时间% 创建折线图
figure;
markerSize = 2; % 设置数据点的尺寸
plot(x_time, y_yaw, '-o', 'Color', 'b','MarkerSize', markerSize, 'DisplayName', 'Yaw');     	% 绘制Yaw数据
hold on;                                                            % 保持当前图表
plot(x_time, y_roll, '-o', 'Color', 'r', 'MarkerSize', markerSize, 'DisplayName', 'Roll');    % 绘制Roll数据
plot(x_time, y_pitch, '-o', 'Color', 'g','MarkerSize', markerSize,  'DisplayName', 'Pitch');  % 绘制Pitch数据% 设置图表标题和标签
title([file_name, ' - Angle Display'], 'Interpreter', 'none');
xlabel('Time (s)');
ylabel('IMU Angle (rad)');
h_legend = legend('show');      % 显示图例
grid on;                        % 启用网格线
grid minor;                     % 启用次要网格线
% 设置图表充满figure
set(gca, 'Position', [0.035, 0.05, 0.95, 0.9]); % 使Axes充满figure窗口(left, bottom, width, height) % 设置图例项的可点击属性
h_legend.ItemHitFcn = @toggleVisibility;%*************************************  计算前后帧角度差 ***********************************************
% 计算角度差并进行归一化
yaw_diff = diff(y_yaw); 
yaw_diff = mod(yaw_diff + pi, 2*pi) - pi; % 将角度差限制在 -π 到 π 之间
yaw_diff = [yaw_diff; 0]; % 最后一帧差值设为0roll_diff = diff(y_roll); 
roll_diff = mod(roll_diff + pi, 2*pi) - pi; % 将角度差限制在 -π 到 π 之间
roll_diff = [roll_diff; 0]; % 最后一帧差值设为0pitch_diff = diff(y_pitch); 
pitch_diff = mod(pitch_diff + pi, 2*pi) - pi; % 将角度差限制在 -π 到 π 之间
pitch_diff = [pitch_diff; 0]; % 最后一帧差值设为0% 创建新的图窗并绘制角度差折线图
figure;
% plot(x_time, yaw_diff, '-*', 'Color', 'b', 'DisplayName', 'Yaw Difference'); % 绘制Yaw差值
% hold on;
% plot(x_time, roll_diff, '-x', 'Color', 'r', 'DisplayName', 'Roll Difference'); % 绘制Roll差值
% plot(x_time, pitch_diff, '-x', 'Color', 'g', 'DisplayName', 'Pitch Difference'); % 绘制Pitch差值
bar(x_time, yaw_diff, 'FaceColor', 'b', 'DisplayName', 'Yaw'); % 绘制Yaw差值
hold on;
bar(x_time, roll_diff, 'FaceColor', 'r', 'DisplayName', 'Roll'); % 绘制Roll差值
bar(x_time, pitch_diff, 'FaceColor', 'g', 'DisplayName', 'Pitch'); % 绘制Pitch差值% 设置图表标题和标签
title([file_name, ' - Delta Angle Display'], 'Interpreter', 'none');
xlabel('Time (s)');
ylabel('Angle Delta (rad)');
D_legend = legend('show');      % 显示图例
grid on;                        % 启用网格线
grid minor;                     % 启用次要网格线
% 设置图表充满figure
set(gca, 'Position', [0.035, 0.05, 0.95, 0.9]); % 使Axes充满figure窗口(left, bottom, width, height)D_legend.ItemHitFcn = @toggleVisibility;%*************************************  计算前后帧时间差 ***********************************************
% 计算时间戳差值
time_diff = diff(x_time);     % 计算相邻时间戳之间的差值
time_diff = [time_diff; 0];   % 最后一个时间戳差值设为0,因为没有下一帧% 统计 time_diff > 0.025 的次数及其比例
threshold = 0.025;
data_sum=sum(data(:));
count_exceed = sum(time_diff > threshold); % 计算超过阈值的数量
total_count = length(time_diff);           % 总的时间戳差值数量
proportion_exceed = count_exceed / total_count; % 计算超过阈值的比例% 打印统计结果
fprintf(' IMU 数据总帧数:%.f 帧 \n', data_sum);% 打印数据总和,不采用科学计数法
fprintf(' 间隔 >%.3fs 帧数:%d 帧\t', threshold, count_exceed);
fprintf('异常帧率所占比例: %.2f%%\n', proportion_exceed * 100);% 创建新的图窗并绘制柱状图
figure;
bar(x_time, time_diff, 'FaceColor', 'b'); % 绘制时间戳差值柱状图% 设置图表标题和标签
title([file_name, ' - Delta time Display'], 'Interpreter', 'none');
xlabel('Time (s)');
ylabel('Time Delta (s)');
grid on; % 启用网格线
grid minor; % 启用次要网格线
% 设置图表充满figure
set(gca, 'Position', [0.035, 0.05, 0.95, 0.9]); % 使Axes充满figure窗口(left, bottom, width, height) %*************************************  函数置于程序最后 ***********************************************
% 回调函数,用于显示和隐藏折线
function toggleVisibility(~, event)h_line = event.Peer;% 切换折线的可见性if strcmp(h_line.Visible, 'on')h_line.Visible = 'off';elseh_line.Visible = 'on';end
end

三、效果

注意:点击图例,图表中对应折线可显示与隐藏。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、RTK类

1. 待处理数据格式

# 	p_x						p_y 						p_z						lat						lon 			alt		type sats	time
0.932831314024 0.688128449856 -0.065349213413 31.189889848090 120.593791473480 12.1707 50 23 264.971752582
0.933988519921 0.686419487272 -0.067954306696 31.189889832690 120.593791485610 12.1681 50 23 265.062251207
0.934132574159 0.686145386414 -0.066855122953 31.189889830220 120.593791487120 12.1692 50 23 265.174277166
0.930754446656 0.689859606514 -0.069844054392 31.189889863690 120.593791451710 12.1662 50 23 265.262168874
0.930238330538 0.691429854924 -0.070039372782 31.189889877840 120.593791446300 12.1660 50 23 265.371954541
0.926209575172 0.691106926309 -0.076640334879 31.189889874930 120.593791404070 12.1594 50 23 265.462255416
0.926119897413 0.692730441288 -0.074935496950 31.189889889560 120.593791403130 12.1611 50 23 265.571762541
0.925914784963 0.693109963431 -0.077834364811 31.189889892980 120.593791400980 12.1582 50 23 265.662138374

2. matlab 源程序

clc;
% 0: 选择对话框          1:文件路径(默认)
mode=1;% 选择打开文件方式
switch mode
% 选择对话框打开文件case 0  [filename, pathname] = uigetfile('*.txt', 'Select the IMU data log file');if isequal(filename, 0)disp('User selected Cancel');return;elsedisp(['User selected ', fullfile(pathname, filename)]);end% 打开文件路径获取文件case 1%         file_name="all_roate";file_name="rtk_data";pathname="/home/work/IMU/imu_rviz/imu_data/";file=file_name+".txt";otherwisedisp("Other Case ...");
end% 完整的文件路径
filepath = fullfile(pathname, file);
data = importdata(filepath);% %*************************************  数据提取 ***********************************************
% 提取yaw, roll, pitch和时间
p_x = data(:, 1);     % 第1列是x
p_y = data(:, 2);    % 第2列是y
p_z = data(:, 3);   % 第3列是z
p_time = data(:, 9);    % 第9列是时间%************************************ 二维图绘制 *********************************************
figure;
markerSize = 4; % 设置数据点的尺寸
plot(p_x, p_y, '-o','MarkerSize', markerSize, 'LineWidth', 0.1, 'Color', 'b'); 
title([file_name, ' - 2D Trajectory'], 'Interpreter', 'none');
xlabel('X Position(m)');
ylabel('Y Position(m)');
hold on;
grid on;
grid minor;                     % 启用次要网格线axis equal;
set(gca, 'Position', [0.035, 0.05, 0.9, 0.9]); % 使Axes充满figure窗口(left, bottom, width, height) % 计算箭头的方向向量
u = diff(p_x);
v = diff(p_y);% 在所有点上绘制箭头
quiver(p_x(1:end-1), p_y(1:end-1), u, v, 0, 'MaxHeadSize', 0.2, 'Color', 'g');%************************************ 三维图绘制 *********************************************figure;
plot3(p_x, p_y, p_z, '-o','MarkerSize', markerSize, 'LineWidth', 0.1, 'Color', 'b');
title([file_name, ' - 3D Trajectory'], 'Interpreter', 'none');
xlabel('X Position(m)');
ylabel('Y Position(m)');
zlabel('Z Position(m)');
grid on;
grid minor;                     % 启用次要网格线
view(3); % 设置默认的三维视角
hold on;% 计算三维箭头的方向向量
u3 = diff(p_x);
v3 = diff(p_y);
w3 = diff(p_z);% 在所有点上绘制三维箭头
quiver3(p_x(1:end-1), p_y(1:end-1), p_z(1:end-1), u3, v3, w3, 0, 'MaxHeadSize', 0.2, 'Color', 'g');hold off;%*************************************  计算前后帧时间差 ***********************************************
% 计算时间戳差值
time_diff = diff(p_time);     % 计算相邻时间戳之间的差值
time_diff = [time_diff; 0];   % 最后一个时间戳差值设为0,因为没有下一帧% 统计 time_diff > 0.025 的次数及其比例
threshold = 0.15;
data_sum=sum(data(:));
count_exceed = sum(time_diff > threshold); % 计算超过阈值的数量
total_count = length(time_diff);           % 总的时间戳差值数量
proportion_exceed = count_exceed / total_count; % 计算超过阈值的比例% 打印统计结果
fprintf(' RTK 数据总帧数:%.f 帧 \n', data_sum);% 打印数据总和,不采用科学计数法
fprintf(' 间隔 >%.3fs 帧数:%d 帧\t', threshold, count_exceed);
fprintf('异常帧率所占比例: %.2f%%\n', proportion_exceed * 100);% 创建新的图窗并绘制柱状图
figure;
bar(p_time, time_diff, 'FaceColor', 'b'); % 绘制时间戳差值柱状图% 设置图表标题和标签
title([file_name, ' - Delta time Display'], 'Interpreter', 'none');
xlabel('Time (s)');
ylabel('Time Delta (s)');
grid on; % 启用网格线
grid minor; % 启用次要网格线
% 设置图表充满figure
set(gca, 'Position', [0.035, 0.05, 0.95, 0.9]); % 使Axes充满figure窗口(left, bottom, width, height) %*************************************  计算前后帧距离差 ***********************************************
% 计算角度差并进行归一化
x_diff = diff(p_x); 
x_diff = [x_diff; 0]; % 最后一帧差值设为0y_diff = diff(p_y); 
y_diff = [y_diff; 0]; % 最后一帧差值设为0z_diff = diff(p_z); 
z_diff = [z_diff; 0]; % 最后一帧差值设为0% 创建新的图窗并绘制角度差折线图
figure;
bar(p_time, x_diff, 'FaceColor', 'r', 'DisplayName', 'D\_x'); % 绘制Yaw差值
hold on;
bar(p_time, y_diff, 'FaceColor', 'g', 'DisplayName', 'D\_y'); % 绘制Roll差值
bar(p_time, z_diff, 'FaceColor', 'b', 'DisplayName', 'D\_z'); % 绘制Pitch差值% 设置图表标题和标签
title([file_name, ' - Delta Distance Display'], 'Interpreter', 'none');
xlabel('Time (s)');
ylabel('Distance Delta (m)');
D_legend = legend('show');      % 显示图例
grid on;                        % 启用网格线
grid minor;                     % 启用次要网格线
% 设置图表充满figure
set(gca, 'Position', [0.035, 0.05, 0.95, 0.9]); % 使Axes充满figure窗口(left, bottom, width, height)D_legend.ItemHitFcn = @toggleVisibility;%*************************************  函数置于程序最后 ***********************************************
% 回调函数,用于显示和隐藏折线
function toggleVisibility(~, event)h_line = event.Peer;% 切换折线的可见性if strcmp(h_line.Visible, 'on')h_line.Visible = 'off';elseh_line.Visible = 'on';end
end

三、效果

注意:点击图例,图表中对应折线可显示与隐藏,二维、三维缩放图表箭头由当前帧指向下一帧。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/25109.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对Java中二维数组的深层认识

首先,在JAVA中,二维数组是一种数组的数组。它可以看作是一个矩阵,通常是由于表示二维数据节后,如表格和网格。 1.声明和初始化二维数组 声明 int[][] arr;初始化 int[][] arrnew int[3][4];或者用花括号嵌套 int[][] arr{{1,…

Python一些小操作

矢量图 from matplotlib_inline import backend_inline backend_inline.set_matplotlib_formats(svg)matplotlib中文问题 import matplotlib.pyplot as plt plt.rcParams["font.sans-serif"]["SimHei"] #设置字体 plt.rcParams["axes.unicode_minus…

【LeetCode:312. 戳气球+ 动态规划】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

ChromaDB初探

探索ChromaDB 在当今数据驱动的世界中,随着人工智能和机器学习的广泛应用,如何高效地存储、检索和操作大量向量数据成为了一个关键问题。ChromaDB作为一种强大的向量数据库,正在为解决这一问题提供全新的解决方案。在这篇博客中,…

【机器学习基础】Python编程10:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机…

代码随想录——修建二叉搜素树(Leetcode669)

题目链接 递归 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right) {* …

八爪鱼现金流-019-个人对接支付,个人网站支付解决方案

背景: 随着用户量不断增加,服务器成本越来越大。想着实现会员制回点服务器成本。 业务场景分析: 用户在站点上付款 -----> 我监听到付款金额 -----> 给用户开通会员 调研: 支付宝和微信官方支付接口:基本都需…

hustoj二开

目录 1、路径问题2、开发问题&#xff08;1&#xff09;、mysql&#xff08;2&#xff09;、php 啊啊啊啊&#xff01;&#xff01;&#xff01;难崩&#xff1a; 路径问题搞了好长时间才明白了该项目的路径如何设置的 >_< ,&#xff0c;本文就路径问题&#xff0c;前端页…

k8s之deployments相关操作

k8s之deployments相关操作 介绍 官网是这样说明如下&#xff1a; 一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力。 你负责描述 Deployment 中的目标状态&#xff0c;而 Deployment 控制器&#xff08;Controller&#xff09; 以受控速率更改实际状态&#xf…

操作系统期末复习整理知识点

操作系统的概念&#xff1a;①控制和管理整个计算机系统的硬件和软件资源&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff1b;②提供给用户和其他软件方便的接口和环境&#xff1b;③是计算机中最基本的系统软件 功能和目标&#xff1a; ①操作系统作为系统资源…

【下篇】从 YOLOv1 到 YOLOv8 的 YOLO 物体检测模型历史

YOLO 型号之所以闻名遐迩,主要有两个原因:其速度和准确性令人印象深刻,而且能够快速、可靠地检测图像中的物体。上回我解释了YoloX, 今天从Yolov6开始。 YOLOv6:面向工业应用的单级物体检测框架 美团视觉人工智能事业部(Meituan Vision AI Department)于 2022 年 9 月在…

超详解——python数字和运算_——小白篇

目录 1.的位运算 2. 常用内置函数/模块 math模块&#xff1a; random模块&#xff1a; decimal模块&#xff1a; 3.内置函数&#xff1a; 总结&#xff1a; 1.的位运算 位运算是对整数在内存中的二进制表示进行操作。Python支持以下常见的位运算符&#xff1a; 按位与&…

C++笔记之一个函数多个返回值的方法、std::pair、std::tuple、std::tie的用法

C++笔记之一个函数多个返回值的方法、std::pair、std::tuple、std::tie的用法 —— 2024-06-08 杭州 code review! 文章目录 C++笔记之一个函数多个返回值的方法、std::pair、std::tuple、std::tie的用法一.从一个函数中获取多个返回值的方法1. 使用结构体或类2. 使用`std::t…

【小白专用24.6.8】C#Lambda表达式

Lambda表达式可以采用以下任意一种形式的表达式&#xff1a; 1.表达式Lambda&#xff0c;表达式为其主体&#xff1a; (input-parameters) > expression 1 2.语句Lambda&#xff0c;语句块作为其主体&#xff1a; (input-parameters) > {<sequence-of-statements>…

LSTM卷土重来之Vision-LSTM横空出世!!

在Transformer诞生三年后&#xff0c;谷歌将这一自然语言处理的重要研究扩展到了视觉领域&#xff0c;也就是Vision Transformer。 论文链接&#xff1a;https://arxiv.org/abs/2406.04303 项目链接: https://nx-ai.github.io/vision-lstm/ GPT-4o深夜发布&#xff01;Plus免…

WPF Treeview控件开虚拟化后定位节点

不开虚拟化&#xff0c;可以用下面的方法直接定位 <Window x:Class"WpfApplication2.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"Title"Main…

Linux shell编程基础

Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问 Linux 内核的服务。 Shell 脚本&#x…

pdf压缩文件怎么压缩最小,软件工具压缩清晰

PDF格式的文件&#xff0c;当其体积过于庞大时&#xff0c;确实在上传的过程中显得尤为不便。今天给大家分享一个压缩pdf的简单的方法&#xff0c;让大家可以轻松的压缩pdf。 浏览器打开 "轻云处理pdf官网" &#xff0c;上传pdf文件&#xff0c;文件上传完成后网站会…

Mysql使用中的性能优化——索引对插入操作的性能影响

当我们往表中插入数据时&#xff0c;如果表中有索引&#xff0c;则会给插入操作增加更多的工作量。带来的好处是可以提升查询效率。但是这种优劣该如何权衡&#xff0c;则需要通过数据对比来提供佐证。本文我们将对比没有索引、有一个普通索引、有一个唯一索引的性能差距。 结…