SlimeVR_DeftTracker/Main_Tracker/Firmware/SlimeVR-Tracker-ESP/lib/magneto/dmpmag.h
2024-10-04 12:23:11 +08:00

27 lines
871 B
C

#include "quat.h"
#include "vector3.h"
//Get rotation quaternion from gravity vector and geomagnetic vector by Direction Cosine Matrix
//https://www.vectornav.com/resources/inertial-navigation-primer/math-fundamentals/math-attitudetran
Quat getQuatDCM(float* acc, float* mag){
Vector3 Mv(mag[0], mag[1], mag[2]);
Vector3 Dv(acc[0], acc[1], acc[2]);
Dv.normalize();
Vector3 Rv = Dv.cross(Mv);
Rv.normalize();
Vector3 Fv = Rv.cross(Dv);
Fv.normalize();
float q04 = 2*sqrt(1+Fv.x+Rv.y+Dv.z);
return Quat(Rv.z-Dv.y,Dv.x-Fv.z,Fv.y-Rv.x,q04*q04/4).normalized();
}
Quat getCorrection(float* acc,float* mag,Quat quat)
{
Quat magQ = getQuatDCM(acc,mag);
//dmp.w=DCM.z
//dmp.x=DCM.y
//dmp.y=-DCM.x
//dmp.z=DCM.w
Quat trans(magQ.x, magQ.y, magQ.w, magQ.z);
Quat result = trans*quat.inverse();
return result;
}