计算用户随时间的步行距离
Calculating walking distance for user over time
我正在尝试使用 GPS 跟踪用户在我的应用程序中随时间移动的距离。我有了基本的想法,所以我存储了以前的位置,当发送新的 GPS 位置时,我计算它们之间的距离,并将其添加到总距离中。到目前为止一切顺利。
这个简单的实现有两个大问题:
- 由于 GPS 不准确,当用户移动时,GPS 点将不是一条直线,而是更多的 "zig zag" 模式,使用户看起来移动的时间比实际移动的时间长。
- 同样是精度问题。如果 phone 只是躺在 table 上并轮询 GPS 位置,答案通常每次都不同几米,所以即使 phone 正在铺设,你也会看到米数开始累积还是。
这两种情况都使 coruse 的跟踪变得无用,因为我提供的数字现在已经足够准确了。
但我想这个问题是可以解决的,因为有很多健身追踪器和类似的东西可以从 GPS 追踪距离。我猜他们会在 GPS 值之间进行某种插值之类的操作?我想这也不是 100% 准确,但可能足以满足我的使用需求。
所以我所追求的基本上是一种算法,我可以在其中输入我的 GPS 位置,并获得尽可能好的行进距离近似值。
请注意,我不能假定用户会沿着道路行驶,因此我不能为此使用 Google 距离矩阵 API 或类似矩阵。
这是 GPS 接收器生成的位置数据的常见问题。我使用的典型消费级接收器的位置精度定义为 2.5 米的 CEP。这意味着对于 "perfect" 天空视图环境中的固定接收器,随着时间的推移,50% 的定位点将位于半径为 2.5 米的圆圈内。如果您查看接收器报告的位置,它似乎在真实位置周围随机游荡,有时会远离其真实位置数米。如果您简单地整合样本之间移动的距离,那么您将获得非常大的表观距离 travelled.for 固定设备。
我已经非常成功地用于车辆里程表功能的简单算法如下
for(;;)
{
Stored_Position = Current_Position ;
do
{
Distance_Moved = Distance_Between( Current_Position, Stored_Position ) ;
} while ( Distance_Moved < MOVEMENT_THRESHOLD ) ;
Cumulative_Distance += Distance_Moved ;
}
MOVEMENT_THRESHOLD的值会影响最终结果的准确性。如果该值太小,则固定接收器执行的一些随机漂移将包含在最终结果中。如果该值太大,则所采用的路径将近似为一系列直线,每条直线都与阈值一样长。当接收器的路径偏离该直线段时,接收器行进的额外距离将被忽略。
与车辆里程表相比,这种方法的准确性非常好。必须测试它与行人的配合情况。人的问题在于他们可以比车辆做出更急的转弯,从而导致直线近似的误差更大。建筑物、车辆等造成的天空视野遮挡和信号多径问题也是长期存在的问题,可导致数十米的位置误差。
我正在尝试使用 GPS 跟踪用户在我的应用程序中随时间移动的距离。我有了基本的想法,所以我存储了以前的位置,当发送新的 GPS 位置时,我计算它们之间的距离,并将其添加到总距离中。到目前为止一切顺利。
这个简单的实现有两个大问题:
- 由于 GPS 不准确,当用户移动时,GPS 点将不是一条直线,而是更多的 "zig zag" 模式,使用户看起来移动的时间比实际移动的时间长。
- 同样是精度问题。如果 phone 只是躺在 table 上并轮询 GPS 位置,答案通常每次都不同几米,所以即使 phone 正在铺设,你也会看到米数开始累积还是。
这两种情况都使 coruse 的跟踪变得无用,因为我提供的数字现在已经足够准确了。
但我想这个问题是可以解决的,因为有很多健身追踪器和类似的东西可以从 GPS 追踪距离。我猜他们会在 GPS 值之间进行某种插值之类的操作?我想这也不是 100% 准确,但可能足以满足我的使用需求。
所以我所追求的基本上是一种算法,我可以在其中输入我的 GPS 位置,并获得尽可能好的行进距离近似值。
请注意,我不能假定用户会沿着道路行驶,因此我不能为此使用 Google 距离矩阵 API 或类似矩阵。
这是 GPS 接收器生成的位置数据的常见问题。我使用的典型消费级接收器的位置精度定义为 2.5 米的 CEP。这意味着对于 "perfect" 天空视图环境中的固定接收器,随着时间的推移,50% 的定位点将位于半径为 2.5 米的圆圈内。如果您查看接收器报告的位置,它似乎在真实位置周围随机游荡,有时会远离其真实位置数米。如果您简单地整合样本之间移动的距离,那么您将获得非常大的表观距离 travelled.for 固定设备。
我已经非常成功地用于车辆里程表功能的简单算法如下
for(;;)
{
Stored_Position = Current_Position ;
do
{
Distance_Moved = Distance_Between( Current_Position, Stored_Position ) ;
} while ( Distance_Moved < MOVEMENT_THRESHOLD ) ;
Cumulative_Distance += Distance_Moved ;
}
MOVEMENT_THRESHOLD的值会影响最终结果的准确性。如果该值太小,则固定接收器执行的一些随机漂移将包含在最终结果中。如果该值太大,则所采用的路径将近似为一系列直线,每条直线都与阈值一样长。当接收器的路径偏离该直线段时,接收器行进的额外距离将被忽略。
与车辆里程表相比,这种方法的准确性非常好。必须测试它与行人的配合情况。人的问题在于他们可以比车辆做出更急的转弯,从而导致直线近似的误差更大。建筑物、车辆等造成的天空视野遮挡和信号多径问题也是长期存在的问题,可导致数十米的位置误差。