【基于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-CSDN博客

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

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

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

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

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

给博主一个免费的赞👍吧

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

2024.5.6

渝北仙桃数据谷

### 回答1: STM32F103版本可以通过串口接收GPS模块发送的NMEA协议数据,然后进行解析NMEA协议是一种常用的GPS数据格式,包含了位置、速度、时间等信息。解析NMEA协议数据需要先将数据按照逗号分隔,然后根据协议规定的字段解析出相应的数据。例如,$GPRMC协议中包含了UTC时间、经度、纬度、速度等信息,可以通过解析该协议来获取这些数据解析完成后,可以将数据存储到内存中或者通过其他方式进行处理和显示。 ### 回答2: 在使用STM32F103版本GPS解析NMEA协议数据时,需要先了解NMEA协议的结构。NMEA协议是用于GPS定位的标准协议,它的结构包含了数据类型标识符、数据字段和校验码。其中数据字段包括时间、日期、经度、纬度、海拔高度等信息,而校验码是用于校验数据的完整性和准确性。在解析NMEA协议数据时,首先需要对接收到的数据进行分析和提取,进而将数据转化为可表示的数据类型,如结构体或数组。 基于STM32F103版本进行GPS解析时,可以使用串口通信进行数据传输。可以通过串口中断程序获取数据,并在中断处理函数中对数据进行分析和处理。在程序的实现过程中,可以先设置一个缓存区用于存储串口中断处理函数接收到的数据,当接收到的数据中包含了完整的NMEA协议数据后,再进行解析和提取。 对于NMEA协议中的数据字段,需要对每个字段进行解析提取,例如通过解析语句$GPRMC中的时间和位置信息,可以得到当前时间和地理位置,而解析语句$GPGGA,可以得到卫星数量、海拔高度、信噪比等信息。另外,在获取到NMEA协议数据后,还需要对数据进行校验,以确保数据的正确性。校验可以通过校验码计算来实现,常用的校验方式是异或校验法,即将数据中所有字节进行异或运算得到一个校验码。 在实现GPS解析时,还需要考虑到系统对处理能力的要求。由于NMEA协议数据频繁更新,对系统的处理能力有一定的要求,因此可以通过优化代码逻辑结构,减小耗时的操作,提升系统性能。同时,还需要注意程序的健壮性,对异常情况进行防范和处理,以保证程序的稳定性和可靠性。 综上所述,STM32F103版本的GPS解析NMEA协议数据,需要先对协议结构进行了解,然后通过串口通信进行数据传输,并使用串口中断程序进行数据处理,在实现过程中,需要考虑到系统的处理能力和程序的健壮性。 ### 回答3: STM32F103系列是一款高性能、低功耗、32位Cortex-M3内核处理器的微控制器,广泛应用于各种嵌入式系统设计。随着GPS技术的广泛应用,STM32F103版本的GPS解析NMEA协议数据变得越来越重要,下面我将详细介绍STM32F103版本GPS解析NMEA协议数据的方法。 NMEA协议是一种用于GPS接收器和计算机之间的信息交换协议,它定义了一系列用于传输GPS数据数据格式和协议。NMEA协议的数据格式通常为ASCII码格式,不同的数据字段通过逗号分隔。 STM32F103版本的GPS解析NMEA协议数据需要完成以下几个步骤: 1.配置串口 GPS模块一般通过串口与MCU进行通信,因此需要首先配置STM32F103的串口,使其能够接收GPS模块发送的数据。 2.接收数据 在串口配置完成后,MCU需要不断接收GPS模块发送的数据,可以通过中断方式或轮询方式进行。 3.解析数据 MCU接收到GPS模块发送的NMEA协议数据后,需要解析出其中需要的数据字段。例如,获取GPS模块发送的经纬度信息,可以从数据解析出GPRMC数据的经度和纬度字段。 4.处理数据 解析出需要的数据后,还需要进行一些数据处理,例如将经纬度数据转换为十进制表示,计算定位的海拔高度等。 5.输出数据 最后,MCU需要将处理后的数据输出到显示器、SD卡或其他设备中,以便用户实时查看或后续处理。 总之,STM32F103版本GPS解析NMEA协议数据需要进行串口配置、数据接收、数据解析数据处理和数据输出等多个步骤,需要仔细调试和测试,才能确保正确解析和输出GPS数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Akaxi-1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值