3、轨迹数据采集:GPS数据格式(NMEA-0183)、基站定位、WiFi定位、惯性导航(IMU)数据融合

各位同学,咱们今天聊点实在的。

做轨迹回放,第一步就是拿到数据。数据怎么来?说白了,就是定位。但现实世界不是理想实验室,你不可能指望一种定位技术打天下。我做了这么多年轨迹回放,踩过的坑比走过的路还多。今天就把几种主流的数据采集方式,掰开了揉碎了讲给你听。

3.1 GPS数据格式:NMEA-0183

GPS 是最常见的定位方式。但 GPS 芯片吐出来的数据,不是直接给你经纬度就完事了。它有一套自己的语言,叫 NMEA-0183 协议。

嗯,这里要注意。NMEA 是一套标准,几乎所有 GPS 模块都支持。它的数据格式是纯文本,以 $ 开头,以 <CR><LF> 结尾。每一条语句叫一个 Sentence。

我个人最常用的是 $GPGGA 和 $GPRMC 这两条。前者给定位信息,后者给速度和时间。

举个例子,一条典型的 GGA 语句长这样:

$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47

看着乱是吧?我拆开给你看:

字段 含义 示例值
$GPGGA 语句头,GGA 定位数据 -
123519 UTC 时间,12:35:19 12:35:19
4807.038,N 纬度,北纬 48°07.038' 48.1173°
01131.000,E 经度,东经 11°31.000' 11.5167°
1 定位质量,0=无效,1=单点,2=差分 1
08 可见卫星数 8
0.9 水平精度因子(HDOP) 0.9
545.4,M 海拔高度,单位米 545.4
我的小技巧: 解析 NMEA 时,别只看经纬度。一定要检查定位质量字段。如果值是 0,说明定位无效。我曾经在项目里没做这个检查,结果轨迹图上出现了一个跳到非洲的点,排查了半天才发现是 GPS 信号丢失后芯片吐了脏数据。

3.2 基站定位:没 GPS 时的救命稻草

GPS 信号不好怎么办?比如地下车库、隧道、高楼林立的街道。这时候基站定位就派上用场了。

基站定位的原理很简单:手机同时连接多个基站,根据信号到达的时间差(TDOA)或者信号强度(RSSI)来估算位置。精度嘛,说实话,在城市里大概 50-200 米,郊区可能更差。

为什么精度差?因为基站的位置是固定的,而且信号会受建筑物遮挡、多径效应影响。你想想看,在密集的楼群里,信号反射来反射去,算出来的位置能准吗?

但基站定位有个好处:覆盖广。只要有手机信号,就能定位。我在做物流轨迹项目时,很多货车跑偏远山区,GPS 经常掉线。这时候全靠基站定位补数据,虽然精度差,但至少知道车大概在哪个县哪个镇。

避坑指南: 我曾经遇到过一个问题:基站定位返回的经纬度,在跨基站切换时会出现「跳点」。比如你从 A 基站覆盖区走到 B 基站,位置会突然从 A 附近跳到 B 附近。这在轨迹回放里非常明显,必须做平滑处理,否则轨迹看起来像瞬移。

3.3 WiFi 定位:室内定位的利器

到了室内,GPS 基本废了,基站定位精度又不够。这时候 WiFi 定位就香了。

WiFi 定位的原理是:每个 WiFi 热点(AP)都有唯一的 MAC 地址。手机扫描周围的 AP,把它们的 MAC 地址和信号强度上报给服务器。服务器有一个指纹库,里面存着每个位置能扫到的 AP 列表和信号强度。通过匹配,就能算出位置。

精度怎么样?如果指纹库建得好,可以达到 5-15 米。比基站强多了。

但有个前提:指纹库需要提前采集。说白了,你得先拿着设备在商场里走一遍,把每个角落的 WiFi 信号都记录下来。这是个苦力活。

我记得有一次给一个大型商场做室内导航,光采集指纹数据就花了三天。但效果确实好,用户反馈定位很准。

