我的状况有点怪异。我目前遇到的情况通常是很好的-完全没有陀螺仪漂移-但我不知道为什么会这样。我希望陀螺仪会漂移很多,到处都有报道。因此这个问题找到了我看不到任何漂移的原因。

最后,我使用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度。
如果我将设备移动到上面的屏幕截图中所示的位置,则根本看不到漂移。

我在做什么错(或正确吗?)?

感谢您的任何建议!

最佳答案

您拥有的陀螺仪可能是经过后过滤的陀螺仪,我在某些SAMSUNG I9100设备中发现了这种陀螺仪。他们使用INVENSENSE CORP。生产的陀螺仪。


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


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

但是,考虑使用9dof或添加磁力计传感器后,过滤器会进入您不想要的状态。根据我的测试,这是由于磁力计状态未校准而导致,需要人们摇动手机(称为绘制“八”)以在融合之前将手机取下。

9dof提供了完整的旋转估计,而6dof无法处理围绕y轴旋转的累积漂移(有关轴的定义,请参见android ref。)。而且我不认为在启动应用前使用“ shaking-and-drawing-number-8”是一个不错的UE,因此我们必须回到6dof方法,并尝试找到一种方法来消除绕y-旋转的工厂漂移。轴。

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

您可以尝试Google相机附带的360度全景应用,该应用可以从市场上下载。在我们真正开始捕捉之前,该应用程序使用视觉辅助(基于图像处理的运动估计)来校准传感器,因此很容易进行验证。我猜不使用磁力计。

因此,我建议在Android上使用传感器融合:
1.没有磁力计(不知道这是硬件问题还是可以通过软件解决。)
2.加速度计+陀螺仪提供平滑稳定的6dof运动估计;
3.尝试解决绕y轴的漂移,主要是指应添加视觉方法;
4.尝试3再尝试3 ...

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

关于android - 陀螺仪没有任何漂移,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9825129/

10-08 23:25