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
NavigationBoard.h
Go to the documentation of this file.
1
11#ifndef NAVIGATIONBOARD_H
12#define NAVIGATIONBOARD_H
13
14#include "../util/GeospatialOperations.hpp"
15
17#include <RoveComm/RoveComm.h>
18#include <RoveComm/RoveCommManifest.h>
19#include <chrono>
20#include <shared_mutex>
21
23
24
33{
34 public:
36 // Declare public enums and structs that are specific to and used withing this class.
38
40 // Declare public methods and member variables.
42
45
47 // Setters
49
51 // Getters
53
56 double GetHeading();
57 double GetHeadingAccuracy();
58 double GetVelocity();
59 double GetAngularVelocity();
60 std::chrono::system_clock::duration GetGPSLastUpdateTime();
61 std::chrono::system_clock::duration GetCompassLastUpdateTime();
62 bool IsOutOfDate();
63
64 private:
66 // Declare private member variables.
68
69 geoops::GPSCoordinate m_stLocation; // Store current global position in UTM format.
70 double m_dHeading; // Store current GPS heading.
71 double m_dHeadingAccuracy; // Store current GPS heading accuracy in degrees.
72 double m_dVelocity; // Store current GPS-based velocity.
73 double m_dAngularVelocity; // Store current compass-based angular velocity.
74 std::shared_mutex m_muLocationMutex; // Mutex for acquiring read and write lock on location member variable.
75 std::shared_mutex m_muHeadingMutex; // Mutex for acquiring read and write lock on heading member variable.
76 std::shared_mutex m_muVelocityMutex; // Mutex for acquiring read and write lock on velocity member variable.
77 std::shared_mutex m_muAngularVelocityMutex; // Mutex for acquiring read and write lock on angular velocity member variable.
78 std::chrono::system_clock::time_point m_tmLastGPSUpdateTime; // A time point for storing the timestamp of the last GPS update. Also used for velocity.
79 std::chrono::system_clock::time_point m_tmLastCompassUpdateTime; // A time point for storing the time of the last compass update. Used for angular velocity.
80 bool m_bNavBoardOutOfDate; // A boolean to store whether the GPS is out of date.
81
83 // Declare private methods.
85
86
93 const std::function<void(const rovecomm::RoveCommPacket<double>&, const sockaddr_in&)> ProcessGPSData =
94 [this](const rovecomm::RoveCommPacket<double>& stPacket, const sockaddr_in& stdAddr)
95 {
96 // Not using this.
97 (void) stdAddr;
98
99 // Get current time.
100 std::chrono::system_clock::time_point tmCurrentTime = std::chrono::system_clock::now();
101 // Acquire read lock for getting GPS struct.
102 std::shared_lock<std::shared_mutex> lkGPSReadProcessLock(m_muLocationMutex);
103 // Calculate distance of new GPS coordinate to old GPS coordinate.
104 geoops::GeoMeasurement geMeasurement =
105 geoops::CalculateGeoMeasurement(m_stLocation, geoops::GPSCoordinate(stPacket.vData[0], stPacket.vData[1], stPacket.vData[2]));
106 // Unlock mutex.
107 lkGPSReadProcessLock.unlock();
108
109 // Acquire write lock for writing to velocity member variable.
110 std::unique_lock<std::shared_mutex> lkVelocityProcessLock(m_muVelocityMutex);
111 // Calculate rover velocity based on GPS distance traveled over time.
112 m_dVelocity = geMeasurement.dDistanceMeters /
113 static_cast<double>((std::chrono::duration_cast<std::chrono::microseconds>(tmCurrentTime - m_tmLastGPSUpdateTime).count() / 1e6));
114 // Unlock mutex.
115 lkVelocityProcessLock.unlock();
116
117 // Acquire write lock for writing to GPS struct.
118 std::unique_lock<std::shared_mutex> lkGPSWriteProcessLock(m_muLocationMutex);
119 // Repack data from RoveCommPacket into member variable.
120 m_stLocation.dLatitude = stPacket.vData[0];
121 m_stLocation.dLongitude = stPacket.vData[1];
122 m_stLocation.dAltitude = stPacket.vData[2];
123 m_stLocation.tmTimestamp = tmCurrentTime;
124 // Update GPS update time.
125 m_tmLastGPSUpdateTime = tmCurrentTime;
126 // Unlock mutex.
127 lkGPSWriteProcessLock.unlock();
128
129 // Submit logger message.
130 LOG_DEBUG(logging::g_qSharedLogger, "Incoming GPS Data: ({} lat, {} lon, {} alt)", m_stLocation.dLatitude, m_stLocation.dLongitude, m_stLocation.dAltitude);
131 };
132
133
140 const std::function<void(const rovecomm::RoveCommPacket<float>&, const sockaddr_in&)> ProcessAccuracyData =
141 [this](const rovecomm::RoveCommPacket<float>& stPacket, const sockaddr_in& stdAddr)
142 {
143 // Not using this.
144 (void) stdAddr;
145
146 // Acquire write lock for writing to GPS struct.
147 std::unique_lock<std::shared_mutex> lkGPSProcessLock(m_muLocationMutex);
148 std::unique_lock<std::shared_mutex> lkCompassProcessLock(m_muHeadingMutex);
149 // Repack data from RoveCommPacket into member variable.
150 m_stLocation.d2DAccuracy = std::fabs(stPacket.vData[0]);
151 m_stLocation.d3DAccuracy = std::fabs(stPacket.vData[1]);
152 m_dHeadingAccuracy = std::fabs(stPacket.vData[2]);
153 m_stLocation.eCoordinateAccuracyFixType = static_cast<geoops::PositionFixType>(stPacket.vData[3]);
154 m_stLocation.bIsDifferential = static_cast<bool>(stPacket.vData[4]);
155 // Unlock mutex.
156 lkCompassProcessLock.unlock();
157 lkGPSProcessLock.unlock();
158
159 // Submit logger message.
160 LOG_DEBUG(logging::g_qSharedLogger,
161 "Incoming Accuracy Data: (2D: {}, 3D: {}, Compass: {}, FIX_TYPE: {}, Differential?: {})",
162 stPacket.vData[0],
163 stPacket.vData[1],
164 stPacket.vData[2],
165 stPacket.vData[3],
166 stPacket.vData[4]);
167 };
168
169
176 const std::function<void(const rovecomm::RoveCommPacket<float>&, const sockaddr_in&)> ProcessCompassData =
177 [this](const rovecomm::RoveCommPacket<float>& stPacket, const sockaddr_in& stdAddr)
178 {
179 // Not using this.
180 (void) stdAddr;
181
182 // Get current time.
183 std::chrono::system_clock::time_point tmCurrentTime = std::chrono::system_clock::now();
184
185 // Acquire read lock for heading.
186 std::shared_lock<std::shared_mutex> lkCompassReadLock(m_muHeadingMutex);
187 // Calculate the total change in angle with respect to the last recorded heading.
188 double dNewHeading = stPacket.vData[0];
189 double dDeltaAngle = dNewHeading - m_dHeading;
190 // Assume that the change in angle can't be greater than 180 degrees in a single timestep.
191 // This accounts for changes in angle across the 0/360 degree line.
192 if (std::abs(dDeltaAngle) > 180)
193 {
194 dDeltaAngle = dNewHeading > m_dHeading ? -(360 - dDeltaAngle) : 360 + dDeltaAngle;
195 }
196 // Unlock mutex.
197 lkCompassReadLock.unlock();
198
199 // Acquire write lock for writing to angular velocity member variable.
200 std::unique_lock<std::shared_mutex> lkAngularVelocityProcessLock(m_muAngularVelocityMutex);
201 // Calculate rover angular velocity based on change in heading over time.
202 m_dAngularVelocity = dDeltaAngle / (std::chrono::duration_cast<std::chrono::microseconds>(tmCurrentTime - m_tmLastCompassUpdateTime).count() / 1e6);
203 // Unlock mutex.
204 lkAngularVelocityProcessLock.unlock();
205
206 // Acquire write lock for heading and compass timestamp.
207 std::unique_lock<std::shared_mutex> lkCompassProcessLock(m_muHeadingMutex);
208 // Repack data from RoveCommPacket into member variable.
209 m_dHeading = dNewHeading;
210 // Update compass time.
211 m_tmLastCompassUpdateTime = tmCurrentTime;
212 // Unlock mutex.
213 lkCompassProcessLock.unlock();
214
215 // Submit logger message.
216 LOG_DEBUG(logging::g_qSharedLogger, "Incoming Compass Data: {}", m_dHeading);
217 };
218};
219
220#endif // NAVIGATIONBOARD_H
This class handles communication with the navigation board on the rover by sending RoveComm packets o...
Definition NavigationBoard.h:33
~NavigationBoard()
Destroy the Navigation Board:: Navigation Board object.
Definition NavigationBoard.cpp:68
double GetHeading()
Accessor for the most recent compass heading received from the NavBoard.
Definition NavigationBoard.cpp:161
double GetHeadingAccuracy()
Accessor for the most recent compass heading accuracy received from NavBoard.
Definition NavigationBoard.cpp:202
geoops::GPSCoordinate GetGPSData()
Accessor for most recent GPS data received from NavBoard.
Definition NavigationBoard.cpp:78
const std::function< void(const rovecomm::RoveCommPacket< float > &, const sockaddr_in &)> ProcessCompassData
Callback function that is called whenever RoveComm receives new Compass data.
Definition NavigationBoard.h:176
std::chrono::system_clock::duration GetCompassLastUpdateTime()
A chrono timestamp storing the last time autonomy's compass location was updated over RoveComm via th...
Definition NavigationBoard.cpp:347
double GetAngularVelocity()
The rover's current angular velocity based off of the change in angle over the last two headings.
Definition NavigationBoard.cpp:286
NavigationBoard()
Construct a new Navigation Board:: Navigation Board object.
Definition NavigationBoard.cpp:28
bool IsOutOfDate()
Checks if any of the navboard data is out of date. Expired data depends on constants::NAVBOARD_MAX_CO...
Definition NavigationBoard.cpp:367
const std::function< void(const rovecomm::RoveCommPacket< float > &, const sockaddr_in &)> ProcessAccuracyData
Callback function that is called whenever RoveComm receives new Accuracy data.
Definition NavigationBoard.h:140
double GetVelocity()
The rover's current velocity based off of the distance covered over the last two GPSCoordinates.
Definition NavigationBoard.cpp:244
const std::function< void(const rovecomm::RoveCommPacket< double > &, const sockaddr_in &)> ProcessGPSData
Callback function that is called whenever RoveComm receives new GPS data.
Definition NavigationBoard.h:93
geoops::UTMCoordinate GetUTMData()
Accessor for most recent GPS data received from NavBoard converted to UTM coords.
Definition NavigationBoard.cpp:120
std::chrono::system_clock::duration GetGPSLastUpdateTime()
A chrono timestamp storing the last time autonomy's GPS location was updated over RoveComm via the Na...
Definition NavigationBoard.cpp:328
GeoMeasurement CalculateGeoMeasurement(const GPSCoordinate &stCoord1, const GPSCoordinate &stCoord2)
The shortest path between two points on an ellipsoid at (lat1, lon1) and (lat2, lon2) is called the g...
Definition GeospatialOperations.hpp:445
This struct stores/contains information about a GPS data.
Definition GeospatialOperations.hpp:148
This struct is used to store the distance, arc length, and relative bearing for a calculated geodesic...
Definition GeospatialOperations.hpp:82
This struct stores/contains information about a UTM coordinate.
Definition GeospatialOperations.hpp:244