diff --git a/src/fsfw/globalfunctions/math/QuaternionOperations.cpp b/src/fsfw/globalfunctions/math/QuaternionOperations.cpp index ce44dc08..293eb168 100644 --- a/src/fsfw/globalfunctions/math/QuaternionOperations.cpp +++ b/src/fsfw/globalfunctions/math/QuaternionOperations.cpp @@ -153,3 +153,26 @@ double QuaternionOperations::getAngle(const double* quaternion, bool abs) { } } } + +void QuaternionOperations::rotationFromQuaternions(const double qNew[4], const double qOld[4], + const double timeDelta, + double rotRate[3]) { + double qOldInv[4] = {0, 0, 0, 0}; + double qDelta[4] = {0, 0, 0, 0}; + + inverse(qOld, qOldInv); + multiply(qNew, qOldInv, qDelta); + if (VectorOperations::norm(qDelta, 4) != 0.0) { + normalize(qDelta); + } + if (VectorOperations::norm(qDelta, 3) == 0.0) { + rotRate[0] = 0.0; + rotRate[1] = 0.0; + rotRate[2] = 0.0; + return; + } + double rotVec[3] = {0, 0, 0}; + double angle = getAngle(qDelta); + VectorOperations::normalize(qDelta, rotVec, 3); + VectorOperations::mulScalar(rotVec, angle / timeDelta, rotRate, 3); +} diff --git a/src/fsfw/globalfunctions/math/QuaternionOperations.h b/src/fsfw/globalfunctions/math/QuaternionOperations.h index 473cee2b..4e302017 100644 --- a/src/fsfw/globalfunctions/math/QuaternionOperations.h +++ b/src/fsfw/globalfunctions/math/QuaternionOperations.h @@ -25,6 +25,9 @@ class QuaternionOperations { static void slerp(const double q1[4], const double q2[4], const double weight, double q[4]); + static void rotationFromQuaternions(const double qNew[4], const double qOld[4], + const double timeDelta, double rotRate[3]); + /** * returns angle in ]-Pi;Pi] or [0;Pi] if abs == true */