Autonomy Software C++ 24.5.1
Welcome to the Autonomy Software repository of the Mars Rover Design Team (MRDT) at Missouri University of Science and Technology (Missouri S&T)! API reference contains the source code and other resources for the development of the autonomy software for our Mars rover. The Autonomy Software project aims to compete in the University Rover Challenge (URC) by demonstrating advanced autonomous capabilities and robust navigation algorithms.
Loading...
Searching...
No Matches
UnicycleModel.hpp
Go to the documentation of this file.
1
14#ifndef UNICYCLE_MODEL_H
15#define UNICYCLE_MODEL_H
16
17#include "../../util/NumberOperations.hpp"
18
20#include <chrono>
21#include <cmath>
22#include <vector>
23
25
26
35{
36 public:
38 // Declare public structs for this class.
40
41
49 {
50 public:
51 double dXPosition;
52 double dYPosition;
53 double dTheta;
54 };
55
57 // Declare public class methods.
59
60
68 {
69 // Initialize member variables.
70 m_dXPosition = 0.0;
71 m_dYPosition = 0.0;
72 m_dTheta = 0.0;
73 m_dVelocity = -1.0;
74 m_dAngularVelocity = 0.0;
75 m_tmLastUpdateTime = std::chrono::system_clock::now();
76 }
77
78
88 UnicycleModel(const double dXPosition, const double dYPosition, const double dTheta)
89 {
90 // Initialize member variables.
91 m_dXPosition = dXPosition;
92 m_dYPosition = dYPosition;
93 m_dTheta = dTheta;
94 m_dVelocity = -1.0;
95 m_dAngularVelocity = 0.0;
96 m_tmLastUpdateTime = std::chrono::system_clock::now();
97 }
98
99
109 void ResetState(const double dXPosition, const double dYPosition, const double dTheta)
110 {
111 // Update member variables.
112 m_dXPosition = dXPosition;
113 m_dYPosition = dYPosition;
114 m_dTheta = dTheta;
115 m_dAngularVelocity = 0.0;
116 m_dVelocity = -1.0;
117 m_tmLastUpdateTime = std::chrono::system_clock::now();
118 }
119
120
128 {
129 // Update member variables.
130 m_dXPosition = 0.0;
131 m_dYPosition = 0.0;
132 m_dTheta = 0.0;
133 m_dAngularVelocity = 0.0;
134 m_dVelocity = -1.0;
135 m_tmLastUpdateTime = std::chrono::system_clock::now();
136 }
137
138
151 void UpdateState(const double dXPosition, const double dYPosition, const double dTheta)
152 {
153 // Check if this is our first update.
154 if (m_dVelocity == -1.0)
155 {
156 // Set the velocity to zero.
157 m_dVelocity = 0.0;
158 }
159 // Calculate the velocity of the rover as long as the new position is different from the current position.
160 else if (dXPosition != m_dXPosition || dYPosition != m_dYPosition)
161 {
162 // Calculate the velocity of the rover.
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;
166
167 // Update the last update time.
168 m_tmLastUpdateTime = tmCurrentTime;
169 }
170
171 // Update member variables.
172 m_dXPosition = dXPosition;
173 m_dYPosition = dYPosition;
174 m_dTheta = dTheta;
175 }
176
177
187 void Predict(const double dTimeStep, const int nNumPredictions, std::vector<Prediction>& vPredictions)
188 {
189 // Start from the current state.
190 double dXPredicted = m_dXPosition;
191 double dYPredicted = m_dYPosition;
192 double dThetaPredicted = m_dTheta;
193
194 // Perform prediction for a specified number of time steps.
195 for (int nIter = 0; nIter < nNumPredictions; ++nIter)
196 {
197 // Convert theta from degrees to radians for calculation.
198 double dThetaRad = dThetaPredicted * M_PI / 180.0;
199
200 // Calculate the new state.
201 dXPredicted += m_dVelocity * std::sin(dThetaRad) * dTimeStep;
202 dYPredicted += m_dVelocity * std::cos(dThetaRad) * dTimeStep;
203 dThetaPredicted += (m_dAngularVelocity) *dTimeStep;
204
205 // Ensure theta stays within 0-360 degrees.
206 dThetaPredicted = numops::InputAngleModulus(dThetaPredicted, 0.0, 360.0);
207
208 // Store the new state.
209 Prediction stPrediction{dXPredicted, dYPredicted, dThetaPredicted};
210 vPredictions.push_back(stPrediction);
211 }
212 }
213
215 // Setters.
217
218
226 void SetXPosition(const double dXPosition) { m_dXPosition = dXPosition; }
227
228
236 void SetYPosition(const double dYPosition) { m_dYPosition = dYPosition; }
237
238
246 void SetTheta(const double dTheta) { m_dTheta = dTheta; }
247
248
256 void SetAngularVelocity(const double dAngularVelocity) { m_dAngularVelocity = dAngularVelocity; }
257
259 // Getters.
261
262
270 double GetXPosition() const { return m_dXPosition; }
271
272
280 double GetYPosition() const { return m_dYPosition; }
281
282
290 double GetTheta() const { return m_dTheta; }
291
292
300 double GetVelocity() const { return m_dVelocity; }
301
302
310 double GetAngularVelocity() const { return m_dAngularVelocity; }
311
312 private:
314 // Declare private member variables.
316
317 double m_dXPosition;
318 double m_dYPosition;
319 double m_dTheta;
320 double m_dVelocity;
321 double m_dAngularVelocity;
322 std::chrono::system_clock::time_point m_tmLastUpdateTime;
323};
324#endif
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