2013-12-14 2 views
0

ПРОБЛЕМЫАкселерометр данные смешивают с гироскопом, когда несколько слушателей зарегистрированы

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

ЧТО Я Пытался

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

ВАЖНЫЕ ПРИМЕЧАНИЯ

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

  • Когда я регистрирую только акселерометр (без гироскопа), данные идеальны. На выходе акселерометра нет данных гироскопа.

  • Это не проблема с оборудованием. Я загрузил другие приложения для тестирования датчиков, которые отображают данные датчиков, и у них нет никаких проблем с чтением данных датчика с моего телефона.

Любые идеи относительно того, что я сделал неправильно? Это что-то с тем, как я интерпретирую событие onSensorChanged для обработки нескольких датчиков?

// Код опущен

+0

Ваш код датчика кажется правильным. Возникает ли проблема локально (например, при отображении значений датчика в текстовом виде) или при чтении потоковых данных? – foibs

+0

@foibs Он отображается как в отображаемых значениях, так и в значениях потока – pwee92

+0

Посмотрите на ответ Растикана. Он прав. Я полностью пропустил это – foibs

ответ

2

Я считаю, что вы не имеете Android проблему, но простую задачу Java. SensorEvent.values ​​- объект массива с плавающей точкой, и вы просто проходите вокруг его указателя. Рассмотрим клонирование всего «события» или прямое копирование соответствующих элементов из массива. Например, посмотрите на код ниже (взятый из документации Android SDK), посмотрите, как данные массива явно копируют элементы дискретно.

http://developer.android.com/reference/android/hardware/SensorEvent.html

// Class Members 
private float gravity[]; 
private float linear_acceleration[]; 

public void onSensorChanged(SensorEvent event) 
{ 
     // alpha is calculated as t/(t + dT) 
     // with t, the low-pass filter's time-constant 
     // and dT, the event delivery rate 

     final float alpha = 0.8; 

     // Elements are discretely copied. 
     gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0]; 
     gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1]; 
     gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2]; 

     linear_acceleration[0] = event.values[0] - gravity[0]; 
     linear_acceleration[1] = event.values[1] - gravity[1]; 
     linear_acceleration[2] = event.values[2] - gravity[2]; 
} 
+0

Я посмотрел на вашу ссылку, и на самом деле вы ничего не исправить, вы просто сделали еще один псевдоним (локальный на этот раз) ... DO COPY отдельных элементов из массива: см. Обновление, которое я сделал к приведенному выше коду. – Rastikan

+0

Делает гораздо больше смысла: P Так, как я это понимаю, просто передача объекта, подобного этому, передаёт только ссылку на него в памяти. Так как это место в памяти фактически меняется между другими датчиками, когда назначение выполняется в onSensorChanged, я получаю данные от нескольких датчиков, а не только от одного? Это сработало, привет! – pwee92

Смежные вопросы