你以为定位全靠 GPS?手机里其实有四套系统在替你接力

聊聊开发中定位这件事
打开一个地图 App,蓝点落在你脚下;调用一行 navigator.geolocation.getCurrentPosition(),经纬度回调到手。定位已经平常到让人忘了它的存在——直到某天你发现,蓝点飘到了马路对面,或者室内定位结果离了个大谱。
很多开发者把"定位"等同于"GPS",这其实是一个误解。现代智能设备的定位,是一个典型的多技术融合系统:卫星、基站、Wi-Fi、蓝牙、运动传感器各司其职,再由算法综合出最优结果。GPS 只是其中最能打的一个,却远不是唯一的一个。
这篇文章把定位这件事拆开,讲清楚四根技术支柱——卫星定位、基站定位、Wi-Fi/蓝牙定位、传感器辅助——的原理,以及它们在实际开发中是如何被串联起来的。
一、卫星定位:最"正统"的答案

1.1 从"对表"说起
卫星定位的原理,本质上是一个初中物理题:距离 = 速度 × 时间。
卫星在太空按已知轨道飞行,不断向地面广播信号。信号以光速传播,设备只要测出信号从卫星飞到自己的时间,乘以光速,就得到了自己到那颗卫星的距离。一颗卫星能画出一个"距离圈",三颗卫星的交点就确定了位置。
但这里有个细节:光速每秒 30 万公里,时间测量必须精确到纳秒(十亿分之一秒)级。差一纳秒,距离就偏 30 厘米。更重要的是,设备内部那个便宜的石英钟远没有卫星上的原子钟准,它和卫星之间天然存在一个未知的钟差。于是未知数变成了四个:三维坐标(X/Y/Z),加上接收机自身的钟差。四个未知数需要四个方程——这就是为什么 GPS 定位至少需要锁定 4 颗卫星。
卫星信号到了地面已经极其微弱(比 Wi-Fi 信号弱万亿倍),几十颗卫星又都挤在同一个频段上,接收机怎么区分"这是哪颗卫星发来的"?答案是码分多址(CDMA):每颗卫星分配一个独一无二的伪随机噪声码(PRN 码),接收机内部预存了所有卫星的码,通过相关运算,谁的码对上了,就"提取"出谁的信号。GPS 用的是 L1 频段(1575.42MHz),北斗有 B1/B2/B3,俄罗斯 GLONASS、欧盟 Galileo 各有各的频点——但它们共用一套测距思想。
1.2 开发者的第一个坑:坐标为什么偏了几百米
假设你在北京用 GPS 拿到了一个"真实"坐标,拿它去比对手机地图上显示的蓝点,会发现差了几百米。这不是定位不准,而是坐标系不同。
卫星解算出的位置基于 WGS-84 坐标系——一个以地球质心为原点、全球统一的"数学地球"。而我们日常使用的经纬度,是高德、谷歌、百度等地图服务商展示出来的值:
- GCJ-02(火星坐标系):中国国家测绘局制定的标准,在 WGS-84 基础上加了一层非线性的、不可逆的偏移(通常几百米),目的是符合地理信息保密要求。
- BD-09(百度坐标系):百度在 GCJ-02 基础上再加密偏移一次。
所以你在手机里拿到的"原始定位",底层是 WGS-84;地图 SDK 在展示时默默套了一层偏移。开发中如果后端拿的是手机原生 API 的坐标,前端用的是地图 SDK 的坐标,两边一比对,永远差着几百米——这不是 bug,是坐标系没统一。线上项目务必在接入层强制约定坐标系,用地图服务商提供的转换接口(GCJ-02 ↔ WGS-84、BD-09 ↔ GCJ-02)做一次收敛。
顺带一提,GPS 报的"海拔"也常常不准:卫星算的是相对 WGS-84 椭球面的几何高度,而我们在意的是相对海平面的正高。地球质量分布不均,两者在全球最大可相差 ±100 米。内陆地区看到的 GPS 海拔,本质是个"数学高度"。
1.3 为什么冷启动那么慢
用过 GPS 导航的人都有经验:刚开机时,定位经常要转圈转好几十秒。原因是接收机在"冷启动"时,不知道自己在哪里、现在是几点,必须先扫描天空、下载卫星的星历(描述卫星轨道和钟差的参数),才能开始测距。星历通过卫星信号播发,速率很低,下完一次要一两分钟。
这个体验问题,被基站定位顺手解决了——这就是 A-GNSS(辅助卫星导航)。手机通过蜂窝网络,从运营商或地图服务商的服务器直接下载当前区域对应的星历数据。接收机不用再去解卫星里慢吞吞的导航电文,冷启动时间从一分钟缩短到几秒。这里基站只是"数据快递员",并不参与坐标计算。
1.4 头顶上的卫星,其实离不开地面
还有一个常被忽略的事实:卫星定位系统能正常工作,离不开地面的支持。
卫星在太空并不是纹丝不动的。月球引力、太阳风、地球自转都会让它的轨道缓慢漂移。如果卫星广播的轨道参数是错的,地面设备用它对表,定位自然失准。所以 GPS/北斗在全球布置了地面监测站,持续"盯着"每颗卫星,测出它真实的轨道和钟差,再通过注入站把修正后的参数上行发给卫星,卫星再广播给用户。没有这套地面系统,卫星轨道误差几天内就能累积到几公里,定位直接失效。
而普通用户想拿到厘米级精度,还需要另一类地面设施——差分定位(RTK)。固定的参考站(CORS)知道自己精确坐标,它接收卫星信号后能算出当前的大气误差,再把"误差修正值"通过 4G 或电台发给移动设备,设备在自己的计算结果上做减法,精度从几米跃升到厘米甚至毫米级。专业测绘、自动驾驶用的就是这条路,代价是需要依赖地面基础设施。
1.5 同一颗卫星,设备之间也有差异
只靠卫星、在信号良好的空旷室外,手机和手表的定位精度几乎没有差别。但一进入城市峡谷或室内,差别就出来了,根源在硬件:
- 天线:GPS 信号到达地面时极弱,理想天线需要约 5 厘米的净空。手机有大主板、金属中框当地网,能锁住十几颗星;手表表盘只有 4 厘米,天线只能做成微带贴片压在屏幕下,信噪比低 5–10dB,经常只锁得住六七颗星,几何分布还差,漂移自然更大。
- 功耗策略:手表为了省电,定位芯片常采用"间歇性睡眠"(占空比)策略,每秒只工作约 200 毫秒,丢失了大量多普勒频移信息,导致速度不准、轨迹呈锯齿状。
- 传感器质量:手机的陀螺仪、加速度计精度通常高于手表,在卫星信号短暂丢失时能靠惯性推算补位。
- 频段:支持 L1+L5 双频的旗舰设备,用 L5 的长波长信号抗多径反射,精度显著优于单频设备。
开发启示很直接:做运动轨迹记录,要给手表端更低的定位更新间隔(用续航换精度);做导航应用,别指望消费级设备给你米级以下的承诺。
二、基站定位:城市里随叫随到的"兜底"
卫星定位依赖头顶开阔的天空,进了地铁、商场、地下车库就抓瞎。这时基站定位顶上来了——只要有手机信号的地方就能用。它的演进分三代。
第一代:Cell ID(小区识别码)。 运营商把每个基站覆盖范围看成一个"小区",分配唯一编号。手机注册到网络,系统就知道你挂在哪个基站下,直接把基站坐标返回给你。精度完全取决于基站密度:城市密集区微基站覆盖半径 200–500 米,偏远农村一个基站覆盖 10 公里,误差就是 10 公里。优点是瞬间完成、几乎不耗电。
第二代:TDOA(到达时间差)。 当手机同时被多个基站"看到"时,可以测出信号到达两个基站的时间差。时间差恒定,意味着手机落在以这两个基站为焦点的双曲线上;引入第三个基站,两条双曲线一交,位置就出来了。它不测绝对时间,做差抵消了手机钟差,是 4G/5G 网络的主力方案(如 OTDOA),城市密集区精度可达 50–150 米。
第三代:AoA(到达角)+ Massive MIMO。 5G 基站天线阵列动辄几十上百根,能精确测出信号到达的水平角和俯仰角,结合距离估算(TA 时间提前量),一个基站就能画出一条"方向射线 + 距离",理论精度可达亚米级。代价是基站硬件必须升级支持。
基站定位最大的局限是精度受制于基站密度,到了海上、荒漠就退化回 Cell ID 模式,误差以公里计。但在城市里,它是定位速度的保障——也是 A-GNSS 得以运转的通道。
三、Wi-Fi 与蓝牙:室内定位的主角
进了室内,卫星失效、基站变稀,但 Wi-Fi 和蓝牙信号密布。这两种技术原理同源,都依赖"固定锚点",但工程实现上有本质分野。
3.1 Wi-Fi:一张靠众包养大的指纹地图
很多人想当然地以为 Wi-Fi 定位是"测信号强度、画圆求交点"。现实中商业方案几乎不这么做——Wi-Fi 信号穿墙衰减太离谱,用公式算距离误差能到几十米。真正的主流是指纹定位(Fingerprinting):
把手机扫描到的"MAC 地址 + 信号强度"列表(比如 {MAC-A:-45dBm, MAC-B:-60dBm, MAC-C:-78dBm})当成一个指纹,去数据库里找最相似的历史采样点。这更像人脸识别,而不是三角测量。匹配算法通常是 KNN(找最相似的 K 个点做加权平均)或贝叶斯推断(算指纹在每个地理网格上的出现概率)。
那么问题来了:这张庞大的指纹数据库哪来的?早期靠谷歌、苹果的街景车沿街采集,只能覆盖路边。现在靠众包:每一位开启定位服务的用户都是免费的采集员。手机在室外收到 GPS 信号时,会把周围扫到的所有 Wi-Fi MAC 地址、信号强度连同精确经纬度一起匿名上报。海量用户的"投票"让系统不仅知道某个路由器在哪,还能画出它的信号覆盖范围。用的人越多,地图越精细,定位越准——这是 Wi-Fi 定位最妙的地方。
这套系统还内建了防污染机制:
- 相似度替代相等:信号随时波动,系统只做"最相似 Top-N 点"的加权平均,返回的是一个计算出的重心,而不是某条历史记录的坐标。
- 移动热点排除:某个 MAC 若在几小时内出现在相距数十公里的位置,会被判定为移动热点(车载 Wi-Fi 之类),在匹配中直接降权剔除,防止位置被一辆路过的车拖走。
- 质量筛选:高速行驶中上报的 Wi-Fi 扫描与 GPS 坐标不匹配,属于脏数据。后台跑聚类算法,只有当大量用户在连续多天里对同一路由器上报了相近的强度,才置信它的位置并更新主库。
还有一个开发盲区值得点出:手机没连 Wi-Fi,也照样能被 Wi-Fi 定位。 只要系统里开着"位置信息扫描",底层 Wi-Fi 芯片就在被动监听周围路由器的信标帧,不需要密码、不耗流量,拿到 MAC 列表后通过蜂窝数据上传换位置。这也是为什么关掉 Wi-Fi 后定位明显变慢。
3.2 蓝牙:从"指纹"到"测向"
蓝牙定位与 Wi-Fi 定位同宗同源——都靠固定锚点(蓝牙信标 Beacon)和指纹匹配。最早的 iBeacon 方案本质上就是一张"信标 MAC + RSSI"的指纹地图。但蓝牙有两个质变。
第一,信号特性更利于测距。蓝牙信标发射功率极低(1–10mW),覆盖只有 10–30 米,穿墙能力弱——这在工程上反而是优点:你收到的蓝牙信号绝大多数是直射路径,受反射干扰极小,RSSI 换算距离的公式比 Wi-Fi 可靠得多。
第二,蓝牙 5.1 引入了 AoA/AoD(到达角/出发角)测向。信标端改用阵列天线,设备发出的信号到达不同天线时有微小相位差,芯片算出差就能得到方位角和俯仰角。一个支持 AoA 的信标即可确定一条指向你的射线,再结合距离估算,就能实现亚米级精度。这不再是"指纹匹配",而是回到了物理几何测距。代价是:指纹方案零部署成本(复用现有路由器),AoA 方案需要额外铺设专用信标阵列,且要求设备硬件支持蓝牙 5.1。
Wi-Fi 和蓝牙定位的共性也很明显:它们都是"人类社会活动的衍生产物",靠众包数据画地图。野外没人部署锚点、数据库一片空白,这两兄弟就彻底失灵——野外的主力仍然只有卫星,以及接下来要讲的"盲推"。
四、传感器辅助:没有信号时的"盲推"
假设你走进一条长隧道,卫星、基站、Wi-Fi 全部失联,定位图标却还在移动。这就是运动传感器(惯性导航)在工作:它不依赖任何外部信号,只靠测量自身的加速度和角速度,从已知起点出发一路"盲推"。
4.1 两步积分算出位移
手机里的加速度计测量三维空间上的线性加速度(包括重力),陀螺仪测量绕三个轴的旋转角速度。算法的工作分两步:
- 姿态解算:先把陀螺仪积出角度,结合加速度计感知的重力方向,融合出设备当前的朝向——手机横着放和竖着放,"前"是完全不同的方向。
- 航位推算:从加速度中减去重力分量,对运动加速度积分一次得到速度,再积分一次得到位移,叠加到上一个已知坐标点上。
这就是"盲推"的完整数学过程。它不依赖任何基础设施,隐蔽性极强——潜艇在水下靠的就是它。
4.2 阿喀琉斯之踵:误差随时间爆炸
加速度计和陀螺仪存在零偏(静止时输出不为零)和噪声。微小的误差经过一次积分变成线性增长的速度误差,经过两次积分就变成二次增长的位置误差。顶级手机 IMU 在没有外部修正的情况下,一分钟内推算的位置误差可达几百米——你在隧道里走直线,出隧道时定位点已经飘到隔壁街道。
工程上的救赎有两个:一是零速修正(ZUPT)——算法通过加速度计的方差判断设备是否静止(等红灯、脚步落地那一瞬),一旦判定静止就强制把速度归零,斩断误差累积;二是定期校准——传感器只负责填补两次绝对定位之间的空档,一旦 GPS 重新捕获信号,就把位置"拽"回正确坐标,重置惯性误差。
4.3 顺带聊聊 MEMS 芯片
手机里没有传统意义的机械陀螺仪(那玩意儿体积比手机还大)。现代设备用的是 MEMS(微机电系统) 芯片——在指甲盖大的硅片上,用光刻机刻出一个微米级的"弹簧-质量块"结构。设备加速或倾斜时,质量块因惯性滞后于外壳,与固定电极的间距变化引起电容变化,芯片测电容即测加速度;陀螺仪则利用科里奥利力——一个持续振动的质量块在旋转时会被施加垂直方向的力,同样转化为电容变化。芯片工艺无法避免零偏,且零偏随温度漂移,这也是传感器数据必须交给融合算法"消化"的根本原因。
4.4 组合导航:松耦合与紧耦合
实际产品中,传感器从不单独作战,它和绝对定位源组成组合导航:
- 松耦合(手机常用):GPS 每秒给一个位置,IMU 在间隙里填充轨迹让图标更顺滑;信号丢失时短暂接管,恢复后立即被拽回并重置误差。
- 紧耦合(汽车、无人机常用):不再只消费 GPS 的位置结果,而是把多普勒频移、载波相位等原始观测值与 IMU 深度耦合滤波。即使卫星被短暂遮挡,车辆仍能保持车道级精度。
五、把它们串起来:一次定位请求的完整旅程
现在把四根支柱放回真实场景,看看现代设备一次"定位成功"背后发生了什么。
场景一:在户外打开导航。 冷启动时,基站先用 Cell ID 给出一个粗略位置(误差几百米),同时通过 A-GNSS 从服务器拉来星历。接收机拿到星历后秒级捕获卫星,开始伪距解算,坐标从"几百米"收敛到"几米"。过程中陀螺仪和加速度计持续记录运动,用卡尔曼滤波把卫星散点和惯性推算融合成一条平滑轨迹——过立交桥信号遮挡的那几秒,蓝点靠惯性撑着没乱跳。
场景二:走进商场。 卫星信号衰减到不可用,基站变稀。系统检测到环境变化,切换到 Wi-Fi/蓝牙指纹匹配:扫描周围几十个热点,上传指纹,服务端在众包数据库里算出位置(10–20 米),配合气压计校准楼层。这一步就是导航 App 商场内"一键寻店"的基础。
场景三:进入地铁隧道。 一切外部信号消失,定位完全交给惯性导航 + 零速修正。隧道短则误差可接受,隧道长则出站瞬间被 GPS 重新校准,"啪"地拽回真实位置——如果你见过地图 App 里图标在出隧道时瞬移,就是这个机制在起作用。
场景四:自驾跑长途。 车机用双频 GNSS + 差分(RTK)拿到车道级横向精度,靠战术级 IMU + 轮速脉冲在无星状态下继续航位推算,再用摄像头识别车道线做地图匹配,把定位点"吸附"到正确的车道上。这就是"导航知道你在主路还是辅路"的原因。
开发实践清单
把上面这些落到工程里,几条经验值得写进团队规范:
- 坐标系先行。统一约定 WGS-84 / GCJ-02 / BD-09,在接入层做转换收敛,别让"差几百米"的问题追查半天。
- 区分"粗定位"与"精定位"。用系统的融合定位接口(Android 的 FusedLocationProvider、iOS 的 Core Location)而不是裸调 GPS,让系统在功耗和精度之间做权衡。
- 声明精度预期。室内外场景分开处理:室外可承诺 10 米内,室内别承诺高于 Wi-Fi/蓝牙能力,必要时自建蓝牙 AoA 或 UWB 基站。
- 别裸用传感器。惯性数据必须配绝对定位校准,否则误差会以二次方的速度失控。
- 理解设备差异。手表、低端机、双频旗舰的定位能力不在一个量级,测试时要覆盖"低端设备 + 复杂环境"这种最坏组合。
写在最后
回到开头那个蓝点。它落在你脚下这件事,背后是四套互不相干的技术在接力:卫星在太空广播时间,基站在地面递送数据,Wi-Fi 与蓝牙用众包指纹描绘室内,传感器在信号真空里默默推算。它们各自的精度都有限,合在一起才构成了现代设备"走到哪都知道自己在哪"的体验。
理解了这套系统,再回头看那些"定位不准"的 bug——坐标系没对齐、室内切场没触发、传感器误差没校准——就都有了清晰的排查方向。定位不是一行 API 的事,它是一整套系统工程,而认识它,是做好它的第一步。
聊聊开发中定位这件事
打开一个地图 App,蓝点落在你脚下;调用一行 navigator.geolocation.getCurrentPosition(),经纬度回调到手。定位已经平常到让人忘了它的存在——直到某天你发现,蓝点飘到了马路对面,或者室内定位结果离了个大谱。
很多开发者把"定位"等同于"GPS",这其实是一个误解。现代智能设备的定位,是一个典型的多技术融合系统:卫星、基站、Wi-Fi、蓝牙、运动传感器各司其职,再由算法综合出最优结果。GPS 只是其中最能打的一个,却远不是唯一的一个。
这篇文章把定位这件事拆开,讲清楚四根技术支柱——卫星定位、基站定位、Wi-Fi/蓝牙定位、传感器辅助——的原理,以及它们在实际开发中是如何被串联起来的。
一、卫星定位:最"正统"的答案
1.1 从"对表"说起
卫星定位的原理,本质上是一个初中物理题:距离 = 速度 × 时间。
卫星在太空按已知轨道飞行,不断向地面广播信号。信号以光速传播,设备只要测出信号从卫星飞到自己的时间,乘以光速,就得到了自己到那颗卫星的距离。一颗卫星能画出一个"距离圈",三颗卫星的交点就确定了位置。
但这里有个细节:光速每秒 30 万公里,时间测量必须精确到纳秒(十亿分之一秒)级。差一纳秒,距离就偏 30 厘米。更重要的是,设备内部那个便宜的石英钟远没有卫星上的原子钟准,它和卫星之间天然存在一个未知的钟差。于是未知数变成了四个:三维坐标(X/Y/Z),加上接收机自身的钟差。四个未知数需要四个方程——这就是为什么 GPS 定位至少需要锁定 4 颗卫星。
卫星信号到了地面已经极其微弱(比 Wi-Fi 信号弱万亿倍),几十颗卫星又都挤在同一个频段上,接收机怎么区分"这是哪颗卫星发来的"?答案是码分多址(CDMA):每颗卫星分配一个独一无二的伪随机噪声码(PRN 码),接收机内部预存了所有卫星的码,通过相关运算,谁的码对上了,就"提取"出谁的信号。GPS 用的是 L1 频段(1575.42MHz),北斗有 B1/B2/B3,俄罗斯 GLONASS、欧盟 Galileo 各有各的频点——但它们共用一套测距思想。
1.2 开发者的第一个坑:坐标为什么偏了几百米
假设你在北京用 GPS 拿到了一个"真实"坐标,拿它去比对手机地图上显示的蓝点,会发现差了几百米。这不是定位不准,而是坐标系不同。
卫星解算出的位置基于 WGS-84 坐标系——一个以地球质心为原点、全球统一的"数学地球"。而我们日常使用的经纬度,是高德、谷歌、百度等地图服务商展示出来的值:
- GCJ-02(火星坐标系):中国国家测绘局制定的标准,在 WGS-84 基础上加了一层非线性的、不可逆的偏移(通常几百米),目的是符合地理信息保密要求。
- BD-09(百度坐标系):百度在 GCJ-02 基础上再加密偏移一次。
所以你在手机里拿到的"原始定位",底层是 WGS-84;地图 SDK 在展示时默默套了一层偏移。开发中如果后端拿的是手机原生 API 的坐标,前端用的是地图 SDK 的坐标,两边一比对,永远差着几百米——这不是 bug,是坐标系没统一。线上项目务必在接入层强制约定坐标系,用地图服务商提供的转换接口(GCJ-02 ↔ WGS-84、BD-09 ↔ GCJ-02)做一次收敛。
顺带一提,GPS 报的"海拔"也常常不准:卫星算的是相对 WGS-84 椭球面的几何高度,而我们在意的是相对海平面的正高。地球质量分布不均,两者在全球最大可相差 ±100 米。内陆地区看到的 GPS 海拔,本质是个"数学高度"。
1.3 为什么冷启动那么慢
用过 GPS 导航的人都有经验:刚开机时,定位经常要转圈转好几十秒。原因是接收机在"冷启动"时,不知道自己在哪里、现在是几点,必须先扫描天空、下载卫星的星历(描述卫星轨道和钟差的参数),才能开始测距。星历通过卫星信号播发,速率很低,下完一次要一两分钟。
这个体验问题,被基站定位顺手解决了——这就是 A-GNSS(辅助卫星导航)。手机通过蜂窝网络,从运营商或地图服务商的服务器直接下载当前区域对应的星历数据。接收机不用再去解卫星里慢吞吞的导航电文,冷启动时间从一分钟缩短到几秒。这里基站只是"数据快递员",并不参与坐标计算。
1.4 头顶上的卫星,其实离不开地面
还有一个常被忽略的事实:卫星定位系统能正常工作,离不开地面的支持。
卫星在太空并不是纹丝不动的。月球引力、太阳风、地球自转都会让它的轨道缓慢漂移。如果卫星广播的轨道参数是错的,地面设备用它对表,定位自然失准。所以 GPS/北斗在全球布置了地面监测站,持续"盯着"每颗卫星,测出它真实的轨道和钟差,再通过注入站把修正后的参数上行发给卫星,卫星再广播给用户。没有这套地面系统,卫星轨道误差几天内就能累积到几公里,定位直接失效。
而普通用户想拿到厘米级精度,还需要另一类地面设施——差分定位(RTK)。固定的参考站(CORS)知道自己精确坐标,它接收卫星信号后能算出当前的大气误差,再把"误差修正值"通过 4G 或电台发给移动设备,设备在自己的计算结果上做减法,精度从几米跃升到厘米甚至毫米级。专业测绘、自动驾驶用的就是这条路,代价是需要依赖地面基础设施。
1.5 同一颗卫星,设备之间也有差异
只靠卫星、在信号良好的空旷室外,手机和手表的定位精度几乎没有差别。但一进入城市峡谷或室内,差别就出来了,根源在硬件:
- 天线:GPS 信号到达地面时极弱,理想天线需要约 5 厘米的净空。手机有大主板、金属中框当地网,能锁住十几颗星;手表表盘只有 4 厘米,天线只能做成微带贴片压在屏幕下,信噪比低 5–10dB,经常只锁得住六七颗星,几何分布还差,漂移自然更大。
- 功耗策略:手表为了省电,定位芯片常采用"间歇性睡眠"(占空比)策略,每秒只工作约 200 毫秒,丢失了大量多普勒频移信息,导致速度不准、轨迹呈锯齿状。
- 传感器质量:手机的陀螺仪、加速度计精度通常高于手表,在卫星信号短暂丢失时能靠惯性推算补位。
- 频段:支持 L1+L5 双频的旗舰设备,用 L5 的长波长信号抗多径反射,精度显著优于单频设备。
开发启示很直接:做运动轨迹记录,要给手表端更低的定位更新间隔(用续航换精度);做导航应用,别指望消费级设备给你米级以下的承诺。
二、基站定位:城市里随叫随到的"兜底"

