R Roam 获取 Roam

GPS 爬升为什么是错的,气压计又修好了什么

垂直方向是卫星接收机测得最差的那个量,而爬升的求和方式,恰好把这个弱点放大成一个很大、而且永远是正的误差。为什么气压传感器是更合适的仪器,以及它自己会在哪里失手。

你沿着运河骑了一圈平路。App 告诉你,你爬升了四百米。你这趟路一点问题都没有;是那个数字被拼出来的方式,保证了它一定偏高。

垂直方向是最弱的那个轴

卫星接收机是从它能听见的那些卫星的几何分布里解出你的位置的,而这个分布天生就是偏的。水平方向上,卫星在你四周,来自相反方向的误差会部分抵消。垂直方向上,每一颗卫星都在你上方——本该在你下方的那些,被地球挡住了——另一侧没有任何东西可以拿来抵消。结果是一条几十年来一直成立的经验法则:垂直误差大约是水平误差的两到三倍。

还有第二个、完全独立的问题。GNSS 原生给出的是相对一个数学椭球面的高度,而不是相对海平面的高度,这两者之间的差在全球范围内可以差出几十米。接收机会做大地水准面改正,而各家用的模型并不一样,这也是同一个山顶上两台设备对它的海拔各执一词的部分原因。

为什么一累加就更糟,而且只往一个方向糟

爬升不是一次测量,它是一次求和:把高度采样一个一个走过去,把每一次上升加起来。这个操作有一个很不走运的性质——噪声也会贡献进去,而且只会往正的方向贡献。

假设真实高度完全是平的,而你的采样在上下几米之间抖动。每一次往上抖,被算成爬升。每一次往下抖,什么都不算,因为下降并不会从爬升里减掉。一秒采一次,采两个小时,一个仅仅是有噪声的传感器,就能在一条完全水平的河堤路上凭空造出几百米爬升。

这就是各家 App 都会设一个阈值、忽略小于若干米的变化的原因。这确实有用,同时也带来了它自己的误差:阈值抬得足够高到能压住噪声,你就同时不再统计那些构成起伏路的、真实存在的小上坡。

气压计的做法不一样在哪里

近几代 iPhone 里都有一个气压传感器。气压随高度下降的规律很清楚——在海平面附近,大致是每一百帕对应八到九米——而这个传感器灵敏到能分辨远小于一米的变化。

更要紧的是,它是一件完全独立的仪器。它的误差跟卫星几何分布、跟城市峡谷、跟树冠遮挡、跟大地水准面模型都没有关系,而它的短期噪声远小于 GNSS 的垂直噪声。对于「我此刻是不是在往上走」这个具体任务——而爬升这个数字问的其实就只有这一个问题——它是好得多的传感器,差距很大。

Roam 读的就是这个气压传感器,在每一个点上把气压高度和 GPS 高度并排存下来,只要有气压值就优先用它。两列数据都保留,什么都不丢。

气压计失手的地方

它测的是气压,不是高度,而气压变化的原因里,有很多跟你毫无关系。

明智的做法是用气压计来算爬升,同时把任何一个单独的绝对高度都当成近似值看待。在 iOS 上,这个传感器还挡在「运动与健身」权限后面,这意味着一个 App 可能在表面上什么都没坏的情况下,失去对它的访问权。

没人会注意到的那种故障

有意思的 bug 不是一个错的数字,而是一个缺的数字长得跟正常数字一模一样。如果某一趟路的气压列整列都是空的,一个直接退回去用 GPS 高度的 App,会报出一个看上去挺合理的数字,而屏幕上没有任何地方会提示你:那个好传感器从头到尾没参与过。

这件事在这个 App 自己的历史上真发生过:某一趟路的九千多个点上,气压高度全是空的,而且没有任何办法判断五种可能的原因里到底是哪一种——那个传感器压根就没有被构造出来,而一个不存在的传感器和一个不出声的传感器,从外面看是一模一样的。修复的办法是给每一种原因起个名字,并在走到那条分支的当下就把它记下来:这台设备没有这个硬件、权限从没申请过、权限被拒绝、被设备管理描述文件或家长控制限制、在 App 自己的设置里被关掉了,或者启动了却失败了。这些原因的解法各不相同,其中两种,开关就握在骑车的人自己手里。

你自己的那些数字该怎么办

  1. 骑一条平路,看看它报出来的爬升。在真正平坦的地面上,一小时里超出几十米的那部分,就是被累加起来的噪声。
  2. 同一趟路上带两台设备比一比。总数会不一样,这是正常的;按预期,气压那一台会更低,也更稳。
  3. 不要把不同 App 之间的爬升当成一个测量量来比。阈值不同、平滑方式不同,从一模一样的数据里也会得出不一样的答案。
  4. 把绝对高度当成一个粗略数字,把爬升当成可靠的那一个——这跟大多数人的直觉正好相反。

常见问题

为什么我的 GPS 爬升高得离谱?

因为爬升是所有上升变化的求和,而 GPS 的垂直噪声只往上贡献。每一次往上抖都被算成爬升,每一次往下抖什么都不算,所以一个小时的含噪采样,就能在平地上造出爬升来。

气压高度比 GPS 高度更准吗?

算爬升的话,要准得多——它能分辨亚米级的变化,而且它的误差跟卫星几何分布无关。但换成绝对高度,它就只和自己的校准一样准,因为天气本身就在推动它所测量的那个气压。

天气会影响气压高度吗?

会。一次锋面过境能让海平面气压在一天里变化到读出一百米以上。短途出行里这点漂移无关紧要;多日行程里它就要紧了,这也是为什么这个传感器被用来判断相对变化,而不是绝对高度。

为什么同一趟路,两个 App 报出来的爬升不一样?

传感器不同、噪声阈值不同、平滑方式也不同。爬升不是一次测量,而是一个算法的输出,所以同一份原始数据合理地产生不同的总数,而跨 App 去比这个数字,意义非常有限。

一个不会把这趟弄丢的记录 App

Roam 每收到一个定位点就立刻写进手机,和当前的累计数字在同一个事务里落盘;信号断掉的那一段标成断的,不拿一条直线糊过去;爬升读的是气压计,不是 GPS 高度。没有账号,不用登录,不同步。完整记录一趟、看它、回放它,都是免费的。

在 App Store 下载

相关文章

全部文章