Обнаружение ускорения в автомобиле (iPhone Accelerometer)

Я работаю над iPhone-приложением, где мы пытаемся вычислить ускорение движущегося автомобиля. Подобные приложения достигли этого (Dynolicious), но разница в том, что это приложение предназначено для использования во время общего городского вождения, а не на полосе перетаскивания.

Это приводит нас к одной большой проблеме, которую, к счастью, удалось избежать Dynolicious: холмы. Да, холмы.

Существует два важных этапа: калибровка и фактическое вождение.

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

Следующий шаг состоял в том, чтобы добавить условие, что iPhone должен быть ориентирован таким образом, чтобы экран был обращен к задней части автомобиля. Используя этот метод, я попытался выполнить только силу на оси z, но это, очевидно, приводит к проблемам, если iPhone не был ориентирован прямо вертикально из-за силы тяжести.

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

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

Говорить с кем-то гораздо умнее меня по математике приводят к решению, которое я пытаюсь реализовать дольше, чем я хотел бы признать. Это шаги:

1) Во время калибровки измерьте гравитацию как вектор вместо размера. Сохраните этот вектор. 2) Когда автомобиль сначала движется вперед, возьмите вектор движения и вычтите гравитацию. Используйте это как импульс вперед. (Игнорируйте, на данный момент, пользовательские случаи, когда это будет сложно, и сосредоточьтесь на математике:) 3) Из вектора прямой и гравитационного вектора построим плоскость. 4) Всякий раз, когда принимается сила, проецируйте ее на указанную плоскость, чтобы избавиться от бокового усилия/и т.д. 5) Затем используйте эту силу, известную величину силы тяжести и известное направление движения вперед, чтобы по существу решить треугольник, чтобы получить передний вектор.

Проблема, которая вызывает наибольшую трудность в этой новой системе, - это не шаг 5, который я получил до такой степени, что все цифры выглядят так, как должны. Трудная часть - это на самом деле обнаружение переднего вектора. Я выбираю векторы, чья величина превышает гравитацию, а оттуда усредняет их и вычитает гравитацию. (Я делаю некоторые проверки ошибок, чтобы убедиться, что я не использую силу только потому, что акселерометр iPhone отключен, что происходит чаще, чем хотелось бы). Но если я построю эти векторы, которые я использую, они фактически меняются на угол около 20-30 градусов, что может привести к некоторым сильным неточностям. Конечным результатом является то, что приложение стало еще более неточным, чем раньше.

Итак, в основном - все, что у вас есть математика и iPhone, - какие-то вопиющие ошибки? Любые потенциально лучшие решения? Любой опыт, который может быть полезен вообще?

Премия: предоставление первого гранта в размере 250 долларов, что приводит к решению.

Ответ 1

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

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

Забудьте о 250 долларов, но я думаю, вы должны дать мне пиво за количество R & D, которое я спасу.: -)

Ответ 2

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

Как уже упоминали другие, на очень глубоком уровне нет никакого способа отличить гравитацию от ускорения; это известно как принцип эквивалентности (и был одним из самых важных идей Эйнштейна). Поэтому для решения этой проблемы нужно знать больше, чем выходной сигнал акселерометра, и это усложняет проблему. Для различных подходов к проблеме, смотрите здесь.

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

Подробнее о том, почему вам нужна внешняя ссылка:

Стоит подумать, можете ли вы использовать уникальные свойства гравитации: 1) она всегда "включена", 2) она всегда имеет одинаковую величину (для этой ситуации). Но когда все, что вы знаете, это общее ускорение, вы не можете надежно разделить два вклада. Как показано на рисунке ниже, просто зная величину силы тяжести недостаточно... изображение ниже рисуется в системе координат телефона, где измеряется результирующее ускорение (черный вектор), а цветные стрелки большего размера являются возможными векторами гравитации. в то время как меньшие по цвету стрелки соответствуют соответствующим векторам ускорения. Таким образом, вы можете видеть, не зная и под углом, у вас недостаточно информации для решения проблемы.

