将陀螺仪和加速度计结合起来以获取方向

6
我正在使用一个安卓设备来获取方向(方位角或偏航角)。
安卓 API 使用了加速度计值和磁场值来计算矩阵旋转,然后从该矩阵中提取出方位角(即 SensorManager.getOrientation(...))。但结果非常不准确!特别是如果手机受到某些磁性物质的干扰。
然后我有陀螺仪,如果我通过时间积分陀螺仪值,我就能得到实际的角度,但像每个人都知道的那样,这容易发生漂移...10秒后,即使我没有移动,角度也会偏移10°...
所以在一边我有加速计+磁力计的结果,在磁性场附近它相当垃圾;另一边是陀螺仪的结果非常好,但会随着时间漂移...
因此,我的问题是,有没有一种简单或聪明的方法将这两个结果组合在一起,以获得一种“鲁棒”的方向估计?我说简单是因为我知道有卡尔曼滤波器...但即使我读了50遍理论,我也一头雾水:)。
谢谢!

1
TYPE_ORIENTATION被弃用的原因是它非常不准确 :) 你应该使用陀螺仪来检测移动,而不是静态位置。加速度计更适合这个目的,尽管你需要做一些三角函数运算。你能否编辑你的问题,明确你想要做什么?你还可以查看文档 - http://developer.android.com/reference/android/hardware/SensorManager.html - Codeman
1
我赞同。至于“是否有一种简单或聪明的方法将这两个结果合并在一起?”这已经由传感器管理器完成了,请查看Pheonixblade9所提到的文档。 - Ali
3
传感器管理器不会将陀螺仪和加速度计结合在一起。它使用加速度计和磁场来计算旋转矩阵,从而得到方向(即SensorManager.getOrientation(..))。所以,针对Pheonix所说的问题,我的问题是如何将SensorManager.getOrientation的结果与陀螺仪的积分值相结合。 - Alexis
将如何合并...是的,凤凰城,你开始理解我的问题,即使它在阅读我的初始帖子后非常清晰...如果您没有回答或理解这个问题的能力,感谢您离开 :) - Alexis
1
我猜我不确定为什么OP不直接使用传感器管理器 - 我自己从Android教程中获取非常准确的读数从来没有遇到过问题。我不明白这里的问题或目的是什么。 - Codeman
显示剩余7条评论
3个回答

4

抱歉,阿里,但你链接的视频展示了一个在麻省理工学院工作的人,他已经开发出了我想要做的东西(几乎是,因为他做了更多的事情)。这在Android中没有任何包含...也许再过几年?但我想了解他是如何做到的... - Alexis
如果我理解正确的话,这种类型只使用加速度计+指南针 (http://www.google.com/codesearch#uX1GffpyOZk/services/sensorservice/RotationVectorSensor.cpp)。我不明白为什么他们不包括陀螺仪的使用,这样会更准确...但无论如何,谢谢,我将尝试使用该类型并尝试从返回的矩阵中提取好的角度。 - Alexis
TYPE_ORIENTION 目前相当糟糕。目前我正在使用补偿滤波器(罗盘+陀螺仪),效果还可以,但如果存在磁干扰,那就是一场灾难 :) - Alexis
SensorManager没有实现任何类型的过滤(我指的是磁力、加速度和陀螺仪传感器),包括卡尔曼滤波器。 - jap1968
@jap1968 你看了那个视频吗?如果我理解正确的话,他在谈论SensorManager。 - Ali
显示剩余7条评论

1

简而言之:

无法通过结合陀螺仪和加速度计来获取方位角(我强调一下),因为加速度计无法感知XY轴上的加速度。

一种方法是将陀螺仪与指南针融合,但如果存在磁干扰,则效果不佳。


1

关于陀螺仪传感器似乎存在一种非常普遍的困惑。我最近回答了一个类似的问题这里,所以我建议任何对这些话题感兴趣的人都去看看那个问题和答案。

我在这个应用程序中使用了描述的技术(一个将陀螺仪读数集成到指南针中以改善结果的指南针)。结果并不完美,但总体上比其他指南针要好得多。


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