Компенсация наклона компаса iphone - PullRequest
6 голосов
/ 27 марта 2010

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

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

ПЕРВОЕ я определяю вектор Ev, вычисленный из перекрестного произведения Gv и Hv. Gv - это вектор силы тяжести, который я строю из значений акселерометра, а Hv - это вектор направления, построенный из значений магнитометра. Ev стоит перпендикулярно на Gv и Hv, поэтому он направляется на восток.

ВТОРОЙ я определяю вектор Rv, рассчитанный из перекрестного произведения Bv и Gv. Bv - мой выглядящий вектор, и он определяется как [0,0, -1]. Rv перпендикулярен Gv и Bv и показывает всегда вправо.

ТРЕТИЙ угол между этими двумя векторами, Ev и Rv, должен быть моим исправленным курсом. чтобы вычислить угол, я строю скалярное произведение и его аркос.

phi = arcos (Ev * Rv / | Ev | * | Rv |)

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

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

Спасибо, m01d

Ответы [ 3 ]

3 голосов
/ 18 сентября 2010

Да. Вы, безусловно, должны нормализовать. Это из моего кода, который я использую для извлечения ориентации устройства. Гравитация получается как x, y, z акселерометра и компас получается из x, y, z функции курса

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

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

2 голосов
/ 19 сентября 2011

Я не получил исходный код, но настроил свой собственный пример. Вы можете увидеть проект и код здесь: http://www.sundh.com/blog/2011/09/stabalize-compass-of-iphone-with-gyroscope/

0 голосов
/ 19 мая 2010

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

Вот мой код для решения выше, но это не окончательное рабочее решение:

- (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));
}
...
}
...