Гироскоп не показывает дрейфа

Я в немного странной ситуации. Ситуация, в которой я сейчас нахожусь, обычно хорошая - вообще нет гироскопического дрейфа, но я понятия не имею, почему это так. Я ожидал, что гироскоп будет сильно дрейфовать, как сообщалось везде. Поэтому этот вопрос, чтобы найти причину, почему я не вижу никакого дрейфа.

Я использую 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 градуса. Если я перемещу устройство, чтобы получить что-то похожее на скриншоте выше, никакого смещения не наблюдается вообще...

Что я делаю не так (или правильно?)??

Спасибо за любой совет!

2 ответа

Решение

Гироскоп, который у вас есть, может быть постфильтрованным, я обнаружил это на некоторых устройствах SAMSUNG I9100. они используют гироскопы, произведенные INVENSENSE CORP.

отредактируйте 2014/12/10 для комментирования @Lourenço Castro Я верю, что @Lourenço Castro был прав насчет "заводского дрейфа" (или ноль-дрейфа) и "накопленного дрейфа";

Что касается дополнительных / калмановских фильтров, на Android, 6dof(ACC+GYRO) вкл. отлично работает, благодаря калибровке акселерометра может устранить как заводской, так и накопленный дрейф гироскопа;

Тем не менее, с учетом 9dof или добавления датчика магнитометра, фильтр переходит в состояние, которое вам не нужно. Согласно моим тестам, это вызвано некалиброванным статусом магнитометра, который нужно, чтобы ребята встряхнули (известный как "восьмерка") телефон, чтобы удалить его перед слиянием.

9dof обеспечивает полную оценку вращения, в то время как 6dof не может справиться с накопленным дрейфом вращения вокруг оси y (см. Ссылку Android для определения оси). И я не думаю, что "встряхивание-и-рисование-число-8" перед тем, как запустить приложение, является хорошим UE, поэтому мы должны вернуться к методу 6dof и попытаться найти способ устранить заводской дрейф вращения вокруг y- ось.

(Здесь должно быть много скучного, но удивительного контента о дополнительном фильтре / фильтре Калмана. Но я думаю, что те, кто пришел сюда, уже знают это.)

Вы можете попробовать приложение 360 Panorama, включенное в Google Camera, которое можно загрузить с маркета. Это приложение использует визуальное средство (оценка движения на основе обработки изображений) для калибровки датчика, прежде чем мы действительно начнем снимать, это легко проверить. И, наверное, не использовать магнитометр.

Поэтому мой совет использовать сенсор-фьюжн на Android: 1. нет магнитометра; (не знаю, если это аппаратная проблема или может быть решена с помощью программного обеспечения.) 2. акселерометр + гироскоп обеспечивает плавную и стабильную оценку движения; 3. попытаться решить дрейф вокруг оси Y, в основном это означает, что визуальный метод должен быть добавлен к; 4. попробуй 3 и попробуй 3...

Может быть, кто-то столкнется с этим вопросом, и я надеюсь, что все вышеперечисленное может быть полезным. спасибо тем постам, связанным с этими вопросами на Stackru. Я точно не помню ваших имен, но вы все мне очень помогли.:)

Я просматривал эту тему, и, хотя это старый вопрос, я не думаю, что принятый ответ правильный. Дрейф, о котором "сообщают повсюду", вызван интеграцией шумных данных гироскопа (как видно по каналу, предоставленному OP), а не просто выводом данных датчика. Эта интеграция понадобится вам для расчета изменений ориентации с течением времени.

Более длительные периоды интеграции будут содержать большее количество шума, которое накапливает дрейф довольно быстро. Я считаю, что внутренняя фильтрация сигнала, которая происходит на оборудовании Invensense, используется для устранения дрейфа, вызванного их собственной предварительной обработкой гироскопа.

В случае Android в API 18 (Jelly Bean MR2) был добавлен датчик GYROSCOPE_UNCALIBRATED, в котором можно (предположительно) проверить эту заводскую калибровку дрейфа. В любом случае, когда вы попытаетесь интегрировать калиброванные и некалиброванные сенсорные события, вы получите смещение, так как оба довольно шумные. Чтобы уменьшить эту проблему, вам придется углубиться в дополнительные фильтры или фильтры Калмана.

(Извините за то, что не публикуете больше информационных ссылок, недостаточно репутации).

Надеюсь, это поможет будущим пользователям.

Другие вопросы по тегам