我正在使用卡尔曼滤波器来跟踪车辆的位置,对于我的测量,我有一个 GPX 文件(WGS84 格式),其中包含有关纬度、经度、海拔和 GPS 给出的每个点的时间戳的信息。使用此数据,我计算了GPS点之间的距离(使用测地线距离和Vincenty公式),并且由于时间戳信息是已知的,因此可以使用点之间的时间差来计算时间增量。由于我们现在有了点之间的距离和时间增量,我们可以计算速度(=点之间的距离/时间增量),然后也可以将其用作卡尔曼的测量输入。
然而,我读到过这只是平均速度,而不是任意给定点的瞬时速度。为了获得瞬时速度,建议必须取移动平均值,并且一些实施方式考虑到在该点的当前时间与第一初始点之间的时间差来直接计算速度。我有点困惑,我需要用哪种方法在python中实现这一点。
>
首先,在我的实现中使用这种方法来计算速度是否正确?(我也阅读了可以使用的多普勒频移,但遗憾的是,我只通过我iPhone上的运行应用程序(Strava)收集GPS数据)
如何从我的实现中计算出每个GPS点的瞬时速度?(方位信息也有必要吗?)
这个计算速度的误差是多少?(由于iPhone的位置本身误差可能约为10米,距离测量误差约为1毫米,并且考虑到我希望焦点尽可能高的精度)
当前实施情况
import gpxpy
import pandas as pd
import numpy as np
from geopy.distance import vincenty, geodesic
import matplotlib.pyplot as plt
"Import GPS Data"
with open('my_run_001.gpx') as fh:
gpx_file = gpxpy.parse(fh)
segment = gpx_file.tracks[0].segments[0]
coords = pd.DataFrame([
{'lat': p.latitude,
'lon': p.longitude,
'ele': p.elevation,
} for p in segment.points])
"Compute delta between timestamps"
times = pd.Series([p.time for p in segment.points], name='time')
dt = np.diff(times.values) / np.timedelta64(1, 's')
"Find distance between points using Vincenty and Geodesic methods"
vx = []
for i in range(len(coords.lat)-1):
if(i<=2425):
vincenty_distance = vincenty([coords.lat[i], coords.lon[i]],[coords.lat[i+1], coords.lon[i+1]]).meters
vx.append(vincenty_distance)
print(vx)
vy = []
for i in range(len(coords.lat)-1):
if(i<=2425):
geodesic_distance = geodesic([coords.lat[i], coords.lon[i]],[coords.lat[i+1], coords.lon[i+1]]).meters
vy.append(geodesic_distance)
print(vy)
"Compute and plot velocity"
velocity = vx/dt
time = [i for i in range(len(dt))]
plt.plot(velocity,time)
plt.xlabel('time')
plt.ylabel('velocity')
plt.title('Plot of Velocity vs Time')
plt.show()
GPX数据参考:https://github.com/stevenvandorpe/testdata/blob/master/gps_coordinates/gpx/my_run_001.gpx
有趣的话题在这里。
若你们计划使用独立的GPS定位输出来计算物体的速度,那个么就要为结果的不确定性做好准备。我相信你知道,在整个过程中存在一定的传播延迟,因此有几个信息需要注意。
1.基本上,取距离和时间,然后根据这些增量计算速度是正确的方法,但正如您所说,这是两次GPS测量之间的平均速度,因为GPS本质上具有一些传播延迟。
2.正如我们所说的,这种计算给出了平均速度与时间和距离的函数关系,从本质上来说,我们无法改变这一点。我们所能做的就是影响gps信号的采样频率,从而提高或降低系统的实时精度。
建议:如果您希望更准确的实时速度数据,我建议您使用手机的陀螺仪传感器并处理其输出。从GPS收集第一个增量(平均)速度,然后检测陀螺仪变化将是继续您的想法的有趣方式。
3.假设您正在使用设备行走(或超高速跑步:))。有一刻,设备正在发送GPS位置请求,但由于一些问题(可能是不良的卫星连接),您得到了10秒延迟的数据响应。出于示例的目的,让我们考虑您在表面:)的绝对平坦部分的绝对直线上行走从收到最后一个请求开始 1 分钟后,您将发送另一个 GPS 位置请求,并且您收到的数据告诉您您已经从上次测量向北走了 300 米,延迟了 2 秒。如果您从发送请求到发送另一个请求来测量它,您会得到您的速度为 300/70 = 4.28 m/s(相当令人印象深刻的速度),但实际可能的情况之一是什么: - 你没有走300米,你走了270米(GPS误差) - 两次测量(接收)之间的时间约为 62 秒 - 你甚至更快,270/62 = 4.84 m/s
使用手机时,你很难测量你实际在以太网上发送请求的时间,或者在毫秒内得到响应的时间,而当你在硬件接近层上操纵传感器时,这些事情很有可能发生。因此,你肯定会失去一些准确性。