2012-03-22 7 views
1

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

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

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

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

+0

Я должен был прочитать 3 раза ваше первое предложение, пока не понял его;) – MrTJ

+0

Извините, я переформулировал его, чтобы сделать его хотя бы немного яснее ... – fkerber

ответ

2

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

редактировать 2014/12/10 для комментирования @ Лоренсу Кастро я считаю, @ Лоуренс Кастро был прав насчет " фабричный дрейф (или нулевой дрейф) и «накопленный дрейф»;

В отношении к комплементарной/фильтров Калмана, на Android, то 6DOF (ACC + ГИРОСКОПА) осущ. отлично работает, он может удалить как заводские, так и накопленные дрейфы гироскопа благодаря калибровке акселерометра;

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

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

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

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

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

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

+0

Спасибо за ваш ответ. Как я могу узнать, есть ли у меня один из Invensense или другой. У вас есть дополнительная информация о том, как они фильтруются? – fkerber

+0

Sensor.getType() Sensor.getVendor() может вам помочь. вы найдете тип датчика. проверьте тип, если выход был отфильтрован алгоритмом слияния с использованием акселерометра и компаса. – iicodec

+0

Хорошо, я проверил поставщика сейчас - и действительно, это Invensense. Таким образом, ваше предположение может быть правильным. Еще раз спасибо. – fkerber

0

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

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

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

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

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