2010-03-27 2 views
6

Кто-нибудь уже запрограммировал компенсацию наклона микрофона для iphone?Компенсация наклона iphone компаса

У меня есть некоторые подходы, но некоторая помощь или лучшее решение было бы круто!

FIRST i определите вектор Ev, вычисленный из перекрестного произведения Gv и Hv. Gv - вектор гравитации i, построенный из значений акселерометра, а Hv - вектор направления, построенный по значениям магнитометра. Ev стоит перпендикулярно на Gv и Hv, поэтому он движется к горизонту востока.

SECOND i определите вектор Rv, вычисленный из поперечного произведения Bv и Gv. Bv - это мой вектор, который определяется как [0,0, -1]. Rv перпендикулярно Gv и Bv и всегда отображается вправо.

THIRD Угол между этими двумя векторами Ev и Rv должен быть моим исправленным заголовком. для вычисления угла i построим точечный продукт и его арко.

Фи = Arcos (Ev * Rv/| Ev | * | Rv |)

Теоретически это должно работать, но, возможно, я должен нормировать векторы ?!

У кого-нибудь есть решение для этого?

Спасибо, m01d

ответ

3

Угу. Вы НЕОБХОДИМО нормализовать. Это из моего кода, который я использую для извлечения ориентации устройства. силы тяжести получается как х, у, г акселерометра и компас получается из х, у, г функции заголовка

gravity.normalize(); compass.normalize(); compassEast = gravity.cross (компас);
compassEast.normalize();
compassNorth = compassEast.cross (gravity); compassNorth.normalize();

Дайте мне знать, если вам нужен полный код. Кроме того, для тех, кто havnt еще не видел гироскоп iphone 4s в действии: его потрясающий! Я поменял вышеуказанный вход на гравитацию и компас на эквиваленты от гироскопа, и результат стабильный, гладкий и потрясающий :) Go Apple.

+0

Можно ли увидеть исходный код? Мне было любопытно. Не могли бы вы отправить исходный код на адрес [email protected]? – fyasar

+0

Меня также интересует код. Моя электронная почта: ellen.sundh [at] gmail.com Спасибо! –

0

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

Здесь ISS мой код для вышеупомянутого решения, но не окончательный рабочий раствор:

- (void)locationManager:(CLLocationManager *)manager didUpdateHeading:(CLHeading *)newHeading{ 
if (newHeading != nil) { 
float Ax = accelerationValueX; 
float Ay = accelerationValueY; 
float Az = accelerationValueZ; 
float filterFactor = 0.2; 
Mx = [newHeading x] * filterFactor + (Mx * (1.0 - filterFactor)); 
My = [newHeading y] * filterFactor + (My * (1.0 - filterFactor)); 
Mz = [newHeading z] * filterFactor + (Mz * (1.0 - filterFactor)); 

float counter = ( -pow(Ax, 2)*Mz + Ax*Az*Mx - pow(Ay, 2)*Mz + Ay*Az*My); 
float denominator = (sqrt(pow((My*Az-Mz*Ay), 2) + pow((Mz*Ax-Mx*Az), 2) + pow((Mx*Ay-My*Ax), 2)) * sqrt(pow(Ay, 2)+pow(-Ax, 2))); 
headingCorrected = (acos(counter/denominator)* (180.0/M_PI)) * filterFactor + (headingCorrected * (1.0 - filterFactor)); 
} 
... 
} 
Смежные вопросы