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

NG_*_*_21 1 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
Run Code Online (Sandbox Code Playgroud)

Ret*_*adi 6

看着3分p0,p1并且p2,你可以看看两个向量的相对方向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
Run Code Online (Sandbox Code Playgroud)