我一直在做方向估计,当我在直线上行走时,我需要估计正确的方向。在面对一些障碍之后,我又从基础开始。
我已经实现了一个来自这里的互补滤波器,它使用了从Android获得的重力矢量(而不是原始加速度)、原始陀螺数据和原始磁强计数据。我也是应用一个低通滤波器对陀螺和磁强计数据,并使用它作为输入。
互补滤波器的输出是欧拉角,我也在记录TYPE_ROTATION_VECTOR,它输出4D四元数的器件方向。
所以我想把四元数转换成欧拉,并将它们与互补滤波器得到的欧拉进行比较。当手机固定在桌子上时,欧拉角的输出如下所示。


可以看出,偏航的价值有很大幅度的下降。
,当手机是固定的时,对于这个简单的情况,我做错了什么?
然后我走进我的客厅,得到了下面的输出。


,互补过滤器的形状看起来非常好,并且非常接近于安卓系统。但这些值都有很大差距。。
,请告诉我我做错了什么?
发布于 2015-06-03 15:40:09
我认为没有必要在陀螺仪上应用低通滤波器。因为你在整合陀螺仪来获得旋转,它可能会把一切都搞砸。
请注意,TYPE_GRAVITY是一种从陀螺和accel中合成的复合传感器,它包含在Android自身的传感器融合算法中。也就是说,这已经通过了卡尔曼滤波器。如果你要使用安卓的内置传感器融合,为什么不直接使用TYPE_ROTATION_VECTOR呢?
你的角度看起来是弧度,第一组的误差离90度不远。也许你在你的磁强计输入中交换了X和Y?
下面是我要采取的方法:首先,编写一个测试,该测试采用accel和陀螺仪,并从测试中合成欧拉角。暂时忽略陀螺仪。在房子里走动,确认它做的是对的,但很紧张。
接下来,在你的算法上加上一个具有攻击性的低通滤波器。
yaw0 = yaw;
yaw = computeFromAccelMag(); // yaw in radians
factor = 0.2; // between 0 and 1; experiment
yaw = yaw * factor + yaw0 * (1-factor);确认这还能用。这应该是少得多的紧张,但也迟缓。
最后,加入陀螺仪,用它做一个互补滤波器。
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);它们的关键是在你开发算法的过程中测试每一步,这样当错误发生时,你就会知道是什么原因造成的。
https://stackoverflow.com/questions/30573588
复制相似问题