eive-obsw/mission/controller/acs/control/SafeCtrl.h
meggert 39b2a3420c
All checks were successful
EIVE/eive-obsw/pipeline/pr-develop This commit looks good
changed satRotRateRef to scalar
2023-04-05 16:46:57 +02:00

64 lines
2.7 KiB
C++

#ifndef SAFECTRL_H_
#define SAFECTRL_H_
#include <eive/resultClassIds.h>
#include <mission/controller/acs/AcsParameters.h>
#include <mission/controller/acs/SensorValues.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
class SafeCtrl {
public:
SafeCtrl(AcsParameters *acsParameters_);
virtual ~SafeCtrl();
static constexpr uint8_t IF_SAFE_ID = CLASS_ID::ACS_SAFE;
static constexpr ReturnValue_t SAFECTRL_NO_MAG_FIELD_FOR_CONTROL =
returnvalue::makeCode(IF_SAFE_ID, 2);
static constexpr ReturnValue_t SAFECTRL_USE_MEKF = returnvalue::makeCode(IF_SAFE_ID, 3);
static constexpr ReturnValue_t SAFECTRL_USE_NONMEKF = returnvalue::makeCode(IF_SAFE_ID, 4);
static constexpr ReturnValue_t SAFECTRL_USE_DAMPING = returnvalue::makeCode(IF_SAFE_ID, 5);
static constexpr ReturnValue_t SAFECTRL_NO_SENSORS_FOR_CONTROL =
returnvalue::makeCode(IF_SAFE_ID, 6);
ReturnValue_t safeCtrlStrategy(const bool magFieldValid, const ReturnValue_t mekfValid,
const bool satRotRateValid, const bool sunDirValid);
void safeMekf(const double *magFieldB, const double *satRotRateB, const double *sunDirModelI,
const double *quatBI, const double *sunDirRefB, const double satRotRateRef,
const double inertiaMatrix[3][3], double *magMomB, double &errorAngle);
void safeNonMekf(const double *magFieldB, const double *satRotRateB, const double *sunDirB,
const double *sunDirRefB, const double satRotRateRef,
const double inertiaMatrix[3][3], double *magMomB, double &errorAngle);
void safeRateDamping(const double *magFieldB, const double *satRotRateB,
const double satRotRateRef, const double *sunDirRefB, double *magMomB,
double &errorAngle);
void splitRotationalRate(const double *satRotRateB, const double *sunDirB);
void calculateRotationalRateTorque(const double satRotRateRef, const double *sunDirB,
const double *sunDirRefB, double &errorAngle,
const double gainParallel, const double gainOrtho);
void calculateAngleErrorTorque(const double *sunDirB, const double *sunDirRefB,
const double gainAlign, const double inertiaMatrix[3][3]);
void calculateMagneticMoment(double *magMomB);
protected:
private:
AcsParameters *acsParameters;
double magFieldBT[3] = {0, 0, 0};
double satRotRateParallelB[3] = {0, 0, 0};
double satRotRateOrthogonalB[3] = {0, 0, 0};
double cmdParallel[3] = {0, 0, 0};
double cmdOrtho[3] = {0, 0, 0};
double cmdAlign[3] = {0, 0, 0};
double cmdTorque[3] = {0, 0, 0};
};
#endif /* ACS_CONTROL_SAFECTRL_H_ */