结合陀螺仪和加速度计数据

73

我正在使用Lego Mindstorm的NXT系统构建平衡机器人。我使用了来自HiTechnic的两个传感器,第一个是加速度计,第二个是陀螺仪。我已经成功地过滤掉了两个传感器的噪声,并为两个传感器派生了角度,这些角度在-90和90度之间,其中0度是完全平衡的。

我的下一个挑战是将两个传感器值组合起来,以纠正陀螺仪随时间漂移的问题。以下是我从实际数据创建的示例图形,用于演示陀螺仪漂移:

enter image description here

我看到最常用的方法是使用卡尔曼滤波器使这两个传感器组合更可靠。但是,我不是微积分方面的专家,我真的不理解数学符号,但我可以理解源代码中的数学。

我正在使用RobotC(类似于任何其他C衍生产品),如果有人能给出如何在C中完成此操作的示例,我将非常感激。

谢谢你的帮助!

解决方案结果:

好的,kersny通过介绍互补滤波器来解决了我的问题。这是一张图表,说明了我的结果:

结果 #1

enter image description here

结果 #2

enter image description here

如您所见,该滤波器纠正了陀螺仪漂移,并将两个信号组合成单个平滑信号。

编辑:由于我正在修复损坏的图像,我认为展示我用来生成这些数据的装置会很有趣:

enter image description here


你的数据明显出现了偏差。如果你的初始数据不一致,卡尔曼滤波器或其他任何方法都无法帮助你。 - ldog
1
我不知道你正在绘制什么图表,因为你没有标记坐标轴,但是如果你的数据在相同的x值给出相同的y值时明显发散,那么这是非常糟糕的数据。 - ldog
3
一种很好的替代卡尔曼滤波器的方法是互补滤波器,它更易于实现:http://www.pieter-jan.com/node/11。 - Pieter-Jan
这个问题上的图片不再显示。 - g19fanatic
我已经修复了损坏的图片。 - Dylan Vester
显示剩余6条评论
2个回答

48
卡尔曼滤波器很棒,但是我发现互补滤波器更容易实现,并且结果相似。我找到的最好的编写互补滤波器的文章是这个维基页面(以及这篇文章,讲述将传感器转换为工程单位)以及一个zip文件里的PDF(在技术文档下,我认为zip文件中的文件名是filter.pdf);
附注:如果您卡在卡尔曼滤波器上,这里有一些Arduino的C语法代码来实现它。

2
太棒了,我相信这可能正是我一直在寻找的。Filter.pdf文件真的很有帮助,解释并解决了我的确切问题。我还没有验证它(我现在在工作中)。但今晚,我会尝试让它运行,并将我的问题标记为已回答! - Dylan Vester
很高兴能够帮助!如果你想看它的实际应用例子,可以查看我的博客http://www.ohscope.com。我制作了一个类似平衡车的Segway,并且很快会上传更多数据。 - kersny
9
维基链接似乎失效了。 - JonDrnek
7
太好了,存档网站:http://web.archive.org/web/20091121085323/http://www.mikroquad.com/bin/view/Research/ComplementaryFilter - Edward Falk

6

感谢您的回复。这篇文章也很棒,但我真的需要知道如何使用卡尔曼(或其他)滤波器来结合两个传感器值,而不仅仅是平滑一个。 - Dylan Vester
据我所知,您需要平滑一个,然后使用它来对另一个应用校正因子。虽然我不能完全理解它应该如何工作。这<a href="http://www.tlb.org/scooter2.html">两篇</a> <a href="http://www.tlb.org/scooter.html">文章</a>可能会有所帮助。 - Vatine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接