使arctan2()连续超过2pi

时间:2017-01-29 03:41:24

标签: python python-2.7

我使用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)

绿色显示我想要的东西,黑色显示我得到的东西 enter image description here

3 个答案:

答案 0 :(得分:1)

出于绘图目的,您可以使用以下算法:

  • 让我们假设您在(x1, y1)

  • 上绘制最后一个点
  • 新点应该在(x2,y2),其中x2y2 = 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)