Winkel zwischen Quaternion mit oder ohne Eigen
-
Denkfehler?
Der Winkel zwischen den Achsen des Standard-Koordinatensystems(xyz) Beträgt Π bzw. 90°
Also sollte der Winkel zwischen bspw.
Q1(0.1,1,0,0) und Q2(0.1,0,1,0) auch genau 1.570796327 bzw. Π sein.
Folgende Funktion und auch die Q1.angularDistance(Q2) von Eigen:
double angularDistance(Eigen::Quaterniond a, Eigen::Quaterniond b){ using std::atan2; Eigen::Quaterniond d = a * b.conjugate(); d.normalize(); double angle_result = 2.0f* acos(d.w()); if(angle_result > M_PI) return 2.0f * M_PI - angle_result; return angle_result; }
ergeben allerdings bspw.:
Q1(0.1,1,0,0) -> Q2(0.1,0,1,0) = 3.12179
Q1(0.5,1,0,0) -> Q2(0.5,0,1,0) = 2.73888
-
quaternionenIon schrieb:
Denkfehler?
ja
quaternionenIon schrieb:
Der Winkel zwischen den Achsen des Standard-Koordinatensystems(xyz) Beträgt Π bzw. 90°
Also sollte der Winkel zwischen bspw.
Q1(0.1,1,0,0) und Q2(0.1,0,1,0) auch genau 1.570796327 bzw. Π sein.
Was ist die Signifikanz von 0.1 und 1?
Zur einfachen Vorstellung:
Was ist z.B. mit [101000;1;0] und [101000;0;1]? Nach Normalisierung sind das Punkte, die sehr nahe der gleichen Koordinatenachse liegen, der Winkel zwischen beiden Ortsvektoren wäre folglich nahe Null.
-
Vielen Dank für deine Antwort!
der Winkel zwischen beiden Ortsvektoren wäre folglich nahe Null.
Ok, das kann ich nachvollziehen. Aber im konkreten Beispiel habe ich mal einfach X und Y-Vector angesetzt und den Winkel zwischen den entsprechenden Quaternionen berechnen lassen.
Eigen::AngleAxisd startAxis(0,Eigen::Vector3d::UnitX()); Eigen::Quaterniond startQuaternion(startAxis); startQuaternion.normalize(); Eigen::AngleAxisd targetAxis(0,Eigen::Vector3d::UnitY()); Eigen::Quaterniond target_pose(targetAxis); target_pose.normalize();
Warum sind die Quaternionen identisch?
startAxis.angle(): 0.000000, X: 1.000000, Y: 0.000000, Z: 0.000000
targetAxis.angle(): 0.000000, X: 0.000000, Y: 1.000000, Z: 0.000000startQuaternion.w(): 1 startQuaternion.x(): 0 startQuaternion.y(): 0 startQuaternion.z(): 0
target_pose.w(): 1 target_pose.x(): 0 target_pose.y(): 0 target_pose.z(): 0angularDistance: 0
-
Habs verstanden!
Die Rotation bezieht sich immer auf einen "Start-Vector" bzw. ein fixes Koordinatensystem. Jetzt ergibt alles einen Sinn! Vielen Dank!