Как откалибровать акселерометр Android и уменьшить шум, устранить гравитацию

Итак, я некоторое время боролся с этой проблемой, и мне не удавалось использовать мудрость интернетов и связанные с ними сообщения SO по этому вопросу.

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

Я пытался использовать различные "фильтры", но, похоже, я не могу обдумать их. Я понимаю, что гравитацию нужно решать в некотором роде, и, может быть, там, где я ошибаюсь. В настоящее время я пробовал это, адаптированный из SO answer, который относится к примеру из iPhone SDK:

                accel[0] = event.values[0] * kFilteringFactor + accel[0] * (1.0f - kFilteringFactor);
                accel[1] = event.values[1] * kFilteringFactor + accel[1] * (1.0f - kFilteringFactor);


                double x = event.values[0] - accel[0];
                double y = event.values[1] - accel[1];

Плакат говорит "играть с" значением kFilteringFactor (kFilteringFactor = 0.1f в примере) до тех пор, пока не будет удовлетворено. К сожалению, по-прежнему мне кажется, что у меня много шума, и все это, по-видимому, заключается в том, чтобы сделать показания крошечными десятичными знаками, что не очень мне помогает, и, похоже, он делает сенсор менее чувствительным. Математические центры моего мозга также атрофируются из-за многих лет пренебрежения, поэтому я не совсем понимаю, как работает этот фильтр.

Может кто-нибудь объяснить мне в деталях, как сделать полезное чтение с акселерометра? Краткий учебник будет невероятной помощью, поскольку я не нашел действительно хорошего (по крайней мере, нацеленного на мой уровень знаний). Я расстраиваюсь, потому что чувствую, что все это должно быть более очевидным для меня. Любая помощь или руководство были бы очень благодарны, и, конечно, я могу предоставить больше образцов из моего кода, если это необходимо.

Надеюсь, я не прошу слишком много ложки кормить; Я бы не просил, если бы я не пытался понять это на какое-то время. Также похоже, что у других членов SO есть некоторый интерес.

Ответы

Ответ 1

Чтобы получить правильное показание с акселерометра, вам нужно использовать уравнение speed = SQRT (x * x + y * y + z * z). Используя это, когда телефон находится в состоянии покоя, скорость будет равна скорости тяжести - 9,8 м/с. Поэтому, если вы вычтите это (SensorManager.GRAVITY_EARTH), тогда, когда телефон находится в состоянии покоя, вы получите показание 0 м/с. Что касается шума, Blrfl может быть прав о дешевых акселерометрах, даже когда мой телефон находится в состоянии покоя, он постоянно мерцает несколько долей метра в секунду. Вы можете просто установить небольшой порог, например 0,4 м/с, и если скорость не пройдет, то он находится в состоянии покоя.

Ответ 2

Частичный ответ:

Точность. Если вы ищете высокую точность, недорогие акселерометры, которые вы найдете в телефонах, не будут вырезать горчицу. Для сравнения, трехосный датчик, подходящий для промышленного или научного использования, работает на север от 1500 долларов только для датчика; добавляя аппаратное обеспечение, чтобы включить его, и превратить его показания в то, что компьютер может использовать, удваивает цену. Датчик в телефонной трубке работает значительно ниже 5 долларов США.

Шум.. Недорогие датчики являются неточными, а погрешность - шумом. Неточный датчик, который не перемещается, не всегда будет показывать нули, он будет показывать значения с обеих сторон в некотором диапазоне. О лучшем, что вы можете сделать, это охарактеризовать датчик в неподвижном состоянии, чтобы понять, насколько он шумный, и использовать его для округления ваших измерений до менее точного масштаба на основе ожидаемой ошибки. (Другими словами, если он находится в пределах ± xm/s ^ 2 от нуля, то можно с уверенностью сказать, что датчик не двигается, но вы не можете быть точно уверены, потому что он может двигаться очень медленно.) Вам придется это сделать на каждом устройстве, потому что они не все используют один и тот же акселерометр, и все они ведут себя по-разному. Я предполагаю, что одно преимущество iPhone: аппаратное обеспечение довольно однородное.

