我有一个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
答案 0 :(得分:5)
查看3个点p0
,p1
和p2
,您可以查看两个向量p1 - p0
和p2 - 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非常方便。