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
StuckDetection.hpp
Go to the documentation of this file.
1
12#ifndef STUCK_DETECTION_HPP
13#define STUCK_DETECTION_HPP
14
16// Put implicit includes in here.
17#include <chrono>
18#include <cmath>
19
21
22
29namespace statemachine
30{
31
43 {
44 private:
46 // Declare private member variables.
48
49 double m_dMaximumStuckCount;
50 double m_dStuckCheckIntervalSeconds;
51 unsigned int m_unStuckChecksSoFar;
52 std::chrono::system_clock::time_point m_tmTimeSinceLastStuckCheck;
53
54 public:
56 // Declare public class methods.
58
59
68 TimeIntervalBasedStuckDetector(double dMaximumStuckCount = 3, double dStuckCheckIntervalSeconds = 3)
69 {
70 // Initialize member variables.
71 m_dMaximumStuckCount = dMaximumStuckCount;
72 m_dStuckCheckIntervalSeconds = dStuckCheckIntervalSeconds;
73 m_unStuckChecksSoFar = 0;
74 m_tmTimeSinceLastStuckCheck = std::chrono::system_clock::now();
75 }
76
77
85
86
96 bool CheckIfStuck(double dCurrentVelocity, double dCurrentAngularVelocity, double dVelocityThreshold = 0.1, double dAngularVelocityThreshold = 0.1)
97 {
98 // Create instance variables.
99 bool bStuck = false;
100
101 // Time since we last checked if the rover is stuck.
102 std::chrono::system_clock::time_point tmCurrentTime = std::chrono::system_clock::now();
103 double dTimeSinceLastCheck = std::chrono::duration_cast<std::chrono::milliseconds>(tmCurrentTime - m_tmTimeSinceLastStuckCheck).count() / 1000.0;
104 if (dTimeSinceLastCheck > m_dStuckCheckIntervalSeconds)
105 {
106 // Update time since last check to now.
107 m_tmTimeSinceLastStuckCheck = tmCurrentTime;
108
109 // Check if the rover is rotating or moving linearly.
110 if (std::abs(dCurrentVelocity) < dVelocityThreshold && std::abs(dCurrentAngularVelocity) < dAngularVelocityThreshold)
111 {
112 ++m_unStuckChecksSoFar;
113 }
114 else
115 {
116 m_unStuckChecksSoFar = 0;
117 }
118 }
119
120 // Check if we met stuck criteria.
121 if (m_unStuckChecksSoFar > m_dMaximumStuckCount)
122 {
123 // Reset stuck checks.
124 m_unStuckChecksSoFar = 0;
125 // Set stuck toggle.
126 bStuck = true;
127 }
128
129 // Return if stuck or not.
130 return bStuck;
131 }
132
133
140 void ResetStuckChecks() { m_unStuckChecksSoFar = 0; }
141 };
142} // namespace statemachine
143
144#endif
This class should be instantiated within another state to be used for detection of if the rover is st...
Definition StuckDetection.hpp:43
~TimeIntervalBasedStuckDetector()
Destroy the Stuck Detector object.
Definition StuckDetection.hpp:84
bool CheckIfStuck(double dCurrentVelocity, double dCurrentAngularVelocity, double dVelocityThreshold=0.1, double dAngularVelocityThreshold=0.1)
Checks if the rover meets stuck criteria based in the given parameters.
Definition StuckDetection.hpp:96
void ResetStuckChecks()
Reset stuck variables so rover does not go into stuck-state next check of CheckIfStuck.
Definition StuckDetection.hpp:140
TimeIntervalBasedStuckDetector(double dMaximumStuckCount=3, double dStuckCheckIntervalSeconds=3)
Construct a new Stuck Detector object.
Definition StuckDetection.hpp:68
Namespace containing all state machine related classes.
Definition State.hpp:23