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.000000

    startQuaternion.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(): 0

    angularDistance: 0



  • Habs verstanden!

    Die Rotation bezieht sich immer auf einen "Start-Vector" bzw. ein fixes Koordinatensystem. Jetzt ergibt alles einen Sinn! Vielen Dank!