从x,y坐标检测左转或右转的算法

时间:2014-12-24 10:12:29

标签: python algorithm graph

我有一个x,y坐标的数据集,从原点开始,每秒记录一次。我可以检测距离,速度,加速度,位移模数。有没有算法来检测左转还是右转?

我目前正在计算每10秒的距离和位移模数,如果位移大约等于距离,那么车辆在直线路径上,但是值会发生变化,然后就会出现转弯。

是否有算法来决定转弯是左转还是右转?我的数据看起来像这样

Time   x     y
 0     0     0
 1    -0.2  -0.1
 2    -0.7   0.9
 3    -0.8   0.9
 4    -1     0.8
 5    -1.1   0.8
 6    -1.2   0.7
 7    -1.4   0.7
 8    -1.9   1.7
 9    -2     1.7
10    -2.2   1.6
11    -2.3   1.6
12    -2.5   1.5
13    -2.6   1.5
14    -2.7   1.5
15    -2.9   1.4
16    -3.6   1.2
17    -4.1  -0.1
18    -4.7  -1.5
19    -4.7  -2.6
20    -4.3  -3.7
21    -4.3  -3.7
22    -4.7  -3.8
23    -6.2  -3.1
24    -9.9  -1.9
25   -13.7  -1.9
26   -17.9  -2
27   -21.8  -0.8
28   -25.1  -0.6
29   -28.6   1.8

2 个答案:

答案 0 :(得分:5)

查看3个点p0p1p2,您可以查看两个向量p1 - p0p2 - p1的相对方向。一种简单的方法是计算两个向量之间的叉积。叉积的x和y分量是0,因为两个矢量都在xy平面内。因此,只需要计算叉积的z分量。

如果叉积的z分量是正的,则知道第二个向量相对于第一个向量指向左,因为第一个向量,第二个向量和正z方向的向量是右手。如果叉积为负,则第二个向量指向相对于第一个的右侧。

我使用了我疯狂的Python技能(我每年使用Python一次......)将其放入下面的代码中。有一点逻辑,因此可以在中间点打印左/右指定,即使它只能在读取下一个点后计算。为了实现这一点,几个以前的行被保存起来,其打印延迟。实际计算在calcDir()函数中。

import sys

fileName = sys.argv[1]
dataFile = open(fileName, 'r')

def calcDir(p0, p1, p2):
    v1x = float(p1[0]) - float(p0[0])
    v1y = float(p1[1]) - float(p0[1])
    v2x = float(p2[0]) - float(p1[0])
    v2y = float(p2[1]) - float(p1[1])
    if v1x * v2y - v1y * v2x > 0.0:
        return 'Left'
    else:
        return 'Right'

lineIdx = 0
for line in dataFile:
    line = line.rstrip()
    lineIdx += 1
    if lineIdx == 1:
        print line
    elif lineIdx == 2:
        line0 = line
        print line0
    elif lineIdx == 3:
        line1 = line
    else:
        line2 = line
        dir = calcDir(line0.split()[1:], line1.split()[1:], line2.split()[1:])
        print line1 + ' ' + dir
        line0 = line1
        line1 = line2

print line2

答案 1 :(得分:2)

是:您想要计算前一个方向的dot product和新方向。

如果你开始标准化两个向量(给每个向量的长度为1),那么点积将是两个向量之间角度的余弦,这将允许你确定它是左转还是右转,以及你转过多少。

您可能还会发现the further explanation here非常方便。