Гравитация.. В обсуждении SensorEvent документации говорится о факторизации гравитации из того, что говорит акселерометр. Вы заметите, что он имеет много общего с кодом, который вы опубликовали, за исключением того, что он более четкий о том, что он делает.: -)

НТН.

Ответ 3

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

например, вместо использования значений 10 6 7 11 7 10 вы можете усреднить их по-разному. Например, мы можем вычислить следующее значение из равного веса текущего среднего (т.е. Вашей последней обрабатываемой точки данных) со следующей исходной точкой данных. Используя смесь 50-50 для вышеуказанных чисел, мы получим 10, 8, 7.5, 9.25, 8.125, 9.0675. Эта новая последовательность, наши обработанные данные, будет использоваться вместо шумных данных. И мы могли бы использовать другой микс, чем 50-50, конечно.

Как аналог, представьте, что вы сообщаете, где находится определенный человек, используя только ваше зрение. У вас есть хороший взгляд на более широкий ландшафт, но человек охвачен туманом. Вы увидите кусочки тела, которые привлекут ваше внимание. Движущаяся левая рука, правая нога, блеск очков и т.д., Которые кажутся нервными, НО каждое значение довольно близко к истинному центру масс. Если мы проведем какое-то среднее усреднение, мы получим значения, которые приближаются к центру масс этой цели при ее прохождении через туман и в действительности более точны, чем те значения, которые мы (датчик) сообщили, что было сделано шумно туман.

Теперь кажется, что мы теряем потенциально интересные данные, чтобы получить скучную кривую. Это имеет смысл, хотя. Если мы пытаемся воссоздать точную картину человека в тумане, первая задача - получить хорошее плавное приближение центра масс. Затем мы можем добавить данные из дополнительного датчика/процесса измерения. Например, другой человек может приблизиться к этой цели. Этот человек может предоставить очень точное описание движений тела, но может оказаться в гуще тумана и не знать целиком, где цель заканчивается. Это дополнительное положение к тому, что мы впервые получили - во вторых данных дается подробная информация без ощущения приблизительного местоположения. Две части данных будут сшиты вместе. Мы бы спустили первый набор (как ваша проблема, представленная здесь), чтобы получить общее местоположение, не имеющее шума. Мы могли бы передать второй набор данных, чтобы получить детали без нежелательных вводящих в заблуждение вкладов в общее положение. Мы используем высококачественные глобальные данные и высококачественные локальные данные, каждый из которых оптимизирован по дополнительным путям и не позволяет развращать другой набор (через 2 фильтрации).

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

Подводя итог, мы сбрасываем данные с датчиков, которые неустойчивы, но остаются близкими к "центру масс". Мы комбинируем это базовое плавное значение с данными, которые точны на деталях, но дрейфуют, поэтому этот второй набор фильтруется с высоким разрешением. Мы получаем лучшее из обоих миров, когда мы обрабатываем каждую группу данных, чтобы очистить ее от неправильных аспектов. Для акселерометра мы плавно/низко пропускаем данные эффективно, выполняя некоторое изменение среднего значения по его измеренным значениям. Если бы мы обрабатывали данные гироскопа, мы бы выполнили математику, которая эффективно хранит детали (принимает дельта), отказываясь от накопленной ошибки, которая в конечном итоге будет расти и исказить плавную кривую акселерометра. Как? По сути, мы используем фактические значения гироскопа (не средние), но используем небольшое количество образцов (дельт) части при выводе наших итоговых чистых значений. Использование небольшого количества дельта сохраняет общую среднюю кривую в основном по тем же средним значениям, которые отслеживаются на этапе низкого прохода (по усредненным данным акселерометра), который составляет основную часть каждой конечной точки данных.