首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >TYPE_ROTATION_VECTOR与复网滤波器的比较

TYPE_ROTATION_VECTOR与复网滤波器的比较
EN

Stack Overflow用户
提问于 2015-06-01 12:32:53
回答 1查看 894关注 0票数 2

我一直在做方向估计,当我在直线上行走时,我需要估计正确的方向。在面对一些障碍之后,我又从基础开始。

我已经实现了一个来自这里的互补滤波器,它使用了从Android获得的重力矢量(而不是原始加速度)、原始陀螺数据和原始磁强计数据。我也是应用一个低通滤波器对陀螺和磁强计数据,并使用它作为输入。

互补滤波器的输出是欧拉角,我也在记录TYPE_ROTATION_VECTOR,它输出4D四元数的器件方向。

所以我想把四元数转换成欧拉,并将它们与互补滤波器得到的欧拉进行比较。当手机固定在桌子上时,欧拉角的输出如下所示。

可以看出,偏航的价值有很大幅度的下降。

,当手机是固定的时,对于这个简单的情况,我做错了什么?

然后我走进我的客厅,得到了下面的输出。

,互补过滤器的形状看起来非常好,并且非常接近于安卓系统。但这些值都有很大差距。

,请告诉我我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2015-06-03 15:40:09

我认为没有必要在陀螺仪上应用低通滤波器。因为你在整合陀螺仪来获得旋转,它可能会把一切都搞砸。

请注意,TYPE_GRAVITY是一种从陀螺和accel中合成的复合传感器,它包含在Android自身的传感器融合算法中。也就是说,这已经通过了卡尔曼滤波器。如果你要使用安卓的内置传感器融合,为什么不直接使用TYPE_ROTATION_VECTOR呢?

你的角度看起来是弧度,第一组的误差离90度不远。也许你在你的磁强计输入中交换了X和Y?

下面是我要采取的方法:首先,编写一个测试,该测试采用accel和陀螺仪,并从测试中合成欧拉角。暂时忽略陀螺仪。在房子里走动,确认它做的是对的,但很紧张。

接下来,在你的算法上加上一个具有攻击性的低通滤波器。

代码语言:javascript
复制
yaw0 = yaw;
yaw = computeFromAccelMag();  // yaw in radians
factor = 0.2;                 // between 0 and 1; experiment
yaw = yaw * factor + yaw0 * (1-factor);

确认这还能用。这应该是少得多的紧张,但也迟缓。

最后,加入陀螺仪,用它做一个互补滤波器。

代码语言:javascript
复制
dt = time_since_last_gyro_update;
yaw += gyroData[2] * dt;            // test: might need to subtract instead of add
yaw0 = yaw;
yaw = computeFromAccelMag();  // yaw in radians
factor = 0.2;                 // between 0 and 1; experiment
yaw = yaw * factor + yaw0 * (1-factor);

它们的关键是在你开发算法的过程中测试每一步,这样当错误发生时,你就会知道是什么原因造成的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30573588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档