14#ifndef UNICYCLE_MODEL_H
15#define UNICYCLE_MODEL_H
17#include "../../util/NumberOperations.hpp"
74 m_dAngularVelocity = 0.0;
75 m_tmLastUpdateTime = std::chrono::system_clock::now();
88 UnicycleModel(
const double dXPosition,
const double dYPosition,
const double dTheta)
91 m_dXPosition = dXPosition;
92 m_dYPosition = dYPosition;
95 m_dAngularVelocity = 0.0;
96 m_tmLastUpdateTime = std::chrono::system_clock::now();
109 void ResetState(
const double dXPosition,
const double dYPosition,
const double dTheta)
112 m_dXPosition = dXPosition;
113 m_dYPosition = dYPosition;
115 m_dAngularVelocity = 0.0;
117 m_tmLastUpdateTime = std::chrono::system_clock::now();
133 m_dAngularVelocity = 0.0;
135 m_tmLastUpdateTime = std::chrono::system_clock::now();
151 void UpdateState(
const double dXPosition,
const double dYPosition,
const double dTheta)
154 if (m_dVelocity == -1.0)
160 else if (dXPosition != m_dXPosition || dYPosition != m_dYPosition)
163 std::chrono::system_clock::time_point tmCurrentTime = std::chrono::system_clock::now();
164 double dTimeElapsed = std::chrono::duration_cast<std::chrono::milliseconds>(tmCurrentTime - m_tmLastUpdateTime).count() / 1000.0;
165 m_dVelocity = std::sqrt(std::pow(dXPosition - m_dXPosition, 2) + std::pow(dYPosition - m_dYPosition, 2)) / dTimeElapsed;
168 m_tmLastUpdateTime = tmCurrentTime;
172 m_dXPosition = dXPosition;
173 m_dYPosition = dYPosition;
187 void Predict(
const double dTimeStep,
const int nNumPredictions, std::vector<Prediction>& vPredictions)
190 double dXPredicted = m_dXPosition;
191 double dYPredicted = m_dYPosition;
192 double dThetaPredicted = m_dTheta;
195 for (
int nIter = 0; nIter < nNumPredictions; ++nIter)
198 double dThetaRad = dThetaPredicted * M_PI / 180.0;
201 dXPredicted += m_dVelocity * std::sin(dThetaRad) * dTimeStep;
202 dYPredicted += m_dVelocity * std::cos(dThetaRad) * dTimeStep;
203 dThetaPredicted += (m_dAngularVelocity) *dTimeStep;
209 Prediction stPrediction{dXPredicted, dYPredicted, dThetaPredicted};
210 vPredictions.push_back(stPrediction);
226 void SetXPosition(
const double dXPosition) { m_dXPosition = dXPosition; }
236 void SetYPosition(
const double dYPosition) { m_dYPosition = dYPosition; }
246 void SetTheta(
const double dTheta) { m_dTheta = dTheta; }
321 double m_dAngularVelocity;
322 std::chrono::system_clock::time_point m_tmLastUpdateTime;
This class implements the Unicycle Model. This model is used to predict the future state of the rover...
Definition UnicycleModel.hpp:35
void SetAngularVelocity(const double dAngularVelocity)
Mutator for the Angular Velocity private member.
Definition UnicycleModel.hpp:256
void SetYPosition(const double dYPosition)
Mutator for the YPosition private member.
Definition UnicycleModel.hpp:236
void ResetState()
Resets the state of the model to a default state.
Definition UnicycleModel.hpp:127
double GetYPosition() const
Accessor for the YPosition private member.
Definition UnicycleModel.hpp:280
void ResetState(const double dXPosition, const double dYPosition, const double dTheta)
Resets the state of the model to a new position and heading.
Definition UnicycleModel.hpp:109
double GetTheta() const
Accessor for the Theta private member.
Definition UnicycleModel.hpp:290
void UpdateState(const double dXPosition, const double dYPosition, const double dTheta)
Update the state of the model, given a new position and heading. This method will automatically calcu...
Definition UnicycleModel.hpp:151
double GetAngularVelocity() const
Accessor for the Angular Velocity private member.
Definition UnicycleModel.hpp:310
double GetVelocity() const
Accessor for the Velocity private member.
Definition UnicycleModel.hpp:300
void Predict(const double dTimeStep, const int nNumPredictions, std::vector< Prediction > &vPredictions)
Accessor for the State private member.
Definition UnicycleModel.hpp:187
double GetXPosition() const
Accessor for the XPosition private member.
Definition UnicycleModel.hpp:270
UnicycleModel(const double dXPosition, const double dYPosition, const double dTheta)
Construct a new Unicycle Model object.
Definition UnicycleModel.hpp:88
void SetTheta(const double dTheta)
Mutator for the Theta private member.
Definition UnicycleModel.hpp:246
void SetXPosition(const double dXPosition)
Mutator for the XPosition private member.
Definition UnicycleModel.hpp:226
UnicycleModel()
Construct a new Unicycle Model object.
Definition UnicycleModel.hpp:67
constexpr T InputAngleModulus(T tValue, T tMinValue, T tMaxValue)
Calculates the modulus of an input angle.
Definition NumberOperations.hpp:165
This struct is used to store the predicted state of the unicycle.
Definition UnicycleModel.hpp:49