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

时间:2014-12-30 14:58:58

标签: c embedded accelerometer gyroscope inertial-navigation

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

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

1 个答案:

答案 0 :(得分:3)

您提出的问题是一个相当频繁的问题,并且相当复杂,有许多不同的解决方案。 虽然标题只提到了一个加速度计,但你的帖子的主体提到了一个陀螺仪,所以我假设你有两个。此外,还有许多步骤可以使低成本的加速度计和陀螺仪工作,其中之一就是进行电压 - 测量转换。我不会介绍那部分内容。

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

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

我将为您提供一些我以前使用的一般建议,具体知识和一些示例代码。

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

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

您想要使用设备态度的应用程序将非常重要。如果使用欧拉角,由于所谓的Gimbal Lock,当在滚轴或俯仰轴上进行大的(大于约50度)旋转时,您将无法准确地跟踪设备的姿态。 如果您需要跟踪此类动作,则需要使用四元数或方向余弦矩阵(DCM)表示态度。

第三,正如您所说,您可以使用免费滤波器或卡尔曼滤波器变体(扩展卡尔曼滤波器,误差状态卡尔曼滤波器,间接卡尔曼滤波器)来精确跟踪设备的姿态融合来自加速度计,陀螺仪和磁力计的数据。我建议Madgwick描述的免费过滤器,用C,C#和MATLAB here实现。如果您想跟踪设备的位置,并且有一个额外的传感器,如GPS,则需要卡尔曼滤波器变体。

对于我的一些示例代码,仅使用加速度计获得欧拉角俯仰和滚动,请参阅my answer to this other question