#android #accelerometer #compass-geolocation #sensors
#Android #акселерометр #компас-геолокация #датчики
Вопрос:
Я разрабатываю приложение с использованием ОС Android, для которого мне нужно знать, как я могу рассчитать движение устройства вверх в вертикальном направлении.
Например, устройство находится в состоянии покоя (точка A), пользователь поднимает его в руке (точка B), теперь происходит изменение высоты между точками A и B, как бы я это рассчитал?
Я уже просмотрел статьи о датчиках и акселерометрах, но я не смог найти ничего, что помогло бы мне с этим. У кого-нибудь есть идеи?
Комментарии:
1. Вам нужно точное изменение высоты?
2. Нет, мне просто нужно знать, что произошло изменение высоты более чем на 2 или 3 фута.
Ответ №1:
Если вы дважды интегрируете ускорение, вы получаете положение, но ошибка ужасна. На практике это бесполезно. Вот объяснение, почему (Google Tech Talk) в 23:20. Я настоятельно рекомендую это видео.
Теперь вам не нужно ничего точного, и это совсем другая история. Линейное ускорение доступно после слияния датчиков, как описано в видео. Смотрите Sensor.TYPE_LINEAR_ACCELERATION
на SensorEvent. Я бы сначала попробовал фильтр верхних частот, чтобы обнаружить внезапное увеличение линейного ускорения вдоль вертикальной оси.
Я понятия не имею, подходит ли это для вашего приложения.
Комментарии:
1. Спасибо @Ali. Видео действительно помогло мне разобраться в акселерометрах и их расчете. Однако, как вы сказали, это нецелесообразно, поэтому я отказываюсь от идеи этого приложения, поскольку я не вижу, чтобы оно использовалось в нем. По сути, основная идея приложения зависела от измерения расстояния (хотя просто зная, составляет ли оно > 3 футов) устройства от rest до точки приема пользователя, что, как я теперь вижу, невозможно сделать с помощью акселерометра.
2. Рад слышать, что это помогло. Насколько я знаю, существует библиотека жестов, также упомянутая в видео, возможно, она уже поддерживает то, что вам нужно. Я не программирую устройства Android, поэтому я не знаю больше об этом. Удачи!
3. Привет, спасибо. Я загляну в библиотеку жестов. Во-вторых, я просто тестирую некоторые вещи с помощью TYPE_LINEAR_ACCELERATION, я мог бы заставить его работать так, как я хочу. Опубликую обновление, если мне повезет.
Ответ №2:
На самом деле вы можете установить (только) вертикальное положение без измерения ускорения с течением времени. Это достигается путем измерения угла между направлением к центру Земли и направлением на северный магнитный полюс.
Это изменяется (значительно) только при изменении высоты телефона. Что вы делаете, так это используете accelerometer
и magnetometer
, чтобы получить два массива с плавающей точкой [3], обрабатываете их как векторы, превращаете их в единичные векторы, а затем угол между любыми двумя единичными векторами равен arccos (AxM).
Обратите внимание, что это точечное произведение, то есть. math.acos(A[0]*B[0] A[1]*B[1] A[2]*B[2])
Любое изменение этого угла соответствует изменению высоты. Также обратите внимание, что это должно быть откалибровано в реальных единицах, и отношение изменения угла к высоте будет разным на разных долготах; Но это метод получения абсолютного значения высоты; хотя, конечно, угол также становится искаженным при ускорении или при наличии близлежащих магнитов 🙂
Ответ №3:
-
вы можете соотнести это с датчиком магнитного поля в microTesla
-
Вы можете использовать dist = интеграл от интеграла ускорения ~ сигма ~ суммирование = интеграл от скорости константа
Комментарии:
1. Что ты говоришь?? Можете ли вы это объяснить?