卫星定位依赖头顶开阔的天空,进了地铁、商场、地下车库就抓瞎。这时基站定位顶上来了——只要有手机信号的地方就能用。它的演进分三代。
第一代:Cell ID(小区识别码)。 运营商把每个基站覆盖范围看成一个"小区",分配唯一编号。手机注册到网络,系统就知道你挂在哪个基站下,直接把基站坐标返回给你。精度完全取决于基站密度:城市密集区微基站覆盖半径 200–500 米,偏远农村一个基站覆盖 10 公里,误差就是 10 公里。优点是瞬间完成、几乎不耗电。
第二代:TDOA(到达时间差)。 当手机同时被多个基站"看到"时,可以测出信号到达两个基站的时间差。时间差恒定,意味着手机落在以这两个基站为焦点的双曲线上;引入第三个基站,两条双曲线一交,位置就出来了。它不测绝对时间,做差抵消了手机钟差,是 4G/5G 网络的主力方案(如 OTDOA),城市密集区精度可达 50–150 米。
第三代:AoA(到达角)+ Massive MIMO。 5G 基站天线阵列动辄几十上百根,能精确测出信号到达的水平角和俯仰角,结合距离估算(TA 时间提前量),一个基站就能画出一条"方向射线 + 距离",理论精度可达亚米级。代价是基站硬件必须升级支持。
基站定位最大的局限是精度受制于基站密度,到了海上、荒漠就退化回 Cell ID 模式,误差以公里计。但在城市里,它是定位速度的保障——也是 A-GNSS 得以运转的通道。
三、Wi-Fi 与蓝牙:室内定位的主角
进了室内,卫星失效、基站变稀,但 Wi-Fi 和蓝牙信号密布。这两种技术原理同源,都依赖"固定锚点",但工程实现上有本质分野。
3.1 Wi-Fi:一张靠众包养大的指纹地图
很多人想当然地以为 Wi-Fi 定位是"测信号强度、画圆求交点"。现实中商业方案几乎不这么做——Wi-Fi 信号穿墙衰减太离谱,用公式算距离误差能到几十米。真正的主流是指纹定位(Fingerprinting):
把手机扫描到的"MAC 地址 + 信号强度"列表(比如 {MAC-A:-45dBm, MAC-B:-60dBm, MAC-C:-78dBm})当成一个指纹,去数据库里找最相似的历史采样点。这更像人脸识别,而不是三角测量。匹配算法通常是 KNN(找最相似的 K 个点做加权平均)或贝叶斯推断(算指纹在每个地理网格上的出现概率)。
那么问题来了:这张庞大的指纹数据库哪来的?早期靠谷歌、苹果的街景车沿街采集,只能覆盖路边。现在靠众包:每一位开启定位服务的用户都是免费的采集员。手机在室外收到 GPS 信号时,会把周围扫到的所有 Wi-Fi MAC 地址、信号强度连同精确经纬度一起匿名上报。海量用户的"投票"让系统不仅知道某个路由器在哪,还能画出它的信号覆盖范围。用的人越多,地图越精细,定位越准——这是 Wi-Fi 定位最妙的地方。
这套系统还内建了防污染机制:
- 相似度替代相等:信号随时波动,系统只做"最相似 Top-N 点"的加权平均,返回的是一个计算出的重心,而不是某条历史记录的坐标。
- 移动热点排除:某个 MAC 若在几小时内出现在相距数十公里的位置,会被判定为移动热点(车载 Wi-Fi 之类),在匹配中直接降权剔除,防止位置被一辆路过的车拖走。
- 质量筛选:高速行驶中上报的 Wi-Fi 扫描与 GPS 坐标不匹配,属于脏数据。后台跑聚类算法,只有当大量用户在连续多天里对同一路由器上报了相近的强度,才置信它的位置并更新主库。
还有一个开发盲区值得点出:手机没连 Wi-Fi,也照样能被 Wi-Fi 定位。 只要系统里开着"位置信息扫描",底层 Wi-Fi 芯片就在被动监听周围路由器的信标帧,不需要密码、不耗流量,拿到 MAC 列表后通过蜂窝数据上传换位置。这也是为什么关掉 Wi-Fi 后定位明显变慢。
3.2 蓝牙:从"指纹"到"测向"
蓝牙定位与 Wi-Fi 定位同宗同源——都靠固定锚点(蓝牙信标 Beacon)和指纹匹配。最早的 iBeacon 方案本质上就是一张"信标 MAC + RSSI"的指纹地图。但蓝牙有两个质变。
第一,信号特性更利于测距。蓝牙信标发射功率极低(1–10mW),覆盖只有 10–30 米,穿墙能力弱——这在工程上反而是优点:你收到的蓝牙信号绝大多数是直射路径,受反射干扰极小,RSSI 换算距离的公式比 Wi-Fi 可靠得多。
第二,蓝牙 5.1 引入了 AoA/AoD(到达角/出发角)测向。信标端改用阵列天线,设备发出的信号到达不同天线时有微小相位差,芯片算出差就能得到方位角和俯仰角。一个支持 AoA 的信标即可确定一条指向你的射线,再结合距离估算,就能实现亚米级精度。这不再是"指纹匹配",而是回到了物理几何测距。代价是:指纹方案零部署成本(复用现有路由器),AoA 方案需要额外铺设专用信标阵列,且要求设备硬件支持蓝牙 5.1。
Wi-Fi 和蓝牙定位的共性也很明显:它们都是"人类社会活动的衍生产物",靠众包数据画地图。野外没人部署锚点、数据库一片空白,这两兄弟就彻底失灵——野外的主力仍然只有卫星,以及接下来要讲的"盲推"。
四、传感器辅助:没有信号时的"盲推"
假设你走进一条长隧道,卫星、基站、Wi-Fi 全部失联,定位图标却还在移动。这就是运动传感器(惯性导航)在工作:它不依赖任何外部信号,只靠测量自身的加速度和角速度,从已知起点出发一路"盲推"。
4.1 两步积分算出位移
手机里的加速度计测量三维空间上的线性加速度(包括重力),陀螺仪测量绕三个轴的旋转角速度。算法的工作分两步:
- 姿态解算:先把陀螺仪积出角度,结合加速度计感知的重力方向,融合出设备当前的朝向——手机横着放和竖着放,"前"是完全不同的方向。
- 航位推算:从加速度中减去重力分量,对运动加速度积分一次得到速度,再积分一次得到位移,叠加到上一个已知坐标点上。
这就是"盲推"的完整数学过程。它不依赖任何基础设施,隐蔽性极强——潜艇在水下靠的就是它。
4.2 阿喀琉斯之踵:误差随时间爆炸
加速度计和陀螺仪存在零偏(静止时输出不为零)和噪声。微小的误差经过一次积分变成线性增长的速度误差,经过两次积分就变成二次增长的位置误差。顶级手机 IMU 在没有外部修正的情况下,一分钟内推算的位置误差可达几百米——你在隧道里走直线,出隧道时定位点已经飘到隔壁街道。
工程上的救赎有两个:一是零速修正(ZUPT)——算法通过加速度计的方差判断设备是否静止(等红灯、脚步落地那一瞬),一旦判定静止就强制把速度归零,斩断误差累积;二是定期校准——传感器只负责填补两次绝对定位之间的空档,一旦 GPS 重新捕获信号,就把位置"拽"回正确坐标,重置惯性误差。
4.3 顺带聊聊 MEMS 芯片

