这是我在SO上的第一篇文章。我还没有为嵌入式系统开发太多代码,但我很少遇到问题,需要更高级的程序员的帮助。我使用以下设备:-LandTiger板采用LPC1768(Cortex M3(MCU,-带ADXL345加速度计的Digilent pmodACL(3轴(,-带L3G4200D陀螺仪的Digilent pmodGYRO(3轴(。
我想获得一些关于设备方向的信息,即X、Y和Z轴上的旋转角度。我读到,为了实现这一点,我需要使用卡尔曼滤波器或其更简单的形式,即互补滤波器,将加速度计和陀螺仪的数据结合起来。我想知道是否可以只使用陀螺仪和加速度计(没有磁力计(的测量数据来计算全范围(0-360度(的滚转、俯仰和偏航。我还发现了一些数学公式(http://www.ewerksinc.com/refdocs/Tilt%20Sensing%20with%20LA.pdf和http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf)但是它们在分子/分母中包含平方根,因此丢失了关于坐标系的适当象限的信息。
您所问的问题是一个相当频繁的问题,而且相当复杂,有许多不同的解决方案。虽然标题中只提到了一个加速度计,但你的帖子正文中提到了陀螺仪,所以我假设你两者都有。此外,让低成本的加速度计和陀螺仪工作还有很多步骤,其中之一就是进行电压到测量值的转换。我不涉及那部分。
首先,我将回答你的问题。你问,通过"计数"陀螺仪测量值,你是否可以用欧拉角来估计设备的姿态(方向(。
简言之:是的,你可以对缩放后的陀螺仪测量值求和,以获得设备旋转(实际旋转弧度,而不是姿态(的非常嘈杂的估计值,但一旦你旋转多个轴,它就会失败。这对于大多数应用程序来说是不够的。
我将为您提供一些我以前使用过的一般建议、具体知识和一些示例代码。
首先,您不应该试图通过编写程序并使用IMU进行测试来解决此问题。您应该首先使用经过验证的库编写模拟,然后验证您的算法/程序,然后尝试使用IMU实现它。
其次,您说要">计算全范围(0-360度(的滚转、俯仰和偏航"。由此,我假设你的意思是,你希望能够确定欧拉角,该角表示设备相对于外部静止东北向下(NED(框架的姿态。你的陈述让我觉得你不熟悉态度的表示,因为据我所知,没有欧拉角表示,所有3个角度都在0-360范围内。
您想要使用设备姿态的应用程序将非常重要。如果您使用的是欧拉角,当在滚转或俯仰轴上进行大的(大于50度左右(旋转时,您将无法准确跟踪设备的姿态,这是由于所谓的万向节锁定。如果您需要跟踪此类运动,则需要使用四元数或方向余弦矩阵(DCM(表示姿态。
第三,正如您所说,您可以使用互补滤波器或卡尔曼滤波器变体(扩展卡尔曼滤波器、误差状态卡尔曼滤波器、间接卡尔曼滤波器(,通过融合来自加速度计、陀螺仪和磁力计的数据,精确跟踪设备的姿态。我建议Madgwick描述的互补滤波器在这里用C、C#和MATLAB实现。如果你想跟踪设备的位置,并且有一个额外的传感器,比如GPS,那么卡尔曼滤波器变体是必要的。
关于我使用加速度计只获得欧拉角俯仰和滚转的一些示例代码,请参阅我对另一个问题的回答。