【基于Matlab的NMEA数据-GPS采集与可视化】保姆级教程 | NMEA数据集自定义制作 | NMEA数据解析 | NMEA-GPS数据可视化 | 全过程图文by.Akaxi

目录

一、【NMEA数据集制作】

二、【NMEA数据解析】

2.1 GPGGA(全球定位数据)

2.2 GPGSA(卫星PRN数据)

2.3 GPRMC(运输定位数据)

三、【NMEA-GPS数据可视化】


最终效果:

------------------------全文4035字16图一步一步完成大约耗时0.5h------------------------

所需软件以及环境:

Matlab R2022a电脑版(用于可视化NMEA-GPS数据)

代码文档已开源在我的Gitee仓库:智能车辆定位与导航技术: 《智能车辆定位与导航技术》课程学习仓库 (gitee.com)

一、【NMEA数据集制作】

打开NMEA数据集制作网站,nmeagen网站:NMEA Generator

右上角可以选择卫星地图Satellite,然后鼠标滚轮将地图滑到合适大小,定位至亚洲中国,选择你想要生成GPS数据的地方。

使用街道地图,定位至具体位置,这里我将使用渝北仙桃数据谷的位置

然后我们即将制作GPS数据

点击左上角的Add Point添加GPS点,这里绕公路外圈选择17个GPS点,如上图

完成后,点击左下角的Generate NMEA file生成NMEA格式的GPS数据啦~然后下载至笔记本文件夹。

二、【NMEA数据解析】

打开output.nmea文件可以看到有17 * 3条数据,也就是我们之前的制作的17个GPS数据点~

每个点有3条格式GPS数据,分别是GPGGA(全球定位数据)、GPGSA(卫星PRN数据)、GPRMC(运输定位数据),接下来我们对这三种格式的GPS数据进行解析,选择我们的第一个GPS点进行对照说明~

2.1 GPGGA(全球定位数据)

这里GPGGA数据的时间、维度、经度最重要啦

2.2 GPGSA(卫星PRN数据)

这个数据对于可视化好像不太重要

2.3 GPRMC(运输定位数据)

这里GPRMC(运输定位数据)的时间、维度、经度、地表速度较为重要,之后我们用Matlab对此数据进行处理啦~

三、【NMEA-GPS数据可视化】

由上文的NMEA数据集三种格式GPGGA(全球定位数据)、GPGSA(卫星PRN数据)、GPRMC(运输定位数据)解析可知,我们需要可视化的数据有:维度、经度、速度,故这里采用对GPRMC(运输定位数据)进行处理并可视化

(当然你对其他两种格式的数据处理也是一样的,只需要微改一下可视化代码即可)

使用Matlab可视化代码如下:

clc; clear % 清空变量

% 初始化空表格变量
latitude_table = table();
longitude_table = table();
speed_table = table();

% 读取 NMEA 数据文件
fid = fopen('output_txt_nmea.txt', 'r');
nmea_data = textscan(fid, '%s', 'Delimiter', '\n');
fclose(fid);

% 提取每行数据并解析
for i = 1:length(nmea_data{1})
    % 提取一行数据
    sentence = nmea_data{1}{i};
    
    % 使用逗号分割数据
    parts = strsplit(sentence, ',');
    
    % 提取感兴趣的数据
    if strcmp(parts{1}, '$GPRMC')
        % GGA 数据解析示例
        latitude = parts{4};  % 纬度
        longitude = parts{6}; % 经度
        speed = parts{8};     % 速度

        % 将纬度和经度数据缩小100
        latitude = num2str(str2double(latitude) / 100);
        longitude = num2str(str2double(longitude) / 100);

        % 将纬度数据添加到表格变量中
        new_row_lat = table({latitude}, 'VariableNames', {'Latitude'});
        new_row_lon = table({longitude}, 'VariableNames', {'Longitude'});
        new_row_speed = table({speed}, 'VariableNames', {'Speed'});
        latitude_table = [latitude_table; new_row_lat];
        longitude_table = [longitude_table; new_row_lon];
        speed_table = [speed_table; new_row_speed];
    end
end

