Гироскоп не показывает дрейфа - PullRequest
1 голос
/ 22 марта 2012

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

Я использую 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 ]

2 голосов
/ 19 июля 2012

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

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

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

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

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

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

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

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

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

0 голосов
/ 29 апреля 2014

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

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

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

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

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

...