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
какво имаш предвид? Не ме интересува дали са радиани или градуси. Просто искам да знам на колко градуса е завъртяно устройството във всяка ос. Използването на Yaw, pitch и roll не е добро, защото pitch просто варира от -Pi до Pi. И така, опитвам се да видя дали мога да извлека относителното въртене по 3 оси от този rotationRate...   -  person Duck    schedule 21.02.2011
comment
Случайно забелязах, че това е много подобно на предишния въпрос, който зададохте. Причината да не използвате Euler Angles от 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: Сензорен монитор

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 като индикация за посоката на въртене, когато въртенето е малко. На теория rotationRates идва със знак плюс, когато въртенето е обратно на часовниковата стрелка, и със знак минус, когато е по часовниковата стрелка (правило на дясната ръка). Но това не е вярно, когато ротацията е малка, дори при използване на безпристрастни данни от Core Motion. - person Duck; 21.02.2011
comment
Не мисля така. Погледнете тази графика, току-що записана от iPhone4 с много приличен нискочестотен филтър (=0,9) и честота около 75Hz: dl.dropbox.com/u/658954/RotationRate_LowPass0.9.jpg . Направих много малко завъртане и това е увеличено. Това, което виждате, е само моето собствено превишаване (правилен английски?), когато забавям от vMax до 0. Ако наистина съм концентриран върху движението, успявам да избегна това. - person Kay; 21.02.2011
comment
Това не ми се случва. Можете ли да ми изпратите това приложение, което направихте за тест, за да мога да видя как сте го направили? Може би това е нещо, свързано с нискочестотния филтър... благодаря - person Duck; 21.02.2011
comment
Не говорех за целия проект, а само как взимате проби и филтрирате, но няма значение. Така че съм прав, когато казвам, че rotationRate не е надежден. Ако трябваше да разработите своя собствена рамка, за да работи откриването, това е сигнал, че Apple е дефектен. Благодаря. - person Duck; 21.02.2011
comment
Моята рамка интерпретира входа на сензора на по-високо ниво за откриване на различни предварително дефинирани движения с помощта на AI като обучение и т.н. Използвах rotationRate за динамични части, т.е. които не трябва да знаят точната позиция в края. Това работи отлично, защото се интересувам само от скоростта. За онези части, които се нуждаят от точна информация за позицията, използвах кватернионното представяне на CMAttitude (матрицата на въртене също ще го направи). Използвам правилото на Симпсън с нееквидистантни времеви интервали и е един от малкото грозно кодирани класове (от 80). Опростяването му до линейна интеграция води до ... - person Kay; 21.02.2011
comment
phi(n) = SUM(rotRate(n) * deltaTime(n)) - person Kay; 21.02.2011
comment
Модераторите мразят дългите нишки с коментари, но това беше много проницателно и се надяваме, че няма да го изтрият. За съжаление, те са склонни да мислят, че писаните правила заменят нечие мнение или преценка за всеки отделен случай. Имате ли нещо против да публикувате отново кода си за DevicePosition? Връзките на Dropbox са мъртви. - person Potatoswatter; 05.03.2012
comment
Актуализирах отговора и премахнах някои от коментарите си. Случайно изтрих снимката, но все пак оставям коментара заради други неща. - person Kay; 05.03.2012