iPhone - скорость вращения ядра

Используя только свойство rotationRate Core Motion или Gyroscope, можно ли определить, на сколько радиан (или градусов, если хотите) повернулось устройство?

Я попытался выполнить временную выборку данных Core Motion, например, делая выборку 5 раз в секунду, поэтому я знаю, что между каждым чтением есть 0,2 секунды. Тогда, если у меня есть скорость вращения 0,5 радиана в секунду от одного чтения к другому, теоретически я мог бы разделить это на 5 и теперь знать, сколько радиан повернуло устройство с последнего раза.

Это кажется логичным, но результаты не имеют ничего общего с реальностью. Поворот устройства на 90 градусов даст результаты, говорящие мне, что устройство повернулось в 100 раз меньше этого.

Можно ли узнать, насколько повернулось устройство, просто взглянув на RotationRate?

Что мне не хватает?


person Duck    schedule 20.02.2011    source источник
comment
Степень - радианы? Прямой угол в зависимости от ориентации устройства?   -  person Kay    schedule 21.02.2011
comment
что ты имеешь в виду? Меня не волнует, радианы это или градусы. Я просто хочу знать, на сколько градусов устройство повернулось по каждой оси. Использование рысканья, тангажа и крена не очень хорошо, потому что шаг может варьироваться от -Pi до Pi. Итак, я пытаюсь увидеть, могу ли я извлечь относительное вращение по 3 осям из этого вращения ...   -  person Duck    schedule 21.02.2011
comment
Я заметил, что это очень похоже на предыдущий вопрос, который вы задали. Причина, по которой вы не выбрали Углы Эйлера из CMAttitude, потому что высота звука варьируется от -Pi до Pi?   -  person Matt Wilding    schedule 21.02.2011
comment
Нет, это потому, что я получал дикие значения, и я хотел бы попробовать другой подход, чтобы увидеть, являются ли значения более точными.   -  person Duck    schedule 21.02.2011


Ответы (1)


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

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

В общем, я бы рекомендовал использовать временную метку, предоставляемую движением ядра, вместо определенного периода (1/5), как рекомендовано Apple, потому что данные о движении устройства часто доставляются с более низкой частотой, чем ожидалось (см. Какова официальная максимальная частота обновления данных гироскопа iPhone 4 и или Метод Push для движения ядра и частота данных акселерометра / гироскопа.

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

[Обновление из раздела комментариев:]

Если вы заинтересованы в интеграции с помощью расширенного правила Симпсона, я рекомендую эту статью (только на немецком языке, стр. 173 и далее) и An Расширение формул Ньютона-Котеса. Пример кода в виде фрагмента, извлеченного из существующего проекта, можно найти здесь: DevicePosition.m Обратите внимание, что он может не компилироваться, без гарантии, как есть, ... вы знаете это по другим сайтам ;-)

Бесплатное приложение, отображающее входные данные датчика в виде графиков для iPhone: Sensor Monitor < / а>

person Kay    schedule 20.02.2011
comment
Благодарю. Я пробовал использовать официальные временные метки, но вот большая проблема. Мой метод делает это. Когда он запускается, мне нужно считывать исходное положение, и я рассчитываю вращение устройства. Допустим, iphone находится в состоянии покоя, а значение угла показывает 0 градусов. Затем поворачиваю на 180 градусов. Во время вращения подпрограмма делает следующее: считывает разницу между отметками времени (текущей и последней) - позволяет вызвать эту дельту, считывает RotationRate, делит ее на дельту. Итак, теперь он знает, на сколько он повернулся с прошлого раза .... продолжается - person Duck; 21.02.2011
comment
если я поверну устройство на 180 градусов по одной оси и вернусь в исходное положение, сумма всех дельт должна быть равна нулю, но это не так. Исходное положение, которое было указано как нулевое, теперь отображается неверно ... например, поворот на 180 градусов сообщается как более или менее 150 градусов ... - person Duck; 21.02.2011
comment
Ах, делится на дельту? скорость * время = угол. скорость / время = ускорение. Извините, я неправильно прочитал ваш вопрос (вы уже указали это) и принял 1/5 секунды как временную дельту для умножения. Может и все :) - person Kay; 21.02.2011
comment
Извините, моя ошибка, я имел ввиду умножение на дельту. К сожалению, я умножаю на дельту, и диапазон сообщается как 150 градусов более или менее для реального поворота на 180 градусов, и каждый раз, когда вы вращаете, сообщается другой угол. Я буду продолжать искать пути. Спасибо. - person Duck; 21.02.2011
comment
то, что я обнаружил в этом процессе, - это то, что вы не можете доверять RotationRate как индикатору направления вращения, когда вращение небольшое. Теоретически ротацияRates идет со знаком плюс, когда вращение против часовой стрелки, и со знаком минус, когда оно вращается по часовой стрелке (правило правой руки). Но это неверно, когда вращение небольшое, даже при использовании несмещенных данных Core Motion. - person Duck; 21.02.2011
comment
Я так не думаю. Взгляните на этот график, только что записанный с iPhone4 с очень приличным фильтром нижних частот (= 0,9) и частотой около 75 Гц: dl.dropbox.com/u/658954/RotationRate_LowPass0.9.jpg. Я сделал очень маленький поворот, и он увеличен. Вы видите просто мое собственное превышение (правильный английский?), Когда я замедляюсь с vMax до 0. Если я действительно сконцентрирован на движении, мне удается этого избежать. - person Kay; 21.02.2011
comment
Со мной этого не происходит. Не могли бы вы прислать мне это приложение для тестирования, чтобы я мог посмотреть, как вы его сделали? Возможно это что-то связано с фильтром нижних частот ... спасибо - person Duck; 21.02.2011
comment
Я говорил не обо всем проекте, а о том, как вы выполняете выборку и фильтрацию, но неважно. Итак, я прав, когда говорю, что ротацияRate не заслуживает доверия. Если вам пришлось разработать свой собственный фреймворк, чтобы обнаружение работало, это сигнал о том, что Apple неисправна. Спасибо. - person Duck; 21.02.2011
comment
Моя структура интерпретирует входные данные датчика на более высоком уровне для обнаружения различных предопределенных движений с использованием искусственного интеллекта, такого как обучение и так далее. Я использовал RotationRate для динамических частей, т.е. для которых не нужно знать точное положение в конце. Это отлично работает, потому что меня интересует только скорость. Для тех частей, которым нужна точная информация о местоположении, я использовал кватернионное представление CMAttitude (матрица вращения тоже сделает это). Я использую правило Симпсона с неэквидистантными временными интервалами, и это один из немногих некрасиво закодированных классов (из 80). Упрощение до линейного интегрирования приводит к ... - person Kay; 21.02.2011
comment
phi (n) = СУММ (rotRate (n) * deltaTime (n)) - person Kay; 21.02.2011
comment
Модераторы ненавидят длинные цепочки комментариев, но это было очень проницательно, и, надеюсь, они не удалят его. К сожалению, они склонны думать, что письменные правила заменяют чье-либо мнение или индивидуальное суждение. Не могли бы вы повторно опубликовать свой код DevicePosition? Ссылки Dropbox мертвы. - person Potatoswatter; 05.03.2012
comment
Я обновил ответ и оставил несколько своих комментариев. Я случайно удалил фотографию, но все равно оставляю комментарий из-за прочего. - person Kay; 05.03.2012