Physik: Berechnung der Winkelbeschleunigung in der Welt im Vergleich zum lokalen Raum


7

Ich habe eine ziemlich einfache Starrkörpersimulation in Python geschrieben. In meinem Code berechne ich die Winkelbeschleunigung mit folgender Formel:

angAcc = Drehmoment * Trägheitstensor ^ -1 (Zeile-Hauptmatrix-Reihenfolge beachten)

Jetzt ist das Drehmoment im Weltraum, also sollte mein Trägheitstensor auch im Weltraum sein. Mein Python-Code, der die Winkelbeschleunigungsberechnung durchführt, sieht folgendermaßen aus:

oriMat = quaternion.ToMatrix(self.ori)
inertia_world = self.inertia_local * oriMat
matrix.Invert(inertia_world)
angAcc = vector.Transform(self.totalTorque, inertia_world)

oriMat ist effektiv eine Transformation von lokal zu Welt. self.totalTorque ist das Drehmoment im Weltraum. Dieser Code wandelt also die lokale Trägheit in die Weltträgheit um und verwendet ihre Umkehrung zusammen mit dem Weltdrehmoment, um die Weltwinkelbeschleunigung zu berechnen. Dieser Code funktioniert völlig einwandfrei.

Ich überlegte, ob ich die Winkelbeschleunigungsberechnung im lokalen Raum durchführen und schließlich lokales angAcc in WeltangAcc umwandeln könnte. Hier ist der Code:

oriMat = quaternion.ToMatrix(self.ori)
self.totalTorque = vector.Transform(self.totalTorque, matrix.Inverted(oriMat))
angAcc = vector.Transform(self.totalTorque, matrix.Inverted(self.inertia_local))
angAcc = vector.Transform(angAcc, oriMat)

Hier wollte ich die Drehmoment-Trägheitstransformation im lokalen Raum durchführen. Dazu transformiere ich self.totalTorque mithilfe der Umkehrung von oriMat in den lokalen Raum des starren Körpers. Dann mul ich das durch invertierte lokale Trägheit, um eine Winkelbeschleunigung im lokalen Raum zu erhalten. Schließlich transformiere ich die Winkelbeschleunigung in den Weltraum, indem ich sie mit oriMat transformiere.

Aus irgendeinem Grund liefert dieser Code kein korrektes Verhalten meines starren Körpers und ich kann wirklich nicht sagen warum. Hat jemand eine Idee?

Antworten:


1

Du sagst :

Dann mul ich das durch invertierte lokale Trägheit, um eine Winkelbeschleunigung im lokalen Raum zu erhalten.

Dies scheint falsch zu sein, da "invertierte lokale Trägheit" "Weltträgheit" ist. Sie setzen also "das" in den Weltraum, während Sie es im lokalen Raum wollen ...

Der Code sollte also sein:

// oriMat: local -> world
oriMat = quaternion.ToMatrix(self.ori)

// put total torque in local space
self.totalTorque = vector.Transform(self.totalTorque, matrix.Inverted(oriMat))

// multiply local torque with local inertia to get angAcc in local space
angAcc = vector.Transform(self.totalTorque, self.inertia_local))

// put angAcc in world space
angAcc = vector.Transform(angAcc, oriMat)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.