为了真正理解 Tracelet 的后台定位引擎是如何运行的,我们必须放弃简单的“对 GPS 执行 ping 操作的计时器”的想法。相反,让我们跟随一位用户——莎拉,一名送货司机——度过她的一天。在此过程中,我们将准确了解 Tracelet 的智能算法(什么)如何解决现实世界的问题(为什么和在哪里)。
场景 1:早上通勤
**探索的概念:**运动检测、自适应采样、弹性
问题
莎拉醒来,做好准备,然后离开了家。如果她睡觉时手机的 GPS 不断以 10 米的间隔进行轮询,那么在她开始轮班之前,她的电池就会没电。一旦她上车并驶上高速公路,10 米的间隔就太频繁了,会淹没数据库,但如果间隔太少,她的路线看起来就像一条穿过建筑物的直线。
Tracelet 如何解决这个问题
-
静止状态(
motion.stopTimeout) 当莎拉睡觉时,她手机的加速计检测到零移动。 5 分钟后(默认stopTimeout),Tracelet 主动完全关闭 GPS 无线电,进入STATIONARY状态。她的电池电量消耗降至接近 0%。就在她拿起手机准备离开的那一刻,加速度计瞬间将Tracelet吵醒了。 -
自适应模式 (
geo.enableAdaptiveMode) 当 Sarah 走向她的车时,Tracelet 使用 10 米的基线distanceFilter。然而,当她以 65 英里/小时的速度并入高速公路时,enableAdaptiveMode会检测到高速并自动将distanceFilter缩放至 50 或 100 米。
*为什么?*因为在高速行驶时,您会沿直线覆盖很多地面。我们不需要 100 个点来在高速公路上画一条直线。
- 弹性乘数 (
geo.elasticityMultiplier) 该参数控制距离过滤器高速拉伸的“积极程度”。如果她是无尽沙漠高速公路上的长途卡车司机,您可以将elasticityMultiplier设置为2.0以进一步扩展过滤器,从而节省更多电池。
场景2:地铁隧道
探索的概念: 航位推算、卡尔曼滤波、里程表精度
问题
莎拉有一个包裹要送到市中心。她停好车,乘坐地铁三站。在地下时,她完全失去了 GPS 信号。普通的位置跟踪器会画一条从地铁入口跳到出口的直线,从而破坏了为她计算的工资单的总距离。
Tracelet 如何解决这个问题
GPS 信号为零(通过 deadReckoningActivationDelay 配置) 10 秒后,Tracelet 意识到她处于 GPS 拒绝的环境中。它激活航位推算引擎,融合来自加速度计、陀螺仪和指南针的数据,根据她最后已知的速度和航向猜测她穿过隧道的路径。
- 里程表准确度阈值 (
geo.filter.odometerAccuracyThreshold) 当她走出地铁时,GPS 信号在摩天大楼周围反弹,给出了精度为 150m 的“模糊”位置。由于她的odometerAccuracyThreshold设置为50米,Tracelet 会记录该点,但“拒绝”将该距离添加到她的总行程里程表中,确保她不会因不准确的“GPS 反弹”距离而付费。
场景 3:办公桌
探索的概念: 电池预算引擎、地理围栏代理
问题
莎拉到达一个大型企业园区,并花了 45 分钟在里面走动,递送包裹。 GPS 信号微弱,电池电量开始不足。
Tracelet 如何解决这个问题
-
电池预算(
android.batteryBudgetPerHour) 您使用batteryBudgetPerHour或2.0%配置了 Tracelet。 Tracelet 注意到由于建筑物内信号微弱,她的电池每小时消耗 3.5%。引擎自动将desiredAccuracy从high降级为medium,并增加distanceFilter,以迫使电池消耗回到 2.0% 预算以下。 -
通过邻近无限地理围栏 公司园区有 500 个单独的交付区(地理围栏)。 iOS 和 Android 本身都将地理围栏限制为 20 或 100 个。 Tracelet 通过仅注册
geofenceProximityRadius内最近的地理围栏来绕过此硬件限制。当 Sarah 穿过校园时,Tracelet 会无缝地将地理围栏加载和卸载到操作系统硬件中,从而实现无限的地理围栏。