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

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

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

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

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


person fkerber    schedule 22.03.2012    source источник
comment
Мне пришлось прочитать ваше первое предложение 3 раза, пока я его не понял ;)   -  person MrTJ    schedule 22.03.2012
comment
Извините, переформулировал, чтобы хоть немного было понятнее...   -  person fkerber    schedule 22.03.2012


Ответы (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, включенное в Google Camera, которое можно загрузить с рынка. Это приложение использует визуальную помощь (оценка движения на основе обработки изображений) для калибровки датчика, прежде чем мы действительно начнем захватывать, это легко проверить. И никакого использования магнитометра, я думаю.

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

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

person iicodec    schedule 19.07.2012
comment
Спасибо за ваш ответ. Как я могу узнать, есть ли у меня один от Invensense или другой. У вас есть дополнительная информация о том, как они фильтруются? - person fkerber; 19.07.2012
comment
Sensor.getType() Sensor.getVendor() может вам помочь. вы найдете тип датчика. проверьте тип, если выходные данные были отфильтрованы алгоритмом объединения с использованием акселерометра и компаса. - person iicodec; 19.07.2012
comment
Хорошо, я проверил поставщика - и действительно, это Invensense. Так что ваше предположение может быть верным. Спасибо еще раз. - person fkerber; 23.07.2012

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

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

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

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

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

person Lourenço Castro    schedule 29.04.2014