компас iPhone наклоняет компенсацию

кто-либо уже запрограммировал компас iPhone, возглавляющий наклонную компенсацию?

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

СНАЧАЛА я определяю векторный Ev, вычисленный из векторного произведения Gv и Hv. GV является вектором силы тяжести, который я создаю из значений акселерометра, и Hv является направляющимся вектором, пристроил значения магнитометра. Ev стоит перпендикуляр на Gv и Hv, таким образом, он направляется на горизонтальный Восток.

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

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

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

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

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

Спасибо, m01d

6
задан casperOne 10 May 2012 в 12:00
поделиться

1 ответ

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

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

- (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));
}
...
}
0
ответ дан 17 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: