Как найти расстояние, пройденное гироскопом и акселерометром?

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

Как мне подойти к этой проблеме?

    Основным исчислением этой проблемы является выражение

    введите описание изображения здесь

    (и аналогичные выражения для смещений по y и z) и базовой геометрии есть теорема Пифагора

    введите описание изображения здесь

    Таким образом, как только вы передадите свои сигналы акселерометра через фильтр нижних частот и закодированы во времени с интервалом выборки dt, вы можете найти смещение в x как ( pardon my C … )

    float dx=0.0f; float vx=0.0f; for (int i=1; i 

    и аналогично для dy и dz. Вот

     float acceleration_x[n]; 

    содержит значения ускорения x от начала до конца измерения в моменты времени 0, dt, 2 * dt, 3 * dt, ... (n-1) * dt.

    Чтобы найти полное перемещение, вы просто

     dl=sqrt(dx*dx + dy*dy + dz*dz); 

    Гироскоп для этого не нужен, но если вы измеряете линейные расстояния, вы можете использовать показания гироскопа для управления тем, что rotation устройства не слишком велико. Если rotation было слишком сильным, попросите пользователя выполнить измерение.

    Вы получаете позицию, дважды интегрируя линейное ускорение, но ошибка ужасна. На практике это бесполезно.

    Вот объяснение, почему (Google Tech Talk) в 23:20. Я очень рекомендую это видео.

    Похожие вопросы:

    • отслеживать небольшие движения iphone без GPS

    • Какова реальная точность телефонных акселерометров при использовании для позиционирования?

    • как рассчитать движение телефона в вертикальном направлении от restа?

    • iOS: точность перемещения в 3D пространстве

    • Как использовать акселерометр для измерения расстояния для разработки приложений Android

    • Расстояние, перемещаемое акселерометром


    Обновление (24 февраля 2013 г.): @Simon Да, если вы знаете больше о движении, например, человек, идущий, и датчик находится на ноге, тогда вы можете сделать намного больше. Они называются

    доменных допущений .

    Они терпят неудачу, если предположения не выполняются и могут быть довольно громоздкими для реализации. Тем не менее, если они работают, вы можете делать забавные вещи. См. Ссылки в моем ответе Точность акселерометра Android (Инерциальная навигация) при помещении в помещении.

    Вы должны использовать интерфейс Core Motion, как описано в « Простое обнаружение движения iPhone» . Особенно можно отслеживать все повороты очень точно. Если вы планируете сделать что-то, связанное с линейными движениями, это очень сложно. Посмотрите, как перемещать данные акселерометра с помощью Core Motion .

    Я взломал это и сдался (поздно ночью, похоже, никуда не денутся). Это для проекта Unity3d.

    Если кто-то захочет подобрать то место, где я остановился, я был бы рад рассказать о том, что делает все это.

    В основном после того, что оказалось ложным, я подумал, что попытаюсь отфильтровать его с помощью фильтра нижних частот, затем попытаюсь удалить отскоки, найдя тренд, затем (acc_x [i-1] + acc_x [i] ) / 2.

    Похоже, что ложный позитив все еще исходит от наклона, который я попытался удалить.

    Если этот код полезен или ведет вас куда-нибудь, пожалуйста, дайте мне знать!

     using UnityEngine; using System.Collections.Generic; ///  /// [email protected] ///  public class AccelerometerInput : MonoBehaviour { Transform myTransform; Gyroscope gyro; GyroCam gyroCam; void Awake() { gyroCam= FindObjectOfType (); myTransform = transform; if (SystemInfo.supportsGyroscope) { gyro = Input.gyro; gyro.enabled = true; } } bool shouldBeInitialized = false; void Update () { transform.Translate (GetAccelerometer ());// * Time.deltaTime * speed); //GetComponent ().AddForce (GetAccelerometer ()); } public float speed = 10.0F; public Vector3 dir; public float f; Vector3 GetAccelerometer() { dir = Input.acceleration; dir.x *= gyro.attitude.x; dir.z *= gyro.attitude.z; if (Mathf.Abs (dir.x) < .001f) dir.x = 0; dir.y = 0; if (Mathf.Abs (dir.z) < .001f) dir.z = 0; RecordPointsForFilter (dir); //print ("Direction : " + dir.ToString("F7")); return TestPointsForVelocity(); } Vector3[] points = new Vector3[20]; int index; void RecordPointsForFilter(Vector3 recentPoint) { if (index >= 20) index = 0; points [index] = EvaluateTrend (recentPoint);; index++; } //try to remove bounces float xTrend = 0; float zTrend = 0; float lastTrendyX = 0; float lastTrendyZ = 0; Vector3 EvaluateTrend(Vector3 recentPoint) { //if the last few points were positive, and this point is negative, don't pass it along //accumulate points into a trend if (recentPoint.x > 0) xTrend += .01f; else xTrend -= .1f; if (recentPoint.z > 0) zTrend += .1f; else zTrend -= .1f; //if point matches trend, keep it if (xTrend > 0) { if (recentPoint.x > 0) lastTrendyX = recentPoint.x; } else // xTrend < 0 if (recentPoint.x < 0) lastTrendyX = recentPoint.x; if (zTrend > 0) { if (recentPoint.z > 0) lastTrendyZ = recentPoint.z; } else // xTrend < 0 if (recentPoint.z < 0) lastTrendyZ = recentPoint.z; return new Vector3( lastTrendyX, 0, lastTrendyZ); } Vector3 TestPointsForVelocity() { float x = 0; float z = 0; float xAcc = 0; float zAcc = 0; int successfulHits = 0; for(int i = 0; i < points.Length; i++) { if(points[i]!=null) { successfulHits ++; xAcc += points[i].x; zAcc += points[i].z; } } x = xAcc / successfulHits; z = zAcc / successfulHits; return new Vector3 (x, 0, z); } } 

    Вот ответ . Кто-то спросил раньше.

    Существует приложение под названием RangeFinder, которое делает то же самое (доступно в App Store).

    (acc_x [i-1] + acc_x [i]) / 2 – фильтр нижних частот, это среднее значение между двумя измерениями во времени

    также смотрите здесь: http://www.freescale.com/files/sensors/doc/app_note/AN3397.pdf pag: 3

    Interesting Posts

    boost :: asio + std :: future – Нарушение прав доступа после закрытия сокета

    Массовая вставка записей в таблицу Active Record

    Невозможно ввести unicode из-за сочетания клавиш

    Sass Интерполяция имен Mixin, Function и Variable

    Chrome: Ctrl-K для поиска в Google и Ctrl-L для меня, я чувствую себя счастливым

    Как переопределить блокировку автозаполнения на бланках (Google Chrome)?

    В vim, как я могу быстро переключаться между вкладками?

    Измените цвет текста одного ClickableSpan при нажатии, не затрагивая другие ClickableSpans в том же TextView

    байты строки в java?

    Сохраненная процедура медленна при вызове из Интернета, быстро из Management Studio

    Простой TextView.setText вызывает 40% использования ЦП

    C ++ Функция Обратные вызовы: невозможно преобразовать из функции-члена в подпись функции

    Форматирование даты в WPat datagrid

    Что означают цвета слота для ОС материнской платы?

    Когда следует использовать double вместо десятичного?

    Давайте будем гением компьютера.