diff --git a/src/boards/Main/Configs/NASConfig.h b/src/boards/Main/Configs/NASConfig.h index 445449e860808815818a0728857c88fda7cd5ca6..115838e0cef9c44f3d427e73d2144cb3a655c86f 100644 --- a/src/boards/Main/Configs/NASConfig.h +++ b/src/boards/Main/Configs/NASConfig.h @@ -37,6 +37,8 @@ constexpr uint32_t UPDATE_PERIOD = 20; // 50 hz constexpr int CALIBRATION_SAMPLES_COUNT = 20; constexpr int CALIBRATION_SLEEP_TIME = 100; // [ms] +constexpr float ACCELERATION_THRESHOLD = 0.5; // [m/s^2] + static const Boardcore::NASConfig config = { UPDATE_PERIOD / 1000.0, // T 0.0001f, // SIGMA_BETA diff --git a/src/boards/Main/StateMachines/NASController/NASController.cpp b/src/boards/Main/StateMachines/NASController/NASController.cpp index 166ec0f67886dc51313eabfcbbe813f0f861a0c9..056adbc1bbcdb07d5954f625986802f25eceb454 100644 --- a/src/boards/Main/StateMachines/NASController/NASController.cpp +++ b/src/boards/Main/StateMachines/NASController/NASController.cpp @@ -72,8 +72,13 @@ void NASController::update() nas.correctGPS(gpsData); nas.correctBaro(pressureData.pressure); - // TODO: Add accelerometer correction until the acceleration goes out of - // specs + // Correct with accelerometer if the acceleration is in specs + Vector3f acceleration = static_cast<AccelerometerData>(imuData); + if (acceleration.norm() > (9.8 + ACCELERATION_THRESHOLD) || + acceleration.norm() < (9.8 - ACCELERATION_THRESHOLD)) + accelerationValid = false; + if (accelerationValid) + nas.correctAcc(imuData); Logger::getInstance().log(nas.getState()); FlightStatsRecorder::getInstance().update(nas.getState()); @@ -86,7 +91,8 @@ void NASController::update() void NASController::calibrate() { - Vector3f acceleration, magneticField; + Vector3f acceleration = Vector3f::Zero(); + Vector3f magneticField = Vector3f::Zero(); Stats pressure; for (int i = 0; i < CALIBRATION_SAMPLES_COUNT; i++) diff --git a/src/boards/Main/StateMachines/NASController/NASController.h b/src/boards/Main/StateMachines/NASController/NASController.h index 0f64d5efcc8a480459f38296b009cadef038abf3..6ae8b821f985b80070e82701ff4a3417e6cd0fbf 100644 --- a/src/boards/Main/StateMachines/NASController/NASController.h +++ b/src/boards/Main/StateMachines/NASController/NASController.h @@ -74,6 +74,7 @@ private: Boardcore::NAS nas; Eigen::Vector3f initialOrientation; + bool accelerationValid = true; Boardcore::PrintLogger logger = Boardcore::Logging::getLogger("nas"); diff --git a/src/boards/Payload/Configs/NASConfig.h b/src/boards/Payload/Configs/NASConfig.h index dda4d519f9dd5e44993ac32457e56d15f69033c2..450f4ea8a126c91d15c50dbc75a81e3f72fd3303 100644 --- a/src/boards/Payload/Configs/NASConfig.h +++ b/src/boards/Payload/Configs/NASConfig.h @@ -37,6 +37,8 @@ constexpr uint32_t UPDATE_PERIOD = 20; // 50 hz constexpr int CALIBRATION_SAMPLES_COUNT = 20; constexpr int CALIBRATION_SLEEP_TIME = 100; // [ms] +constexpr float ACCELERATION_THRESHOLD = 0.5; // [m/s^2] + static const Boardcore::NASConfig config = { UPDATE_PERIOD / 1000.0, // T 0.0001f, // SIGMA_BETA diff --git a/src/boards/Payload/StateMachines/NASController/NASController.cpp b/src/boards/Payload/StateMachines/NASController/NASController.cpp index 380bc2c0b51dd68c2d40d488abfffc986e26b73b..8f914775091fa756232f85b0c838c37bd486cb5e 100644 --- a/src/boards/Payload/StateMachines/NASController/NASController.cpp +++ b/src/boards/Payload/StateMachines/NASController/NASController.cpp @@ -70,8 +70,13 @@ void NASController::update() nas.correctGPS(gpsData); nas.correctBaro(pressureData.pressure); - // TODO: Add accelerometer correction until the acceleration goes out of - // specs + // Correct with accelerometer if the acceleration is in specs + Vector3f acceleration = static_cast<AccelerometerData>(imuData); + if (acceleration.norm() > (9.8 + ACCELERATION_THRESHOLD) || + acceleration.norm() < (9.8 - ACCELERATION_THRESHOLD)) + accelerationValid = false; + if (accelerationValid) + nas.correctAcc(imuData); Logger::getInstance().log(nas.getState()); FlightStatsRecorder::getInstance().update(nas.getState()); @@ -80,7 +85,8 @@ void NASController::update() void NASController::calibrate() { - Vector3f acceleration, magneticField; + Vector3f acceleration = Vector3f::Zero(); + Vector3f magneticField = Vector3f::Zero(); Stats pressure; for (int i = 0; i < CALIBRATION_SAMPLES_COUNT; i++) @@ -248,6 +254,8 @@ void NASController::state_ready(const Event& event) { case EV_ENTRY: { + accelerationValid = true; + return logStatus(NASControllerState::READY); } case NAS_CALIBRATE: diff --git a/src/boards/Payload/StateMachines/NASController/NASController.h b/src/boards/Payload/StateMachines/NASController/NASController.h index db0eb9270fb28f0c417e418498df68398fe1c52d..476c5a84d06e888b35f389f708205e370895d6b2 100644 --- a/src/boards/Payload/StateMachines/NASController/NASController.h +++ b/src/boards/Payload/StateMachines/NASController/NASController.h @@ -69,6 +69,7 @@ private: Boardcore::NAS nas; Eigen::Vector3f initialOrientation; + bool accelerationValid = true; Boardcore::PrintLogger logger = Boardcore::Logging::getLogger("nas"); };