【问题标题】:Counting number of laps from GPS coordinate recordings从 GPS 坐标记录中计算圈数
【发布时间】:2011-06-17 19:33:02
【问题描述】:

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

在巡回赛期间记录 GPS。

圈数是车辆通过赛道起点/终点的次数。

【问题讨论】:

  • 那里有很多 GPX 解析库。我推荐了名为“GPX”的 Haskell 库。
  • 您能描述一下您拥有的数据吗?它是按时间排序的一组点吗?你如何定义一圈?
  • 感谢您的快速cmets,我已将信息添加到我的问题中:)

标签: algorithm geometry gps gpx


【解决方案1】:

假设轨道足够小,我们可以假设这些点位于一个平面上,例如,我们可以忽略地球的曲率。在这种情况下,您可以将所有点转换为平面中的点,例如,不带 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) = arcsin( P / (长度(x(i) - C) * 长度(x(i+1) - C)))

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

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

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

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

【讨论】:

  • 我是否正确地得出结论,该算法假定课程不会在任何地方重复自己?
  • 双退是什么意思?只要路线围绕中心点,它就应该起作用,即使有时由于车辆在错误的方向上行驶了一段时间,theta 是负数。
  • 通过“双退”,考虑沿着“U”形周边的路线。
  • 视情况而定。您能否在 U 形内选择一个点,使内周和外周始终与该点分开,即使存在噪声也是如此?
  • 我将更彻底地研究您在答案中提供的“缠绕数”链接,看看我是否可以先回答我自己的问题。
【解决方案2】:

该解决方案需要一些试验和错误才能看到有效的方法,因为它在很大程度上取决于数据质量以及您拥有多少数据点。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多