14#ifndef BICYCLE_MODEL_H
15#define BICYCLE_MODEL_H
17#include "../../util/NumberOperations.hpp"
75 m_dSteeringAngle = 0.0;
76 m_tmLastUpdateTime = std::chrono::system_clock::now();
90 BicycleModel(
const double dWheelbase,
const double dXPosition,
const double dYPosition,
const double dTheta)
93 m_dWheelbase = dWheelbase;
94 m_dXPosition = dXPosition;
95 m_dYPosition = dYPosition;
98 m_dSteeringAngle = 0.0;
99 m_tmLastUpdateTime = std::chrono::system_clock::now();
112 void ResetState(
const double dXPosition,
const double dYPosition,
const double dTheta)
115 m_dXPosition = dXPosition;
116 m_dYPosition = dYPosition;
118 m_dSteeringAngle = 0.0;
120 m_tmLastUpdateTime = std::chrono::system_clock::now();
136 m_dSteeringAngle = 0.0;
138 m_tmLastUpdateTime = std::chrono::system_clock::now();
154 void UpdateState(
const double dXPosition,
const double dYPosition,
const double dTheta)
157 if (m_dVelocity == -1.0)
163 else if (dXPosition != m_dXPosition || dYPosition != m_dYPosition)
166 std::chrono::system_clock::time_point tmCurrentTime = std::chrono::system_clock::now();
167 double dTimeElapsed = std::chrono::duration_cast<std::chrono::milliseconds>(tmCurrentTime - m_tmLastUpdateTime).count() / 1000.0;
168 m_dVelocity = std::sqrt(std::pow(dXPosition - m_dXPosition, 2) + std::pow(dYPosition - m_dYPosition, 2)) / dTimeElapsed;
171 m_tmLastUpdateTime = tmCurrentTime;
175 m_dSteeringAngle = (std::atan2(dYPosition - m_dYPosition, dXPosition - m_dXPosition) * 180.0 / M_PI) - m_dTheta;
180 m_dXPosition = dXPosition;
181 m_dYPosition = dYPosition;
195 void Predict(
const double dTimeStep,
const int nNumPredictions, std::vector<Prediction>& vPredictions)
198 double dXPredicted = m_dXPosition;
199 double dYPredicted = m_dYPosition;
200 double dThetaPredicted = m_dTheta;
203 for (
int nIter = 0; nIter < nNumPredictions; ++nIter)
206 double dThetaRad = dThetaPredicted * M_PI / 180.0;
207 double dSteeringAngleRad = m_dSteeringAngle * M_PI / 180.0;
210 dXPredicted += m_dVelocity * std::sin(dThetaRad) * dTimeStep;
211 dYPredicted += m_dVelocity * std::cos(dThetaRad) * dTimeStep;
212 dThetaPredicted += (m_dVelocity / m_dWheelbase) * std::tan(dSteeringAngleRad - M_PI_2) * dTimeStep;
218 Prediction stPrediction{dXPredicted, dYPredicted, dThetaPredicted};
219 vPredictions.push_back(stPrediction);
235 void SetWheelbase(
const double dWheelbase) { m_dWheelbase = dWheelbase; }
245 void SetXPosition(
const double dXPosition) { m_dXPosition = dXPosition; }
255 void SetYPosition(
const double dYPosition) { m_dYPosition = dYPosition; }
265 void SetTheta(
const double dTheta) { m_dTheta = dTheta; }
351 double m_dSteeringAngle;
352 std::chrono::system_clock::time_point m_tmLastUpdateTime;
This class implements the Bicycle Model. This model is used to predict the future state of the rover ...
Definition BicycleModel.hpp:35
BicycleModel()
Construct a new Bicycle Model object.
Definition BicycleModel.hpp:67
double GetXPosition() const
Accessor for the XPosition private member.
Definition BicycleModel.hpp:299
double GetSteeringAngle() const
Accessor for the Steering Angle private member.
Definition BicycleModel.hpp:339
void ResetState(const double dXPosition, const double dYPosition, const double dTheta)
Resets the state of the model to a new position and heading.
Definition BicycleModel.hpp:112
void SetXPosition(const double dXPosition)
Mutator for the XPosition private member.
Definition BicycleModel.hpp:245
double GetVelocity() const
Accessor for the Velocity private member.
Definition BicycleModel.hpp:329
double GetTheta() const
Accessor for the Theta private member.
Definition BicycleModel.hpp:319
void Predict(const double dTimeStep, const int nNumPredictions, std::vector< Prediction > &vPredictions)
Accessor for the State private member.
Definition BicycleModel.hpp:195
void SetWheelbase(const double dWheelbase)
Mutator for the Wheelbase private member.
Definition BicycleModel.hpp:235
double GetWheelbase() const
Accessor for the Wheelbase private member.
Definition BicycleModel.hpp:289
void SetTheta(const double dTheta)
Mutator for the Theta private member.
Definition BicycleModel.hpp:265
void ResetState()
Resets the state of the model to a default state.
Definition BicycleModel.hpp:130
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 BicycleModel.hpp:154
void SetYPosition(const double dYPosition)
Mutator for the YPosition private member.
Definition BicycleModel.hpp:255
BicycleModel(const double dWheelbase, const double dXPosition, const double dYPosition, const double dTheta)
Construct a new Bicycle Model object.
Definition BicycleModel.hpp:90
void SetSteeringAngle(const double dSteeringAngle)
Mutator for the Steering Angle private member.
Definition BicycleModel.hpp:275
double GetYPosition() const
Accessor for the YPosition private member.
Definition BicycleModel.hpp:309
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 bicycle.
Definition BicycleModel.hpp:49