diff --git a/src/shared/algorithms/Propagator/Propagator.cpp b/src/shared/algorithms/Propagator/Propagator.cpp index be54a81fcbe7f8b6a47ef27139ed4372b9d1d6d5..fa537373f0a919a42eed320c6f0d4f40265ce360 100644 --- a/src/shared/algorithms/Propagator/Propagator.cpp +++ b/src/shared/algorithms/Propagator/Propagator.cpp @@ -46,6 +46,7 @@ void Propagator::step() miosix::Lock<miosix::FastMutex> lock(stateMutex); // Take new rocket data only if it has been just updated, otherwise take // last state available + PropagatorState oldState = state; // updates with the last received NAS state if present, otherwise uses the @@ -55,14 +56,22 @@ void Propagator::step() getRocketNasState()) : oldState); - if (useAcceleration) // Update Position assuming constant acceleration + if (state.nPropagations == 0 && + useAcceleration) // Update Position assuming constant acceleration { - state.setAcceleration((state.getVelocity() - oldState.getVelocity()) / - updatePeriod); - state.setVelocity((state.getVelocity() + state.getAcceleration()) * - updatePeriod); + t1 = state.timestamp; + dt = t1 - t0; + if (dt > 0 && dt < 4646476 && t0 != 0) + state.setAcceleration(state.getVelocity() - + last_real_velocity / dt); + t0 = t1; + last_real_velocity = state.getVelocity(); } + if (useAcceleration) + state.setVelocity(state.getVelocity() + + state.getAcceleration() * updatePeriod); + state.setPosition(state.getPosition() + state.getVelocity() * updatePeriod); state.nPropagations++; diff --git a/src/shared/algorithms/Propagator/Propagator.h b/src/shared/algorithms/Propagator/Propagator.h index 142fc41c21268b8abc42f209894bc95cfd23880b..2f2b4860b9931c03fd18c77bb92e851cfb1f6631 100644 --- a/src/shared/algorithms/Propagator/Propagator.h +++ b/src/shared/algorithms/Propagator/Propagator.h @@ -97,6 +97,8 @@ private: NASState lastRocketNasState; ///< Last received rocket NAS state miosix::FastMutex nasStateMutex; ///< mutex to sync nasState accesses miosix::FastMutex stateMutex; ///< mutex to sync state accesses + Eigen::Vector3f last_real_velocity; + uint64_t t0 = 0, t1 = 0, dt = 0; }; } // namespace Boardcore diff --git a/src/shared/algorithms/Propagator/PropagatorData.h b/src/shared/algorithms/Propagator/PropagatorData.h index 8df9949d64287a42672566910cc4937c036a85e2..073799ba2824dec7b902a48075b342df23af5626 100644 --- a/src/shared/algorithms/Propagator/PropagatorData.h +++ b/src/shared/algorithms/Propagator/PropagatorData.h @@ -42,7 +42,10 @@ struct PropagatorState uint32_t nPropagations; ///< Predictions from last received NAS state NASState nas; - Eigen::Vector3f acceleration = Eigen::Vector3f::Zero(); + + float ax = 0, ay = 0, + az = 0; // propagater acceleration (Eigen::Vector3f could not be used + // because it is not trivially copyable) PropagatorState() : timestamp(0), nPropagations(0), nas() {} @@ -63,9 +66,8 @@ struct PropagatorState os << timestamp << "," << nPropagations << "," << nas.n << "," << nas.e << "," << nas.d << "," << nas.vn << "," << nas.ve << "," << nas.vd << "," << nas.qx << "," << nas.qy << "," << nas.qz << "," << nas.qw - << "," << nas.bx << "," << nas.by << "," << nas.bz << "," - << acceleration[0] << "," << acceleration[1] << "," - << acceleration[2] << "\n"; + << "," << nas.bx << "," << nas.by << "," << nas.bz << "," << ax + << "," << ay << "," << az << "\n"; } NASState getNasState() const { return nas; } @@ -113,14 +115,26 @@ struct PropagatorState /** * @brief Setter for the vector acceleration */ - void setAcceleration(Eigen::Vector3f acc) { acceleration = acc; } + void setAcceleration(Eigen::Vector3f acc) + { + ax = acc[0]; + ay = acc[1]; + az = acc[2]; + } /** * @brief Getter for the vector acceleration * * @return Eigen::Vector3f acceleration */ - Eigen::Vector3f getAcceleration() const { return acceleration; } + Eigen::Vector3f getAcceleration() const + { + Eigen::Vector3f acc; + acc[0] = ax; + acc[1] = ay; + acc[2] = az; + return acc; + } /** * @brief Getter for the vector of quaternions