GNSS与GPS的区别:从定位原理到高精度位移监测
很多人都有过这种经历手机上定位图标明明已经点亮站在立交桥下面却硬生生飘出去一两百米朋友发来位置共享在楼群里变成一坨乱麻。遇到这种情况大多数人习惯归咎于GPS信号差但实际上真正干活的往往是一套比GPS复杂得多的系统。卫星导航定位技术发展到今天GNSS和GPS这两个词早就不能简单画等号把它们的区别和原理搞清楚你才会明白为什么有些场景定位准、有些场景定位飘也才知道从模块选型到位移监测到底该怎么下手。这篇内容顺着原理—误差—硬件—数据—应用这条线来聊先厘清GNSS和GPS的关系再拆解定位解算和误差来源然后用低成本模块做一次实操接入最后落到开源数据处理和GNSS位移监测这类高精度应用上。如果你正准备用GNSS做项目或者只是想知道手机定位到底怎么回事这篇都值得看完。1. GNSS与GPS名字背后的导航体系1.1 GNSS不是GPS的升级版是全家桶GNSS的全称是Global Navigation Satellite System直译过来就是全球导航卫星系统。它是一个统称GPS只是这个家族里的一个成员。目前全球范围内真正在提供服务的卫星导航系统主要有四个美国的GPS、俄罗斯的GLONASS、欧盟的Galileo以及北斗系统BDS。除了这四个全球系统还有日本、印度等国家的区域增强系统。很多手机宣传页上写支持GPS定位实际上手机里的定位芯片几乎都是多系统融合定位。你拿起手机看天空同时接收到的卫星信号可能来自GPS、北斗、GLONASS甚至还有Galileo。芯片把它们的观测数据放在一起解算效果比单系统好得多。这也是为什么十几年前的GPS手机在楼群里基本没法用而现在的手机哪怕在室内靠窗边还能勉强定位——多系统贡献了更多可见卫星。所以从这个角度说GNSS是宏观概念GPS是具体系统。日常口语里说GPS信号不好严格讲应该说GNSS定位效果差。但在工程和通信语境里人们还是习惯用GPS代指所有卫星定位这个习惯很难改也不一定要改只要心里清楚区别就行。1.2 卫星星座、地面监控和导航电文定位的基础设施GNSS之所以能定位靠的不是一颗卫星而是一整套基础设施。它由空间段、地面段和用户段组成。空间段是几十颗在轨卫星分布在两万公里上下的中圆轨道上确保地球上任何位置在任意时刻都能看到至少四颗卫星。地面段负责监测卫星轨道、维护卫星钟时间并定期把更新的星历和钟差参数上传给卫星。用户段则是你手里的手机、车里的接收机、手上的测量模块。卫星持续广播的导航电文里包含了三样最关键的东西卫星自身的精确轨道参数星历、卫星钟的差值和电文时刻。接收机收到电文后相当于知道了信号是从哪个位置、哪个时刻发出来的。剩下的工作就是测算信号从卫星飞到接收机用了多久再用光速乘以时间差得到卫星到接收机的距离。这里有一个特别容易让人困惑的点卫星和接收机之间的时钟并不完全同步。卫星上有原子钟接收机里只是一个普通晶振两边的时间差可能达到微秒甚至毫秒级。光速大约每秒30万公里一微秒的时钟误差对应约300米距离误差。所以接收机不能直接用卫星时间减去接收机时间来算距离而要把接收机钟差当成一个未知数一起解算。这也是为什么至少需要四颗卫星三个未知数用于确定三维坐标经度、纬度、高度第四个用于求解接收机钟差。之前有人用三球交汇来解释定位原理说卫星距离确定后三颗卫星就能画三个球面交出一个点。这个说法只对了一半因为接收机钟差没考虑进去。实际工程中都是四颗以上卫星做冗余解算用最小二乘或卡尔曼滤波处理卫星越多、几何分布越均匀定位越稳定。2. 定位解算与误差源为什么手机会飘、会偏2.1 伪距定位看似简单实际是多个误差的叠加GNSS测距用的观测值叫伪距pseudo-range。伪就是不真实的意思因为测出来的距离里包含了各种误差。接收机记录信号到达时间卫星记录信号发射时间两者之差乘以光速得到一个距离值。由于存在电离层延迟、对流层延迟、卫星钟差、接收机钟差等这个距离不是真实几何距离所以叫伪距。解算坐标时接收机建立四元方程组卫星位置由星历计算出来伪距观测值已经测得未知数是用户的三维坐标和接收机钟差。使用四颗以上卫星时方程数多于未知数系统采用最小二乘法迭代求解。每次迭代都会更新估计位置和钟差直到收敛。在开阔环境下单频伪距定位的水平精度通常在3到5米左右这基本就是手机和手持机的水平。为什么手机在城市里经常飘除了误差源还有一个重要因素是卫星几何分布。这里要引入DOP精度因子的概念。DOP描述的是卫星的几何构型对定位精度的放大程度。卫星在天空分布得越分散DOP越小定位越好如果卫星都挤在天边一片区域哪怕有十颗卫星解算结果也会被放大得很难看。手机定位App里常见的PDOP值位置精度因子就是这个意思。开阔地带PDOP一般在1.5到2.5高楼峡谷里可能涨到5以上定位自然飘。2.2 误差来源全面拆解米级误差主要来自哪里把伪距误差拆开看主要来源有这几类每个的成因和影响程度不一样误差源产生原因典型量级削弱方法卫星星历误差地面监控对卫星轨道预报有偏差约1米使用精密星历卫星钟差星载钟与系统时间不同步约1到2米电文播发钟差修正参数电离层延迟带电粒子改变信号传播速度白天几米到几十米双频改正、模型改正对流层延迟大气水汽使信号折射0.5到2米模型改正、参数估计多径效应信号经地面/楼面反射后叠加1到10米扼流圈天线、避开遮挡接收机噪声硬件热噪声与量化噪声0.1到0.5米高质量接收机最麻烦的是多径。在城市里卫星信号经玻璃幕墙、金属护栏反射后再进入天线和直达信号叠加形成明显的测距误差。单频接收机几乎无法有效消除多径只能靠天线设计比如扼流圈天线或者长时间观测取平均来削弱。这也是为什么同一个广场上测量型天线和手机内置天线测出来的稳定性差很多。电离层延迟对单频用户影响也很大。白天电子密度高L1频段信号的电离层延迟可能达到十几米甚至更大。双频接收机可以利用两个频率的延迟差异来消除一阶电离层项效果非常好。单频接收机只能依赖算法模型做大致修正残余误差依然可观。所以你会发现同样在马路上双频手机比单频手机定位明显更稳。2.3 差分定位和RTK怎么把米级压到厘米级既然误差大多具有空间相关性——也就是说相距不远的两台接收机看到的电离层延迟、星历误差、卫星钟差基本相同——那么就可以在已知坐标的地方架一台基准站把基准站观测到误差算出来再告诉流动站现在改多少这就是差分定位DGNSS的基本思路。差分又分两种层次位置差分和观测值差分。位置差分最简单但效果受距离制约观测值差分更精细。RTK实时动态差分则更进一步它不只看伪距还看载波相位。载波L1的频率约1575.42MHz对应波长约19厘米载波相位测量的分辨率能达到毫米级。但载波相位有一个整周模糊度问题接收机只知道相位的小数部分不知道整周数是多少需要通过复杂的搜索算法把整周模糊度固定成整数。RTK的精度直接取决于模糊度能不能固定。固定成功了水平精度可以达到1到2厘米固定失败退化到分米级甚至米级。模糊度固定需要足够多、质量好的卫星观测值并且流动站和基准站之间的误差相关性要强。通常单基站RTK的作用距离在10到20公里内距离越远大气误差越不相关固定越困难。3. NEO-M8N接线与实测低成本模块的GNSS入门3.1 模块选型为什么NEO-M8N是入门首选如果你想亲手做一个带定位功能的设备NEO-M8N是一个绕不开的模块。它属于低成本单频GNSS接收模块芯片很小外围电路简单通过串口输出定位结果。支持GPS、北斗、GLONASS和Galileo的多系统联合接收单点定位精度在2.5米左右功耗低价格合适非常适合Arduino、STM32这类嵌入式项目的起步阶段。有一个重要局限要提前说清楚NEO-M8N只输出伪距观测值和导航解算结果不支持输出用于RTK的载波相位原始观测值。这就意味着它做不了厘米级定位最多就是拿到一个还不错的米级坐标。如果你确定以后要做RTK一开始就应该选能输出载波相位数据的多频模块比如支持RTK的F9P级别板卡。NEO-M8N适合的是先理解GNSS数据流、做产品原型、跑通业务逻辑。3.2 接线细节这些坑我基本都踩过NEO-M8N通常以贴片或小底板的形式出现很多开发板上已经引出了引脚。核心接线就四根电源、地、TX、RX。但有几个细节特别容易出问题NEO-M8N引脚连接目标注意事项VCC3.3V电源部分开发板可以用5V供电但板上要处理好电平转换GND公共地必须和MCU共地否则串口乱码TXDMCU的RX模块输出到MCU注意MCU串口RX引脚配置RXDMCU的TXMCU向模块下发命令时使用ANT有源天线输入需要主板提供天线供电查看天线电流要求有源天线和无源天线一定别搞混。无源天线没有放大器模块直接接收卫星信号天线体积小、成本低但灵敏度有限。有源天线内部带一个低噪声放大器LNA需要额外供电通常由模块的VCC_RF引脚提供3.3V或5V电压。老式有源天线工作在5V新型模块很多是3.3V供电接反电压虽然不会立刻烧坏但会造成收星灵敏度下降。还有一种情况是天线线缆过长导致衰减太大这时信号会忽好忽坏让人误以为模块坏了。接好线后模块默认通过串口输出NMEA 0183语句波特率常见为9600。如果模块是全新的第一次上电可能要在开阔环境下等待几秒到几十秒完成冷启动期间不要移动设备让模块下载星历。室内上电基本搜不到星这个不是故障。3.3 看懂NMEA数据GPS输出到底长什么样模块输出的最典型语句是GNGGA这是一个标准的定位语句包含了时间、经纬度、定位质量、卫星数和海拔。下面是一个简化示例$GNGGA,123519.00,3112.34567,N,12122.12345,E,1,08,0.9,45.6,M,-2.3,M,,*5F字段解析如下123519.00UTC时间12时35分19秒3112.34567,N北纬31度12.34567分12122.12345,E东经121度22.12345分1定位质量标志1表示单点定位08参与定位的卫星数量0.9HDOP值水平精度因子45.6,M海拔高度单位米-2.3,M大地水准面高度差看到这个数据说明模块已经正常工作。如果你需要把数据灌进自己的程序里直接按逗号拆分字段就行。NMEA协议里还有GNGSA、GSV、RMC等语句分别表示解算模式、卫星详情和推荐定位信息。一个常见误区是把$GNRMC里的坐标直接当成WGS84经纬度往地图上画——在以国内地图服务为底图时需要做坐标偏移转换否则点位会偏几十到几百米。3.4 安卓手机抓取GNSS原始数据比想象中简单模块输出的是解析后的定位结果手机却能更进一步。从安卓7.0开始系统开放了GNSS原始数据访问接口应用可以直接读到每颗卫星的伪距、载波相位、多普勒频移、信噪比等测量值。以某米为典型代表的几类安卓机只要芯片支持都可以用App看到这些数据。实操非常简单打开开发者选项在位置里允许模拟位置然后安装一款叫GPS Connector的APK或者用GNSS Logger这类工具点击记录GNSS原始数据。本来显示GPS数据的界面会变成一张天空图里面列出各颗卫星的方位角、仰角、信噪比以及原始测量值。原始数据的核心字段是ReceivedSvTimeNanos和TimeNanos伪距可以近似按这个公式算伪距 (TimeNanos - ReceivedSvTimeNanos) * 光速 / 10^9这个公式在多数安卓设备上可用但要注意芯片对硬件时钟的处理有差异严格处理还要考虑FullBiasNanos等字段。刚开始跑通数据流的人容易忽略一点手机原始数据能不能输出载波相位完全取决于芯片和厂商驱动很多机器虽然开着API实际只能输出伪距载波相位被屏蔽了。所以在做手机RTK方向前先检查能拿到的测量类型别白写一堆算法。4. 从NMEA到应用开发开源工具链与数据处理4.1 为什么说GNSS开源生态已经非常成熟GPS开源工具链这十多年发展得相当完善。在软件层面RTKLIB是最常被提到的开源软件包支持实时和后处理两种模式能处理单频、双频数据支持GPS、北斗、GLONASS等系统。GNSS-SDR则走另一条路用软件定义无线电的方式处理原始采样信号灵活性高但需要配套硬件。RINEX是标准的观测数据交换格式几乎所有专业GNSS数据处理都绕不开。对大多数项目来说真正需要量的不是能不能收到卫星而是把收下来的数据变成位置结果。如果只是做轨迹记录解析NMEA就够了但如果想获得厘米级精度就必须有RINEX观测值、基准站数据、后处理差分这三个要素。开源工具恰好把这条链路全部打通了。选型思路我建议这样先确定需要什么级别的精度再决定用什么开源方案。米级精度嵌入式直接解析串口NMEA分米级可以考虑RTKLIB单频差分厘米级需要双频接收机加RTK或PPK配合RTKLIB做固定解。不要一上来就上全套高精度方案成本和管理复杂度都会翻倍。4.2 一条完整的数据处理链路采集、转换、解算如果手头有一台能输出UBX或原始观测值的接收机要做一次后处理差分标准流程大致是这样第一步采集观测数据。接收机连续记录至少半小时到数小时的数据期间天线保持固定。采集文件建议同时包含观测值和星历NEO-M8N这类模块要确认是否输出RINEX所需的所有观测值。第二步把原始数据转换成RINEX格式。RTKLIB自带的转换工具可以完成参数上要注意选择正确的观测系统、输出频率和截止仰角。通常设截止仰角10度采样间隔按项目要求设1秒或30秒。第三步准备基准站数据。可以是自己架的基准站也可以找附近公开的GNSS基准站数据。基准站的坐标必须是精确已知的精度直接影响最终结果。第四步用RTKLIB的后处理功能进行差分解算。命令行下执行rnx2rtkp指定流动站RINEX文件、基准站RINEX文件、输出文件名和定位模式模式选择kinematic或static。解算完成后检查固定率固定率越高结果越可信。第五步导出结果做后处理分析。查看坐标序列的离散程度剔除周跳或异常跳变再用平均或滤波得到最终坐标。这条链路里最容易翻车的是数据格式不匹配。RINEX版本不同观测值类型代码不同RTKLIB解析不了时会报各种错。建议一开始就用最新版本并统一所有工具的版本减少兼容性问题。4.3 开源方案对比直接选一个适合你的以下是我在实际项目中经常用到的几种路线列个对比表方案硬件要求定位精度开发成本适用场景解析NMEANEO-M8N或手机米级很低轨迹记录、设备定位安卓原始数据API支持原始数据的手机米级到亚米级中等科研、算法验证RTKLIB后处理双频多系统接收机厘米级较高测绘、监测、科研GNSS-SDRSDR前端硬件取决于前端很高学术研究、信号处理我的经验是做产品原型先用解析NMEA把业务逻辑跑通不要一上来就陷进高精度但如果是测绘和监测项目直接上RTKLIB路线不要用NMEA结果凑合。很多人的项目死在米级精度够用这句自我安慰上等需求真的到了返工成本远超一开始的投入。5. GNSS位移监测与高精度应用把厘米级做成常规服务5.1 位移监测的精度需求不是每天测个坐标那么简单GNSS位移监测是卫星导航技术从导航延伸到土木、地质领域的典型应用。大坝、桥梁、边坡、矿山采空区这些对象最怕的就是缓慢的形变。传统人工测量手段成本高、频次低、受天气影响大GNSS监测站可以7×24小时连续工作每天输出高精度坐标序列通过比对前后两天的坐标差就能发现毫米到厘米级的位移趋势。位移监测对精度要求很高。普通导航的米级误差显然不可接受监测站通常采用静态观测或RTK作业方式双差载波相位解算后水平精度可以到毫米级到厘米级。这里的核心是重复观测精度也就是同一测点每天解算位置的一致性。基准站必须架设在稳定区域监测点则要牢固固定在结构体上天线相位中心的稳定性会直接影响位移曲线。还有一个常被忽略的问题GNSS测出来的位移有一个基准前提就是基准站不动。如果基准站本身发生沉降或位移所有监测站的解算结果都会跟着骗人。所以在正式部署时基准站要么布在基岩上要么和气象、地下水等环境参数一起分析避免把误判当成真实形变。5.2 天线安装和数据质量GNSS天线决定成败在位移监测项目里GNSS天线比接收机更重要。天线相位中心随卫星仰角和方位角变化专业测量天线在出厂前就做过相位中心标定而普通天线这一项就能引入厘米级误差。对于毫米级监测目标天线必须选测量级产品。安装环节有几个硬性要求天线必须对中、整平固定在一个稳定的观测墩上天线上方尽量净空仰角10度以内没有建筑物、树木、高压线遮挡天线电缆使用低损耗射频线长度不宜过长必要时在电缆中间加放大器有源天线供电稳定电源纹波过大会影响信噪比。数据质量检查是监测项目里每天都要做的事情。常用的判断指标包括信噪比C/N0、多径误差MP1/MP2、周跳数和PDOP。正常情况下健康卫星的信噪比应当在40 dBHz以上低于35的卫星参与解算时要谨慎。多径误差如果长时间超过0.5米说明天线环境有问题。RTKLIB提供的数据质量统计工具可以输出每个观测时段的周跳比和标准差建议定期检查。5.3 一次典型监测项目的复盘一个虚构现场的真实启示之前接手过一个模拟边坡监测项目基准站架在山脚基岩上两个监测点分别布在坡顶和坡腰。设备都是双频接收机加测量天线采样间隔设30秒每天连续观测24小时解算后生成日坐标序列。项目一开始就碰到一个很典型的问题坡顶那个监测电周围原来有一排矮树秋季落叶后看着不挡但卫星图显示东北方向的卫星信噪比始终偏低MP值偏高。后来用GNSS天线测试工具在安装位置做了天空图评估才发现那排矮树在低仰角的遮挡和反射非常明显。我们把天线位置挪到坡顶另一侧避开反射面数据质量才恢复正常。第二个问题是馈线。最初用了一根20米长的普通射频线信号从天线到接收机衰减太厉害多颗卫星信噪比掉到35以下导致解算精度下降。后来换成低损耗馈线并把接收机尽量靠近天线效果立竿见影。还有一个经验教训是基准站和监测点之间的距离。其中一个监测点离基准站超过12公里夏季暴雨天气下电离层活跃单基站差分的固定率明显下降。这种情况下要么加密基准站要么采用网络RTK或PPP方式。从项目角度数据质量和固定率比多用了几台设备更重要。6. 选型建议与几个容易忽略的细节6.1 不同角色选不同路线如果你和我一样经常帮人评估GNSS方案通常在开始时会问一个问题你要的是够用的定位还是可信的坐标。这两个目标对应完全不同的工具链和预算。日常消费级场景比如行车记录、轨迹记录、个人户外导航一部支持多系统定位的手机或一块内置GNSS的智能手表就够了不用额外折腾硬件。想学习数据原理NEO-M8N加一个串口调试助手是最便宜的入门组合。想验证算法和做科研安卓手机原始数据配合RTKLIB能做不少事情。想做专业位移监测和测绘直接选支持载波相位输出的多频接收机按测量型设备的规范来布线、安装和采集。6.2 几个我到现在还在用的实战小技巧最后分享几个日常GNSS使用中非常实用的细节。冷启动期间尽量别移动设备。刚开机的接收机要下载星历如果边走动边搜星定位结果容易跳变而且初始化时间会变长。很多刚开机定位不准的问题其实都是因为没等它完成星历下载就动了。用C/N0判断天线摆放。在户外测试外置GNSS天线时我会用带卫星天空图的应用观察信噪比分布。只要调到某个位置后多数可见卫星的C/N0比原来高3到5个dBHz就说明摆放更合理。这个办法比单纯刷新定位状态判断快得多。外置天线永远比内置天线强。同样在车里手机放在中控台附近的定位效果和用一根带磁吸外置天线放在车顶的效果差距非常明显尤其在城市高架桥下方场景。别忘了坐标系和投影。GNSS输出的是WGS84坐标系下的经纬度而工程监测和地图展示往往需要投影到平面坐标系或者经过地图偏移转换。忽略这一步你会看到所有点位整体偏移几十米却找不出问题出在哪。卫星导航定位技术真正难的部分不在原理而在每一处细节的执行。从模块接线到天线安装从原始数据解析到差分解算每一步都有它自己的坑。希望这篇内容能帮你少走几圈弯路第一次跑通自己的GNSS项目。