Гравитация как ориентир в данных акселерометра в iOS - PullRequest
0 голосов
/ 24 ноября 2011

Я работаю над приложением для мотоциклистов для iPhone, которое обнаружит сбой после его возникновения.В настоящее время мы находимся в процессе сбора данных и строим графики и смотрим на данные.То, что мне нужно для регистрации, - это ускорение вперед и угол наклона велосипеда по отношению к велосипеду, стоящему прямо на дороге.Я могу получить вектор ускорения пользователя, т. Е. Направление вперед, в котором гонщик движется, по квадратам значений акселерометра x, y и z в квадрате.Но для угла наклона мне нужен постоянный ориентир, поэтому я подумал, что давайте использовать вектор гравитации.Теперь я понимаю, что deviceMotion API имеет значения силы тяжести и ускорения пользователя, откуда эти значения и что они означают?Если я возьму квадрат квадратов x, y и z, составляющих гравитацию, это всегда даст мне прямую связь?Как я могу использовать это, чтобы найти угол наклона велосипеда относительно вертикального велосипеда на дороге?Спасибо.

Ответы [ 3 ]

1 голос
/ 24 ноября 2011

Отложив "whiy", сделайте это ...

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

Очень интересная идея.

0 голосов
/ 27 ноября 2011

Так как это не шутка.

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

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

Например, большинство современных текстильных мотоциклетных курток имеют карман для мобильного телефона слева внутри.Если бы пользователь положил телефон в этот карман, вы могли бы ожидать только ускорение и ускорение (~ z).В этом сценарии вы ожидаете, что почти никогда не увидите значительного ускорения из стороны в сторону (~ x), потому что всадник наклоняется пропорционально силе g поворота.Поэтому, обходя кривую, можно ожидать увеличения (y) по сравнению с ее общим состоянием в 1g.Таким образом, туловище всадника в основном зависит от силы тяжести (x).

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

Что касается эвристики алгоритма обнаружения сбоя, определить ее очень сложно.Некоторые аварии похожи на то, что вы видите по телевизору, велосипедные перевороты разрывают на миллион кусочков, этот сбой должен быть чрезвычайно легко обнаружить, да, 3gs измерено ... Crash!Но как насчет простых спусков? (Велосипед лежит на боку, упс, всадник встает, забирает велосипедные поездки). Они могут происходить без каких-либо особенно заметных перегрузок (за исключением примерно 1 г влево или вправо на оси х).)

Еще пара предложений:

  • Регулировка чувствительности, возможно, даже в каком-то режиме обучения (когда пользователь переводит устройство в этот режим и едет, устройствозатем записывает / изучает среднюю скорость езды для этого пользователя)

  • Кнопка «Я остановился» или аналогичная кнопка;возможно, гонщик не разбился, может, он или она просто сломались, это происходит, и, поскольку у вас есть какая-то специальная настройка сети, должно быть легко распространять новости.

0 голосов
/ 24 ноября 2011

Предполагая, что это не «вопрос шутки», вам понадобится контрольная точка для сравнения с, т. Е. Позицией, занимаемой, когда пользователь нажимает «старт». Тогда вы можете использовать cos(currentGravity.z / |referenceGravity|) с | referenceGravity | == 1 потому что Core Motion измеряет ускорения в г.

Но, честно говоря, есть пара проблем, например:

  • Устройство должно быть в фиксированном положении, когда вы берете систему отсчета, если вы положите его в карман, и он просто немного перемещается внутрь, ваши измерения - мусор
  • Хм, драйвер мертв, а устройство живо? Хороши шансы, что iPhone тоже не выживет
  • Если приложение переходит в фоновый режим, Core Motion засыпает и перестает выдавать значения
  • Это должно быть внутреннее приложение, потому что забудьте о получении одобрения для магазина приложений

Или мы вас неправильно поняли, и это просто игра?

...