Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

24.05.2012, 21:46

Richtung der Beschleunigung korrigieren

Hi,

die Frage hat jetzt nichts mit Computergrafik zu tun, aber da die mathematischen Grundlagen die selben sein dürften, stelle ich die einfach trotzdem mal in diesem Forum:

Ich habe einen 3D-Beschleunigungssensor, der in Ruhestellung und bei exakter Einbaulage einen Wert von ca. -9,81 für die Z-Richtung zurückliefert (entsprechend der Gravitation in Z-Richtung, also von oben nach unten). Allerdings kann es sein, dass der Sensor eben nicht exakt waagerecht eingebaut ist, sondern irgend wie schräg. Im Ergebnis misst dieser schief eingebaute Sensor in Ruhestellung dann irgend welche Werte für X, Y und Z, welche zusammen die nach unten gerichtete Gravitation repräsentieren.

Diese Werte würde ich jetzt gerne verwenden, um daraus einen Korrekturwert zu errechnen, welcher mir aussagt, wie ich den Sensor in welche Richtung drehen müsste, um wieder eine exakt parallele und waagerechte Einbaulage zu erhalten.

Genau diesen Korrekturwert möchte ich später verwenden, um die für X, Y und Z gelieferten Werte so zu verändern, dass sich daraus wieder die exakten seitlichen und Längs-Beschleunigungswerte erhalte. Kurz und knapp: ich will jeweils die schiefe Einbaulage des Sensors herauszuberechnen.

Nur: wie geht das am cleversten?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

24.05.2012, 22:14

Kannst du nicht einfach dem Benutzer sagen er soll das Ding, was auch immer es genau ist, mal richtig waagerecht hinlegen und dir dann eben den Wert merken?

3

24.05.2012, 22:21

Leider nein. Das Teil ist in jedem Fall irgend wie schräg eingebaut, die einzige Chance, die ich habe, ist eben in Grunstellung zu erkennen, in welche Richtung die Gravitation geht und daraus auf die tatsächliche Einbaulage zu schließen.

Im Prinzip sollte das ja auch nur ein 3D-Vektor sein, d.h. aus Soll-Vektor (X=0, Y=0, Z=-9,81) und Ist-Vektor (X!=0, Y!=0, Z!=0) müsste ich doch auf irgend eine Rotation schließen könne, welche die Einbaulage bescheibt!?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

24.05.2012, 22:48

Ich mein ja eben das Ding in Grundstellung bringen und dann den Vektor in Grundstellung betrachten. Dann kannst du dir z.B. eine Rotationsmatrix ausrechnen die den Vektor auf die von dir gewünschte Richtung dreht...

5

24.05.2012, 22:53

Ich mein ja eben das Ding in Grundstellung bringen und dann den Vektor in Grundstellung betrachten. Dann kannst du dir z.B. eine Rotationsmatrix ausrechnen die den Vektor auf die von dir gewünschte Richtung dreht...


Ja eben genau das ist ja meine Frage: WIE berechne ich diese Rotationsmatrix aus diesen beiden Vektoren?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

24.05.2012, 23:33

Ok, jetzt wo ich drüber nachdenk fällt mir auf, dass du natürlich nicht einfach nur einen Vektor brauchst, da der eine Vektor die Ausrichtung des verdrehten Chip natürlich nicht eindeutig bestimmt.

Eine einfache Lösung, die mir spontan einfällt, wär wohl, das Gerät nicht nur in eine Grundposition zu bringen, sondern in drei verschiedene, orthogonale Positionen. Alle drei Vektoren normalisieren und vorsichtshalber Gram-Schmidt Orthogonalisierung drauf durchführen (zwei Vektoren würden auch reichen und dann einfach den dritten per Kreuzprodukt bestimmen, so ists aber evtl. etwas genauer). Dann hast du drei Basisvektoren die die verdrehte Ausrichtung beschreiben. Die packst du in die Spalten einer 3x3 Matrix A. Zusätzlich hast du drei Vektoren, die deine gewünschte Ausrichtung repräsentieren. Die drei kommen in die Spalten von Matrix B. Das Produkt der Inversen von A mit B sollte dann die von dir gesuchte Matrix sein wenn mich nicht alles täuscht.

Das wär mal eine erste Lösung, geht aber sicher noch wesentlich besser...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (24.05.2012, 23:46)


BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

25.05.2012, 07:15

Vielleicht sollten wir mal wieder die wichtigste aller Fragen stellen: Wofür soll das später benutzt werden? Denn mir deucht das Ziel lässt sich auch anders erreichen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

8

25.05.2012, 07:41

Der Sensor ist in einem Fahrzeug eingebaut und misst dort die Beschleunigungswerte, die von verschiedenen Seiten kommen. Das Problem ist halt, dass der Benutzer das Gerät irgendwo irgendwie schief hinkleben kann, so dass eine korrekte Sensorausrichtung nicht mehr gegeben ist. Also muss der Spaß korrigiert werden und als einzige Referenz steht die Gravitation zur Verfügung. Dass der Benutzer die Kalibrierung auf einer Ebene macht, wird dabei vorausgesetzt (wenn irgend ein Depp das dann trotzdem an einem Berghang macht, ist er halt selber schuld).

9

25.05.2012, 08:07

Wenn du alle 3 Beschleunigungskräft (in Ruhelage) mit §a_g = \sqrt{X^2 + Y^2 + Z^2}§ zusammen rechnest kommst du dann nicht wieder auf 9,81?
Ich hätte jetzt mal gesagt sowas wie nen Eich schalter einbaun. Dann Ermitteln der Vorzeichen -> daraus lässt sich dann bestimmen ob er auf dem Kopfsteht ect.
über Sinus Cosinus ect sollten sich auch die genau lage im Raumberechnen lassen, mit Winkel zur Erdanziehungskraft. Somit sollte es ja dann möglich sein alle Korrekturwerte zu berechen.

Gruß Koschi
Wer aufhört besser werden zu wollen hört auf gut zu sein!

aktuelles Projekt:Rickety Racquet

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

10

25.05.2012, 08:13

Ah, ok, dann hast Du in der Tat Dein Ziel von Anfang an klar genug spezifiziert gehabt ;)
Ich denke aber, so schlimm kann das eigentlich nicht sein. Den Vektor in Ruhelage vom Sensor ablesen, damit sind alle Achsen-Winkel gegeben. Daraus die Rotationsmatrix erstellen und die Inverse bilden. Dürfte vermutlich dem entsprechen, was d0t auch meinte.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige