我使用python 2.7处理加速度数据集,为了找到角度,我使用arctan2(y,x)。我的问题是,虽然我的数据可以旋转超过pi,但arctan2(y,x)的输出在pi和-pi之间有界限。这意味着每当我超过pi时,我的数据突然大幅跳跃并循环到负pi。
我试图找出一个优雅的解决方案来解决这个问题,让我的图表连续不断。我已经实现了一个简单的检查,如果我甚至超过80%的跳跃,我认为我已经超出界限并开始为每个后续数据点添加2 pi。这有效,但感觉非常笨重。有没有更优雅的方式来实现这个?或者这是我能做的最好的事情吗?
谢谢^ _ ^
for index in range(1,(len(x_data))):
new_angle = math.atan2((y_data[index]), (x_data[index]))
if (new_angle - angle[index-1]) > 5:
new_angle = new_angle - 6.28
if (new_angle - angle[index-1]) < -5:
new_angle = new_angle + 6.28
angle.append(new_angle)
答案 0 :(得分:1)
出于绘图目的,您可以使用以下算法:
让我们假设您在(x1, y1)
新点应该在(x2,y2)
,其中x2
,y2 = atan2(...) + 2 * pi * k
,对于某个整数k
。
查找距k
到(x1,y1)
的距离最小的(x2,y2)
使用(x2,y2)
作为(x1,y1)
进行下一步。
答案 1 :(得分:0)
您尝试做的通常称为“提升”......我通常使用的代码是
last = 0
out = []
for x, y in data:
angle = math.atan2(y, x)
while angle < last-math.pi: angle += 2*math.pi
while angle > last+math.pi: angle -= 2*math.pi
last = angle
out.append(angle)
两个“while”循环可以在更隐蔽的
中浓缩 angle = (angle-last + math.pi)%(2*math.pi)-math.pi + last
答案 2 :(得分:0)
假设有一个角度列表,你可以使用 numpy:
angles = []
new_angles = np.unwrap(angles, discont=np.pi)