3

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

在巡回赛期间记录 GPS。

圈数是车辆通过赛道开始/结束的次数。

4

2 回答 2

5

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

考虑以下算法: 找到位于轨道中间某处的点 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 为正,则观察者逆时针旋转,如果为负,则观察者顺时针旋转。观察者旋转的角度是

theta(i, i+1) = arcsin( P / (长度(x(i) - C) * 长度(x(i+1) - C)))

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

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

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

对于真正的极客来说,这只是使用定义计算车辆绕 C 的路径的缠绕数

于 2011-01-30T02:40:05.543 回答
3

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

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

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

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

于 2011-01-29T20:41:38.010 回答