#include "Detumble.h" #include #include #include #include #include #include #include "../util/MathOperations.h" Detumble::Detumble() {} Detumble::~Detumble() {} ReturnValue_t Detumble::bDotLaw(const double *magRate, const bool magRateValid, const double *magField, const bool magFieldValid, double *magMom, double gain) { if (!magRateValid || !magFieldValid) { return DETUMBLE_NO_SENSORDATA; } // convert uT to T double magFieldT[3], magRateT[3]; VectorOperations::mulScalar(magField, 1e-6, magFieldT, 3); VectorOperations::mulScalar(magRate, 1e-6, magRateT, 3); // control law double factor = -gain / pow(VectorOperations::norm(magFieldT, 3), 2); VectorOperations::mulScalar(magRateT, factor, magMom, 3); return returnvalue::OK; } ReturnValue_t Detumble::bangbangLaw(const double *magRate, const bool magRateValid, double *magMom, double dipolMax) { if (!magRateValid) { return DETUMBLE_NO_SENSORDATA; } for (int i = 0; i < 3; i++) { magMom[i] = -dipolMax * sign(magRate[i]); } return returnvalue::OK; } ReturnValue_t Detumble::bDotLawFull(const double *satRate, const bool *satRateValid, const double *magField, const bool *magFieldValid, double *magMom, double gain) { if (!satRateValid || !magFieldValid) { return DETUMBLE_NO_SENSORDATA; } // convert uT to T double magFieldT[3]; VectorOperations::mulScalar(magField, 1e-6, magFieldT, 3); // control law double factor = gain / pow(VectorOperations::norm(magField, 3), 2); double magFieldNormed[3] = {0, 0, 0}, crossProduct[3] = {0, 0, 0}; VectorOperations::normalize(magFieldT, magFieldNormed, 3); VectorOperations::cross(satRate, magFieldNormed, crossProduct); VectorOperations::mulScalar(crossProduct, factor, magMom, 3); return returnvalue::OK; }