目录
最终效果:
------------------------全文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-CSDN博客
--------------------------------------------------------------------
可以看到前面我们用小电驴跑的数据和网站仿真出来的数据有差距,说明nmeagen网站仿真出来的数据存在偏差,不准确!猜测是:nmeagen网站拿不到各个国家地区的确切GPS数据,关乎国家安全之类的数据,太确切反而不对。
但是使用nmeagen网站仿真出来的GPS数据,经过我们的Matlab解析,可视化后轨迹轮廓一致,说明还是成功的!撒花~~~
----------------------------------------------------------------------------------------------------
相信读到这里的朋友,一定是坚持且优秀的
给博主一个免费的赞👍吧
扫描二维码进博主交流群,问题交流 | 吹吹水 | 一起变得更加优秀
2024.5.6
渝北仙桃数据谷