【GNSS】 MATLAB读取GNSSLogger数据:Fix记录筛选与提取实战【含matlab代码】

📅 2026/7/23 12:41:17
【GNSS】 MATLAB读取GNSSLogger数据:Fix记录筛选与提取实战【含matlab代码】
论文引用信息本文内容基于以下SPIE会议论文Zixia Shang, “Off-line Data Processing Based on GNSSLOGGER, GNSS System Positioning Data Quality and Accuracy Analysis,”Fourth International Conference on Geology, Mapping, and Remote Sensing (ICGMRS 2023), Wuhan, China, 14-16 April 2023.Proceedings of SPIE, Vol. 12978. DOI: 10.1117/12.3019575论文实验数据已上传至GitHubhttps://github.com/ZixiaShang/GNSSLOGGER-Data-8PS懒得找图了直接贴海报了MATLAB读取GNSSLogger数据Fix记录筛选与提取实战一、引言在前两篇文章中我们完成了GNSS数据的采集第一篇和数据质量分析第二篇。现在我们将进入数据处理的核心环节——使用MATLAB读取GNSSLogger生成的日志文件筛选出定位解算结果Fix记录并按定位提供者Provider进行分类提取。在论文第四章B节中作者详细阐述了基于MATLAB的离线数据处理流程。本文将从论文中的zixia4.m代码出发带你一步步实现读取GNSSLogger的.txt日志文件筛选出所有的Fix行按照FLP融合定位、GPS纯GNSS定位、NLP网络定位进行分类提取经纬度、速度等关键字段为后续轨迹绘制做准备二、Android原始GNSS API版本差异与数据字段说明在深入MATLAB代码之前有必要了解不同Android版本对GNSS原始数据输出的影响这直接关系到我们解析到的数据内容。2.1 Android版本与GNSS API演进Android版本API LevelGNSS核心变化对Fix数据的影响Android 7.0API 24首次引入GnssMeasurement和GnssClock支持原始GNSS测量基础Fix数据可用但卫星数量和测量类型有限Android 8.0API 26添加GnssMeasurement.getState()码锁定状态Fix数据的Accuracy字段更可靠Android 9API 28添加GnssMeasurement.getCarrierFrequencyHz()载波频率支持多频段L1/L5区分Fix数据更丰富Android 10API 29必须支持原始GNSS测量添加GnssMeasurement.getAutomaticGainControlLevelDb()固定输出兼容性大幅提升Android 11API 30支持动态数据注入Fix输出更稳定Android 12API 31增强多星座支持添加GnssMeasurement.getElapsedRealtimeNanos()多系统GPS/GLO/GAL/BDSFix数据齐全论文中的设备论文使用的三款设备均运行Android 12API 31因此能够完整接收GPS、GLONASS、Galileo和BeiDou四大系统的Fix数据。2.2 GNSSLogger Fix行的Provider字段含义Fix行中的第2列是Provider它直接对应Android定位框架中的定位提供者Provider全称Android对应API数据来源GPSGNSS Location ProviderLocationManager.GPS_PROVIDER纯GNSS卫星定位NLPNetwork Location ProviderLocationManager.NETWORK_PROVIDER基站三角定位 Wi-Fi定位FLPFused Location ProviderFusedLocationProviderClientGPS NLP 传感器多源融合论文中的关键结论融合系统FLP的稳定性、刚性和精度远优于单一GNSS系统GPS。因此在实际应用中如果没有特殊限制应优先使用FLP数据。三、MATLAB代码详解从原始日志到结构化数据3.1 步骤1读取日志文件并筛选Fix行GNSSLogger的输出文件是混合了多种数据类型的文本文件。我们的第一步是将所有以Fix开头的行筛选出来单独保存到一个新文件中。%% 步骤1筛选Fix行 % 打开原始GNSSLogger日志文件只读模式fidfopen(gnss_log_2023_03_08_19_48_23.txt,r);% 创建一个新文件用于存储筛选出的Fix数据out_fidfopen(fix_data2.txt,w);% 逐行读取tlinefgetl(fid);whileischar(tline)% 当读取到文件末尾时tline变为-1% strncmp比较前3个字符是否为Fix匹配则写入新文件ifstrncmp(tline,Fix,3)1fprintf(out_fid,%s\n,tline);endtlinefgetl(fid);end% 关闭所有文件句柄fclose(fid);fclose(out_fid);disp(Fix行筛选完成结果已保存至 fix_data2.txt);代码解析strncmp(tline, Fix, 3)只比较前3个字符避免误匹配如Fixed等其他词为什么单独写一个新文件——便于后续调试和重复使用避免反复读取大文件如果原始日志文件很大几百MB这个循环可能较慢。优化方案见后文工程化建议3.2 步骤2解析Fix数据的CSV格式Fix行是CSV逗号分隔值格式。我们使用MATLAB的textscan函数进行解析%% 步骤2解析Fix数据 filenamefix_data2.txt;delimiter,;% 分隔符为逗号% 格式说明符14个字段类型依次为 字符串,字符串,浮点数×12formatSpec%s%s%f%f%f%f%f%f%f%f%f%f%f%f;fileIDfopen(filename,r);dataArraytextscan(fileID,formatSpec,Delimiter,delimiter,...EmptyValue,NaN,ReturnOnError,false);fclose(fileID);disp(Fix数据解析完成);Fix行的17个字段说明为什么代码中只读取了14个不同的Android版本和GNSSLogger版本Fix行的列数可能略有不同论文代码读取了前14列包含了最核心的字段列1Fix固定标识列2Provider定位提供者列3Lat纬度列4Lon经度列5Alt高度列6Speed速度m/s列7Accuracy精度米后续列时间戳、方位角等 提示如果你的日志文件列数更多可以扩展formatSpec或在textscan中设置CollectOutput, true灵活处理。3.3 步骤3按Provider分类这是整个数据处理中最关键的步骤。论文中将Fix数据按Provider分为三类%% 步骤3按Provider分类 % dataArray{2} 是第二列即Provider字段FLP_indexstrcmp(dataArray{2},FLP);GPS_indexstrcmp(dataArray{2},GPS);NLP_indexstrcmp(dataArray{2},NLP);% 提取各类数据[纬度, 经度, 高度, 速度, 精度]% 列索引3Lat, 4Lon, 5Alt, 6Speed, 7AccuracyFLP_data[dataArray{3}(FLP_index),dataArray{4}(FLP_index),...dataArray{5}(FLP_index),dataArray{6}(FLP_index),...dataArray{7}(FLP_index)];GPS_data[dataArray{3}(GPS_index),dataArray{4}(GPS_index),...dataArray{5}(GPS_index),dataArray{6}(GPS_index),...dataArray{7}(GPS_index)];NLP_data[dataArray{3}(NLP_index),dataArray{4}(NLP_index),...dataArray{5}(NLP_index),dataArray{6}(NLP_index),...dataArray{7}(NLP_index)];% 显示各Provider的数据点数量fprintf(FLP数据点: %d\n,size(FLP_data,1));fprintf(GPS数据点: %d\n,size(GPS_data,1));fprintf(NLP数据点: %d\n,size(NLP_data,1));3.4 步骤4提取经纬度用于后续绘图从分类数据中提取经纬度并输出基本信息%% 步骤4提取关键字段 % 从FLP数据中提取经纬度和速度lat1FLP_data(:,1);% 纬度lon1FLP_data(:,2);% 经度t1FLP_data(:,3);% 高度可选spd1FLP_data(:,4);% 速度m/s% 从GPS数据中提取lat2GPS_data(:,1);lon2GPS_data(:,2);t2GPS_data(:,3);spd2GPS_data(:,4);% 打印经纬度范围检查数据合理性fprintf(FLP 纬度范围: [%.6f, %.6f]\n,min(lat1),max(lat1));fprintf(FLP 经度范围: [%.6f, %.6f]\n,min(lon1),max(lon1));fprintf(GPS 纬度范围: [%.6f, %.6f]\n,min(lat2),max(lat2));fprintf(GPS 经度范围: [%.6f, %.6f]\n,min(lon2),max(lon2));四、完整MATLAB代码核心部分整合以下是论文中前30行代码的完整整理版本添加了详细注释%% % 文件名read_gnss_fix_data.m% 功能读取GNSSLogger日志筛选Fix行按Provider分类提取经纬度/速度% 参考论文 Off-line Data Processing Based on GNSSLOGGER...% 作者Zixia Shang (UNSW)% 对应论文章节第四章 B节% clear;clc;close all;%% -------------------- 1. 配置输入输出文件 --------------------inputFilegnss_log_2023_03_08_19_48_23.txt;% 原始日志文件outputFilefix_data2.txt;% 筛选后的Fix数据文件%% -------------------- 2. 筛选Fix行 --------------------fidfopen(inputFile,r);out_fidfopen(outputFile,w);tlinefgetl(fid);count0;whileischar(tline)ifstrncmp(tline,Fix,3)1fprintf(out_fid,%s\n,tline);countcount1;endtlinefgetl(fid);endfclose(fid);fclose(out_fid);fprintf(共筛选出 %d 条Fix记录\n,count);%% -------------------- 3. 解析Fix CSV数据 --------------------delimiter,;% 14列Fix, Provider, Lat, Lon, Alt, Speed, Accuracy, ...formatSpec%s%s%f%f%f%f%f%f%f%f%f%f%f%f;fileIDfopen(outputFile,r);dataArraytextscan(fileID,formatSpec,Delimiter,delimiter,...EmptyValue,NaN,ReturnOnError,false);fclose(fileID);%% -------------------- 4. 按Provider分类 --------------------% 逻辑索引idxFLPstrcmp(dataArray{2},FLP);idxGPSstrcmp(dataArray{2},GPS);idxNLPstrcmp(dataArray{2},NLP);% 提取数据[Lat, Lon, Alt, Speed, Accuracy]FLP_data[dataArray{3}(idxFLP),dataArray{4}(idxFLP),...dataArray{5}(idxFLP),dataArray{6}(idxFLP),...dataArray{7}(idxFLP)];GPS_data[dataArray{3}(idxGPS),dataArray{4}(idxGPS),...dataArray{5}(idxGPS),dataArray{6}(idxGPS),...dataArray{7}(idxGPS)];NLP_data[dataArray{3}(idxNLP),dataArray{4}(idxNLP),...dataArray{5}(idxNLP),dataArray{6}(idxNLP),...dataArray{7}(idxNLP)];%% -------------------- 5. 统计与输出 --------------------fprintf(*50);fprintf(数据统计结果\n);fprintf(FLP: %d 个点\n,size(FLP_data,1));fprintf(GPS: %d 个点\n,size(GPS_data,1));fprintf(NLP: %d 个点\n,size(NLP_data,1));% 保存为MAT文件便于后续处理第四篇博客会用到save(gnss_parsed_data.mat,FLP_data,GPS_data,NLP_data);disp(数据已保存至 gnss_parsed_data.mat);代码运行结果示例 read_gnss_fix_data 共筛选出 98778 条Fix记录 数据统计结果 FLP: 11236 个点 GPS: 85342 个点 NLP: 2200 个点 数据已保存至 gnss_parsed_data.mat五、调试与数据验证5.1 检查数据合理性在得到分类数据后建议进行快速验证%% 快速检查绘制经纬度散点图figure;subplot(1,2,1);plot(FLP_data(:,2),FLP_data(:,1),r.,MarkerSize,2);hold on;plot(GPS_data(:,2),GPS_data(:,1),b.,MarkerSize,2);legend(FLP,GPS);xlabel(经度);ylabel(纬度);title(FLP vs GPS 轨迹对比);grid on;axis equal;subplot(1,2,2);plot(NLP_data(:,2),NLP_data(:,1),g.,MarkerSize,4);xlabel(经度);ylabel(纬度);title(NLP 轨迹Wi-Fi/基站定位);grid on;axis equal;5.2 检查速度数据速度数据可以帮助判断定位点的运动状态%% 检查速度分布figure;histogram(GPS_data(:,4),50,FaceColor,b,EdgeAlpha,0.3);hold on;histogram(FLP_data(:,4),50,FaceColor,r,EdgeAlpha,0.3);xlabel(速度 (m/s));ylabel(频次);legend(GPS,FLP);title(速度分布对比);% 检查是否有异常值如负速度或极大速度fprintf(GPS速度范围: [%.2f, %.2f] m/s\n,min(GPS_data(:,4)),max(GPS_data(:,4)));fprintf(FLP速度范围: [%.2f, %.2f] m/s\n,min(FLP_data(:,4)),max(FLP_data(:,4)));六、不同平台Windows/macOS/Linux下的注意事项平台文件路径写法示例注意事项WindowsC:\Users\name\data\gnss_log.txt必须使用反斜杠\或使用双反斜杠\\转义macOS/Users/name/data/gnss_log.txt使用正斜杠/注意区分大小写Linux/home/name/data/gnss_log.txt使用正斜杠/注意文件权限跨平台兼容写法推荐% 使用 fullfile 自动适配路径分隔符dataDirfullfile(C:,Users,name,data);% Windows% dataDir fullfile(/home, name, data); % Linux/macOSinputFilefullfile(dataDir,gnss_log_2023_03_08_19_48_23.txt);macOS/Linux用户注意MATLAB在Unix系统下对文件权限敏感确保日志文件具有读取权限chmod r gnss_log.txt。七、工程化建议与性能优化7.1 函数封装将核心逻辑封装为可复用的函数function[FLP,GPS,NLP]parseGNSSFixData(inputFile,outputFile)% parseGNSSFixData 解析GNSSLogger的Fix数据% 输入inputFile - 原始日志文件路径% outputFile - (可选) 临时文件输出路径% 输出FLP - 融合定位数据 [Lat, Lon, Alt, Speed, Accuracy]% GPS - GNSS定位数据% NLP - 网络定位数据ifnargin2outputFilefix_data_temp.txt;end% ... 核心代码见上文...end7.2 大文件处理优化当日志文件超过100MB时逐行读取可能较慢。优化方案% 方案1使用 memmapfile 或 readlines (MATLAB R2020b)linesreadlines(inputFile);fixLineslines(startsWith(lines,Fix));% 方案2使用 grep 外部命令Linux/macOS% system(grep ^Fix gnss_log.txt fix_data2.txt);7.3 数据格式容错不同Android版本输出的Fix行列数可能不同% 自动检测列数firstFixLinefixLines(1);numColsnumel(strsplit(firstFixLine,,));ifnumCols14formatSpecrepmat(%f,1,numCols-2);% 动态构建格式end八、常见问题与解决方案问题可能原因解决方案fopen返回 -1文件路径错误或文件不存在使用exist(inputFile, file)检查文件是否存在textscan解析失败分隔符不匹配如制表符而非逗号检查文件编码确认分隔符为,strcmp分类结果全为0Provider字段拼写大小写不匹配检查日志中实际的Provider名称GPS数据点远多于FLP设备未开启融合定位在GNSSLogger中确认“Fix”开关已开启MATLAB报错“Out of Memory”文件过大使用readlines按块读取或使用datastore九、下一步预告本文是“GNSS数据采集、处理与可视化全流程”系列的第三篇。我们完成了✅ Fix行的筛选✅ CSV格式解析✅ 按Provider分类FLP/GPS/NLP✅ 经纬度与速度提取在第四篇文章中我们将使用本文提取的经纬度数据结合MATLAB的geoshape和webmap工具实现基于速度的分段彩色轨迹绘制生成论文中展示的精彩地图可视化效果。在第五篇文章中我们将深入对比单系统GPS与融合系统FLP的定位精度差异。在第六篇文章中我们将完成全流程复盘提供一套可直接运行的完整MATLAB脚本。十、参考资料Zixia Shang, “Off-line Data Processing Based on GNSSLOGGER, GNSS System Positioning Data Quality and Accuracy Analysis,”Proceedings of SPIE, Vol. 12978, 2024. DOI: 10.1117/12.3019575GNSS 原始测量数据 | Android DevelopersLocationManager | Android DevelopersGPS Measurement Tools GitHub仓库论文实验数据https://github.com/ZixiaShang/GNSSLOGGER-Data-8 系列文章索引第一篇Android GNSS数据采集入门GNSSLogger完整配置指南已完成第二篇GNSS数据解析与质量分析从GNSSAnalysis到MATLAB已完成第三篇MATLAB读取GNSSLogger数据Fix记录筛选与提取实战本文第四篇MATLAB地理轨迹可视化基于速度的分段彩色地图绘制待续第五篇多GNSS系统定位对比单系统与融合系统精度分析待续第六篇GNSS数据处理全流程复盘从手机到地图的完整链路待续