12#ifndef GEOSPATIAL_OPERATIONS_HPP
13#define GEOSPATIAL_OPERATIONS_HPP
15#include "../AutonomyLogging.h"
18#include <GeographicLib/Geodesic.hpp>
19#include <GeographicLib/UTMUPS.hpp>
39 enum class WaypointType
51 enum class PositionFixType
57 eGNSSDeadReckoningCombined,
85 double dDistanceMeters;
86 double dArcLengthDegrees;
87 double dStartRelativeBearing;
88 double dEndRelativeBearing;
107 double dMeridianConvergence;
109 PositionFixType eCoordinateAccuracyFixType;
110 bool bIsDifferential;
111 std::chrono::system_clock::time_point tmTimestamp;
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,
139 PositionFixType eCoordinateAccuracyFixType = PositionFixType::eUNKNOWN,
140 bool bIsDifferential =
false,
141 std::chrono::system_clock::time_point tmTimestamp = std::chrono::system_clock::time_point().
min())
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;
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);
201 bool bWithinNorthernHemisphere;
205 double dMeridianConvergence;
207 PositionFixType eCoordinateAccuracyFixType;
208 bool bIsDifferential;
209 std::chrono::system_clock::time_point tmTimestamp;
234 double dNorthing = 0.0,
236 bool bWithinNorthernHemisphere =
true,
237 double dAltitude = 0.0,
238 double d2DAccuracy = -1.0,
239 double d3DAccuracy = -1.0,
240 double dMeridianConvergence = -1.0,
242 PositionFixType eCoordinateAccuracyFixType = PositionFixType::eUNKNOWN,
243 bool bIsDifferential =
false,
244 std::chrono::system_clock::time_point tmTimestamp = std::chrono::system_clock::time_point().
min())
247 this->dEasting = dEasting;
248 this->dNorthing = dNorthing;
250 this->bWithinNorthernHemisphere = bWithinNorthernHemisphere;
251 this->dAltitude = dAltitude;
252 this->d2DAccuracy = d2DAccuracy;
253 this->d3DAccuracy = d3DAccuracy;
254 this->dMeridianConvergence = dMeridianConvergence;
255 this->dScale = dScale;
256 this->eCoordinateAccuracyFixType = eCoordinateAccuracyFixType;
257 this->bIsDifferential = bIsDifferential;
258 this->tmTimestamp = tmTimestamp;
274 return (dEasting == stOtherCoordinate.dEasting && dNorthing == stOtherCoordinate.dNorthing && nZone == stOtherCoordinate.nZone &&
275 bWithinNorthernHemisphere == stOtherCoordinate.bWithinNorthernHemisphere && dAltitude == stOtherCoordinate.dAltitude &&
276 d2DAccuracy == stOtherCoordinate.d2DAccuracy && d3DAccuracy == stOtherCoordinate.d3DAccuracy &&
277 eCoordinateAccuracyFixType == stOtherCoordinate.eCoordinateAccuracyFixType && bIsDifferential == stOtherCoordinate.bIsDifferential);
308 stConvertCoord.d2DAccuracy = stGPSCoord.d2DAccuracy;
309 stConvertCoord.d3DAccuracy = stGPSCoord.d3DAccuracy;
310 stConvertCoord.dAltitude = stGPSCoord.dAltitude;
311 stConvertCoord.eCoordinateAccuracyFixType = stGPSCoord.eCoordinateAccuracyFixType;
312 stConvertCoord.bIsDifferential = stGPSCoord.bIsDifferential;
313 stConvertCoord.tmTimestamp = stGPSCoord.tmTimestamp;
319 GeographicLib::UTMUPS::Forward(stGPSCoord.dLatitude,
320 stGPSCoord.dLongitude,
321 stConvertCoord.nZone,
322 stConvertCoord.bWithinNorthernHemisphere,
323 stConvertCoord.dEasting,
324 stConvertCoord.dNorthing,
325 stConvertCoord.dMeridianConvergence,
326 stConvertCoord.dScale);
328 catch (
const GeographicLib::GeographicErr::exception& geError)
331 LOG_ERROR(logging::g_qSharedLogger,
"Unable to forward solve a GPSCoordinate to UTMCoordinate. GeographicLib error is: {}", geError.what());
335 return stConvertCoord;
353 stConvertCoord.d2DAccuracy = stUTMCoord.d2DAccuracy;
354 stConvertCoord.d3DAccuracy = stUTMCoord.d3DAccuracy;
355 stConvertCoord.dAltitude = stUTMCoord.dAltitude;
356 stConvertCoord.eCoordinateAccuracyFixType = stUTMCoord.eCoordinateAccuracyFixType;
357 stConvertCoord.bIsDifferential = stUTMCoord.bIsDifferential;
358 stConvertCoord.tmTimestamp = stUTMCoord.tmTimestamp;
364 GeographicLib::UTMUPS::Reverse(stUTMCoord.nZone,
365 stUTMCoord.bWithinNorthernHemisphere,
366 std::fabs(stUTMCoord.dEasting),
367 stUTMCoord.dNorthing,
368 stConvertCoord.dLatitude,
369 stConvertCoord.dLongitude,
370 stConvertCoord.dMeridianConvergence,
371 stConvertCoord.dScale);
373 catch (
const GeographicLib::GeographicErr::exception& geError)
376 LOG_ERROR(logging::g_qSharedLogger,
"Unable to reverse solve a UTMCoordinate to GPSCoordinate. GeographicLib error is: {}", geError.what());
380 return stConvertCoord;
420 const WaypointType& eType = WaypointType::eUNKNOWN,
421 const double dRadius = 0.0,
425 this->stGPSLocation = stGPSLocation;
428 this->dRadius = dRadius;
450 this->stUTMLocation = stUTMLocation;
453 this->dRadius = dRadius;
492 return (stGPSLocation == stOtherWaypoint.stGPSLocation && stUTMLocation == stOtherWaypoint.stUTMLocation && eType == stOtherWaypoint.eType &&
493 dRadius == stOtherWaypoint.dRadius && nID == stOtherWaypoint.nID);
529 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
532 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stCoord1.dLatitude,
536 stMeasurements.dDistanceMeters,
537 stMeasurements.dStartRelativeBearing,
538 stMeasurements.dEndRelativeBearing);
543 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
544 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
546 if (stMeasurements.dStartRelativeBearing < 0)
549 stMeasurements.dStartRelativeBearing += 360;
552 if (stMeasurements.dEndRelativeBearing < 0)
555 stMeasurements.dEndRelativeBearing += 360;
559 return stMeasurements;
582 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
589 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stGPSCoord1.dLatitude,
590 stGPSCoord1.dLongitude,
591 stGPSCoord2.dLatitude,
592 stGPSCoord2.dLongitude,
593 stMeasurements.dDistanceMeters,
594 stMeasurements.dStartRelativeBearing,
595 stMeasurements.dEndRelativeBearing);
600 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
601 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
603 if (stMeasurements.dStartRelativeBearing < 0)
606 stMeasurements.dStartRelativeBearing += 360;
609 if (stMeasurements.dEndRelativeBearing < 0)
612 stMeasurements.dEndRelativeBearing += 360;
616 return stMeasurements;
636 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
639 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stWaypoint1.
GetGPSCoordinate().dLatitude,
643 stMeasurements.dDistanceMeters,
644 stMeasurements.dStartRelativeBearing,
645 stMeasurements.dEndRelativeBearing);
650 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
651 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
653 if (stMeasurements.dStartRelativeBearing < 0)
656 stMeasurements.dStartRelativeBearing += 360;
659 if (stMeasurements.dEndRelativeBearing < 0)
662 stMeasurements.dEndRelativeBearing += 360;
666 return stMeasurements;
681 double dRoverHeading;
696 this->stRoverPosition =
Waypoint(stRoverPosition);
697 this->dRoverHeading = dRoverHeading;
712 this->stRoverPosition =
Waypoint(stRoverPosition);
713 this->dRoverHeading = dRoverHeading;
772 dRoverHeading == stOtherRoverPose.dRoverHeading);
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:347
UTMCoordinate ConvertGPSToUTM(const GPSCoordinate &stGPSCoord)
Given a GPS coordinate, convert to UTM and create a new UTMCoordinate object.
Definition GeospatialOperations.hpp:302
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:522
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
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:677
RoverPose(const geoops::GPSCoordinate &stRoverPosition=geoops::GPSCoordinate(), const double dRoverHeading=0.0)
Construct a new Rover Pose object.
Definition GeospatialOperations.hpp:693
bool operator==(const RoverPose &stOtherRoverPose) const
Overridden operator equals for RoverPose struct.
Definition GeospatialOperations.hpp:768
const geoops::GPSCoordinate & GetGPSCoordinate() const
Accessor for the geoops::GPSCoordinate member variable.
Definition GeospatialOperations.hpp:725
bool operator!=(const RoverPose &stOtherRoverPose) const
Overridden operator equals for RoverPose struct.
Definition GeospatialOperations.hpp:785
double GetCompassHeading() const
Accessor for the Compass Heading private member.
Definition GeospatialOperations.hpp:756
const geoops::UTMCoordinate & GetUTMCoordinate() const
Accessor for the geoops::UTMCoordinate member variable.
Definition GeospatialOperations.hpp:736
RoverPose(const geoops::UTMCoordinate &stRoverPosition, const double dRoverHeading=0.0)
Construct a new Rover Pose object.
Definition GeospatialOperations.hpp:709
const geoops::Waypoint & GetWaypoint() const
Accessor for the Waypoint private member.
Definition GeospatialOperations.hpp:746
This struct stores/contains information about a UTM coordinate.
Definition GeospatialOperations.hpp:195
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:233
bool operator==(const UTMCoordinate &stOtherCoordinate) const
Overridden operator equals for UTMCoordinate struct.
Definition GeospatialOperations.hpp:271
bool operator!=(const UTMCoordinate &stOtherCoordinate) const
Overridden operator not equals for UTMCoordinate struct.
Definition GeospatialOperations.hpp:290
This struct is used by the WaypointHandler class to store location, size, and type information about ...
Definition GeospatialOperations.hpp:392
const geoops::GPSCoordinate & GetGPSCoordinate() const
Accessor for the geoops::GPSCoordinate member variable.
Definition GeospatialOperations.hpp:466
bool operator==(const Waypoint &stOtherWaypoint) const
Overridden operator equals for Waypoint struct.
Definition GeospatialOperations.hpp:489
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:419
bool operator!=(const Waypoint &stOtherWaypoint) const
Overridden operator equals for Waypoint struct.
Definition GeospatialOperations.hpp:506
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:447
const geoops::UTMCoordinate & GetUTMCoordinate() const
Accessor for the geoops::UTMCoordinate member variable.
Definition GeospatialOperations.hpp:477