首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >滤波Z-角旋转MPU 6050 + Arduino

滤波Z-角旋转MPU 6050 + Arduino
EN

Stack Overflow用户
提问于 2013-10-17 20:33:27
回答 1查看 6.7K关注 0票数 1

我试着得到GY-521 ( MPU 6050 )的Z角旋转,但是如果我不移动传感器,角度也会上升。有没有办法“过滤”他对我的情况正确的角度?

代码:

代码语言:javascript
复制
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-旋转-角度z=z-旋转-天使

代码语言:javascript
复制
      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
EN

回答 1

Stack Overflow用户

发布于 2013-12-16 14:18:11

Timo,我看到你找到了解决问题的部分方法(引用如下:“没有重力将陀螺仪固定在正确的位置”)。我想详细说明一下,因为只有陀螺仪才能获得相当好的结果。我不知道这是否适合你的申请。下面是我使用与您相同的硬件获得的结果:http://robokitchen.tumblr.com/post/68625623585/imu-with-gyroscope-only-i-tested-the-three-axes。在这段视频中,我根本不使用加速度计。

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

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

代码语言:javascript
复制
float gyro_angle_z = gyro_z*dt + get_last_z_angle();

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

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

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

这里是我得到的最好的结果,使用MPU-6050陀螺仪和加速度计:http://robokitchen.tumblr.com/post/68626551378/imu-with-gyroscope-and-accelerometer-i-ran-the。正如你已经知道的,加速度计有助于稳定x和y轴,而不是z轴。然而,z轴漂移很低,仍然可以在许多应用中使用。例如,有几个不使用磁强计,遭受z轴漂移,但仍可使用的四体飞行器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19436706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档