PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Kipp- und Neigungswinkel nur aus 3D Magnetfelddaten



monkey_cb
27.04.2011, 14:50
Hallo

ich habe eine ziemlich allgemeine Frage bezüglich der Nutzung von 3D
Magnetfeldsensoren:

- kann ich mit den Informationen von solch einem Sensor Kipp(pitch) und
Neigungswinkel(roll) ermitteln

Ich bau gerade eine Lageregelung für eine mehrfach höhenverstellbare
Plattform und habe bereits ein fusioniertes Signal von einem 3D-Gyro und
einem 3D-Beschleunigungssensor.
Um die Genauigkeit und die Ausfallsicherheit zu erhöhen will ich mit
einem 3D-Kompass (Magnetfeldsensor) Kipp- und Neigungswinkel ebenfalls
berechnen und dann wieder fusionieren (vllt inform einer gewichteten
Summe o.ä.).
Auf die Idee bin ich gekommen da ich denke das Beschleunigungssensoren
und Magnetfeldsensoren dass selbe machen bis auf die Verdrehnung der
Koordinatensysteme.
Da ich bereits einen funktionierenden Algorithmus für die
Winkelberechnung durch den Beschleunigungssensor habe wollte ich diesen
gern einfach so anpassen, dass ich den Verdrehungswinkel (Inklination
ca. 67°) berücksichtige.
Auf meiner Suche nach möglichen Ansätzen habe ich viele Threads zur
Ermittlung der Orientierung bzgl. Nordausrichtung mithilfe von
Magnetfeldsensoren und zur Tiltkompensation unter Nutzung von
Beschleunigungssensoren gefunden. Deshalb bin ich mir nicht mehr sicher
ob ich bei meiner obigen Überlegung bzgl. des Zusammenhangs zwischen
Beschleunigungs- und Magnetfeldsensoren nicht doch einen prinzipiellen
Denkfehler habe.

zur Vollständigkeit hier der Code für den ADXL345 welchen ich für einen
HMC5843 anpassen möchte:



void convert_ADXL(Uint16* data)
{
//>>>>>>>Conversion begin<<<<<<<<
ADXL_dx=(((int)data[0])|((int)data[1]<<8));
ADXL_dy=(((int)data[2])|((int)data[3]<<8));
ADXL_dz=(((int)data[4])|((int)data[5]<<8));
//>>>>>>>Conversion end<<<<<<<<<<
}

void ADXL_angle()
{
//range fitting
double const ADXL_x_norm = 0.955224; // dx : 280 ... - 256 = 536 -> 512/536 = 0.955224;
double const ADXL_y_norm = 0.966037; // dy : 264 ... - 266 = 530 -> 512/530 = 0.966037;
double const ADXL_z_norm = 0.994175; // dz : 248 ... - 267 = 515 -> 512/515 = 0.994175;
//zero-point shifting
double const ADXL_x_null = -12.0000; // x : (280 + x_null) * x_norm = 256;
double const ADXL_y_null = 1.0002; // y : (264 + y_null) * y_norm = 256;
double const ADXL_z_null = 9.4999; // z : (248 + z_null) * z_norm = 256;


ADXL_xn = ADXL_dx;
ADXL_xn += ADXL_x_null;
ADXL_xn = (int)(double) ADXL_xn * ADXL_x_norm;
ADXL_gxn = ADXL_xn*D2G;

ADXL_yn = ADXL_dy;
ADXL_yn += ADXL_y_null;
ADXL_yn = (int)(double) ADXL_yn * ADXL_y_norm;
ADXL_gyn = ADXL_yn*D2G;

ADXL_zn = ADXL_dz;
ADXL_zn += ADXL_z_null;
ADXL_zn = (int)(double) ADXL_zn * ADXL_z_norm;
ADXL_gzn = ADXL_zn*D2G;

one_g=sqrt((ADXL_gxn*ADXL_gxn)+(ADXL_gyn*ADXL_gyn) +(ADXL_gzn*ADXL_gzn));

ADXL_pitch = R2D*(atan(ADXL_gxn/(sqrt((ADXL_gyn*ADXL_gyn)+(ADXL_gzn*ADXL_gzn)))));
ADXL_roll = R2D*(atan(ADXL_gyn/(sqrt((ADXL_gxn*ADXL_gxn)+(ADXL_gzn*ADXL_gzn)))));
ADXL_yaw = R2D*(atan(ADXL_gzn/(sqrt((ADXL_gxn*ADXL_gxn)+(ADXL_gyn*ADXL_gyn)))));

}


Vielen Dank für Ideen/Anregungen im Voraus.
Stephan

Markus4004
28.04.2011, 22:03
Ich hätte jetzt vermutet, dass das Erdmagnetfeld stark gestört wird, z.B. von Elektromotoren, elektrischen Leitungen, großen Metallstücken usw.

monkey_cb
02.05.2011, 08:34
hallo markus

also ich hab jetzt auch schon mehrfach festgestellt, dass der magnetfeldsenor für die ermittlung der lagewinkel nicht geeignet ist. beispiel: wenn man annimmt dass das erdmagnetfeld welches ich hier messe betragsmäßig 1 ist steigt der wert bereits bei annäherung an meinen laptop auf 7-8.... die lagewinkel berechnen muss ich nichtsdestotrotz da ich mit messungen nachweisen muss dass die magnetfeldsensoren nicht für diesen zweck geeignet sind. aber danke für deine antwort.

grüße
stephan

Syrus
24.11.2011, 22:24
Nur für sehr grobe Lageregelung geeignet so etwa 0° 90° ...

damit lässt sich zum beispiel Feststellen ob der Quarocopter einen überschlag macht oder nicht.