2013-08-05 3 views
0

Я пытаюсь решить, казалось бы, легкую проблему, связанную с движением устройства, но не мог понять, как ее решить. У меня ситуация, когда iPhone будет двигаться по кругу в плоскости x-y. Мне нужно найти угол между осями x и y для iPhone относительно центра вращения. IPhone может находиться в портретном режиме или в ландшафтном режиме или под любым углом между относительно линии, соединяющей iphone с центром вращения. См. Прикрепленное изображение, объясняющее сценарий.Движение устройства в ограниченной среде

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

Я ценю любую помощь или указатели.

enter image description here

+0

То, что вы описываете, похоже на ограниченный случай _dead reckoning_. В общем, мертвый подсчет очень тяжелый (может едва работать, если вы применяете фильтр Калмана). Я не уверен, что перемещение по кругу ограничивает его достаточно, чтобы избежать проблемы неточности двойной интеграции. – Kornel

+0

@porneL Он только отслеживает ориентацию, чтобы избежать двойного интеграла. – Ali

+0

Прочитав немного о мертвом расчете - да, это то, о чем я думал. Я думал об избежании кумулятивной ошибки, беря каждый экземпляр двух последовательных позиций в качестве независимой точки. Я могу получить изменение угла через изменение угла поворота и расстояние, пройденное через дельта x и delta y (хотя не знаю, как применить фильтр Калмана). – ae262

ответ

0

(я пишу в псевдокоде, так как я не знаю, API, который вы используете, извините.)

Вот как получить ось и угол поворота.

Получите матрицы вращения R1 и R2 в начале и конце вашего вращения непосредственно из API (см. CMAttitude и CMRotationMatrix). Затем определите angle и axis вращения R, который приносит R1 для выравнивания с R2. Вы получаете R следующим образом:

R = R1 * transpose(R2) 

Угол поворота R является

angle = acos((trace(R)-1)/2) 

и его ось

axis = { R[3][2]-R[2][3], R[1][3]-R[3][1], R[2][1]-R[1][2] } 

Для получения более подробной информации, пожалуйста, проверьте Rotation matrix to axis angle, а также Axis-angle.


Я не уверен, как получить интересующий вас угол. Тем не менее, я надеюсь, что это поможет.


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

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

+0

Спасибо! Мне нужно сделать некоторое чтение, чтобы обновить матрицу вращения и т. Д. И лучше понять, что вы описали. Я не уверен, что это за ось, но я думаю, что это может помочь мне получить угол между устройством и осью вращения. – ae262

+0

ваш ответ не помог мне в поиске угла, который я искал, но он указал мне в хорошем направлении. Спасибо за вашу помощь!! – ae262

+0

@ ae262 Да, я знаю, что это не говорит вам о том, что вы ищете, извините. Я считаю, что вам понадобится вектор скорости, чтобы получить этот угол, но не уверен. Печальная новость заключается в том, что вы не можете получить точную оценку скорости со смартфонами, просто потому, что эти сеньеры недостаточно точны. – Ali

Смежные вопросы