diff --git a/CHANGELOG.md b/CHANGELOG.md index 68bb84a8..e1ff3ead 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,10 +16,11 @@ will consitute of a breaking change warranting a new major release: # [unreleased] -## Fixed +- Bumped `eive-fsfw` -- Heaters set to `EXTERNAL CONTROL` no longer can be switched off by the `TCS Controller`, if - they violate the maximum burn duration of the controller. +## Added + +- Added parameter to disable STR input for MEKF. ## Changed @@ -27,6 +28,13 @@ will consitute of a breaking change warranting a new major release: try to control the temperature of that object. - Set lower OP limit of `PLOC` to -5°C. +## Fixed + +- Added prevention of sign jump for target quaternion of GS pointing, which would reduce the + performance of the controller. +- Heaters set to `EXTERNAL CONTROL` no longer can be switched off by the `TCS Controller`, if + they violate the maximum burn duration of the controller. + # [v7.7.2] 2024-03-06 ## Fixed diff --git a/fsfw b/fsfw index 47b21caf..43ea29cb 160000 --- a/fsfw +++ b/fsfw @@ -1 +1 @@ -Subproject commit 47b21caf5fa2a27c7ace89f960141b3f24c329ee +Subproject commit 43ea29cb845d4a7d190c87df490eb53c4992618b diff --git a/mission/controller/AcsController.cpp b/mission/controller/AcsController.cpp index f9a04c46..d3bbfcd8 100644 --- a/mission/controller/AcsController.cpp +++ b/mission/controller/AcsController.cpp @@ -180,7 +180,8 @@ void AcsController::performAttitudeControl() { mode, &susDataProcessed, &mgmDataProcessed, &gyrDataProcessed, &sensorValues, &attitudeEstimationData, timeDelta, &fusedRotRateSourcesData, &fusedRotRateData); result = navigation.useMekf(&sensorValues, &gyrDataProcessed, &mgmDataProcessed, - &susDataProcessed, timeDelta, &attitudeEstimationData); + &susDataProcessed, timeDelta, &attitudeEstimationData, + acsParameters.kalmanFilterParameters.allowStr); if (result != MultiplicativeKalmanFilter::MEKF_RUNNING and result != MultiplicativeKalmanFilter::MEKF_INITIALIZED) { diff --git a/mission/controller/acs/AcsParameters.cpp b/mission/controller/acs/AcsParameters.cpp index f8fb759b..3a7aa726 100644 --- a/mission/controller/acs/AcsParameters.cpp +++ b/mission/controller/acs/AcsParameters.cpp @@ -734,6 +734,9 @@ ReturnValue_t AcsParameters::getParameter(uint8_t domainId, uint8_t parameterId, case 0x5: parameterWrapper->set(kalmanFilterParameters.sensorNoiseGyrBs); break; + case 0x6: + parameterWrapper->set(kalmanFilterParameters.allowStr); + break; default: return INVALID_IDENTIFIER_ID; } diff --git a/mission/controller/acs/AcsParameters.h b/mission/controller/acs/AcsParameters.h index 467c0740..965878e7 100644 --- a/mission/controller/acs/AcsParameters.h +++ b/mission/controller/acs/AcsParameters.h @@ -947,6 +947,8 @@ class AcsParameters : public HasParametersIF { double sensorNoiseGyrArw = 3. * 0.0043 / sqrt(10) * DEG2RAD; // Angular Random Walk double sensorNoiseGyrBs = 3. / 3600. * DEG2RAD; // Bias Stability + + uint8_t allowStr = false; } kalmanFilterParameters; struct MagnetorquerParameter { diff --git a/mission/controller/acs/Guidance.cpp b/mission/controller/acs/Guidance.cpp index 4406a224..a6559db3 100644 --- a/mission/controller/acs/Guidance.cpp +++ b/mission/controller/acs/Guidance.cpp @@ -244,6 +244,8 @@ void Guidance::limitReferenceRotation(const double xAxisIX[3], double quatIX[4]) return; } + QuaternionOperations::preventSignJump(quatIX, quatIXprev); + // check required rotation and return if below limit double quatXprevX[4] = {0, 0, 0, 0}, quatXprevI[4] = {0, 0, 0, 0}; QuaternionOperations::inverse(quatIXprev, quatXprevI); diff --git a/mission/controller/acs/MultiplicativeKalmanFilter.cpp b/mission/controller/acs/MultiplicativeKalmanFilter.cpp index 5dce2a84..b66f0531 100644 --- a/mission/controller/acs/MultiplicativeKalmanFilter.cpp +++ b/mission/controller/acs/MultiplicativeKalmanFilter.cpp @@ -626,11 +626,11 @@ void MultiplicativeKalmanFilter::updateDataSet( } } -void MultiplicativeKalmanFilter::setStrData(double qX, double qY, double qZ, double qW, - bool valid) { +void MultiplicativeKalmanFilter::setStrData(double qX, double qY, double qZ, double qW, bool valid, + bool allowStr) { strData.strQuat.value[0] = qX; strData.strQuat.value[1] = qY; strData.strQuat.value[2] = qZ; strData.strQuat.value[3] = qW; - strData.strQuat.valid = valid; + strData.strQuat.valid = (valid and allowStr); } diff --git a/mission/controller/acs/MultiplicativeKalmanFilter.h b/mission/controller/acs/MultiplicativeKalmanFilter.h index 6d475912..d26b6dd8 100644 --- a/mission/controller/acs/MultiplicativeKalmanFilter.h +++ b/mission/controller/acs/MultiplicativeKalmanFilter.h @@ -38,7 +38,7 @@ class MultiplicativeKalmanFilter { void updateStandardDeviations(const AcsParameters *acsParameters); void setStrData(const double qX, const double qY, const double qZ, const double qW, - const bool valid); + const bool valid, const bool allowStr); static constexpr uint8_t IF_MEKF_ID = CLASS_ID::ACS_MEKF; static constexpr ReturnValue_t MEKF_UNINITIALIZED = returnvalue::makeCode(IF_MEKF_ID, 2); diff --git a/mission/controller/acs/Navigation.cpp b/mission/controller/acs/Navigation.cpp index 038abfdd..113a6ccb 100644 --- a/mission/controller/acs/Navigation.cpp +++ b/mission/controller/acs/Navigation.cpp @@ -9,11 +9,12 @@ ReturnValue_t Navigation::useMekf(const ACS::SensorValues *sensorValues, const acsctrl::MgmDataProcessed *mgmDataProcessed, const acsctrl::SusDataProcessed *susDataProcessed, const double timeDelta, - acsctrl::AttitudeEstimationData *attitudeEstimationData) { + acsctrl::AttitudeEstimationData *attitudeEstimationData, + const bool allowStr) { multiplicativeKalmanFilter.setStrData( sensorValues->strSet.caliQx.value, sensorValues->strSet.caliQy.value, sensorValues->strSet.caliQz.value, sensorValues->strSet.caliQw.value, - sensorValues->strSet.caliQx.isValid()); + sensorValues->strSet.caliQx.isValid(), allowStr); if (mekfStatus == MultiplicativeKalmanFilter::MEKF_UNINITIALIZED) { mekfStatus = multiplicativeKalmanFilter.init(susDataProcessed, mgmDataProcessed, diff --git a/mission/controller/acs/Navigation.h b/mission/controller/acs/Navigation.h index b944073d..230ce79e 100644 --- a/mission/controller/acs/Navigation.h +++ b/mission/controller/acs/Navigation.h @@ -17,7 +17,8 @@ class Navigation { const acsctrl::GyrDataProcessed *gyrDataProcessed, const acsctrl::MgmDataProcessed *mgmDataProcessed, const acsctrl::SusDataProcessed *susDataProcessed, const double timeDelta, - acsctrl::AttitudeEstimationData *attitudeEstimationData); + acsctrl::AttitudeEstimationData *attitudeEstimationData, + const bool allowStr); void resetMekf(acsctrl::AttitudeEstimationData *mekfData); ReturnValue_t useSpg4(timeval now, acsctrl::GpsDataProcessed *gpsDataProcessed);