【Tool】Matlab 数据分析可视化

news2025/3/12 11:22:17

一、问题描述

近期围绕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;
        else
            disp(['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";
    
    otherwise
        disp("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]; % 最后一帧差值设为0

roll_diff = diff(y_roll); 
roll_diff = mod(roll_diff + pi, 2*pi) - pi; % 将角度差限制在 -π 到 π 之间
roll_diff = [roll_diff; 0]; % 最后一帧差值设为0

pitch_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';
    else
        h_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;
        else
            disp(['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";
    
    otherwise
        disp("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]; % 最后一帧差值设为0

y_diff = diff(p_y); 
y_diff = [y_diff; 0]; % 最后一帧差值设为0

z_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';
    else
        h_line.Visible = 'on';
    end
end

三、效果

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

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

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

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

相关文章

引入Springcloud--Sleuth-链路追踪中MDC是如何获取到traceid和何时放入traceid的

在分布式项目中需要引入 spring-cloud-starter-sleuth框架来记录跟踪请求在不同服务之前流转的路径。在整个流转路径通过traceid将所有的路径给串联起来。 项目中需要保存traceid来实现日志快速搜索和定位,可以通过MDC.get("traceId")获取到traceId。 …

统计信号处理基础 习题解答10-9

题目 某质检员的工作是监控制造出来的电阻阻值。为此他从一批电阻中选取一个并用一个欧姆表来测量它。他知道欧姆表质量较差,它给测量带来了误差,这个误差可以看成是一个的随机变量。为此,质检员取N个独立的测量。另外,他知道阻值…

gRPC(狂神说)

gRPC(狂神说) 视频地址:【狂神说】gRPC最新超详细版教程通俗易懂 | Go语言全栈教程_哔哩哔哩_bilibili 1、gRPC介绍 单体架构 一旦某个服务宕机,会引起整个应用不可用,隔离性差只能整体应用进行伸缩,浪…

基于小波多分辨分析的一维时间序列信号趋势检测与去除(MATLAB R2018a)

小波最开始是数学上提出的概念,并且在纯数学的王国里存在了一个世纪之久。最开始是为了弥补傅里叶分析的缺陷,即傅里叶级数发散的问题,并寻找出能够代替傅里叶分析的方法。从最早的一些艰难的探索开始直到慢慢发展成为一套完整系统的小波分析…

Flutter Image源码分析

本文用于记录分析Imge图片加载流程源码分析学习笔记 切入点是Image.network,加载网络图片 构造方法会创建NetworkImage,加载图片的实现类,父类是ImageProvider 加载本地图片等等都是类似 下面进入_ImageState类 void resolveStreamForKey(ImageConfiguration configurat…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第37课-自动切换纹理

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第37课-自动切换纹理 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎&…

【iOS】JSONModel源码阅读笔记

文章目录 前言一、JSONModel使用二、JSONModel其他方法转换属性名称 三、源码分析- (instancetype)initWithDictionary:(NSDictionary*)dict error:(NSError **)err[self init]__setup____inspectProperties - (BOOL)__doesDictionary:(NSDictionary*)dict matchModelWithKeyMa…

Day25 首页待办事项及备忘录添加功能

​ 本章节,完成首页待办事项及备忘录添加功能 一.修改待办事项和备忘录逻辑处理类,即AddMemoViewModel和AddTodoViewModel 在 AddMemoViewModel逻辑处理类中,为了支持与其关联的View视图文件的数据绑定,需要定义一个与视图文件相匹配的实体类 Model。这个Model将包含 View中…

Java开发-面试题-0005-==和String的equals()和String的intern()方法的区别

Java开发-面试题-0005-和String的equals()和String的intern()方法的区别 更多内容欢迎关注我(持续更新中,欢迎Star✨) Github:CodeZeng1998/Java-Developer-Work-Note 技术公众号:CodeZeng1998(纯纯技术…

算法:101. 对称二叉树

对称二叉树 给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false提示: 树中节…

蓝桥杯--跑步计划

问题描述 小蓝计划在某天的日期中出现 11 时跑 55 千米,否则只跑 11 千米。注意日期中出现 11 不仅指年月日也指星期。 请问按照小蓝的计划,20232023 年小蓝总共会跑步锻炼多少千米?例如,55 月 11 日、11 月 1313 日、1111 月 55 日、44 月…

Dubbo 3.x源码(20)—Dubbo服务引用源码(3)

基于Dubbo 3.1,详细介绍了Dubbo服务的发布与引用的源码。 此前我们学习了调用createProxy方法,根据服务引用参数map创建服务接口代理引用对象的整体流程,我们知道会调用createInvokerForRemote方法创建远程引用Invoker,这是Dubbo …

开启数字化校园解决方案,实现教育智能化

现代社会的教育面临诸多挑战,如何提高教育质量,实现教育智能化成为了当务之急。数字化校园解决方案应运而生,为学校提供了全新的教学模式和管理方式。本文将介绍数字化校园解决方案的重要性,以及如何开启数字化校园,实…

客户案例|Zilliz Cloud 助力点石科技转型 AI 智能服务商

福建点石科技网络科技有限公司成立于2010年,是国家高新技术企业,阿里云、蚂蚁金服等大厂海内外生态合作伙伴ISV。在餐饮、零售、酒店、旅游、商圈的行业定制化服务化上有深厚积累,在境内外做了大量标杆性软件项目,如东南亚RWS圣淘…

《python程序语言设计》2018版第5章第46题均值和标准方差-上部(我又一次被作者的出题击倒)

第N次被作者打倒了&#xff0c;第5章46题解题上集的记录 计算均值的代码段 step_num 0num_c 0 pow_c 0 while step_num < 10:a eval(input("Enter number is: "))num_c apow_c pow(a, 2)step_num 1 t2 num_c / 10这个结果和书里的答案差一点。书里写的是…

容器中运行ping提示bash: ping: command not found【笔记】

容器中运行ping提示bash: ping: command not found 原因是容器中没有安装ping命令 在容器中安装ping命令&#xff0c;可以使用以下命令&#xff1a; 对于基于Debian/Ubuntu的容器&#xff0c;使用以下命令&#xff1a; apt-get update apt-get install -y iputils-ping对于基…

Docker run 命令常用参数详解

Docker run 命令提供了丰富的参数选项&#xff0c;用于配置容器的各种设置。以下是docker run命令的主要参数详解&#xff0c; 主要参数详解 后台运行与前台交互 -d, --detach: 在后台运行容器&#xff0c;并返回容器ID。-it: 分配一个伪终端&#xff08;pseudo-TTY&#xff0…

如何做好电子内窥镜的网络安全管理?

电子内窥镜作为一种常用的医疗器械&#xff0c;其网络安全管理对于保护患者隐私和医疗数据的安全至关重要。以下是一些基本原则和步骤&#xff0c;用于确保电子内窥镜的网络安全&#xff1a; 1. 数据加密 为了防止数据泄露&#xff0c;电子内窥镜在传输患者图像数据时应采取有…

解决!word转pdf时,怎样保持图片不失真

#今天用word写了期末设计报告&#xff0c;里面有很多过程的截图&#xff0c;要打印出来&#xff0c;想到pdf图片不会错位&#xff0c;就转成了pdf&#xff0c;发现图片都成高糊了&#xff0c;找了好多方法&#xff0c;再不下载其他软件和插件的情况下&#xff0c;导出拥有清晰的…

cf 欧几里得距离

说明&#xff1a;欧几里得距离本质就是两点间距离 distancesqrt( sum(ai-bi)2 ) Problem - F - Codeforces 代码