diff --git a/src/shared/algorithms/Follower/Follower.cpp b/src/shared/algorithms/Follower/Follower.cpp index 18c0575b5c3510a4e02e9173ba5686f38d7dd9e1..254f09ab23baa0ae7967484e9b5b2e33cb16616d 100644 --- a/src/shared/algorithms/Follower/Follower.cpp +++ b/src/shared/algorithms/Follower/Follower.cpp @@ -56,17 +56,17 @@ Follower::Follower(std::chrono::milliseconds updatePeriod) { } -void Follower::setAntennaCoordinates(const Boardcore::GPSData& gpsData) +void Follower::setAntennaCoordinates(const GPSData& gpsData) { - Lock<FastMutex> lock(lastAntennaAttitudeMutex); - antennaCoordinates = {gpsData.latitude, gpsData.longitude, gpsData.height}; + Lock<FastMutex> lock(followerMutex); + antennaCoordinates = {gpsData.latitude, gpsData.longitude}; Boardcore::Logger::getInstance().log(LogAntennasCoordinates(gpsData)); antennaCoordinatesSet = true; } -void Follower::setRocketNASOrigin(const Boardcore::GPSData& gpsData) +void Follower::setRocketNASOrigin(const GPSData& gpsData) { - Lock<FastMutex> lock(rocketNASOriginMutex); + Lock<FastMutex> lock(followerMutex); rocketNASOrigin = {gpsData.latitude, gpsData.longitude, gpsData.height}; Boardcore::Logger::getInstance().log(LogRocketCoordinates(gpsData)); rocketCoordinatesSet = true; @@ -74,44 +74,45 @@ void Follower::setRocketNASOrigin(const Boardcore::GPSData& gpsData) void Follower::setLastAntennaAttitude(const VN300Data& attitudeData) { - Lock<FastMutex> lock(lastAntennaAttitudeMutex); + Lock<FastMutex> lock(followerMutex); + firstAntennaAttitudeSet = true; lastAntennaAttitude = attitudeData; } VN300Data Follower::getLastAntennaAttitude() { - Lock<FastMutex> lock(lastAntennaAttitudeMutex); + Lock<FastMutex> lock(followerMutex); return lastAntennaAttitude; } void Follower::setLastRocketNasState(const NASState& nasState) { - Lock<FastMutex> lock(lastRocketNasStateMutex); - lastRocketNasState = nasState; - firstAntennaAttitudeSet = true; + Lock<FastMutex> lock(followerMutex); + lastRocketNasState = nasState; + lastRocketNasStateSet = true; } NASState Follower::getLastRocketNasState() { - Lock<FastMutex> lock(lastRocketNasStateMutex); + Lock<FastMutex> lock(followerMutex); return lastRocketNasState; } FollowerState Follower::getState() { - miosix::Lock<miosix::FastMutex> lock(stateMutex); + miosix::Lock<miosix::FastMutex> lock(followerMutex); return state; } void Follower::setState(const FollowerState& newState) { - miosix::Lock<miosix::FastMutex> lock(stateMutex); + miosix::Lock<miosix::FastMutex> lock(followerMutex); state = newState; } AntennaAngles Follower::getTargetAngles() { - miosix::Lock<miosix::FastMutex> lock(targetAnglesMutex); + miosix::Lock<miosix::FastMutex> lock(followerMutex); return targetAngles; } @@ -124,62 +125,43 @@ bool Follower::init() LOG_ERR(logger, "Antenna or rocket coordinates not set"); return false; } - - // Antenna Coordinates (w/out altitude) - Eigen::Vector2f antennaCoord{getAntennaCoordinates().head<2>()}; - // Rocket coordinates (w/out altitude) - Eigen::Vector2f rocketCoord{getRocketNASOrigin().head<2>()}; - - initialAntennaRocketDistance = - Aeroutils::geodetic2NED(rocketCoord, antennaCoord); - - LOG_INFO(logger, "Initial antenna - rocket distance: [{}, {}] [m]\n", - initialAntennaRocketDistance[0], initialAntennaRocketDistance[1]); - - isInit = true; return true; } void Follower::step() { - if (!isInit) - { - LOG_ERR(logger, "Not initialized Follower\n"); - return; - } - - NASState lastRocketNas = getLastRocketNasState(); - - // Getting the position of the rocket wrt the antennas in NED frame - NEDCoords rocketPosition = {lastRocketNas.n, lastRocketNas.e, - lastRocketNas.d}; - AntennaAngles diffAngles; VN300Data vn300; + NASState lastRocketNas; + NEDCoords rocketPosition; + // Read the data for the step computation { - miosix::Lock<miosix::FastMutex> lockAngle(targetAnglesMutex); - - // Calculate the antenna target angles from the NED rocket coordinates - targetAngles = rocketPositionToAntennaAngles(rocketPosition); + Lock<FastMutex> lock(followerMutex); + if (!firstAntennaAttitudeSet) { - Lock<FastMutex> lockLastRocketNasState(lastRocketNasStateMutex); - // If attitude data has never been set, do not actuate the steppers - if (!firstAntennaAttitudeSet) - { - LOG_ERR(logger, "Antenna attitude not set\n"); - return; - } + LOG_ERR(logger, "Antenna attitude not set\n"); + return; } + // TODO: See if needed to check the NAS or rather point to the NAS + // origin if missing - vn300 = getLastAntennaAttitude(); - - // Calculate the amount to move from the current position - diffAngles = {targetAngles.timestamp, targetAngles.yaw - vn300.yaw, - targetAngles.pitch - vn300.pitch}; + lastRocketNas = lastRocketNasState; + vn300 = lastAntennaAttitude; } + // Local variable checks and updates + // Getting the position of the rocket wrt the antennas in NED frame + rocketPosition = {lastRocketNas.n, lastRocketNas.e, lastRocketNas.d}; + + // Calculate the antenna target angles from the NED rocket coordinates + targetAngles = rocketPositionToAntennaAngles(rocketPosition); + + // Calculate the amount to move from the current position + diffAngles = {targetAngles.timestamp, targetAngles.yaw - vn300.yaw, + targetAngles.pitch - vn300.pitch}; + // Rotate in the shortest direction diffAngles.yaw = YAW_GAIN * minimizeRotation(diffAngles.yaw); diffAngles.pitch = PITCH_GAIN * minimizeRotation(diffAngles.pitch); @@ -197,7 +179,12 @@ void Follower::step() newState.pitch = diffAngles.pitch; newState.horizontalSpeed = horizontalSpeed; newState.verticalSpeed = verticalSpeed; - setState(newState); + + // Write the new state for the follower + { + Lock<FastMutex> lockWrite(followerMutex); + state = newState; + } #ifndef NDEBUG std::cout << "[FOLLOWER] STEPPER " << "Angles: [" << newState.yaw << ", " @@ -208,15 +195,15 @@ void Follower::step() #endif } -Eigen::Vector3f Follower::getAntennaCoordinates() +Eigen::Vector2f Follower::getAntennaCoordinates() { - Lock<FastMutex> lock(antennaCoordinatesMutex); - return Eigen::Vector3f{antennaCoordinates}; + Lock<FastMutex> lock(followerMutex); + return Eigen::Vector2f{antennaCoordinates}; } Eigen::Vector3f Follower::getRocketNASOrigin() { - Lock<FastMutex> lock(rocketNASOriginMutex); + Lock<FastMutex> lock(followerMutex); return Eigen::Vector3f{rocketNASOrigin}; } @@ -224,18 +211,16 @@ AntennaAngles Follower::rocketPositionToAntennaAngles( const NEDCoords& rocketNed) { // Antenna Coordinates - Eigen::Vector2f antennaCoord = getAntennaCoordinates().head<2>(); + Eigen::Vector2f antennaCoord = getAntennaCoordinates(); - // Rocket coordinates + // Rocket coordinates, w/out altitude Eigen::Vector2f rocketCoord = getRocketNASOrigin().head<2>(); - initialAntennaRocketDistance = - Aeroutils::geodetic2NED(rocketCoord, antennaCoord); + antennaRocketDistance = Aeroutils::geodetic2NED(rocketCoord, antennaCoord); // NED coordinates of the rocket in the NED antenna frame - NEDCoords ned = {rocketNed.n + initialAntennaRocketDistance.x(), - rocketNed.e + initialAntennaRocketDistance.y(), - rocketNed.d}; + NEDCoords ned = {rocketNed.n + antennaRocketDistance.x(), + rocketNed.e + antennaRocketDistance.y(), rocketNed.d}; AntennaAngles angles; angles.timestamp = TimestampTimer::getTimestamp(); diff --git a/src/shared/algorithms/Follower/Follower.h b/src/shared/algorithms/Follower/Follower.h index 2f84b00e31af71808150ade8e01fe5d2d82326a3..3c09112ec19e6716e2112bb521f0010eb31c8b3e 100644 --- a/src/shared/algorithms/Follower/Follower.h +++ b/src/shared/algorithms/Follower/Follower.h @@ -133,9 +133,9 @@ private: void setState(const FollowerState& newState); /** - * @brief Get for the GPS coordinates of the antenna. + * @brief Get for the [lat, lon] coordinates of the antenna. */ - Eigen::Vector3f getAntennaCoordinates(); + Eigen::Vector2f getAntennaCoordinates(); /** * @brief Get for the GPS coordinates of the rocket's NAS origin reference. @@ -152,33 +152,33 @@ private: bool antennaCoordinatesSet = false; bool rocketCoordinatesSet = false; + bool lastRocketNasStateSet = false; std::atomic<bool> firstAntennaAttitudeSet{false}; VN300Data lastAntennaAttitude; - miosix::FastMutex lastAntennaAttitudeMutex; NASState lastRocketNasState; - miosix::FastMutex lastRocketNasStateMutex; - // GPS coordinates of the antenna [lat, lon, alt] [deg, deg, m] - Eigen::Vector3f antennaCoordinates; - miosix::FastMutex antennaCoordinatesMutex; - // GPS coordinates of the NAS origin taken from reference origin [lat, lon, - // alt] [deg, deg, m] + // TODO: See if assumption has sense... + /* GPS coordinates of the antenna [lat, lon] [deg, deg], + altitude is considered same as NAS Origin */ + Eigen::Vector2f antennaCoordinates; + /* GPS coordinates of the NAS origin taken from reference origin [lat, lon, + alt] [deg, deg, m] */ Eigen::Vector3f rocketNASOrigin; - miosix::FastMutex rocketNASOriginMutex; - // Initial distance between the antenna and the rocket while in ramp [lat, - // lon, alt] [deg, deg, m] - Eigen::Vector2f initialAntennaRocketDistance; + /* Distance between the antenna and the rocket [lat, + lon, alt] [deg, deg, m] */ + Eigen::Vector2f antennaRocketDistance; // Target yaw and pitch of the system [deg, deg] AntennaAngles targetAngles; - miosix::FastMutex targetAnglesMutex; FollowerState state; - miosix::FastMutex stateMutex; PrintLogger logger = Logging::getLogger("Follower"); + + // General mutex for the follower + miosix::FastMutex followerMutex; }; } // namespace Boardcore diff --git a/src/shared/algorithms/Follower/FollowerData.h b/src/shared/algorithms/Follower/FollowerData.h index 92ddec6388c5eb592ca6df670c372cc3787a8005..59a1b7c2ba9869ed94963fb831720df07852eb9b 100644 --- a/src/shared/algorithms/Follower/FollowerData.h +++ b/src/shared/algorithms/Follower/FollowerData.h @@ -48,10 +48,10 @@ struct AntennaAngles AntennaAngles() : timestamp{0}, yaw{0}, pitch{0} {}; AntennaAngles(uint64_t timestamp, float yaw, float pitch) - : timestamp{timestamp}, yaw(yaw), pitch(pitch){}; + : timestamp{timestamp}, yaw(yaw), pitch(pitch) {}; AntennaAngles(uint64_t timestamp, float yaw, float pitch, uint32_t nrPropagations) - : timestamp{timestamp}, yaw(yaw), pitch(pitch){}; + : timestamp{timestamp}, yaw(yaw), pitch(pitch) {}; }; /** @@ -64,7 +64,7 @@ struct AntennaAnglesLog : public AntennaAngles uint32_t nrPropagations = 0; //!< Nr of propagations by the propagator (0 if no propagation) - AntennaAnglesLog() : AntennaAngles(), nrPropagations(0){}; + AntennaAnglesLog() : AntennaAngles(), nrPropagations(0) {}; AntennaAnglesLog(uint64_t timestamp, float yaw, float pitch) : AntennaAngles(timestamp, yaw, pitch), nrPropagations{0} {}; AntennaAnglesLog(uint64_t timestamp, float yaw, float pitch,