1. NMEA数据采集与自定义制作第一次接触GPS数据采集时我也被各种专业术语搞得一头雾水。直到发现NMEA Generator这个神器才真正体会到DIY GPS数据的乐趣。这个在线工具就像乐高积木能让我们自由搭建想要的轨迹数据。实际操作比想象中简单得多。打开nmeagen网站首先会看到全球卫星地图界面。我习惯先点击右上角的Satellite按钮切换为卫星视图这样定位更直观。记得去年做无人机项目时需要模拟重庆洪崖洞附近的飞行轨迹就是通过鼠标滚轮放大到中国区域再精确定位到长江与嘉陵江交汇处。添加轨迹点才是最有意思的部分。点击Add Point后我通常沿着道路轮廓连续点击。比如模拟车辆行驶就按实际道路走向点击做徒步轨迹则故意制造些曲折。上次给学生演示时特意在解放碑周边画了个爱心轨迹导出数据后把学生都逗乐了。提示每个轨迹点会自动生成3条NMEA格式数据包括GPGGA、GPGSA和GPRMC三种报文类型生成数据时有个实用技巧先规划好轨迹形状再密集布点。我测试过17个点能形成清晰轨迹50个点则更适合复杂路径。点击Generate NMEA file后记得检查文件大小正常情况每点约占150字节如果文件异常小可能是生成失败。2. NMEA数据深度解析拿到output.nmea文件后用记事本打开会看到密密麻麻的代码。别被吓到这些看似混乱的字符串其实暗藏规律。每条数据都以$开头像$GPGGA、$GPRMC就是不同数据类型的标识。2.1 GPGGA报文精解GPGGA是核心定位数据我把它比作GPS的身份证。以$GPGGA,085120.307,2937.4536,N,10633.0865,E,1,07,1.3,276.1,M,-33.5,M,,*6B为例085120.307表示UTC时间8点51分20.307秒2937.4536,N是北纬29度37.4536分需除以60换算为十进制10633.0865,E是东经106度33.0865分1代表定位质量有效2.2 GPRMC报文实战GPRMC数据就像行车记录仪包含运动状态信息。解析这段$GPRMC,085120.307,A,2937.4536,N,10633.0865,E,0.00,153.15,060724,,,A*7A时要注意A表示数据有效V为无效0.00是时速节153.15是航向角060724是日期2024年7月6日最后的A表示自主定位模式2.3 数据校验技巧每个报文末尾都有*校验码。有次项目中出现轨迹漂移后来发现是校验位错误导致的数据异常。建议解析前先用这个公式验证function isValid verifyChecksum(nmeaStr) starPos strfind(nmeaStr,*); if isempty(starPos), isValidfalse; return; end checksum 0; for i 2:(starPos-1) checksum bitxor(checksum, double(nmeaStr(i))); end isValid strcmpi(dec2hex(checksum), nmeaStr(starPos1:end)); end3. Matlab数据可视化实战有了清洗好的数据就该Matlab大显身手了。我总结了三步可视化法保证让你的GPS轨迹会说话。3.1 数据预处理首先要把文本数据转为Matlab能处理的数值。这段代码我用了五年从R2018到R2024都兼容data fileread(output.nmea); lines splitlines(data); lat []; lon []; speed []; for i 1:length(lines) if contains(lines{i},$GPRMC) parts strsplit(lines{i},,); lat [lat; dms2degrees([str2double(parts{4}(1:2)) str2double(parts{4}(3:end)) 0])]; lon [lon; dms2degrees([str2double(parts{6}(1:3)) str2double(parts{6}(4:end)) 0])]; speed [speed; str2double(parts{8})*1.852]; % 节转km/h end end3.2 基础可视化最简单的plot就能画出轨迹轮廓figure geoplot(lat, lon, -o,LineWidth,2,MarkerSize,4) geobasemap(streets) title(重庆洪崖洞周边轨迹)但这样显示不出速度变化于是我开发了速度热力图模式speedNorm (speed-min(speed))/(max(speed)-min(speed)); colors [speedNorm zeros(size(speedNorm)) 1-speedNorm]; geoscatter(lat,lon,30,colors,filled)3.3 高级交互可视化用webmap创建可缩放的地图wm webmap(OpenStreetMap); route geoshape(lat,lon); wml wmline(route,Color,red,Width,3); wmzoom(wm,15) % 15级缩放添加自定义标记点时有个小技巧用企业微信图标替换默认图钉视觉效果更专业iconURL https://example.com/custom.png; wmmarker(mean(lat),mean(lon),Icon,iconURL,FeatureName,中心点);4. 常见问题解决方案在重庆某次实地测试中我遇到了轨迹漂移问题。后来发现是NMEA数据的时间戳不连续导致的。分享几个实战中积累的解决方案4.1 数据纠偏技巧当发现生成的轨迹与真实位置偏移时可以添加修正系数% 中国区域常用的GCJ-02修正参数 lat_corr lat 0.0036*randn(size(lat)); lon_corr lon 0.0045*randn(size(lon));4.2 异常值处理速度突变是常见问题。这段代码能平滑异常速度值for i 2:length(speed)-1 if abs(speed(i)-mean(speed(i-1:i1))) 20 % 阈值20km/h speed(i) mean(speed([i-1 i1])); end end4.3 性能优化处理大规模数据时超过10万点建议改用timetablett timetable(seconds(0:length(lat)-1),lat,lon,speed,... VariableNames,{Latitude,Longitude,Speed}); tt retime(tt,regular,linear,TimeStep,seconds(1));记得第一次给学生演示时有个轨迹点漂到了嘉陵江里学生们都笑称这是轻功水上漂。其实只是忘了设置坐标系转换参数。现在我的代码库里永远留着这段黑历史代码提醒自己细节决定成败。
【基于Matlab的NMEA数据-GPS采集与可视化】保姆级教程 | NMEA数据集自定义制作 | NMEA数据解析 | NMEA-GPS数据可视化 | 全过程图文by.Akaxi
1. NMEA数据采集与自定义制作第一次接触GPS数据采集时我也被各种专业术语搞得一头雾水。直到发现NMEA Generator这个神器才真正体会到DIY GPS数据的乐趣。这个在线工具就像乐高积木能让我们自由搭建想要的轨迹数据。实际操作比想象中简单得多。打开nmeagen网站首先会看到全球卫星地图界面。我习惯先点击右上角的Satellite按钮切换为卫星视图这样定位更直观。记得去年做无人机项目时需要模拟重庆洪崖洞附近的飞行轨迹就是通过鼠标滚轮放大到中国区域再精确定位到长江与嘉陵江交汇处。添加轨迹点才是最有意思的部分。点击Add Point后我通常沿着道路轮廓连续点击。比如模拟车辆行驶就按实际道路走向点击做徒步轨迹则故意制造些曲折。上次给学生演示时特意在解放碑周边画了个爱心轨迹导出数据后把学生都逗乐了。提示每个轨迹点会自动生成3条NMEA格式数据包括GPGGA、GPGSA和GPRMC三种报文类型生成数据时有个实用技巧先规划好轨迹形状再密集布点。我测试过17个点能形成清晰轨迹50个点则更适合复杂路径。点击Generate NMEA file后记得检查文件大小正常情况每点约占150字节如果文件异常小可能是生成失败。2. NMEA数据深度解析拿到output.nmea文件后用记事本打开会看到密密麻麻的代码。别被吓到这些看似混乱的字符串其实暗藏规律。每条数据都以$开头像$GPGGA、$GPRMC就是不同数据类型的标识。2.1 GPGGA报文精解GPGGA是核心定位数据我把它比作GPS的身份证。以$GPGGA,085120.307,2937.4536,N,10633.0865,E,1,07,1.3,276.1,M,-33.5,M,,*6B为例085120.307表示UTC时间8点51分20.307秒2937.4536,N是北纬29度37.4536分需除以60换算为十进制10633.0865,E是东经106度33.0865分1代表定位质量有效2.2 GPRMC报文实战GPRMC数据就像行车记录仪包含运动状态信息。解析这段$GPRMC,085120.307,A,2937.4536,N,10633.0865,E,0.00,153.15,060724,,,A*7A时要注意A表示数据有效V为无效0.00是时速节153.15是航向角060724是日期2024年7月6日最后的A表示自主定位模式2.3 数据校验技巧每个报文末尾都有*校验码。有次项目中出现轨迹漂移后来发现是校验位错误导致的数据异常。建议解析前先用这个公式验证function isValid verifyChecksum(nmeaStr) starPos strfind(nmeaStr,*); if isempty(starPos), isValidfalse; return; end checksum 0; for i 2:(starPos-1) checksum bitxor(checksum, double(nmeaStr(i))); end isValid strcmpi(dec2hex(checksum), nmeaStr(starPos1:end)); end3. Matlab数据可视化实战有了清洗好的数据就该Matlab大显身手了。我总结了三步可视化法保证让你的GPS轨迹会说话。3.1 数据预处理首先要把文本数据转为Matlab能处理的数值。这段代码我用了五年从R2018到R2024都兼容data fileread(output.nmea); lines splitlines(data); lat []; lon []; speed []; for i 1:length(lines) if contains(lines{i},$GPRMC) parts strsplit(lines{i},,); lat [lat; dms2degrees([str2double(parts{4}(1:2)) str2double(parts{4}(3:end)) 0])]; lon [lon; dms2degrees([str2double(parts{6}(1:3)) str2double(parts{6}(4:end)) 0])]; speed [speed; str2double(parts{8})*1.852]; % 节转km/h end end3.2 基础可视化最简单的plot就能画出轨迹轮廓figure geoplot(lat, lon, -o,LineWidth,2,MarkerSize,4) geobasemap(streets) title(重庆洪崖洞周边轨迹)但这样显示不出速度变化于是我开发了速度热力图模式speedNorm (speed-min(speed))/(max(speed)-min(speed)); colors [speedNorm zeros(size(speedNorm)) 1-speedNorm]; geoscatter(lat,lon,30,colors,filled)3.3 高级交互可视化用webmap创建可缩放的地图wm webmap(OpenStreetMap); route geoshape(lat,lon); wml wmline(route,Color,red,Width,3); wmzoom(wm,15) % 15级缩放添加自定义标记点时有个小技巧用企业微信图标替换默认图钉视觉效果更专业iconURL https://example.com/custom.png; wmmarker(mean(lat),mean(lon),Icon,iconURL,FeatureName,中心点);4. 常见问题解决方案在重庆某次实地测试中我遇到了轨迹漂移问题。后来发现是NMEA数据的时间戳不连续导致的。分享几个实战中积累的解决方案4.1 数据纠偏技巧当发现生成的轨迹与真实位置偏移时可以添加修正系数% 中国区域常用的GCJ-02修正参数 lat_corr lat 0.0036*randn(size(lat)); lon_corr lon 0.0045*randn(size(lon));4.2 异常值处理速度突变是常见问题。这段代码能平滑异常速度值for i 2:length(speed)-1 if abs(speed(i)-mean(speed(i-1:i1))) 20 % 阈值20km/h speed(i) mean(speed([i-1 i1])); end end4.3 性能优化处理大规模数据时超过10万点建议改用timetablett timetable(seconds(0:length(lat)-1),lat,lon,speed,... VariableNames,{Latitude,Longitude,Speed}); tt retime(tt,regular,linear,TimeStep,seconds(1));记得第一次给学生演示时有个轨迹点漂到了嘉陵江里学生们都笑称这是轻功水上漂。其实只是忘了设置坐标系转换参数。现在我的代码库里永远留着这段黑历史代码提醒自己细节决定成败。