2015-09-24 2 views
0

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

Я прочитал Motion sensor guide и кажется, что есть некоторые избыточности в данных, которые вы можете получить от датчиков. Например: accelrometer между данными содержат тяжести данных, и линейное ускорение данных показывают ускорения без ускорения из-за силы тяжести .

Итак, мой вопрос: действительно ли мне нужны все датчики для получения всех форм движения или я могу отказаться от некоторых из них?

EDIT: (уточняющий вопрос)

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

Ответ, который я ищу, должен включать в себя наборы датчиков, которые имеют высокую корреляцию внутри них, так что только некоторые из датчиков в этом наборе должны вывести один и тот же тип движения \ движение \ вращение \ ускорение \ и т. д.

ответ

3

Термин «движение» в вопросе не имеет точного значения. Поэтому я отвечаю в более общем плане.

«То, как он держит телефон» - это не что иное, как ориентация телефона. Существуют три датчика, которые индивидуально определяют ориентацию телефона.

  1. Акселерометр
  2. Датчик ориентации
  3. вектор вращения датчика

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

  1. Датчик ориентации устарел, поэтому вы не можете его использовать.
  2. Датчик вектора вращения указывает ориентацию, закодированную в кватернионе. Если ваш код основан на кватернионах, то нормализовать выход датчика с помощью SensorManager.getQuaternionFromVector() и продолжить. Если ваш код основан на матрице поворота, то получите матрицу вращения, вызвав SensorManager.getRotationMatrixFromVector(), проходящий выход датчика и продолжите. Если вы хотите, чтобы ориентация была получена только путем вызова SensorManager.getOrientation() переданной матрицы вращения, полученной ранее.
  3. С помощью датчика акселерометра мы можем найти ориентацию, но рекомендуемый подход - объединить его с выходом датчика магнитного поля. Вызовите SensorManager.getRotationMatrix(), передав выход выходного сигнала акселерометра и датчика магнитного поля и получите матрицу вращения. Если ваш код основан на матрице вращения, просто продолжайте.Если вы хотите, чтобы ориентация была получена только путем вызова SensorManager.getOrientation() проходящей матрицы вращения, полученной ранее. Если ваш код основан на кватернионном вызове SensorManager.getQuaternionFromVector() путем прохождения вектора вращения (ориентации), полученного ранее.

«Способ передвижения его телефона» - здесь я рассматриваю четыре движения.

  1. Изменение положения (простой перевод) и изменение скорости положения (скорость) - датчик не обнаруживает.
  2. Скорость изменения скорости (простое ускорение) - Акселерометр обнаруживает его. Но он также содержит гравитационную составляющую. Обычно требуется ускорение без гравитационной составляющей. Это можно было бы рассчитать просто как объяснено here. Однако есть еще один виртуальный сенсор под названием Linear Acceleration, который выполняет эту работу для нас.
  3. Изменение ориентации (поворот) - всякий раз, когда ориентация меняет акселерометр, датчики вектора ориентации и вращения сообщают нам (гироскоп также сообщает, но объясняется в следующей точке). Как использовать этот датчик для получения текущей ориентации, объясняется в первой части ответа.
  4. Скорость изменения ориентации (угловая скорость) - всякий раз, когда меняется ориентация, сообщает датчик гироскопа. Выходной сигнал представляет собой три числа, представляющие угловое ускорение вдоль осей x, y и z. Единица радиации в секунду.

Выход датчиков гироскопа не является точным в долгосрочной перспективе, а выход акселерометра не является точным в краткосрочной перспективе, поэтому объедините их, чтобы получить устойчивый выход. Подробнее см. this вопрос.

Теперь ясно, что гироскоп и акселерометр требуется минимум. Однако использование широкого диапазона датчиков минимизирует нашу работу.

1

Вы не можете решить, что вы получаете - каждый датчик данные уже определены, и вы получаете все или ничего. Если вы посмотрите внимательно, в публичном API нет места, которое позволит вам задавать конкретные вопросы.

Чтобы поддержать это вот цитата из Google's document explaining sensor types:

Датчик акселерометра сообщает ускорение устройства по 3 осям датчика. Измеренное ускорение включает как физическое ускорение (изменение скорости), так и гравитацию. Измерение сообщается в полях x, y и z датчиков_event_t.acceleration.

Если вы видите в android source, то строения здесь строго определены и struct for acceleration contains specific fields. Поэтому, даже если вы получите 0 в полях, которые вам не нравятся, вы ничего не выиграете.

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

Так что, пока вы не можете решить, что вы получите для конкретного датчика (например, «только гравитация» или «только ускорение по оси Y»), составные датчики дают вам данные, которые вы можете вычислить самостоятельно, используя только базовые датчики , Так линейное ускорение является композицией данных из акселерометра и гироскопа (или магнитного датчика), после того, как некоторые расчетов. Аналогично детектора шагов «датчик» использует только акселерометр, но автоматически интерпретирует данные, чтобы просто дать вам событие, которое «да, кто-то сделал шаг» с единственным значением 1.

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

Для получения более подробной информации о каждом из датчиков см. Sensor types на веб-сайте Android, и если вам интересно, вы можете прочитать краткое резюме на sensors stack.

+0

хороший ответ, хотя я ищу датчики, я могу отказаться. см. править. – Tom

+0

Я до сих пор не понимаю, к сожалению. Вы хотите обнаружить движение пользователя, не так ли? Затем вам нужны акселерометр и гироскоп, это два датчика, которые дадут вам как статическую, так и динамическую информацию о том, как устройство перемещается и удерживается. – wasyl

+0

Это правда. Но некоторые датчики дают вам менее сырые и более специфичные для домена данные, такие как линейное ускорение, которое публикует ускорение без гравитации. В целях обнаружения линейного ускорения устройства я предпочел бы использовать этот датчик, чем акселерометр. Я ищу еще примеры, которые будут охватывать все датчики движения в android. Другим примером является необходимость сбора как гироскопа, так и вращательных векторов, чтобы вывести вращение устройства. – Tom

1

Нет, вам не нужен каждый датчик. Некоторые из датчиков существуют как удобство для пользователя. Ваш пример линейного датчика ускорения один - он сообщает вам результаты акселерометра с вытащенными гравитацией. Вы можете сделать это самостоятельно из данных необработанного акселерометра, но это требует немного математики (вам нужно вычесть векторную гравитацию по всем трем осям) и немного ноу-хау (вы помните, чтобы откалибровать датчик? Возможно, он не читает 9.8 в остальном. В этом случае 9.8 может быть не вашей серьезностью, если вы не находитесь на уровне моря). Это много работы, которую нужно было бы повторить для каждого приложения, поэтому они создали программный «датчик», который находится поверх акселерометра и предоставляет вычисленные данные. Для приложения было бы необычно использовать сырые и линейные акселерометры в одном и том же приложении, как правило, одно или другое. Счетчик шагов - еще один пример этого, он догадывается, на каком шаге основываются данные акселерометра. Вам также не нужны откалиброванные и некалиброванные данные гироскопа.

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

+0

Спасибо за подробный ответ. Движение - это, может быть, плохой перевод с моего первого языка. То, что я ищу, - это поведение пользователя: способ держать телефон, способ передвижения его телефона во время его использования и т. Д. – Tom

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