diff --git a/src/boards/Payload/Configs/WingConfig.h b/src/boards/Payload/Configs/WingConfig.h index 91c0b50b2237a569aa3d1070a7ebfe05a0d24baf..7b530a01a8224798f919c74bd6cc1fe0e392f914 100644 --- a/src/boards/Payload/Configs/WingConfig.h +++ b/src/boards/Payload/Configs/WingConfig.h @@ -69,6 +69,13 @@ constexpr auto ALGORITHM = AlgorithmId::EARLY_MANEUVER; constexpr auto STRAIGHT_FLIGHT_TIMEOUT = 15s; constexpr auto UPDATE_RATE = 1_hz; +constexpr auto CUTTERS_TIMEOUT = 1s; + +constexpr auto FLARE_WAIT = 5s; ///< Time to wait before the first flare +constexpr auto FLARE_COUNT = 2; ///< Number of flares +constexpr auto FLARE_DURATION = 2s; ///< Duration of the flare maneuver +constexpr auto FLARE_INTERVAL = 1s; ///< Interval between two flares + namespace PI { constexpr auto SATURATION_MIN_LIMIT = -Boardcore::Constants::PI; @@ -86,8 +93,6 @@ constexpr auto M2_ALTITUDE_THRESHOLD = 150; // [m] constexpr auto TARGET_ALTITUDE_THRESHOLD = 50; // [m] } // namespace Guidance -constexpr float TWIRL_RADIUS = 0.5; // [%] - } // namespace Wing namespace AltitudeTrigger diff --git a/src/boards/Payload/StateMachines/WingController/WingController.cpp b/src/boards/Payload/StateMachines/WingController/WingController.cpp index 3bd2144a6ffd0da38e3f8eeee8311b30bf396ca8..edb38402249d2bba47f14ede6c47f15c171376c3 100644 --- a/src/boards/Payload/StateMachines/WingController/WingController.cpp +++ b/src/boards/Payload/StateMachines/WingController/WingController.cpp @@ -79,13 +79,6 @@ State WingController::Idle(const Boardcore::Event& event) case FLIGHT_WING_DESCENT: { - auto nasState = getModule<NASController>()->getNasState(); - float altitude = -nasState.d; - - getModule<Actuators>()->cuttersOn(); - getModule<FlightStatsRecorder>()->deploymentDetected( - TimestampTimer::getTimestamp(), altitude); - return transition(&WingController::Flying); } @@ -112,6 +105,13 @@ State WingController::Flying(const Event& event) case EV_EXIT: { + if (cuttersOffEventId != 0) + { + EventBroker::getInstance().removeDelayed(cuttersOffEventId); + } + + getModule<Actuators>()->cuttersOff(); + return HANDLED; } @@ -122,7 +122,13 @@ State WingController::Flying(const Event& event) case EV_INIT: { - return transition(&WingController::FlyingCalibration); + return transition(&WingController::FlyingDeployment); + } + + case DPL_CUT_TIMEOUT: + { + getModule<Actuators>()->cuttersOff(); + return HANDLED; } case FLIGHT_LANDING_DETECTED: @@ -137,26 +143,38 @@ State WingController::Flying(const Event& event) } } -State WingController::FlyingCalibration(const Boardcore::Event& event) +State WingController::FlyingDeployment(const Boardcore::Event& event) { - static uint16_t calibrationTimeoutEventId; - switch (event) { - case EV_ENTRY: // starts twirling and calibration wes + case EV_ENTRY: { - updateState(WingControllerState::FLYING_CALIBRATION); + updateState(WingControllerState::FLYING_DEPLOYMENT); - flareWing(); - calibrationTimeoutEventId = EventBroker::getInstance().postDelayed( - DPL_SERVO_ACTUATION_DETECTED, TOPIC_DPL, 2000); + getModule<Actuators>()->cuttersOn(); + cuttersOffEventId = EventBroker::getInstance().postDelayed( + DPL_CUT_TIMEOUT, TOPIC_DPL, + milliseconds{CUTTERS_TIMEOUT}.count()); + + auto nasState = getModule<NASController>()->getNasState(); + float altitude = -nasState.d; + getModule<FlightStatsRecorder>()->deploymentDetected( + TimestampTimer::getTimestamp(), altitude); + + flareEventId = EventBroker::getInstance().postDelayed( + DPL_FLARE_START, TOPIC_DPL, milliseconds{FLARE_WAIT}.count()); return HANDLED; } case EV_EXIT: { - EventBroker::getInstance().removeDelayed(calibrationTimeoutEventId); + if (flareEventId != 0) + { + EventBroker::getInstance().removeDelayed(flareEventId); + } + resetWing(); + return HANDLED; } @@ -165,41 +183,37 @@ State WingController::FlyingCalibration(const Boardcore::Event& event) return tranSuper(&WingController::Flying); } - case DPL_SERVO_ACTUATION_DETECTED: - { - resetWing(); - calibrationTimeoutEventId = EventBroker::getInstance().postDelayed( - DPL_WIGGLE, TOPIC_DPL, 1000); - - return HANDLED; - } - - case DPL_WIGGLE: + case DPL_FLARE_START: { flareWing(); - calibrationTimeoutEventId = EventBroker::getInstance().postDelayed( - DPL_NC_OPEN, TOPIC_DPL, 2000); + flareEventId = EventBroker::getInstance().postDelayed( + DPL_FLARE_STOP, TOPIC_DPL, + milliseconds{FLARE_DURATION}.count()); return HANDLED; } - case DPL_NC_OPEN: + case DPL_FLARE_STOP: { resetWing(); - calibrationTimeoutEventId = EventBroker::getInstance().postDelayed( - DPL_WES_CAL_DONE, TOPIC_DPL, - milliseconds{Config::WES::ROTATION_PERIOD}.count()); - getModule<WindEstimation>()->startWindEstimationSchemeCalibration(); - - twirlWing(); + flareCount--; + + if (flareCount > 0) + { + flareEventId = EventBroker::getInstance().postDelayed( + DPL_FLARE_START, TOPIC_DPL, + milliseconds{FLARE_INTERVAL}.count()); + } + else + { + EventBroker::getInstance().post(DPL_DONE, TOPIC_DPL); + } return HANDLED; } - case DPL_WES_CAL_DONE: + case DPL_DONE: { - resetWing(); - return transition(&WingController::FlyingControlledDescent); } @@ -254,8 +268,8 @@ State WingController::OnGround(const Boardcore::Event& event) getModule<WindEstimation>()->stopWindEstimationScheme(); getModule<WindEstimation>()->stopWindEstimationSchemeCalibration(); stopAlgorithm(); + resetWing(); - // disable servos getModule<Actuators>()->disableServo(PARAFOIL_LEFT_SERVO); getModule<Actuators>()->disableServo(PARAFOIL_RIGHT_SERVO); @@ -512,7 +526,6 @@ void WingController::stopAlgorithm() running = false; getCurrentAlgorithm().end(); - resetWing(); } } @@ -589,12 +602,6 @@ void WingController::flareWing() getModule<Actuators>()->setServoPosition(PARAFOIL_RIGHT_SERVO, 1.0f); } -void WingController::twirlWing() -{ - getModule<Actuators>()->setServoPosition(PARAFOIL_LEFT_SERVO, TWIRL_RADIUS); - getModule<Actuators>()->setServoPosition(PARAFOIL_RIGHT_SERVO, 0.0f); -} - void WingController::resetWing() { getModule<Actuators>()->setServoPosition(PARAFOIL_LEFT_SERVO, 0.0f); diff --git a/src/boards/Payload/StateMachines/WingController/WingController.h b/src/boards/Payload/StateMachines/WingController/WingController.h index 4c3ada8ed3b7a4ed52eaf5ae5b2a4d4ff773fea0..4f0274654aa644dd7e553ba1442dde1bc6f73451 100644 --- a/src/boards/Payload/StateMachines/WingController/WingController.h +++ b/src/boards/Payload/StateMachines/WingController/WingController.h @@ -87,7 +87,7 @@ public: // HSM states Boardcore::State Idle(const Boardcore::Event& event); Boardcore::State Flying(const Boardcore::Event& event); - Boardcore::State FlyingCalibration(const Boardcore::Event& event); + Boardcore::State FlyingDeployment(const Boardcore::Event& event); Boardcore::State FlyingControlledDescent(const Boardcore::Event& event); Boardcore::State OnGround(const Boardcore::Event& event); @@ -243,6 +243,11 @@ private: */ ClosedLoopGuidanceAlgorithm clGuidance; + uint16_t cuttersOffEventId = 0; + uint16_t flareEventId = 0; + + uint32_t flareCount = Config::Wing::FLARE_COUNT; + std::atomic<bool> started{false}; std::atomic<bool> running{false}; ///< Whether the algorithm is running diff --git a/src/boards/Payload/StateMachines/WingController/WingControllerData.h b/src/boards/Payload/StateMachines/WingController/WingControllerData.h index 0d175ea3530314d974a21c8a563781e7790fffa2..fdfb81da287dfb4073c0da8500810361c607fc29 100644 --- a/src/boards/Payload/StateMachines/WingController/WingControllerData.h +++ b/src/boards/Payload/StateMachines/WingController/WingControllerData.h @@ -33,7 +33,7 @@ enum class WingControllerState : uint8_t { UNINIT = 0, IDLE, - FLYING_CALIBRATION, + FLYING_DEPLOYMENT, FLYING_CONTROLLED_DESCENT, ON_GROUND, END diff --git a/src/boards/common/Events.h b/src/boards/common/Events.h index b274d2b579913a62ba7c0ba3fdc09f64bdfeca81..44fe47db9452370fd12d975f499dd830d15d2bc1 100644 --- a/src/boards/common/Events.h +++ b/src/boards/common/Events.h @@ -59,9 +59,9 @@ enum Events : uint8_t DPL_CUT_TIMEOUT, DPL_NC_OPEN, DPL_NC_RESET, - DPL_SERVO_ACTUATION_DETECTED, - DPL_WIGGLE, - DPL_WES_CAL_DONE, + DPL_FLARE_START, + DPL_FLARE_STOP, + DPL_DONE, CAN_FORCE_INIT, CAN_ARM, CAN_ENTER_TEST_MODE, @@ -177,9 +177,9 @@ inline std::string getEventString(uint8_t event) {DPL_CUT_TIMEOUT, "DPL_CUT_TIMEOUT"}, {DPL_NC_OPEN, "DPL_NC_OPEN"}, {DPL_NC_RESET, "DPL_NC_RESET"}, - {DPL_SERVO_ACTUATION_DETECTED, "DPL_SERVO_ACTUATION_DETECTED"}, - {DPL_WIGGLE, "DPL_WIGGLE"}, - {DPL_WES_CAL_DONE, "DPL_WES_CAL_DONE"}, + {DPL_FLARE_START, "DPL_FLARE_START"}, + {DPL_FLARE_STOP, "DPL_FLARE_STOP"}, + {DPL_DONE, "DPL_DONE"}, {CAN_FORCE_INIT, "CAN_FORCE_INIT"}, {CAN_ARM, "CAN_ARM"}, {CAN_ENTER_TEST_MODE, "CAN_ENTER_TEST_MODE"},