11#ifndef NAVIGATIONBOARD_H
12#define NAVIGATIONBOARD_H
14#include "../util/GeospatialOperations.hpp"
17#include <RoveComm/RoveComm.h>
18#include <RoveComm/RoveCommManifest.h>
20#include <shared_mutex>
71 double m_dHeadingAccuracy;
73 double m_dAngularVelocity;
74 std::shared_mutex m_muLocationMutex;
75 std::shared_mutex m_muHeadingMutex;
76 std::shared_mutex m_muVelocityMutex;
77 std::shared_mutex m_muAngularVelocityMutex;
78 std::chrono::system_clock::time_point m_tmLastGPSUpdateTime;
79 std::chrono::system_clock::time_point m_tmLastCompassUpdateTime;
80 bool m_bNavBoardOutOfDate;
93 const std::function<void(
const rovecomm::RoveCommPacket<double>&,
const sockaddr_in&)>
ProcessGPSData =
94 [
this](
const rovecomm::RoveCommPacket<double>& stPacket,
const sockaddr_in& stdAddr)
100 std::chrono::system_clock::time_point tmCurrentTime = std::chrono::system_clock::now();
102 std::shared_lock<std::shared_mutex> lkGPSReadProcessLock(m_muLocationMutex);
107 lkGPSReadProcessLock.unlock();
110 std::unique_lock<std::shared_mutex> lkVelocityProcessLock(m_muVelocityMutex);
112 m_dVelocity = geMeasurement.dDistanceMeters /
113 static_cast<double>((std::chrono::duration_cast<std::chrono::microseconds>(tmCurrentTime - m_tmLastGPSUpdateTime).count() / 1e6));
115 lkVelocityProcessLock.unlock();
118 std::unique_lock<std::shared_mutex> lkGPSWriteProcessLock(m_muLocationMutex);
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;
125 m_tmLastGPSUpdateTime = tmCurrentTime;
127 lkGPSWriteProcessLock.unlock();
130 LOG_DEBUG(logging::g_qSharedLogger,
"Incoming GPS Data: ({} lat, {} lon, {} alt)", m_stLocation.dLatitude, m_stLocation.dLongitude, m_stLocation.dAltitude);
140 const std::function<void(
const rovecomm::RoveCommPacket<float>&,
const sockaddr_in&)>
ProcessAccuracyData =
141 [
this](
const rovecomm::RoveCommPacket<float>& stPacket,
const sockaddr_in& stdAddr)
147 std::unique_lock<std::shared_mutex> lkGPSProcessLock(m_muLocationMutex);
148 std::unique_lock<std::shared_mutex> lkCompassProcessLock(m_muHeadingMutex);
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]);
156 lkCompassProcessLock.unlock();
157 lkGPSProcessLock.unlock();
160 LOG_DEBUG(logging::g_qSharedLogger,
161 "Incoming Accuracy Data: (2D: {}, 3D: {}, Compass: {}, FIX_TYPE: {}, Differential?: {})",
176 const std::function<void(
const rovecomm::RoveCommPacket<float>&,
const sockaddr_in&)>
ProcessCompassData =
177 [
this](
const rovecomm::RoveCommPacket<float>& stPacket,
const sockaddr_in& stdAddr)
183 std::chrono::system_clock::time_point tmCurrentTime = std::chrono::system_clock::now();
186 std::shared_lock<std::shared_mutex> lkCompassReadLock(m_muHeadingMutex);
188 double dNewHeading = stPacket.vData[0];
189 double dDeltaAngle = dNewHeading - m_dHeading;
192 if (std::abs(dDeltaAngle) > 180)
194 dDeltaAngle = dNewHeading > m_dHeading ? -(360 - dDeltaAngle) : 360 + dDeltaAngle;
197 lkCompassReadLock.unlock();
200 std::unique_lock<std::shared_mutex> lkAngularVelocityProcessLock(m_muAngularVelocityMutex);
202 m_dAngularVelocity = dDeltaAngle / (std::chrono::duration_cast<std::chrono::microseconds>(tmCurrentTime - m_tmLastCompassUpdateTime).count() / 1e6);
204 lkAngularVelocityProcessLock.unlock();
207 std::unique_lock<std::shared_mutex> lkCompassProcessLock(m_muHeadingMutex);
209 m_dHeading = dNewHeading;
211 m_tmLastCompassUpdateTime = tmCurrentTime;
213 lkCompassProcessLock.unlock();
216 LOG_DEBUG(logging::g_qSharedLogger,
"Incoming Compass Data: {}", m_dHeading);
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