过滤Z-Angle旋转MPU 6050 + Arduino

时间:2013-10-17 20:33:28

标签: c++ arduino sensor gyroscope i2c

我试图获得GY-521(MPU 6050)的Z角旋转,但如果我不移动传感器,角度也会升高静止。有没有办法“过滤”他对我的案件是正确的角度?

代码:

float accel_z = accel_t_gyro.value.z_accel;
float accel_angle_z = 0;
float gyro_angle_z = gyro_z*dt + get_last_z_angle();
float unfiltered_gyro_angle_z = gyro_z*dt + get_last_gyro_z_angle();
float alpha = 0.96;
float angle_z = alpha*gyro_angle_z + (1.0 - alpha)*accel_angle_z;
传感器未移动时

输出:

x = x-roatation-angle z = z-roatation- angel

      x   z
    8.37 4.24
    8.35 4.22
    8.33 4.21
    8.32 4.19
    8.31 4.18
    8.29 4.17
    8.28 4.15
    8.26 4.14
    8.25 4.12
    8.23 4.12
    8.22 4.10
    8.21 4.09
    8.19 4.07
    8.18 4.05

1 个答案:

答案 0 :(得分:1)

蒂莫,我看到你找到了解决问题的部分解决方案(引用:“没有重力将陀螺仪保持在正确的位置”)。我想详细说明,因为有办法从陀螺仪中获得相当好的结果。我不知道它对你的申请是否足够好。以下是我使用与您相同的硬件获得的结果:http://robokitchen.tumblr.com/post/68625623585/imu-with-gyroscope-only-i-tested-the-three-axes。在这个视频中,我根本没有使用加速度计。

有两点可以帮助您获得更好的结果:

1)除非传感器保持完全水平,否则无法使用以下公式获得z轴旋转:

float gyro_angle_z = gyro_z*dt + get_last_z_angle();

为了解释原因,想象一下:如果你的陀螺仪围绕x轴旋转了90度,然后围绕z轴旋转了90度,那么就不会获得与围绕z轴旋转90度相同的结果。这意味着您应计算围绕所有轴的旋转,然后提取z轴旋转。如果不使用x和y轴,结果将不正确(除非传感器保持完全水平)。

计算所有轴周围旋转的一种有效方法是使用四元数。关于四元数有很多话要说,所以如果需要,我会让你自己做研究并提出更多问题。

2)使用所有3轴后,仍然会出现静态漂移。这是因为陀螺仪即使不移​​动也不会读取完美的0。为了改善这种情况,您可以校准陀螺仪。一种简单的校准方法是在陀螺仪不移动时读取大量(100+)的值,计算平均漂移,并在陀螺仪移动时从测量值中减去它。在此之后仍会有轻微的漂移,但不会像你现在所经历的那样糟糕。

以下是我使用MPU-6050陀螺仪和加速度计获得的最佳效果:http://robokitchen.tumblr.com/post/68626551378/imu-with-gyroscope-and-accelerometer-i-ran-the。如您所知,加速度计有助于稳定x和y轴,但不能稳定z轴。然而,z轴漂移很低并且仍然可用于许多应用。例如,有几个quadcopters不使用磁力计,并且受到z轴漂移的影响,但仍然可用。