陀螺仪没有任何漂移

时间:2012-03-22 15:13:49

标签: android integration sensor gyroscope drift

我有点奇怪的情况。我目前的情况通常很好 - 根本没有陀螺漂移 - 但我不知道为什么会这样。据我所知,我预计陀螺仪会漂移很多。因此,这个问题找到了我没有看到任何漂移的原因。

我使用Galaxy Nexus(Android 4.0.3)及其陀螺仪进行最终的方向变化检测。首先,我只想记录传感器读数,并期望看到大的漂移值,例如here。同样在其他网站上我读到了每秒漂移约1度或相似的测量结果。

我记录传感器数据的代码非常基础:

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
LogSensorEventListener listener = new LogSensorEventListener(
       SensorLoggerActivity.this, Sensor.TYPE_GYROSCOPE);
sm.registerListener(listener, sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
       SensorManager.SENSOR_DELAY_FASTEST);

LogSensorEventListener也是SensorEventListenerInterface的一个非常基本的实现:

@Override
public void onSensorChanged(SensorEvent event) {

    final float dT = (event.timestamp - mTimestamp) / 1000000000.f;
    if (dT < 1) { // just a fix for the first step

        mRelZ += event.values[2] * dT;
        list.add(mRelZ);
        list2.add(event.timestamp);
    }
    mTimestamp = event.timestamp;

mRelZ最初设置为0,两个列表应该跟踪时间和测量值。如果完成了我的测量(单击按钮),则值将写入文件:

    try {

        for (int i = 0; i < list.size(); i++) {

            long time = list2.get(i);

            if (mStartTime < 0) {
                mStartTime = time;
                time = 0;
            } else {
                time = time - mStartTime;
            }

            float timef = time / 1000000000.0f;
            sb.append(timef);
            sb.append(";");
            sb.append(Math.toDegrees(list.get(i)));
            sb.append("\n");
        }

        mOutFileStream.write(sb.toString().getBytes());

        mOutFileStream.flush();
        mOutFileStream.close();
    } catch (IOException e) {
    }

一切正常但我能看到的唯一漂移(例如当设备躺在桌子上并记录值为60秒时)约为0.2度。 如果我移动设备以获得上面屏幕截图中的内容,则根本无法观察到任何漂移......

我做错了什么(或者对吗?)??

感谢您的任何建议!

2 个答案:

答案 0 :(得分:2)

你的陀螺仪可能是后置滤波器,我在一些SAMSUNG I9100设备中发现了这一点。他们使用由INVENSENSE CORP。生产的陀螺仪。

  
    
      
        
          
            
              
                

编辑2014/12/10评论@LourençoCaster                 我相信@LourençoCastro对于'工厂漂移'(或零漂移)和'累积漂移'是正确的;

              
            
          
        
      
    
  

关于补充/卡尔曼过滤器,在Android上,6dof(ACC + GYRO)impl。工作正常,由于加速计的校准,它可以消除陀螺仪的工厂和累积漂移;

然而,考虑到9dof impl。或添加磁力计传感器,过滤器会遇到您不想要的状态。根据我的测试,它是由磁力计的未校准状态引起的,需要人们在融合之前摇动(称为'八')手机。

9dof提供完整的旋转估计,而6dof无法处理围绕y轴旋转的累积漂移(参见android的参考文献中的轴定义)。而且我不认为在启动应用程序之前“摇动和绘制数字8”是一个很好的UE,因此我们必须回到6dof方法并尝试找到一种方法来消除工厂周围的旋转漂移轴。

(关于互补/卡尔曼滤波器的很多无聊但令人惊讶的内容应该在这里。但我猜这些来到这里已经知道了。)

您可以尝试使用Google相机中包含的360全景应用,该应用可从市场下载。这个应用程序使用视觉辅助(基于图像处理的运动估计)在我们真正开始捕获之前校准传感器,很容易验证这一点。我想没有使用磁力计。

所以我在Android上使用sensor-fusion的建议是: 没有磁力计; (不知道这是硬件问题还是可以通过软件解决。) 2.加速度计+陀螺仪提供平稳稳定的6dof运动估计; 3.尝试解决y轴周围的漂移,主要是指应加入视觉方法; 4.尝试3并尝试3 ...

也许有人会遇到这个问题,我希望以上所有内容都有所帮助。 感谢StackOverflow上与这些问题相关的帖子。 我不记得你的名字,但你们都帮助了我很多。 :)

答案 1 :(得分:0)

我正在浏览这个主题,虽然这是一个老问题,但我不相信接受的答案是正确的。 随处可见的漂移&#34;是由噪声陀螺仪数据的集成引起的(如在O.P.提供的链路上所见),而不是简单地输出传感器数据。您将需要此集成来计算一段时间内的方向变化。

更长的积分周期将包含更大的噪声量,这将很快积累漂移。我相信Invensense硬件上发生的信号内部滤波用于消除陀螺仪预处理引起的漂移。

在Android的情况下,在API 18(Jelly Bean MR2)中,添加了一个GYROSCOPE_UNCALIBRATED传感器,您可以(可能)验证此工厂漂移校准。无论如何,当您尝试集成校准和未校准的传感器事件时,您将会发生漂移,因为两者都非常嘈杂。要减少此问题,您必须深入研究complementaryKalman过滤器。

(抱歉没有发布更多信息链接,信誉不足)。

希望这有助于未来的用户。