1

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

最后,我使用 Galaxy Nexus (Android 4.0.3) 及其陀螺仪进行一些方向变化检测。首先,我只是想记录传感器读数,并希望看到大的漂移值,例如这里。同样在其他网站上,我读到大约每秒 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 度。如果我移动设备以获取类似于上面屏幕截图中的内容,则根本不会观察到漂移......

我在做什么错(或对?)?

感谢您的任何建议!

4

2 回答 2

2

你拥有的陀螺仪可能是一个后过滤的陀螺仪,我在一些三星 I9100 设备中发现了这个。他们使用 INVENSENSE CORP 生产的陀螺仪。

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

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

但是,9dof impl.,或考虑添加磁力计传感器,过滤器会进入您不想要的状态。根据我的测试,这是由磁力计未校准状态引起的,需要人们在融合之前摇动(称为“八”)手机以移除。

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

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

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

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

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

于 2012-07-19T03:31:26.413 回答
0

我正在浏览这个主题,虽然这是一个老问题,但我不相信接受的答案是正确的。“到处报告”的漂移是由噪声陀螺仪数据的集成引起的(如 OP 提供的链接所示),而不是简单地输出传感器数据。您将需要这种集成来计算随时间的方向变化。

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

在 Android 的情况下,在 API 18 (Jelly Bean MR2) 中,添加了 GYROSCOPE_UNCALIBRATED 传感器,您可以(大概)在其中验证此工厂漂移校准。无论如何,当您尝试整合校准和未校准的传感器事件时,您会得到漂移,因为两者都很嘈杂。为了减少这个问题,您将不得不深入研究互补卡尔曼滤波器。

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

希望这对未来的用户有所帮助。

于 2014-04-29T11:31:06.967 回答