Algorithm 从GPS坐标记录计算圈数

Algorithm 从GPS坐标记录计算圈数,algorithm,geometry,gps,gpx,Algorithm,Geometry,Gps,Gpx,我有一个GPX文件,其中包含大量的点(按时间排序的经度和纬度),如何计算我的集合包含多少圈 在赛道比赛过程中会记录GPS 圈数是指车辆通过电路开始/结束的次数。解决方案需要一些尝试和错误,以了解哪些方法有效,因为这在很大程度上取决于数据质量和您拥有的数据点数量 如果以高频率获取数据点,那么使用测试就足够了。如果两个相邻数据点形成的线与赛道上的终点线相交,则可以将其计为一圈。然而,当数据点相距太远时,这将失败。如果一辆车在终点线离开赛道,它也可能失败,除非你仔细考虑你的解决方案 更一般的解决方案是

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

在赛道比赛过程中会记录GPS


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

解决方案需要一些尝试和错误,以了解哪些方法有效,因为这在很大程度上取决于数据质量和您拥有的数据点数量

如果以高频率获取数据点,那么使用测试就足够了。如果两个相邻数据点形成的线与赛道上的终点线相交,则可以将其计为一圈。然而,当数据点相距太远时,这将失败。如果一辆车在终点线离开赛道,它也可能失败,除非你仔细考虑你的解决方案

更一般的解决方案是将轨迹分成两个多边形:每个多边形代表轨迹的一半。使其覆盖范围包括偏离轨道。然后使用测试确定哪些数据点位于轨道的哪一半。然后迭代通过这些点,并记录汽车从一半移动到另一半的时间。每一秒的过渡都应表示一圈。然而,如果赛车旋转失控,在两半之间摆动,而没有绕整圈跑,这将失败


您可以通过在转换之间强制使用最少数量的数据点来解决此问题。另一个想法是将轨迹分成三个多边形,并确保汽车始终“向前”移动。

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

考虑下面的算法:找到点C=(Cx,Cy),它位于轨道中间的某个地方,例如所有点的质心。确切的位置无关紧要。然后想象一个观察者站在C点,并且总是旋转面对车辆。您需要计算观察者在车辆行驶时旋转的次数

为此,您需要能够找到当车辆在点列表中的两个相邻点p(i)和p(i+1)之间行驶时,观察者将旋转的有符号角度。这与查找向量P(i)-C和P(i+1)-C之间的有符号角相同,可以使用。这特别容易,因为我们有二维点。我们有

p=(x(i)-Cx)*(y(i+1)-Cy)+ (x(i+1)-Cx)*(y(i)-Cy)

如果p为正,则观察者逆时针旋转;如果p为负,则观察者顺时针旋转。观察者旋转的角度为

θ(i,i+1)=弧心(p/ (长度(x(i)-C)*长度(x(i+1)- C) ))

其中θ(i,i+1)是正的还是负的,取决于观察者旋转的方向

这里我们使用的是相邻点靠得很近,因此观察者只是在相邻点之间旋转一个小于pi/2的小角度

为了找到观察者旋转的总量,只需将路径起点到终点的所有θ相加,确保保留θ的符号,以防车辆因某种原因向后移动。假设θ以弧度为单位,电路的总数就是θ之和除以2*pi


对于真正的极客来说,这只是使用定义计算车辆在C周围的路径。

有很多GPX解析库。我推荐了名为“GPX”的Haskell库。你能描述一下你拥有的数据吗?它是一组按时间排序的点吗?如何定义圈数?感谢大家的快速评论,我在问题中添加了一些信息:)我得出的结论正确吗?这个算法假设课程不会在任何地方自行折返?您所说的折返是什么意思?只要路线围绕中心点,它应该工作,即使有时θ是负的,因为车辆在错误的方向上有一段时间。通过“双后退”,考虑一个遵循“U”的周长的过程。这取决于。你能在U内选择一个点,这样即使在有噪音的情况下,内周长和外周长也始终与该点分开吗?我将更彻底地研究你在答案中提供的“绕组编号”链接,看看我是否能首先回答我自己的问题。