手机里没有传统意义的机械陀螺仪(那玩意儿体积比手机还大)。现代设备用的是 MEMS(微机电系统) 芯片——在指甲盖大的硅片上,用光刻机刻出一个微米级的"弹簧-质量块"结构。设备加速或倾斜时,质量块因惯性滞后于外壳,与固定电极的间距变化引起电容变化,芯片测电容即测加速度;陀螺仪则利用科里奥利力——一个持续振动的质量块在旋转时会被施加垂直方向的力,同样转化为电容变化。芯片工艺无法避免零偏,且零偏随温度漂移,这也是传感器数据必须交给融合算法"消化"的根本原因。
4.4 组合导航:松耦合与紧耦合
实际产品中,传感器从不单独作战,它和绝对定位源组成组合导航:
- 松耦合(手机常用):GPS 每秒给一个位置,IMU 在间隙里填充轨迹让图标更顺滑;信号丢失时短暂接管,恢复后立即被拽回并重置误差。
- 紧耦合(汽车、无人机常用):不再只消费 GPS 的位置结果,而是把多普勒频移、载波相位等原始观测值与 IMU 深度耦合滤波。即使卫星被短暂遮挡,车辆仍能保持车道级精度。
五、把它们串起来:一次定位请求的完整旅程
现在把四根支柱放回真实场景,看看现代设备一次"定位成功"背后发生了什么。
场景一:在户外打开导航。 冷启动时,基站先用 Cell ID 给出一个粗略位置(误差几百米),同时通过 A-GNSS 从服务器拉来星历。接收机拿到星历后秒级捕获卫星,开始伪距解算,坐标从"几百米"收敛到"几米"。过程中陀螺仪和加速度计持续记录运动,用卡尔曼滤波把卫星散点和惯性推算融合成一条平滑轨迹——过立交桥信号遮挡的那几秒,蓝点靠惯性撑着没乱跳。
场景二:走进商场。 卫星信号衰减到不可用,基站变稀。系统检测到环境变化,切换到 Wi-Fi/蓝牙指纹匹配:扫描周围几十个热点,上传指纹,服务端在众包数据库里算出位置(10–20 米),配合气压计校准楼层。这一步就是导航 App 商场内"一键寻店"的基础。
场景三:进入地铁隧道。 一切外部信号消失,定位完全交给惯性导航 + 零速修正。隧道短则误差可接受,隧道长则出站瞬间被 GPS 重新校准,"啪"地拽回真实位置——如果你见过地图 App 里图标在出隧道时瞬移,就是这个机制在起作用。
场景四:自驾跑长途。 车机用双频 GNSS + 差分(RTK)拿到车道级横向精度,靠战术级 IMU + 轮速脉冲在无星状态下继续航位推算,再用摄像头识别车道线做地图匹配,把定位点"吸附"到正确的车道上。这就是"导航知道你在主路还是辅路"的原因。
开发实践清单
把上面这些落到工程里,几条经验值得写进团队规范:
- 坐标系先行。统一约定 WGS-84 / GCJ-02 / BD-09,在接入层做转换收敛,别让"差几百米"的问题追查半天。
- 区分"粗定位"与"精定位"。用系统的融合定位接口(Android 的 FusedLocationProvider、iOS 的 Core Location)而不是裸调 GPS,让系统在功耗和精度之间做权衡。
- 声明精度预期。室内外场景分开处理:室外可承诺 10 米内,室内别承诺高于 Wi-Fi/蓝牙能力,必要时自建蓝牙 AoA 或 UWB 基站。
- 别裸用传感器。惯性数据必须配绝对定位校准,否则误差会以二次方的速度失控。
- 理解设备差异。手表、低端机、双频旗舰的定位能力不在一个量级,测试时要覆盖"低端设备 + 复杂环境"这种最坏组合。
写在最后
回到开头那个蓝点。它落在你脚下这件事,背后是四套互不相干的技术在接力:卫星在太空广播时间,基站在地面递送数据,Wi-Fi 与蓝牙用众包指纹描绘室内,传感器在信号真空里默默推算。它们各自的精度都有限,合在一起才构成了现代设备"走到哪都知道自己在哪"的体验。
理解了这套系统,再回头看那些"定位不准"的 bug——坐标系没对齐、室内切场没触发、传感器误差没校准——就都有了清晰的排查方向。定位不是一行 API 的事,它是一整套系统工程,而认识它,是做好它的第一步。
©本文版权归作者所有,未经授权禁止转载。如需转载,请注明原文出处及链接。
Comments
No comments yet
Be the first to comment!