alt text

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

Поэтому единственным хорошим решением является использование внешней информации.

Ответ 3

Некоторые мысли:

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

Если бы это был я, я бы написал выражение об отказе от ответственности: "Это не работает на холмах, используйте прямолинейную дорогу для тестирования".

P.S.: Мне нравится денежное вознаграждение за ответы, я буду уверен и опубликую это как предложение на meta.stackoverflow.com: P

Ответ 4

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

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

Калибровка

  • Найти поверхность таким образом, чтобы ее степень искажения не менялась.
  • Найдите вектор ускорения, когда автомобиль не двигается по дороге. Запишите этот полный вектор (компоненты x, y и z) как v1. g = | v1 | это величина силы тяжести, которая должна оставаться неизменной.
  • Начните движение прямо по склону (вверх или вниз, а не в сторону, и, конечно, плоская поверхность тоже великолепна).
  • Запишите этот вектор полного ускорения как v2.
  • Найдите v3, вектор, указывающий движение вперед, используя v2 - v1 (вычитая гравитацию).
  • Найти v4= v3 x (v1 x v3), где x является векторный кросс-продукт.
  • Найти единичный вектор v4, v5= v4/| v4 |

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

  • Запишите текущий вектор ускорения a.
  • Найдите точечный продукт a и v1, c = a. v1
  • Если c меньше g (в отличие от g), автомобиль находится на склоне. Угол наклона равен theta = arccos (c/g).

Однако здесь мы сталкиваемся с проблемами. Даже если мы ограничимся наклонами, которые вверх и вниз, а не изогнутыми/банковскими влево или вправо, мы все равно не можем точно сказать, будет ли спуск вниз или вверх - только угол его. Сначала мы можем найти, если автомобиль идет вверх или вниз по склону, принимая точечный продукт v1 и v3 (положительное значение указывает на нисходящий наклон, а отрицательное значение наклон вверх).

Тем не менее, вы можете использовать факт того, уменьшается ли величина общего вектора ускорения или увеличивается по мере того, как наклон увеличивается или уменьшается, чтобы угадать это, но это не будет точно. Например, если угол (theta) наклонности был равен 0 градусам (или достаточно близко к нему), а теперь это не так, а проекция (точечный продукт) общего ускорения на единичный вектор v3 уменьшается, тогда мы можем сделать вывод, что автомобиль поднимается по склону. Опять же, это будет просто догадка, которая вполне может быть неправильной. Я могу сказать, но я имею в виду, что иногда это будет неправильно.

Это примерно столько же информации, сколько я могу представить, как выйти из системы, которая просто использует акселерометр. Удачи!

Ответ 5

@Газзардиан,

Итак, ваша существенная проблема, как я понимаю, - это определить вектор вперед. Вы можете выбрать их:

  • Вы процитируете скорость, скажем каждые 0,2 секунды в течение 5 секунд, и отключите выборку в течение следующих n секунд, чтобы ресурс не был забит. Теперь, что вы можете сделать из этих данных, вы сможете определить скорость изменения скорости (есть простые численные методы для поиска производной с использованием точек данных). Но это не даст вам ускорения в прямом смысле, потому что это не даст вам направление. AFAIK, акселерометр также дает направление, то есть насколько он склонен к одной из оси/гравитации.

Проконсультируйтесь с этой цифрой, чтобы определить угол:  Углы и холмы http://lh6.ggpht.com/_p7FIkTnaSc4/S9kkKF7oECI/AAAAAAAABYg/D1tbxNQXo0E/s288/Hill.png

Еще один возможный метод - найти дополнительную силу во время восхождения на холм. Учитывая дополнительную силу, вы можете найти угол. Вертикальная составляющая дополнительной силы должна противостоять вертикальной составляющей в противоположном направлении, g.