% 将单元格数组转换为数值数组
lat = str2double(table2cell(latitude_table));
lon = str2double(table2cell(longitude_table));
speed = str2double(table2cell(speed_table));

% 对速度值分bin以便使用离散数量的颜色来表示观测到的速度
nBins = 10;
binSpacing = (max(speed) - min(speed))/nBins; 
binRanges = min(speed):binSpacing:max(speed)-binSpacing; 
binRanges(end+1) = inf;
 
% 速度
[~, speedBins] = histc(speed, binRanges);

% 经纬度、速度转置
lat = lat';
lon = lon';
speedBins = speedBins';
 
% 创建地理形状向量,该向量将线段存储为要素
s = geoshape();
% 为每个速度 bin 创建一个不连续线段。将为每个线段分配一种颜色
% 处理每一个小段的速度函数
for k = 1:nBins
 
    latValid = nan(1, length(lat));
    latValid(speedBins==k) = lat(speedBins==k);
    
    lonValid = nan(1, length(lon));
    lonValid(speedBins==k) = lon(speedBins==k);    
    transitions = [diff(speedBins) 0];
    insertionInd = find(speedBins==k & transitions~=0) + 1;
    latSeg = zeros(1, length(latValid) + length(insertionInd));
    latSeg(insertionInd + (0:length(insertionInd)-1)) = lat(insertionInd);
    latSeg(~latSeg) = latValid;
    
    lonSeg = zeros(1, length(lonValid) + length(insertionInd));
    lonSeg(insertionInd + (0:length(insertionInd)-1)) = lon(insertionInd);
    lonSeg(~lonSeg) = lonValid;
 
    % 将纬度/纬度线段添加到地理形状矢量中
    s(k) = geoshape(latSeg, lonSeg);
    
end
% 使用 webmap 在浏览器中打开一个 Web 地图
wm = webmap('World Imagery'); % 世界地图
% 标记 位置
mwLat = 29.7430;  % 内外圈GPS维度
mwLon = 106.5516; % 内外圈GPS经度
name = 'Nei_my_GPS'; % 取名叫仙桃内圈GPS文件
iconDir = fullfile(matlabroot,'toolbox','matlab','icons');
iconFilename = fullfile(iconDir, 'matlabicon.gif'); % 水印图标
wmmarker(mwLat, mwLon, 'FeatureName', name, 'Icon', iconFilename);
% 使用 autumn 颜色图生成与速度 bin 对应的颜色列表。这将为每个 bin 创建一个具有 RGB 值的 [nBins x 3] 矩阵
colors = autumn(nBins);
wmline(s, 'Color', colors, 'Width', 5);
% 放大地图并聚焦于路线
wmzoom(17);

点击运行有:

可以看到NMEA数据GPS定位的轨迹轮廓形状较为正确,但是定位位置不符合实际

在使用nmeagen网站制作GPS数据集的17个点的位置(图中)与实际GPS位置(左下角)偏差较大,我们打开采用Matlab mobile跑出来的实际数据和网站制作的数据对比:

--------------------------------------------------------------------

之前骑小电驴跑的GPS数据,并可视化,请参考我的上一篇博客:【基于Matlab mobile的GPS数据采集与可视化】保姆级教程 | Matlab mobile准备 | GPS数据集制作 | GPS数据可视化 | 全过程图文by.Akaxi-优快云博客

--------------------------------------------------------------------

可以看到前面我们用小电驴跑的数据和网站仿真出来的数据有差距,说明nmeagen网站仿真出来的数据存在偏差,不准确猜测是:nmeagen网站拿不到各个国家地区的确切GPS数据,关乎国家安全之类的数据,太确切反而不对。

但是使用nmeagen网站仿真出来的GPS数据,经过我们的Matlab解析,可视化后轨迹轮廓一致,说明还是成功的!撒花~~~

----------------------------------------------------------------------------------------------------

相信读到这里的朋友,一定是坚持且优秀的

给博主一个免费的赞👍吧

扫描二维码进博主交流群,问题交流 | 吹吹水 | 一起变得更加优秀

2024.5.6

渝北仙桃数据谷

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Akaxi-1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值