2011-01-29 37 views
3

我有一个GPX文件,其中包含大量的点(经度和纬度按时间排序),我如何计算我的集合包含多少圈?从GPS坐标记录中计算圈数

在赛道赛期间记录GPS。

圈数是车辆通过电路开始/结束的次数。

+0

这里有很多GPX解析库。我推荐名为“GPX”的Haskell库。 – 2011-01-29 17:13:05

+0

你能描述你的数据吗?这是按时间排序的一组点吗?你如何定义一圈? – marcog 2011-01-29 17:21:08

回答

2

该解决方案将需要一些试验和错误来看看哪些工作,因为它很大程度上取决于数据质量和您拥有多少数据点。

如果以高频率拍摄数据点,那么使用line-line intersection测试可能会足够好。如果由两个相邻数据点形成的线与赛道上的终点线相交,那么您可以将其视为一圈。但是,当数据点距离太远时,这会失败。如果汽车在终点线上离开赛道,也可能会失败,除非您对解决方案非常小心。

更通用的解决方案是将轨道分成两个多边形:每个代表轨道的一半。使他们的报道包括偏离轨道。然后使用point in polygon测试来确定哪些数据点位于轨道的哪一半。然后遍历点并记下汽车何时从一半移动到另一半。每第二次过渡应该表示一圈。然而,如果赛车失去控制并且在两圈之间摆动而没有绕完整圈,则这将失败。

您可以通过在转换之间执行最少数量的数据点来解决此问题。另一个想法是将赛道分成三个多边形并确保赛车始终向前移动。

4

假设轨道足够小以至于我们可以假设这些点位于一个平面上,例如我们可以忽略地球的曲率。在这种情况下,您可以将所有点转换为平面中的点,例如,没有z坐标的P(i)=(x(i),y(i))。

考虑以下算法:找到位于轨道中间某处的点C =(Cx,Cy),例如,所有点的质心。确切的位置并不重要。然后设想一个观察者站在C点,并始终旋转以面对车辆。您想要统计观察者在车辆行驶时转动多少次。

要做到这一点,您需要能够找到观察者随着车辆在点列表中两个相邻点P(i)和P(i + 1)之间移动而旋转的带符号角度。这与找到向量P(i)-C和P(i + 1)-C之间的符号夹角相同,这可以使用cross product来完成。这是特别容易的,因为我们有二维点。我们有

P =(X(I) - CX)*(Y(I + 1) - CY)+ (X(I + 1) - CX)*(Y(I) - CY)

如果P为正则观察者逆时针旋转,如果是负值,则观察者正在顺时针旋转。观察者旋转角度是

THETA(I,I + 1)=反正弦(P/ (长度(X(ⅰ) - C)*长度(X(I + 1) - C)) )

其中theta(i,i + 1)取决于观察者正在旋转的方向而为正或负。

在这里,我们使用的是相邻点靠近在一起,以便观察者只是在相邻点之间小于π/ 2的小角度旋转。

要查找观察者旋转的总量,只需从路径的开始到结束加总所有的theta,并确保在车辆由于某种原因向后移动时保留theta的符号。假设theta是弧度的,电路的总数就是thetas除以2 * pi的总和。

对于真正令人讨厌的,这只是使用定义来计算C周围车辆路径的winding number