Compare commits

..

61 Commits

Author SHA1 Message Date
c1c254330b Merge pull request 'Prep v7.7.4' (#882) from prep-v7.7.4 into main
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
Reviewed-on: #882
2024-03-21 10:47:20 +01:00
c46c6cd28b changelog
Some checks are pending
EIVE/eive-obsw/pipeline/head Build queued...
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-21 10:18:03 +01:00
aeb8b92bc4 bump version 2024-03-21 10:16:47 +01:00
8011686fbe Merge pull request 'GS Target Pointing Limit Change' (#881) from ptg-improv into main
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
Reviewed-on: #881
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2024-03-21 10:10:44 +01:00
58be09bd4b Merge branch 'main' into ptg-improv
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-21 09:15:53 +01:00
ad82573a35 Merge pull request 'Fix for Current Calculation in PWR Ctrl' (#880) from fix-soc into main
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
Reviewed-on: #880
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2024-03-21 09:14:52 +01:00
a1be15e939 lets rather be gentle here
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-21 09:14:35 +01:00
ba7c9e1c26 changelog
Some checks are pending
EIVE/eive-obsw/pipeline/head Build queued...
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-20 16:19:20 +01:00
46c125d9fe rot rate limit change 2024-03-20 16:18:03 +01:00
889dd04c6b changelog
Some checks are pending
EIVE/eive-obsw/pipeline/head Build started...
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-20 16:01:20 +01:00
c52746a2df fix 2024-03-20 15:53:51 +01:00
d1fc876f03 Merge pull request 'Prep v7.7.3' (#879) from prep-v7.7.3 into main
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
Reviewed-on: #879
2024-03-18 12:34:10 +01:00
0278aabee0 Merge branch 'main' into prep-v7.7.3
Some checks are pending
EIVE/eive-obsw/pipeline/pr-main Build queued...
2024-03-18 11:37:09 +01:00
a9f5b6d2c7 Merge pull request 'TCS Ctrl Time Limit not for Heaters in External Control' (#878) from tcs-ctrl-ignores-ext-ctrl into main
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
Reviewed-on: #878
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2024-03-18 11:36:32 +01:00
80ea0b341b changelog
Some checks are pending
EIVE/eive-obsw/pipeline/head Build queued...
EIVE/eive-obsw/pipeline/pr-main Build queued...
2024-03-18 11:14:10 +01:00
9740831755 bumped version 2024-03-18 11:14:00 +01:00
c4e18432e2 Merge branch 'main' into tcs-ctrl-ignores-ext-ctrl
Some checks are pending
EIVE/eive-obsw/pipeline/pr-main Build queued...
2024-03-18 11:05:23 +01:00
f9f5ba5d46 Merge pull request 'Improve GS PTG' (#876) from gs-ptr-improv into main
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
Reviewed-on: #876
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2024-03-18 11:04:01 +01:00
3b521966a9 bumped fsfw 2024-03-18 11:03:44 +01:00
c58bae5aa5 Merge branch 'main' into gs-ptr-improv 2024-03-18 11:03:06 +01:00
67e6ccf4ae cleanup
Some checks are pending
EIVE/eive-obsw/pipeline/pr-main Build started...
2024-03-18 11:00:29 +01:00
b795beef85 Merge pull request 'Parameter for STR for MEKF' (#877) from no-str-for-mekf into main
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
Reviewed-on: #877
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2024-03-18 10:58:53 +01:00
311ecd7fd2 changelog 2024-03-18 10:58:19 +01:00
950e86ce4b cleaner solution
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-18 10:56:57 +01:00
096328aadc backup heater will not be chosen if heater is on ext ctrl and on
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-18 10:34:21 +01:00
36edd3e324 changed lower op limits for ploc 2024-03-18 10:33:51 +01:00
c65e813e94 changelog
Some checks are pending
EIVE/eive-obsw/pipeline/head Build started...
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-16 13:53:22 +01:00
1c93f51f69 prevent switching of heaters in external control 2024-03-16 13:48:49 +01:00
dade2d519a changelog
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-15 13:21:01 +01:00
c4680f85bb added param to disable str input for mekf
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
2024-03-15 13:16:38 +01:00
6c9a7c3ee5 changelog
Some checks are pending
EIVE/eive-obsw/pipeline/head Build started...
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-13 17:01:17 +01:00
346f4ff9de prevent sign jump
Some checks are pending
EIVE/eive-obsw/pipeline/head Build started...
2024-03-13 16:59:55 +01:00
ad5282ca4a bump fsfw 2024-03-13 16:59:37 +01:00
158927ce5c Merge pull request 'Fix inverted X-Axis for PTG Target' (#875) from fix-tgt-ptg into main
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
Reviewed-on: #875
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2024-03-06 13:33:07 +01:00
e97105820a version bump
Some checks are pending
EIVE/eive-obsw/pipeline/pr-main Build started...
2024-03-06 13:31:39 +01:00
88102b26a6 changelog
Some checks are pending
EIVE/eive-obsw/pipeline/pr-main Build started...
2024-03-06 13:30:22 +01:00
7e689c9f55 well ...
Some checks are pending
EIVE/eive-obsw/pipeline/head Build started...
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-06 13:07:55 +01:00
97ada32f33 Merge pull request 'Prep v7.1.1' (#874) from prep-v7.1.1 into main
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
Reviewed-on: #874
2024-03-06 11:37:05 +01:00
244c364f60 bumped version
Some checks are pending
EIVE/eive-obsw/pipeline/head Build queued...
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-06 11:16:02 +01:00
c0c3576131 changelog 2024-03-06 11:15:40 +01:00
c2a4578b81 Merge pull request 'Fix NaN for Limiting Rotation Rates' (#872) from limit-rot-rate-fix into main
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
Reviewed-on: #872
2024-03-06 11:13:01 +01:00
781feffc90 bumped submodules
Some checks are pending
EIVE/eive-obsw/pipeline/pr-main Build started...
2024-03-06 11:10:35 +01:00
7efd48c695 make robin happy 2024-03-06 11:09:23 +01:00
d0765fdcce Merge branch 'main' into limit-rot-rate-fix
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-06 10:18:15 +01:00
be0bae58ac Merge pull request 'Fix Dimension Error in MEKF' (#873) from fix-mekf-dim into main
All checks were successful
EIVE/eive-obsw/pipeline/head This commit looks good
Reviewed-on: #873
Reviewed-by: Robin Müller <muellerr@irs.uni-stuttgart.de>
2024-03-06 10:17:10 +01:00
616803c6a8 changelog
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-06 09:47:47 +01:00
3501763cf0 fsfw
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-06 09:47:06 +01:00
efaf48beff we should actually use this 2024-03-06 09:46:51 +01:00
e052470cf4 changelog
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-06 09:08:31 +01:00
2364f7d5d9 fix of the century
Some checks are pending
EIVE/eive-obsw/pipeline/head Build started...
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-05 17:35:06 +01:00
c52818a5ce changelog
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-05 15:49:11 +01:00
fb8a92ecb5 bumped fsfw
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-05 14:30:13 +01:00
39032249b2 -
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-05 14:10:32 +01:00
aa4bfa8d88 we might want an OK 2024-03-05 14:09:40 +01:00
c2d8ef9fe4 should be enough
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-05 13:48:09 +01:00
440d989490 whoops
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-05 13:08:29 +01:00
85ed8420fd act cmd
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-05 11:51:02 +01:00
2a2a173ebd prep for leap seconds
Some checks failed
EIVE/eive-obsw/pipeline/pr-main There was a failure building this commit
2024-03-05 09:06:48 +01:00
cda2a9df33 use existing function
All checks were successful
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-04 11:57:10 +01:00
6da37c0fa4 changelog
Some checks are pending
EIVE/eive-obsw/pipeline/head Build started...
EIVE/eive-obsw/pipeline/pr-main This commit looks good
2024-03-01 15:29:14 +01:00
141f82d0a9 prevent ctrl values from becoming NaN
Some checks are pending
EIVE/eive-obsw/pipeline/head Build started...
2024-03-01 15:27:13 +01:00
23 changed files with 198 additions and 23 deletions

View File

@ -16,6 +16,62 @@ will consitute of a breaking change warranting a new major release:
# [unreleased]
# [v7.7.4] 2024-03-21
## Changed
- Rotational rate limit for the GS target pointing is now seperated from controller limit. It
is also reduced to 0.75°/s now.
## Fixed
- Fixed wrong sign in calculation of total current within the `PWR Controller`.
# [v7.7.3] 2024-03-18
- Bumped `eive-fsfw`
## Added
- Added parameter to disable STR input for MEKF.
## Changed
- If a primary heater is set to `EXTERNAL CONTROL` and `ON`, the `TCS Controller` will no
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
- Camera and E-band antenna now point towards the target instead of away from the target for the
pointing target mode.
# [v7.7.1] 2024-03-06
- Bumped `eive-tmtc` to v6.1.1
- Bumped `eive-fsfw`
## Added
- The `CoreController` now sets the leap seconds on initalization. They are stored in a persistent
file. If the file does yet not exist, it will be created. The leap seconds can be updated using an
action command. This will also update the file.
## Fixed
- Fixed wrong dimension of a matrix within the `MEKF`, which would lead to a seg fault, if the
star tracker was available.
- Fixed case in which control values within the `AcsController` could become NaN.
# [v7.7.0] 2024-02-29
- Bumped `eive-tmtc` to v6.1.0

View File

@ -11,7 +11,7 @@ cmake_minimum_required(VERSION 3.13)
set(OBSW_VERSION_MAJOR 7)
set(OBSW_VERSION_MINOR 7)
set(OBSW_VERSION_REVISION 0)
set(OBSW_VERSION_REVISION 4)
# set(CMAKE_VERBOSE TRUE)

View File

@ -480,6 +480,16 @@ ReturnValue_t CoreController::executeAction(ActionId_t actionId, MessageQueueId_
successRecipient = commandedBy;
return returnvalue::OK;
}
case (UPDATE_LEAP_SECONDS): {
if (size != sizeof(uint16_t)) {
return HasActionsIF::INVALID_PARAMETERS;
}
ReturnValue_t result = actionUpdateLeapSeconds(data);
if (result != returnvalue::OK) {
return result;
}
return HasActionsIF::EXECUTION_FINISHED;
}
default: {
return HasActionsIF::INVALID_ACTION_ID;
}
@ -1411,6 +1421,9 @@ void CoreController::performMountedSdCardOperations() {
if (not timeFileInitDone) {
initClockFromTimeFile();
}
if (not leapSecondsInitDone) {
initLeapSeconds();
}
performRebootWatchdogHandling(false);
performRebootCountersHandling(false);
}
@ -2066,6 +2079,71 @@ ReturnValue_t CoreController::backupTimeFileHandler() {
return returnvalue::OK;
}
void CoreController::initLeapSeconds() {
ReturnValue_t result = initLeapSecondsFromFile();
if (result != returnvalue::OK) {
Clock::setLeapSeconds(config::LEAP_SECONDS);
writeLeapSecondsToFile(config::LEAP_SECONDS);
}
leapSecondsInitDone = true;
}
ReturnValue_t CoreController::initLeapSecondsFromFile() {
std::string fileName = currMntPrefix + LEAP_SECONDS_FILE;
std::error_code e;
if (sdcMan->isSdCardUsable(std::nullopt) and std::filesystem::exists(fileName, e)) {
std::ifstream leapSecondsFile(fileName);
std::string nextWord;
std::getline(leapSecondsFile, nextWord);
std::istringstream iss(nextWord);
iss >> nextWord;
if (iss.bad() or nextWord != "LEAP") {
return returnvalue::FAILED;
}
iss >> nextWord;
if (iss.bad() or nextWord != "SECONDS:") {
return returnvalue::FAILED;
}
iss >> nextWord;
uint16_t leapSeconds = 0;
leapSeconds = std::stoi(nextWord.c_str());
if (iss.bad()) {
return returnvalue::FAILED;
}
Clock::setLeapSeconds(leapSeconds);
return returnvalue::OK;
}
sif::error
<< "CoreController::leapSecondsFileHandler: Initalization of leap seconds from file failed"
<< std::endl;
return returnvalue::FAILED;
};
ReturnValue_t CoreController::writeLeapSecondsToFile(const uint16_t leapSeconds) {
std::string fileName = currMntPrefix + LEAP_SECONDS_FILE;
if (not sdcMan->isSdCardUsable(std::nullopt)) {
return returnvalue::FAILED;
}
std::ofstream leapSecondsFile(fileName.c_str(), std::ofstream::out | std::ofstream::trunc);
if (not leapSecondsFile.good()) {
sif::error << "CoreController::leapSecondsFileHandler: Error opening leap seconds file: "
<< strerror(errno) << std::endl;
return returnvalue::FAILED;
}
leapSecondsFile << "LEAP SECONDS: " << leapSeconds << std::endl;
return returnvalue::OK;
};
ReturnValue_t CoreController::actionUpdateLeapSeconds(const uint8_t *data) {
uint16_t leapSeconds = data[1] | (data[0] << 8);
ReturnValue_t result = writeLeapSecondsToFile(leapSeconds);
if (result != returnvalue::OK) {
return result;
}
Clock::setLeapSeconds(leapSeconds);
return returnvalue::OK;
}
ReturnValue_t CoreController::initClockFromTimeFile() {
using namespace GpsHyperion;
using namespace std;

View File

@ -150,6 +150,8 @@ class CoreController : public ExtendedControllerBase, public ReceivesParameterMe
std::string(core::LEGACY_REBOOT_WATCHDOG_FILE_NAME);
const std::string REBOOT_WATCHDOG_FILE =
"/" + std::string(core::CONF_FOLDER) + "/" + std::string(core::REBOOT_WATCHDOG_FILE_NAME);
const std::string LEAP_SECONDS_FILE =
"/" + std::string(core::CONF_FOLDER) + "/" + std::string(core::LEAP_SECONDS_FILE_NAME);
const std::string BACKUP_TIME_FILE =
"/" + std::string(core::CONF_FOLDER) + "/" + std::string(core::TIME_FILE_NAME);
const std::string REBOOT_COUNTERS_FILE =
@ -296,6 +298,7 @@ class CoreController : public ExtendedControllerBase, public ReceivesParameterMe
std::string currMntPrefix;
bool timeFileInitDone = false;
bool leapSecondsInitDone = false;
bool performOneShotSdCardOpsSwitch = false;
uint8_t shortSdCardCdCounter = 0;
#if OBSW_THREAD_TRACING == 1
@ -335,7 +338,11 @@ class CoreController : public ExtendedControllerBase, public ReceivesParameterMe
void performMountedSdCardOperations();
ReturnValue_t initVersionFile();
void initLeapSeconds();
ReturnValue_t initLeapSecondsFromFile();
ReturnValue_t initClockFromTimeFile();
ReturnValue_t actionUpdateLeapSeconds(const uint8_t* data);
ReturnValue_t writeLeapSecondsToFile(const uint16_t leapSeconds);
ReturnValue_t performSdCardCheck();
ReturnValue_t backupTimeFileHandler();
ReturnValue_t initBootCopyFile();

View File

@ -20,6 +20,9 @@ static constexpr char OBSW_VERSION_FILE_PATH[] = "/usr/share/eive-obsw/obsw_vers
// ISO8601 timestamp.
static constexpr char FILE_DATE_FORMAT[] = "%FT%H%M%SZ";
// Leap Seconds as of 2024-03-04
static constexpr uint16_t LEAP_SECONDS = 37;
static constexpr uint16_t EIVE_PUS_APID = 0x65;
static constexpr uint16_t EIVE_CFDP_APID = 0x66;
static constexpr uint16_t EIVE_LOCAL_CFDP_ENTITY_ID = EIVE_CFDP_APID;

2
fsfw

Submodule fsfw updated: 516357d855...43ea29cb84

View File

@ -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) {

View File

@ -182,7 +182,7 @@ void PowerController::calculateStateOfCharge() {
}
// calculate total battery current
iBat = p60CoreHk.batteryCurrent.value + bpxBatteryHk.dischargeCurrent.value;
iBat = p60CoreHk.batteryCurrent.value - bpxBatteryHk.dischargeCurrent.value;
result = calculateOpenCircuitVoltageCharge();
if (result != returnvalue::OK) {

View File

@ -1641,7 +1641,11 @@ bool ThermalController::chooseHeater(heater::Switch& switchNr, heater::Switch re
bool heaterAvailable = true;
HasHealthIF::HealthState mainHealth = heaterHandler.getHealth(switchNr);
heater::SwitchState mainState = heaterHandler.getSwitchState(switchNr);
HasHealthIF::HealthState redHealth = heaterHandler.getHealth(redSwitchNr);
if (mainHealth == HasHealthIF::EXTERNAL_CONTROL and mainState == heater::SwitchState::ON) {
return false;
}
if (mainHealth != HasHealthIF::HEALTHY) {
if (redHealth == HasHealthIF::HEALTHY) {
switchNr = redSwitchNr;
@ -1656,6 +1660,7 @@ bool ThermalController::chooseHeater(heater::Switch& switchNr, heater::Switch re
} else {
ctrlCtx.redSwitchNrInUse = false;
}
return heaterAvailable;
}
@ -1792,7 +1797,8 @@ void ThermalController::heaterMaxDurationControl(
for (unsigned i = 0; i < heater::Switch::NUMBER_OF_SWITCHES; i++) {
// Right now, we only track the maximum duration for heater which were commanded by the TCS
// controller.
if (currentHeaterStates[i] == heater::SwitchState::ON and
if (heaterHandler.getHealth(static_cast<heater::Switch>(i)) != HasHealthIF::EXTERNAL_CONTROL and
currentHeaterStates[i] == heater::SwitchState::ON and
heaterStates[i].trackHeaterMaxBurnTime and
heaterStates[i].heaterOnMaxBurnTime.hasTimedOut()) {
heaterStates[i].switchTransition = false;

View File

@ -197,9 +197,9 @@ class ThermalController : public ExtendedControllerBase {
tcsCtrl::TempLimits pcduAcuLimits = tcsCtrl::TempLimits(-35.0, -35.0, 80.0, 85.0, 85.0);
tcsCtrl::TempLimits pcduPduLimits = tcsCtrl::TempLimits(-35.0, -35.0, 80.0, 85.0, 85.0);
tcsCtrl::TempLimits plPcduBoardLimits = tcsCtrl::TempLimits(-55.0, -40.0, 80.0, 85.0, 125.0);
tcsCtrl::TempLimits plocMissionBoardLimits = tcsCtrl::TempLimits(-30.0, -10.0, 40.0, 45.0, 60);
tcsCtrl::TempLimits plocMissionBoardLimits = tcsCtrl::TempLimits(-30.0, -5.0, 40.0, 45.0, 60);
tcsCtrl::TempLimits plocProcessingBoardLimits =
tcsCtrl::TempLimits(-30.0, -10.0, 40.0, 45.0, 60.0);
tcsCtrl::TempLimits(-30.0, -5.0, 40.0, 45.0, 60.0);
tcsCtrl::TempLimits dacLimits = tcsCtrl::TempLimits(-65.0, -40.0, 113.0, 118.0, 150.0);
tcsCtrl::TempLimits cameraLimits = tcsCtrl::TempLimits(-40.0, -30.0, 60.0, 65.0, 85.0);
tcsCtrl::TempLimits droLimits = tcsCtrl::TempLimits(-40.0, -30.0, 75.0, 80.0, 90.0);

View File

@ -554,6 +554,9 @@ ReturnValue_t AcsParameters::getParameter(uint8_t domainId, uint8_t parameterId,
case 0xE:
parameterWrapper->set(gsTargetModeControllerParameters.altitudeTgt);
break;
case 0xF:
parameterWrapper->set(gsTargetModeControllerParameters.rotRateLimit);
break;
default:
return INVALID_IDENTIFIER_ID;
}
@ -734,6 +737,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;
}

View File

@ -898,6 +898,7 @@ class AcsParameters : public HasParametersIF {
double latitudeTgt = 48.7495 * DEG2RAD; // [rad] Latitude
double longitudeTgt = 9.10384 * DEG2RAD; // [rad] Longitude
double altitudeTgt = 500; // [m]
double rotRateLimit = .75 * DEG2RAD;
} gsTargetModeControllerParameters;
struct NadirModeControllerParameters : PointingLawParameters {
@ -947,6 +948,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 {

View File

@ -59,6 +59,7 @@ void Guidance::targetQuatPtgTarget(timeval timeAbsolute, const double timeDelta,
// this aligns with the camera, E- and S-band antennas
double xAxisIX[3] = {0, 0, 0};
VectorOperations<double>::normalize(targetDirI, xAxisIX, 3);
VectorOperations<double>::mulScalar(xAxisIX, -1, xAxisIX, 3);
// transform velocity into inertial frame
double velSatI[3] = {0, 0, 0};
@ -243,12 +244,14 @@ 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);
QuaternionOperations::multiply(quatIX, quatXprevI, quatXprevX);
QuaternionOperations::normalize(quatXprevX);
double phiMax = acsParameters->gsTargetModeControllerParameters.omMax *
double phiMax = acsParameters->gsTargetModeControllerParameters.rotRateLimit *
acsParameters->onBoardParams.sampleTime;
if (2 * std::acos(quatXprevX[3]) < phiMax) {
return;
@ -273,7 +276,11 @@ void Guidance::limitReferenceRotation(const double xAxisIX[3], double quatIX[4])
QuaternionOperations::multiply(quatIXtilde, quatXI, quatXXtilde);
double phiResidual = 0, phiResidualVec[3] = {0, 0, 0};
if ((phiX * phiX) > (phiMax * phiMax)) {
phiResidual = 0;
} else {
phiResidual = std::sqrt((phiMax * phiMax) - (phiX * phiX));
}
std::memcpy(phiResidualVec, quatXXtilde, sizeof(phiResidualVec));
VectorOperations<double>::normalize(phiResidualVec, phiResidualVec, 3);

View File

@ -69,7 +69,8 @@ void Igrf13Model::magFieldComp(const double longitude, const double gcLatitude,
magFieldModel[1] *= -1;
magFieldModel[2] *= (-1 / sin(theta));
double JD2000 = TimeSystems::convertUnixToJD2000(timeOfMagMeasurement);
double JD2000 = 0;
Clock::convertTimevalToJD2000(timeOfMagMeasurement, &JD2000);
double UT1 = JD2000 / 36525.;
double gst =
@ -93,7 +94,8 @@ void Igrf13Model::magFieldComp(const double longitude, const double gcLatitude,
void Igrf13Model::updateCoeffGH(timeval timeOfMagMeasurement) {
double JD2000Igrf = (2458850.0 - 2451545); // Begin of IGRF-13 (2020-01-01,00:00:00) in JD2000
double JD2000 = TimeSystems::convertUnixToJD2000(timeOfMagMeasurement);
double JD2000 = 0;
Clock::convertTimevalToJD2000(timeOfMagMeasurement, &JD2000);
double days = ceil(JD2000 - JD2000Igrf);
for (int i = 0; i <= igrfOrder; i++) {
for (int j = 0; j <= (igrfOrder - 1); j++) {

View File

@ -16,11 +16,11 @@
#ifndef IGRF13MODEL_H_
#define IGRF13MODEL_H_
#include <fsfw/src/fsfw/globalfunctions/TimeSystems.h>
#include <fsfw/src/fsfw/globalfunctions/constants.h>
#include <fsfw/src/fsfw/globalfunctions/math/MatrixOperations.h>
#include <fsfw/src/fsfw/globalfunctions/math/QuaternionOperations.h>
#include <fsfw/src/fsfw/globalfunctions/math/VectorOperations.h>
#include <fsfw/src/fsfw/timemanager/Clock.h>
#include <cmath>

View File

@ -342,7 +342,7 @@ ReturnValue_t MultiplicativeKalmanFilter::kfGain(
double *measSensMatrix, double *measCovMatrix, double *kalmanGain,
acsctrl::AttitudeEstimationData *attitudeEstimationData) {
// Kalman Gain: K = P * H' / (H * P * H' + R)
double kalmanGainDen[6][matrixDimensionFactor] = {{0}},
double kalmanGainDen[matrixDimensionFactor][matrixDimensionFactor] = {{0}},
invKalmanGainDen[matrixDimensionFactor][matrixDimensionFactor] = {{0}},
residualCov[6][matrixDimensionFactor] = {{0}},
measSensMatrixTransposed[6][matrixDimensionFactor] = {{0}};
@ -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);
}

View File

@ -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);

View File

@ -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,

View File

@ -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);

View File

@ -180,7 +180,8 @@ void SensorProcessing::processSus(
const AcsParameters::SunModelParameters *sunModelParameters,
acsctrl::SusDataProcessed *susDataProcessed) {
/* -------- Sun Model Direction (IJK frame) ------- */
double JD2000 = TimeSystems::convertUnixToJD2000(timeAbsolute);
double JD2000 = 0;
Clock::convertTimevalToJD2000(timeAbsolute, &JD2000);
// Julean Centuries
double sunIjkModel[3] = {0.0, 0.0, 0.0};

View File

@ -4,13 +4,13 @@
#include <common/config/eive/resultClassIds.h>
#include <fsfw/coordinates/CoordinateTransformations.h>
#include <fsfw/datapool/PoolReadGuard.h>
#include <fsfw/globalfunctions/TimeSystems.h>
#include <fsfw/globalfunctions/constants.h>
#include <fsfw/globalfunctions/math/MatrixOperations.h>
#include <fsfw/globalfunctions/math/QuaternionOperations.h>
#include <fsfw/globalfunctions/math/VectorOperations.h>
#include <fsfw/globalfunctions/timevalOperations.h>
#include <fsfw/returnvalues/returnvalue.h>
#include <fsfw/timemanager/Clock.h>
#include <mission/acs/defs.h>
#include <mission/controller/acs/AcsParameters.h>
#include <mission/controller/acs/Igrf13Model.h>

View File

@ -55,6 +55,7 @@ static constexpr char VERSION_FILE_NAME[] = "version.txt";
static constexpr char LEGACY_REBOOT_WATCHDOG_FILE_NAME[] = "reboot.txt";
static constexpr char REBOOT_WATCHDOG_FILE_NAME[] = "reboot_watchdog.txt";
static constexpr char REBOOT_COUNTER_FILE_NAME[] = "reboot_counters.txt";
static constexpr char LEAP_SECONDS_FILE_NAME[] = "leapseconds.txt";
static constexpr char TIME_FILE_NAME[] = "time_backup.txt";
static constexpr uint32_t SYS_ROM_BASE_ADDR = 0x80000000;
@ -93,6 +94,8 @@ static constexpr ActionId_t MV_HELPER = 53;
static constexpr ActionId_t RM_HELPER = 54;
static constexpr ActionId_t MKDIR_HELPER = 55;
static constexpr ActionId_t UPDATE_LEAP_SECONDS = 60;
static constexpr uint8_t SUBSYSTEM_ID = SUBSYSTEM_ID::CORE;
static constexpr Event ALLOC_FAILURE = event::makeEvent(SUBSYSTEM_ID, 0, severity::MEDIUM);

2
tmtc

Submodule tmtc updated: 73a4260f33...c843356c8a