使用 3 轴加速度计和陀螺仪获取方向

1 c embedded accelerometer gyroscope inertial-navigation

这是我在 SO 上的第一篇文章。我还没有为嵌入式系统开发很多代码,但我遇到的问题很少,需要更高级的程序员的帮助。我使用以下设备:-带有 LPC1768(Cortex M3)MCU 的 LandTiger 板,-带有 ADXL345 加速度计(3 轴)的 Digilent pmodACL,-带有 L3G4200D 陀螺仪(3 轴)的 Digilent pmodGYRO。

我想获得一些有关设备方向的信息,即 X、Y 和 Z 轴上的旋转角度。我读过为了实现这一点,我需要使用卡尔曼滤波器或其更简单的形式(即互补滤波器)组合来自加速度计和陀螺仪的数据。我想知道是否可以仅使用来自陀螺仪和加速度计(无磁力计)的测量数据从全范围(0-360 度)计算滚转、俯仰和偏航。我还发现了一些数学公式(http://www.ewerksinc.com/refdocs/Tilt%20Sensing%20with%20LA.pdfhttp://www.freescale.com/files/sensors/doc/app_note/AN3461 .pdf)但它们在分子/分母中包含平方根,因此有关坐标系正确象限的信息丢失了。

Gou*_*uda 5

你问的问题是一个相当常见的问题,而且相当复杂,有许多不同的解决方案。尽管标题只提到了加速度计,但您的帖子正文提到了陀螺仪,因此我假设您两者都有。此外,让低成本加速度计和陀螺仪工作有很多步骤,其中之一就是进行电压到测量的转换。我不会介绍那部分。

首先我会回答你的问题。您询问是否可以通过“计算”陀螺仪测量值来估计设备在欧拉角中的姿态(方向)。

简短回答:是的,您可以将缩放的陀螺仪测量值相加,以获得对设备旋转的非常嘈杂的估计(实际旋转的弧度,而不是姿态),但是一旦您旋转多个轴,它就会失败。这对于大多数应用程序来说是不够的。

我将为您提供一些一般性建议、特定知识和一些我以前使用过的示例代码。

首先,您不应该尝试通过编写程序并使用 IMU 进行测试来解决此问题。您应该首先使用经过验证的库编写模拟,然后验证您的算法/程序,然后才尝试使用 IMU 实现它。

其次,您说要“从全范围(0-360 度)计算横滚、俯仰和偏航”。由此我假设您的意思是您希望能够确定表示设备相对于外部静止东北向下 (NED) 框架的姿态的欧拉角。你的陈述让我觉得你不熟悉态度的表示,因为据我所知,在 0-360 范围内没有所有 3 个角度的欧拉角表示。

您要使用设备姿态的应用程序将很重要。如果您使用 Euler Angles,当在滚动或俯仰轴上进行大(大于 50 度)旋转时,您将无法准确跟踪设备的姿态,这是由于所谓的万向节锁定。如果您需要跟踪此类运动,则需要使用四元数或方向余弦矩阵 (DCM) 表示姿态。

第三,正如您所说,您可以使用互补滤波器或卡尔曼滤波器变体(扩展卡尔曼滤波器、误差状态卡尔曼滤波器、间接卡尔曼滤波器)通过融合来自加速度计、陀螺仪和磁力计。我建议使用 Madgwick 描述的 Complimentary Filter,它是用 C、C# 和 MATLAB here 实现的。如果您想跟踪设备的位置,并且有一个额外的传感器(如 GPS),那么卡尔曼滤波器变体将是必要的。

对于我使用加速度计仅获得欧拉角俯仰和滚转的一些示例代码,请参阅我对另一个问题的回答