核心要点: WiFi 定位依赖指纹库。指纹库的密度和更新频率,直接决定定位精度。如果商场里新装了 AP 或者拆了旧 AP,指纹库必须及时更新,否则定位会漂移。

3.4 惯性导航(IMU):最后的倔强

如果 GPS、基站、WiFi 全都没信号呢?比如地下停车场、电梯、隧道深处。这时候只能靠 IMU 了。

IMU 包含加速度计和陀螺仪。加速度计测加速度,陀螺仪测角速度。通过积分,可以算出位移和姿态。

但这里有个大坑:积分会累积误差。加速度计有零偏,陀螺仪有漂移。你走 10 米,积分出来可能变成 12 米。时间越长,误差越大。

所以 IMU 不能单独用,必须和其他定位方式融合。比如在 GPS 信号好的时候,用 GPS 校准 IMU 的误差。信号丢失后,用 IMU 推算一小段距离,等信号恢复再校准回来。

我做过一个地下车库的轨迹项目,车进车库后 GPS 就没了。全靠 IMU 推算,配合车库入口处的 WiFi 定位做初始校准。最后轨迹虽然有点飘,但至少能看出车在哪个车位附近停了。

避坑指南: 我曾经在 IMU 数据融合时犯过一个低级错误:忘记处理重力加速度。加速度计测到的加速度包含重力分量,如果不减去,垂直方向会一直有个 9.8 m/s² 的加速度,积分出来的位置会一直往下掉。嗯,这个坑我替你们踩过了。

3.5 数据融合:把鸡蛋放在一个篮子里?不,是放在多个篮子里

上面讲了四种定位方式,各有优缺点。实际项目中,我们不会只用一种。而是用数据融合算法,把多种数据揉在一起,取长补短。

最常用的融合算法是卡尔曼滤波(Kalman Filter)。它的核心思想是:用预测和观测两个步骤,不断修正位置估计。

举个例子:

  • 预测: 上一秒你在 A 点,速度 1 m/s,方向朝北。那我预测这一秒你在 A 点北边 1 米处。
  • 观测: GPS 报了一个位置 B,离预测点有 3 米。
  • 融合: 卡尔曼滤波会根据 GPS 的精度和 IMU 的精度,算出一个加权平均。如果 GPS 精度高(比如 HDOP 很小),就多信 GPS。如果 GPS 信号差,就多信 IMU 的预测。

这样,即使某一种数据突然变差,整体定位也不会崩。

下面这张图,是我总结的四种定位方式在轨迹回放中的融合逻辑:

轨迹数据采集与融合架构 GPS (NMEA-0183) 室外,精度 3-15m 基站定位 广覆盖,精度 50-200m WiFi 定位 室内,精度 5-15m IMU (惯性导航) 短时推算,累积误差 数据预处理 格式解析 → 异常值过滤 → 时间戳对齐 → 坐标系统一 数据融合 (卡尔曼滤波 / 粒子滤波) 加权融合 · 误差修正 · 状态估计 输出:平滑、连续的轨迹数据

你看,从四种数据源开始,经过预处理,再到融合算法,最后输出一条平滑的轨迹。每一步都有坑,每一步都需要经验。

我个人建议,刚开始做轨迹回放的同学,先别急着上卡尔曼滤波。先把每种数据单独吃透,搞清楚它们的特性和误差模型。然后再考虑怎么融合。否则,你连数据为什么飘都搞不清楚,融合出来的结果只会更糟。

一句话总结: GPS 管室外,WiFi 管室内,基站管覆盖,IMU 管短时。融合算法就是那个「和稀泥」的,把各家数据按权重揉在一起,得到最靠谱的结果。

好了,这一章的内容就到这里。数据采集是轨迹回放的地基,地基不牢,后面的一切都是空中楼阁。希望你能把这些知识点消化掉,下次遇到定位不准的问题,至少知道该从哪个方向排查。

可可精品资料库