Android GNSS数据采集入门:GNSSLogger完整配置指南
本文内容基于以下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
该论文收录于SPIE数字图书馆,分类号:TB96-53,馆藏号:019638/TB96-53/6:V.12978。论文实验数据已上传至GitHub:https://github.com/ZixiaShang/GNSSLOGGER-Data-8
一、为什么要用GNSSLogger?
全球导航卫星系统(GNSS)已经发展成为多系统同时运行的格局,包括美国的GPS、俄罗斯的GLONASS、中国的北斗卫星导航系统(BDS)以及欧洲的Galileo。目前,全球共有70-80颗可供GNSS使用的在轨卫星。对于导航和定位来说,数据质量至关重要,它直接决定了GNSS卫星导航定位的精度和可靠性。然而,数据质量会受到外部观测环境、接收器质量以及卫星健康状况等多重因素的影响。
自2016年Google I/O大会宣布Android系统支持获取原始GNSS观测数据以来,移动端高精度定位研究迎来了爆发式增长。GNSSLogger正是Google官方推出的数据采集工具,它可以帮助用户获取原始GNSS测量值、GnssStatus、NMEA数据、导航消息以及RINEX日志。
GNSSLogger的核心功能:
- 记录原始GNSS测量数据(Raw GNSS Measurements)
- 记录GnssStatus(卫星状态信息)
- 记录NMEA语句(标准导航数据格式)
- 记录导航消息(Navigation Messages)
- 记录传感器数据(加速度计、陀螺仪等)
- 生成RINEX格式日志
GNSSLogger可用于手机和手表,是GNSS研究者和开发者最基础、最权威的数据采集工具。
二、设备兼容性:你的手机能用吗?
2.1 Android版本要求
根据Android官方文档:
| Android版本 | 原始GNSS测量支持 |
|---|---|
| Android 10(API 29)及以上 | 必须支持 |
| Android 9(API 28)及以下 | 硬件年份2016年或更新的设备必须支持 |
目前,超过90%的现有Android手机都具有原始测量数据能力。
2.2 支持的测量字段
不同设备的GNSS芯片组不同,支持的字段也有所差异:
- 伪距和伪距率(Pseudorange and pseudorange rate)
- 导航消息(Navigation messages)
- 自动增益控制器(AGC)值
- 累计变化量(ADR)/ 载波相位
- 多频段支持:Pixel、Motorola、Samsung、Xiaomi、OnePlus等厂商的大多数旗舰手机已支持L1和L5频段
⚠️ 特别注意:如果您的设备始终报告可用ADR为0,即使在停车状态下且已停用占空比也是如此,则表明您的设备不支持可用于高精度GNSS的载波相位测量。
三、GNSSLogger的安装方式
方式一:从Google Play安装(推荐)
这是最简单快捷的方式。直接在Google Play搜索“GnssLogger”即可安装。
应用由Google官方开发,支持:
- 控制各种数据记录,如原始GNSS测量、GnssStatus、NMEA、导航消息等
- 将GNSS和传感器数据记录为CSV和RINEX文件
方式二:从源码构建(适用于开发者)
如果你需要修改源码或进行二次开发,可以从GitHub获取源码。
详细步骤:
- 安装Android Studio(如果尚未安装)
- 克隆项目代码:
gitclone https://github.com/google/gps-measurement-tools.git - 打开项目:在Android Studio中,选择
File -> Open,定位到下载的仓库中的GNSSLogger目录 - 等待Gradle同步完成
- 构建项目:点击顶部面板的
Build选项卡,选择Rebuild Project - 连接手机:确保手机已开启开发者模式和USB调试,并显示在Android Studio的设备列表中
- 运行应用:点击
Run选项卡 ->Run App
四、GNSSLogger的配置与使用
4.1 首页(Home Tab)配置
打开GNSSLogger应用后,在“Home”标签页中可以看到多种数据记录开关:
| 开关选项 | 说明 | 论文中的使用 |
|---|---|---|
| Fix | 记录定位解算结果(含FLP/GPS/NLP) | ✅ 开启 |
| Raw | 记录原始GNSS测量值(伪距、载波相位等) | ✅ 开启 |
| NMEA | 记录NMEA语句 | 按需开启 |
| Rinex | 记录RINEX格式数据 | 按需开启 |
| GnssStatus | 记录卫星状态信息 | 按需开启 |
| Sensors | 记录加速度计、陀螺仪等传感器数据 | 按需开启 |
论文中的配置:论文《Off-line Data Processing Based on GNSSLOGGER》使用GNSSLoggerv3.0.5.6进行数据采集。
4.2 Settings Tab 关键设置
在开始记录之前,建议进行以下设置:
- 开启“Screen Always ON”:防止屏幕熄灭后应用被系统休眠,导致数据记录中断
- 开启“Location”权限:这是获取GNSS数据的前提
- 开启“Measurement”开关:启用GNSS测量功能
4.3 开始记录数据
Step 1:开启权限
在手机设置中为GNSSLogger授予位置权限。
Step 2:等待卫星可用
在Settings Tab中开启“Location”和“Measurement”开关后,等待显示“GNSS Measurement are Available”。该提示在4颗以上卫星可用时才会显示。
Step 3:开始记录
点击“Start Log”按钮,应用开始记录数据。论文中的实验在晴朗天气的下午进行数据采集,以尽量减少“雨衰”对卫星信号的影响。
Step 4:停止并导出
完成数据采集后,点击“Stop Log”停止记录。
4.4 日志文件位置
日志文件保存在手机的内部存储中:
/Android/data/com.google.android.apps.location.gps.gnsslogger/files/gnss_log/如果需要将文件导出到电脑进行分析,可以通过USB连接手机后复制该目录下的文件。
五、日志文件格式详解
5.1 行前缀(Row Prefixes)
GNSSLogger输出的每一行都以特定的字符串前缀标识数据类型:
| 前缀 | 数据类型 | 说明 |
|---|---|---|
Raw | 原始GNSS测量数据 | 伪距、载波相位、多普勒、C/No等 |
Fix | 定位解算结果 | 经纬度、高度、速度、精度等 |
Nav | 导航消息 | 卫星导航电文 |
NMEA | NMEA语句 | 标准导航数据格式 |
Accel/UncalAccel | 加速度计数据 | m/s² |
Gyro/UncalGyro | 陀螺仪数据 | rad/s |
5.2 Fix 行格式(重点)
Fix行是后续MATLAB数据分析中最常处理的数据类型,包含17个CSV字段:
Fix,Provider,Lat,Lon,Alt,Speed,Accuracy,Bearing,UnixTimeMs,...各字段含义:
| 列号 | 字段 | 说明 |
|---|---|---|
| 1 | Fix | 固定标识符 |
| 2 | Provider | 定位提供者:FLP/GPS/NLP |
| 3 | Lat | 纬度(度) |
| 4 | Lon | 经度(度) |
| 5 | Alt | 海拔高度(米) |
| 6 | Speed | 速度(米/秒) |
| 7 | Accuracy | 定位精度(米) |
三种Provider的区别:
| Provider | 全称 | 数据来源 |
|---|---|---|
| GPS | GNSS Location Provider | 纯GNSS卫星定位 |
| NLP | Network Location Provider | 基站和Wi-Fi接入点定位 |
| FLP | Fused Location Provider | 多GNSS数据 + NLP融合定位 |
论文研究表明,融合系统(FLP)的稳定性、刚性和精度远优于单一GNSS系统(GPS)。
5.3 Raw 行格式
Raw行记录的是最原始的GNSS观测数据:
- 伪距(Pseudorange)
- 载波相位(Carrier Phase / ADR)
- 多普勒频移(Doppler)
- 载波噪声密度(C/No)
这些数据是进行高精度定位分析的基础。
六、GNSSLogger v3.1 测量屏幕详解(进阶)
借助GNSSLogger v3.1,用户可以在测量屏幕上实时查看和分析原始GNSS数据。
6.1 顶部卡片:GNSS时钟与硬件状态
左上角:显示GNSS时钟数据(对应GnssClock类)
- 当前GNSS时间
- 时钟偏差等信息
右上角:显示GNSS硬件(HW)中断次数(来自GnssClock.getHardwareClockDiscontinuityCount())
- 当此计数器递增时,表示GNSS信号的连续观测中断了
- 这有助于判断是否启用了占空比周期性调制(一种省电模式)
- 占空比调制开启时,GNSS信号接收会周期性中断,影响高精度定位
6.2 中部卡片:测量结果汇总
“# 有效的测量”:测量结果被视为有效需要满足的条件:
- 必须在
GnssMeasurement.getState()中设置STATE_CODE_LOCK(码锁定) - 并且设置
STATE_TOW_KNOWN(周内时已知)或STATE_TOW_DECODED(周内时已解码)
“# 可用的累积差值范围(ADR)”:ADR(载波相位)被视为可用于定位的条件:
- 必须设置
ADR_STATE_VALID标志 - 不能设置
ADR_STATE_RESET(重置)或ADR_STATE_CYCLE_SLIP(周跳)
6.3 底部卡片:单个卫星测量值
底部卡片中,每一行代表一个单独的GnssMeasurement(一颗卫星的一个信号):
代码类型列:使用RINEX 4.01中定义的代码类型显示GNSS信号的确切类型
- 例如,GPS L1信号的代码类型为“C”,表示L1 C/A码
- GPS L5信号将具有“Q”代码类型
Rx SV Time (ns)列:如果测量结果有效,文本显示为绿色
状态列:显示GnssMeasurement.getState()字段中设置的按位标志的人类可读版本,有效时也显示为绿色
七、数据采集实操建议
基于论文的实践经验,以下是数据采集的关键建议:
| 建议 | 说明 |
|---|---|
| 选择晴朗天气 | 减少“雨衰”对卫星信号的影响 |
| 选择开阔环境 | 避免建筑物群遮挡卫星信号 |
| 保持屏幕常亮 | 在Settings中开启“Screen Always ON” |
| 保证设备电量 | 长时间记录会消耗较多电量 |
| 固定设备位置 | 如需高精度对比,建议使用三脚架固定手机 |
| 多设备对比 | 不同厂商的GNSS芯片性能差异显著 |
论文中使用的实验设备:
- Xiaomi 22041216C
- Xiaomi M2007J17C
- HUAWEI DBY-W09
八、常见问题与解决方案
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 手机不支持原始GNSS | Android版本过低或硬件太旧 | 检查Android版本≥7.0,确认硬件年份≥2016 |
| 日志文件为空 | 未开启Location或Measurement权限 | 检查权限设置,等待“GNSS Measurement are Available”提示 |
| ADR始终为0 | 设备不支持载波相位测量 | 检查设备是否在支持列表中 |
| 信号质量差 | 处于建筑物密集区域 | 选择开阔环境采集数据 |
| 不同设备结果差异大 | GNSS芯片组不同 | 了解设备具体的GNSS能力 |
九、下一步预告
本文是“GNSS数据采集、处理与可视化全流程”系列的第一篇。在后续文章中,我们将:
- 第二篇:使用GNSSAnalysis和MATLAB对采集的数据进行质量分析
- 第三篇:使用MATLAB读取和筛选GNSSLogger的Fix数据
- 第四篇:基于速度进行分段彩色轨迹绘制
- 第五篇:对比单系统与多系统融合的定位精度
- 第六篇:全流程复盘与工程化建议
十、参考资料
- GNSS 原始测量数据 | Android Developers
- 使用 GnssLogger 分析原始测量数据 | Android Developers
- GPS Measurement Tools GitHub仓库
- 论文实验数据:https://github.com/ZixiaShang/GNSSLOGGER-Data-8
📌 系列文章索引:
- 第一篇:Android GNSS数据采集入门:GNSSLogger完整配置指南(本文)
- 第二篇:GNSS数据解析与质量分析:从GNSSAnalysis到MATLAB
- 第三篇:MATLAB读取GNSSLogger数据:Fix记录筛选与提取实战
- 第四篇:MATLAB地理轨迹可视化:基于速度的分段彩色地图绘制
- 第五篇:多GNSS系统定位对比:单系统与融合系统精度分析
- 第六篇:GNSS数据处理全流程复盘:从手机到地图的完整链路