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
GeospatialOperations.hpp
Go to the documentation of this file.
1
12#ifndef GEOSPATIAL_OPERATIONS_HPP
13#define GEOSPATIAL_OPERATIONS_HPP
14
15#include "../AutonomyLogging.h"
16
18#include <GeographicLib/Geodesic.hpp>
19#include <GeographicLib/UTMUPS.hpp>
20#include <chrono>
21
23
24
32namespace geoops
33{
35 // Declare public enums.
37
38 // This enum is used to store values for the waypoint type.
39 enum class WaypointType
40 {
41 eNavigationWaypoint,
42 eTagWaypoint,
43 eMalletWaypoint,
44 eWaterBottleWaypoint,
45 eObjectWaypoint, // Used to represent either Mallet or WaterBottle waypoint.
46 eObstacleWaypoint,
47 eUNKNOWN
48 };
49
50 // This enum is used to store the location fix type for a UTM or GPS points, the enum indexes follow the UBLOX-F9P docs.
51 enum class PositionFixType
52 {
53 eNoFix,
54 eDeadReckoning,
55 eFix2D,
56 eFix3D,
57 eGNSSDeadReckoningCombined,
58 eTimeOnly,
59 eUNKNOWN
60 };
61
63 // Declare public variables.
65
67 // Declare public structs that are specific to and used within this class.
69
70
82 {
83 public:
84 // Define public struct attributes.
85 double dDistanceMeters; // The great circle distance between the two points.
86 double dArcLengthDegrees; // The degree measurement difference between the two points from the center of the sphere. (0, 180)
87 double dStartRelativeBearing; // The relative bearing in degrees from the first point to the second point for the shortest great circle path. (0, 360)
88 double dEndRelativeBearing; // The relative bearing in degrees from the second point to the first point for the shortest great circle path. (0, 360)
89 };
90
91
99 {
100 public:
101 // Declare struct public attributes
102 double dLatitude; // The geographic latitude in degrees, typically within the range [-90, 90].
103 double dLongitude; // The geographic longitude in degrees, typically within the range [-180, 180].
104 double dAltitude; // The elevation above sea level in meters.
105 double d2DAccuracy; // The horizontal accuracy of the GPS coordinates in meters.
106 double d3DAccuracy; // The three-dimensional accuracy, including altitude, in meters.
107 double dMeridianConvergence; // The angle between true north and grid north at the given location in degrees. Positive in eastern direction.
108 double dScale; // The scale factor applied to the UTM coordinates for map projection.
109 PositionFixType eCoordinateAccuracyFixType; // The type of satellite location lock the coordinate was taken under.
110 bool bIsDifferential; // Whether of not the coordinate was taken under a differential GPS lock.
111 std::chrono::system_clock::time_point tmTimestamp; // The chrono time point when the GPS coordinate was created/received.
112
114 // Declare public methods.
116
132 GPSCoordinate(double dLatitude = 0.0,
133 double dLongitude = 0.0,
134 double dAltitude = 0.0,
135 double d2DAccuracy = -1.0,
136 double d3DAccuracy = -1.0,
137 double dMeridianConvergence = -1.0,
138 double dScale = 0.0,
139 PositionFixType eCoordinateAccuracyFixType = PositionFixType::eUNKNOWN,
140 bool bIsDifferential = false,
141 std::chrono::system_clock::time_point tmTimestamp = std::chrono::system_clock::time_point().min())
142 {
143 // Initialize member variables with given values.
144 this->dLatitude = dLatitude;
145 this->dLongitude = dLongitude;
146 this->dAltitude = dAltitude;
147 this->d2DAccuracy = d2DAccuracy;
148 this->d3DAccuracy = d3DAccuracy;
149 this->dMeridianConvergence = dMeridianConvergence;
150 this->dScale = dScale;
151 this->eCoordinateAccuracyFixType = eCoordinateAccuracyFixType;
152 this->bIsDifferential = bIsDifferential;
153 this->tmTimestamp = tmTimestamp;
154 }
155
156
166 bool operator==(const GPSCoordinate& stOtherCoordinate) const
167 {
168 // Check if location, altitude, and accuracy are the same. Not going to worry about other values for now.
169 return (dLatitude == stOtherCoordinate.dLatitude && dLongitude == stOtherCoordinate.dLongitude && dAltitude == stOtherCoordinate.dAltitude &&
170 d2DAccuracy == stOtherCoordinate.d2DAccuracy && d3DAccuracy == stOtherCoordinate.d3DAccuracy &&
171 eCoordinateAccuracyFixType == stOtherCoordinate.eCoordinateAccuracyFixType && bIsDifferential == stOtherCoordinate.bIsDifferential);
172 }
173
174
184 bool operator!=(const GPSCoordinate& stOtherCoordinate) const { return !this->operator==(stOtherCoordinate); }
185
186
194 std::string ToString() const
195 {
196 std::ostringstream oss;
197 oss << "Latitude: " << dLatitude << ", Longitude: " << dLongitude << ", Altitude: " << dAltitude;
198 return oss.str();
199 }
200 };
201
202
210 {
211 public:
212 // Declare struct public attributes.
213 double dEasting; // The eastward displacement from the UTM zone's central meridian in meters.
214 double dNorthing; // The northward displacement from the equator in meters.
215 int nZone; // The UTM zone number identifying the region on the Earth's surface.
216 bool bWithinNorthernHemisphere; // Indicates whether the coordinate is located in the northern hemisphere.
217 double dAltitude; // The elevation above sea level in meters.
218 double d2DAccuracy; // The horizontal accuracy of the UTM coordinates in meters.
219 double d3DAccuracy; // The three-dimensional accuracy, including altitude, in meters.
220 double dMeridianConvergence; // The angle between true north and grid north at the given location in degrees. Positive in eastern direction.
221 double dScale; // The scale factor applied to the UTM coordinates for map projection.
222 PositionFixType eCoordinateAccuracyFixType; // The type of satellite location lock the coordinate was taken under.
223 bool bIsDifferential; // Whether of not the coordinate was taken under a differential GPS lock.
224 std::chrono::system_clock::time_point tmTimestamp; // The chrono time point when the GPS coordinate was created/received.
225
227 // Declare public methods.
229
230
248 UTMCoordinate(double dEasting = 0.0,
249 double dNorthing = 0.0,
250 int nZone = 0,
251 bool bWithinNorthernHemisphere = true,
252 double dAltitude = 0.0,
253 double d2DAccuracy = -1.0,
254 double d3DAccuracy = -1.0,
255 double dMeridianConvergence = -1.0,
256 double dScale = 0.0,
257 PositionFixType eCoordinateAccuracyFixType = PositionFixType::eUNKNOWN,
258 bool bIsDifferential = false,
259 std::chrono::system_clock::time_point tmTimestamp = std::chrono::system_clock::time_point().min())
260 {
261 // Initialize member variables with given values.
262 this->dEasting = dEasting;
263 this->dNorthing = dNorthing;
264 this->nZone = nZone;
265 this->bWithinNorthernHemisphere = bWithinNorthernHemisphere;
266 this->dAltitude = dAltitude;
267 this->d2DAccuracy = d2DAccuracy;
268 this->d3DAccuracy = d3DAccuracy;
269 this->dMeridianConvergence = dMeridianConvergence;
270 this->dScale = dScale;
271 this->eCoordinateAccuracyFixType = eCoordinateAccuracyFixType;
272 this->bIsDifferential = bIsDifferential;
273 this->tmTimestamp = tmTimestamp;
274 }
275
276
286 bool operator==(const UTMCoordinate& stOtherCoordinate) const
287 {
288 // Check if location, altitude, and accuracy are the same. Not going to worry about other values for now.
289 return (dEasting == stOtherCoordinate.dEasting && dNorthing == stOtherCoordinate.dNorthing && nZone == stOtherCoordinate.nZone &&
290 bWithinNorthernHemisphere == stOtherCoordinate.bWithinNorthernHemisphere && dAltitude == stOtherCoordinate.dAltitude &&
291 d2DAccuracy == stOtherCoordinate.d2DAccuracy && d3DAccuracy == stOtherCoordinate.d3DAccuracy &&
292 eCoordinateAccuracyFixType == stOtherCoordinate.eCoordinateAccuracyFixType && bIsDifferential == stOtherCoordinate.bIsDifferential);
293 }
294
295
305 bool operator!=(const UTMCoordinate& stOtherCoordinate) const { return !this->operator==(stOtherCoordinate); }
306
307
315 std::string ToString() const
316 {
317 std::ostringstream oss;
318 oss << "Easting: " << dEasting << ", Northing: " << dNorthing << ", Altitude: " << dAltitude;
319 return oss.str();
320 }
321 };
322
323
333 {
334 // Create instance variables.
335 UTMCoordinate stConvertCoord;
336
337 // Get data out of the GPS coord and repackage it into the UTM struct.
338 stConvertCoord.d2DAccuracy = stGPSCoord.d2DAccuracy;
339 stConvertCoord.d3DAccuracy = stGPSCoord.d3DAccuracy;
340 stConvertCoord.dAltitude = stGPSCoord.dAltitude;
341 stConvertCoord.eCoordinateAccuracyFixType = stGPSCoord.eCoordinateAccuracyFixType;
342 stConvertCoord.bIsDifferential = stGPSCoord.bIsDifferential;
343 stConvertCoord.tmTimestamp = stGPSCoord.tmTimestamp;
344
345 // Catch errors from GeographicLib.
346 try
347 {
348 // Forward solve for the UTM coord.
349 GeographicLib::UTMUPS::Forward(stGPSCoord.dLatitude,
350 stGPSCoord.dLongitude,
351 stConvertCoord.nZone,
352 stConvertCoord.bWithinNorthernHemisphere,
353 stConvertCoord.dEasting,
354 stConvertCoord.dNorthing,
355 stConvertCoord.dMeridianConvergence,
356 stConvertCoord.dScale);
357 }
358 catch (const GeographicLib::GeographicErr::exception& geError)
359 {
360 // Submit logger message.
361 LOG_ERROR(logging::g_qSharedLogger, "Unable to forward solve a GPSCoordinate to UTMCoordinate. GeographicLib error is: {}", geError.what());
362 }
363
364 // Return the converted UTM coordinate.
365 return stConvertCoord;
366 }
367
368
378 {
379 // Create instance variables.
380 GPSCoordinate stConvertCoord;
381
382 // Get data out of the UTM coord and repackage it into the GPS struct.
383 stConvertCoord.d2DAccuracy = stUTMCoord.d2DAccuracy;
384 stConvertCoord.d3DAccuracy = stUTMCoord.d3DAccuracy;
385 stConvertCoord.dAltitude = stUTMCoord.dAltitude;
386 stConvertCoord.eCoordinateAccuracyFixType = stUTMCoord.eCoordinateAccuracyFixType;
387 stConvertCoord.bIsDifferential = stUTMCoord.bIsDifferential;
388 stConvertCoord.tmTimestamp = stUTMCoord.tmTimestamp;
389
390 // Catch errors from GeographicLib.
391 try
392 {
393 // Reverse solve for the UTM coord.
394 GeographicLib::UTMUPS::Reverse(stUTMCoord.nZone,
395 stUTMCoord.bWithinNorthernHemisphere,
396 std::fabs(stUTMCoord.dEasting),
397 stUTMCoord.dNorthing,
398 stConvertCoord.dLatitude,
399 stConvertCoord.dLongitude,
400 stConvertCoord.dMeridianConvergence,
401 stConvertCoord.dScale);
402 }
403 catch (const GeographicLib::GeographicErr::exception& geError)
404 {
405 // Submit logger message.
406 LOG_ERROR(logging::g_qSharedLogger, "Unable to reverse solve a UTMCoordinate to GPSCoordinate. GeographicLib error is: {}", geError.what());
407 }
408
409 // Return the converted UTM coordinate.
410 return stConvertCoord;
411 }
412
413
421 struct Waypoint
422 {
423 private:
424 // Declare struct private member variables.
425 geoops::GPSCoordinate stGPSLocation; // This is not meant to be changed once this waypoint is created.
426 geoops::UTMCoordinate stUTMLocation; // This is not meant to be changed once this waypoint is created.
427
428 public:
429 // Declare struct public member variables.
430 WaypointType eType;
431 double dRadius;
432 int nID;
433
434
450 const WaypointType& eType = WaypointType::eUNKNOWN,
451 const double dRadius = 0.0,
452 const int nID = -1)
453 {
454 // Initialize member variables.
455 this->stGPSLocation = stGPSLocation;
456 this->stUTMLocation = geoops::ConvertGPSToUTM(stGPSLocation);
457 this->eType = eType;
458 this->dRadius = dRadius;
459 this->nID = nID;
460 }
461
462
477 Waypoint(const geoops::UTMCoordinate& stUTMLocation, const WaypointType& eType = WaypointType::eUNKNOWN, const double dRadius = 0.0, const int nID = -1)
478 {
479 // Initialize member variables.
480 this->stUTMLocation = stUTMLocation;
481 this->stGPSLocation = geoops::ConvertUTMToGPS(stUTMLocation);
482 this->eType = eType;
483 this->dRadius = dRadius;
484 this->nID = nID;
485 }
486
487
496 const geoops::GPSCoordinate& GetGPSCoordinate() const { return stGPSLocation; }
497
498
507 const geoops::UTMCoordinate& GetUTMCoordinate() const { return stUTMLocation; }
508
509
519 bool operator==(const Waypoint& stOtherWaypoint) const
520 {
521 // Check if location, altitude, and accuracy are the same. Not going to worry about other values for now.
522 return (stGPSLocation == stOtherWaypoint.stGPSLocation && stUTMLocation == stOtherWaypoint.stUTMLocation && eType == stOtherWaypoint.eType &&
523 dRadius == stOtherWaypoint.dRadius && nID == stOtherWaypoint.nID);
524 }
525
526
536 bool operator!=(const Waypoint& stOtherWaypoint) const { return !this->operator==(stOtherWaypoint); }
537 };
538
539
552 inline GeoMeasurement CalculateGeoMeasurement(const GPSCoordinate& stCoord1, const GPSCoordinate& stCoord2)
553 {
554 // Create instance variables.
555 GeoMeasurement stMeasurements;
556
557 // Construct a geodesic with earth characteristics. (Radius and flattening)
558 // The WGS84 standard is widely used and aligns with Google Maps.
559 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
560
561 // Solve the inverse geodesic for distance and arc length degrees at the center of the globe, and relative bearings.
562 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stCoord1.dLatitude,
563 stCoord1.dLongitude,
564 stCoord2.dLatitude,
565 stCoord2.dLongitude,
566 stMeasurements.dDistanceMeters,
567 stMeasurements.dStartRelativeBearing,
568 stMeasurements.dEndRelativeBearing);
569
570 // NOTE: Regarding azi1 vs azi2, azi1 is the direction measured at point 1 (your navigation aid) to point 2. azi2 is the direction measured at point 2 (your
571 // location) away from point 1. (If you want the direction to point 1, add ±180° to azi2.)
572 // Map the -180, 180 range of the azimuths to 0, 360, with both points zeroed at North.
573 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
574 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
575 // Ensure the result angle is positive.
576 if (stMeasurements.dStartRelativeBearing < 0)
577 {
578 // Add 360 degrees.
579 stMeasurements.dStartRelativeBearing += 360;
580 }
581 // Ensure the result angle is positive.
582 if (stMeasurements.dEndRelativeBearing < 0)
583 {
584 // Add 360 degrees.
585 stMeasurements.dEndRelativeBearing += 360;
586 }
587
588 // Return result distance.
589 return stMeasurements;
590 }
591
592
605 inline GeoMeasurement CalculateGeoMeasurement(const UTMCoordinate& stCoord1, const UTMCoordinate& stCoord2)
606 {
607 // Create instance variables.
608 GeoMeasurement stMeasurements;
609
610 // Construct a geodesic with earth characteristics. (Radius and flattening)
611 // The WGS84 standard is widely used and aligns with Google Maps.
612 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
613
614 // Convert the given UTM coords into GPS coords for temporary use.
615 GPSCoordinate stGPSCoord1 = ConvertUTMToGPS(stCoord1);
616 GPSCoordinate stGPSCoord2 = ConvertUTMToGPS(stCoord2);
617
618 // Solve the inverse geodesic.
619 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stGPSCoord1.dLatitude,
620 stGPSCoord1.dLongitude,
621 stGPSCoord2.dLatitude,
622 stGPSCoord2.dLongitude,
623 stMeasurements.dDistanceMeters,
624 stMeasurements.dStartRelativeBearing,
625 stMeasurements.dEndRelativeBearing);
626
627 // NOTE: Regarding azi1 vs azi2, azi1 is the direction measured at point 1 (your navigation aid) to point 2. azi2 is the direction measured at point 2 (your
628 // location) away from point 1. (If you want the direction to point 1, add ±180° to azi2.)
629 // Map the -180, 180 range of the azimuths to 0, 360, with both points zeroed at North.
630 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
631 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
632 // Ensure the result angle is positive.
633 if (stMeasurements.dStartRelativeBearing < 0)
634 {
635 // Add 360 degrees.
636 stMeasurements.dStartRelativeBearing += 360;
637 }
638 // Ensure the result angle is positive.
639 if (stMeasurements.dEndRelativeBearing < 0)
640 {
641 // Add 360 degrees.
642 stMeasurements.dEndRelativeBearing += 360;
643 }
644
645 // Return result distance.
646 return stMeasurements;
647 }
648
649
659 inline GeoMeasurement CalculateGeoMeasurement(const geoops::Waypoint& stWaypoint1, const geoops::Waypoint& stWaypoint2)
660 {
661 // Create instance variables.
662 GeoMeasurement stMeasurements;
663
664 // Construct a geodesic with earth characteristics. (Radius and flattening)
665 // The WGS84 standard is widely used and aligns with Google Maps.
666 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
667
668 // Solve the inverse geodesic.
669 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stWaypoint1.GetGPSCoordinate().dLatitude,
670 stWaypoint1.GetGPSCoordinate().dLongitude,
671 stWaypoint2.GetGPSCoordinate().dLatitude,
672 stWaypoint2.GetGPSCoordinate().dLongitude,
673 stMeasurements.dDistanceMeters,
674 stMeasurements.dStartRelativeBearing,
675 stMeasurements.dEndRelativeBearing);
676
677 // NOTE: Regarding azi1 vs azi2, azi1 is the direction measured at point 1 (your navigation aid) to point 2. azi2 is the direction measured at point 2 (your
678 // location) away from point 1. (If you want the direction to point 1, add ±180° to azi2.)
679 // Map the -180, 180 range of the azimuths to 0, 360, with both points zeroed at North.
680 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
681 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
682 // Ensure the result angle is positive.
683 if (stMeasurements.dStartRelativeBearing < 0)
684 {
685 // Add 360 degrees.
686 stMeasurements.dStartRelativeBearing += 360;
687 }
688 // Ensure the result angle is positive.
689 if (stMeasurements.dEndRelativeBearing < 0)
690 {
691 // Add 360 degrees.
692 stMeasurements.dEndRelativeBearing += 360;
693 }
694
695 // Return result distance.
696 return stMeasurements;
697 }
698
699
707 {
708 private:
709 // Declare struct private member variables.
710 Waypoint stRoverPosition; // Stores the rover's 3D location in UTM and GPS form.
711 double dRoverHeading; // Stores the rover's compass heading. North = 0, CW=pos
712
713 public:
714
723 RoverPose(const geoops::GPSCoordinate& stRoverPosition = geoops::GPSCoordinate(), const double dRoverHeading = 0.0)
724 {
725 // Update member variables.
726 this->stRoverPosition = Waypoint(stRoverPosition);
727 this->dRoverHeading = dRoverHeading;
728 }
729
730
739 RoverPose(const geoops::UTMCoordinate& stRoverPosition, const double dRoverHeading = 0.0)
740 {
741 // Update member variables.
742 this->stRoverPosition = Waypoint(stRoverPosition);
743 this->dRoverHeading = dRoverHeading;
744 }
745
746
755 const geoops::GPSCoordinate& GetGPSCoordinate() const { return stRoverPosition.GetGPSCoordinate(); }
756
757
766 const geoops::UTMCoordinate& GetUTMCoordinate() const { return stRoverPosition.GetUTMCoordinate(); }
767
768
776 const geoops::Waypoint& GetWaypoint() const { return stRoverPosition; }
777
778
786 double GetCompassHeading() const { return dRoverHeading; }
787
788
798 bool operator==(const RoverPose& stOtherRoverPose) const
799 {
800 // Check if location, altitude, and accuracy are the same. Not going to worry about other values for now.
801 return (stRoverPosition == stOtherRoverPose.GetGPSCoordinate() && stRoverPosition == stOtherRoverPose.GetUTMCoordinate() &&
802 dRoverHeading == stOtherRoverPose.dRoverHeading);
803 }
804
805
815 bool operator!=(const RoverPose& stOtherRoverPose) const { return !this->operator==(stOtherRoverPose); }
816 };
817} // namespace geoops
818#endif
static softfloat min()
Namespace containing functions related to operations on global position number systems and other data...
Definition GeospatialOperations.hpp:33
GPSCoordinate ConvertUTMToGPS(const UTMCoordinate &stUTMCoord)
Given a UTM coordinate, convert to GPS and create a new GPSCoordinate object.
Definition GeospatialOperations.hpp:377
UTMCoordinate ConvertGPSToUTM(const GPSCoordinate &stGPSCoord)
Given a GPS coordinate, convert to UTM and create a new UTMCoordinate object.
Definition GeospatialOperations.hpp:332
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:552
This struct stores/contains information about a GPS data.
Definition GeospatialOperations.hpp:99
GPSCoordinate(double dLatitude=0.0, double dLongitude=0.0, double dAltitude=0.0, double d2DAccuracy=-1.0, double d3DAccuracy=-1.0, double dMeridianConvergence=-1.0, double dScale=0.0, PositionFixType eCoordinateAccuracyFixType=PositionFixType::eUNKNOWN, bool bIsDifferential=false, std::chrono::system_clock::time_point tmTimestamp=std::chrono::system_clock::time_point().min())
Construct a new GPSCoordinate object.
Definition GeospatialOperations.hpp:132
bool operator!=(const GPSCoordinate &stOtherCoordinate) const
Overridden operator not equals for GPSCoordinate struct.
Definition GeospatialOperations.hpp:184
bool operator==(const GPSCoordinate &stOtherCoordinate) const
Overridden operator equals for GPSCoordinate struct.
Definition GeospatialOperations.hpp:166
std::string ToString() const
Converts the GPSCoordinate to a string representation.
Definition GeospatialOperations.hpp:194
This struct is used to store the distance, arc length, and relative bearing for a calculated geodesic...
Definition GeospatialOperations.hpp:82
This struct is used by the WaypointHandler to provide an easy way to store all pose data about the ro...
Definition GeospatialOperations.hpp:707
RoverPose(const geoops::GPSCoordinate &stRoverPosition=geoops::GPSCoordinate(), const double dRoverHeading=0.0)
Construct a new Rover Pose object.
Definition GeospatialOperations.hpp:723
bool operator==(const RoverPose &stOtherRoverPose) const
Overridden operator equals for RoverPose struct.
Definition GeospatialOperations.hpp:798
const geoops::GPSCoordinate & GetGPSCoordinate() const
Accessor for the geoops::GPSCoordinate member variable.
Definition GeospatialOperations.hpp:755
bool operator!=(const RoverPose &stOtherRoverPose) const
Overridden operator equals for RoverPose struct.
Definition GeospatialOperations.hpp:815
double GetCompassHeading() const
Accessor for the Compass Heading private member.
Definition GeospatialOperations.hpp:786
const geoops::UTMCoordinate & GetUTMCoordinate() const
Accessor for the geoops::UTMCoordinate member variable.
Definition GeospatialOperations.hpp:766
RoverPose(const geoops::UTMCoordinate &stRoverPosition, const double dRoverHeading=0.0)
Construct a new Rover Pose object.
Definition GeospatialOperations.hpp:739
const geoops::Waypoint & GetWaypoint() const
Accessor for the Waypoint private member.
Definition GeospatialOperations.hpp:776
This struct stores/contains information about a UTM coordinate.
Definition GeospatialOperations.hpp:210
UTMCoordinate(double dEasting=0.0, double dNorthing=0.0, int nZone=0, bool bWithinNorthernHemisphere=true, double dAltitude=0.0, double d2DAccuracy=-1.0, double d3DAccuracy=-1.0, double dMeridianConvergence=-1.0, double dScale=0.0, PositionFixType eCoordinateAccuracyFixType=PositionFixType::eUNKNOWN, bool bIsDifferential=false, std::chrono::system_clock::time_point tmTimestamp=std::chrono::system_clock::time_point().min())
Construct a new UTMCoordinate object.
Definition GeospatialOperations.hpp:248
bool operator==(const UTMCoordinate &stOtherCoordinate) const
Overridden operator equals for UTMCoordinate struct.
Definition GeospatialOperations.hpp:286
bool operator!=(const UTMCoordinate &stOtherCoordinate) const
Overridden operator not equals for UTMCoordinate struct.
Definition GeospatialOperations.hpp:305
std::string ToString() const
Converts the UTMCoordinate to a string representation.
Definition GeospatialOperations.hpp:315
This struct is used by the WaypointHandler class to store location, size, and type information about ...
Definition GeospatialOperations.hpp:422
const geoops::GPSCoordinate & GetGPSCoordinate() const
Accessor for the geoops::GPSCoordinate member variable.
Definition GeospatialOperations.hpp:496
bool operator==(const Waypoint &stOtherWaypoint) const
Overridden operator equals for Waypoint struct.
Definition GeospatialOperations.hpp:519
Waypoint(const geoops::GPSCoordinate &stGPSLocation=geoops::GPSCoordinate(), const WaypointType &eType=WaypointType::eUNKNOWN, const double dRadius=0.0, const int nID=-1)
Construct a new Waypoint object.
Definition GeospatialOperations.hpp:449
bool operator!=(const Waypoint &stOtherWaypoint) const
Overridden operator equals for Waypoint struct.
Definition GeospatialOperations.hpp:536
Waypoint(const geoops::UTMCoordinate &stUTMLocation, const WaypointType &eType=WaypointType::eUNKNOWN, const double dRadius=0.0, const int nID=-1)
Construct a new Waypoint object.
Definition GeospatialOperations.hpp:477
const geoops::UTMCoordinate & GetUTMCoordinate() const
Accessor for the geoops::UTMCoordinate member variable.
Definition GeospatialOperations.hpp:507