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

标签 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),但它们在分子/分母中包含平方根,因此有关坐标系适当象限的信息丢失了。

最佳答案

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

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

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

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

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

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

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

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

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

关于c - 使用 3 轴加速度计和陀螺仪获取方向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27707685/

相关文章:

ios - 使用磁力计和加速度计计算准确的偏航

c++ - 在 c++ 中编译但在 c (gcc) 中编译时很复杂

c - 结构和警告 C

c - 如何找到句子中最短和最长单词之间的共同字母,C语言中的字符串

Lua 认证可用于机身或公路车辆?

android - 何时在 Android 上使用加速度计或陀螺仪

iphone - 指向倾斜方向 - iPhone

c - 关于指针和 malloc 错误

embedded - 有没有人成功地将 Prex 移植到 Stellaris 芯片?

c - 在编译时用单调序列初始化全局整数数组?