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;
131 IMUData(
double dPitch,
double dRoll,
double dHeading)
134 this->dPitch = dPitch;
136 this->dHeading = dHeading;
156 double dMeridianConvergence;
158 PositionFixType eCoordinateAccuracyFixType;
159 bool bIsDifferential;
160 std::chrono::system_clock::time_point tmTimestamp;
182 double dLongitude = 0.0,
183 double dAltitude = 0.0,
184 double d2DAccuracy = -1.0,
185 double d3DAccuracy = -1.0,
186 double dMeridianConvergence = -1.0,
188 PositionFixType eCoordinateAccuracyFixType = PositionFixType::eUNKNOWN,
189 bool bIsDifferential =
false,
190 std::chrono::system_clock::time_point tmTimestamp = std::chrono::system_clock::time_point().
min())
193 this->dLatitude = dLatitude;
194 this->dLongitude = dLongitude;
195 this->dAltitude = dAltitude;
196 this->d2DAccuracy = d2DAccuracy;
197 this->d3DAccuracy = d3DAccuracy;
198 this->dMeridianConvergence = dMeridianConvergence;
199 this->dScale = dScale;
200 this->eCoordinateAccuracyFixType = eCoordinateAccuracyFixType;
201 this->bIsDifferential = bIsDifferential;
202 this->tmTimestamp = tmTimestamp;
218 return (dLatitude == stOtherCoordinate.dLatitude && dLongitude == stOtherCoordinate.dLongitude && dAltitude == stOtherCoordinate.dAltitude &&
219 d2DAccuracy == stOtherCoordinate.d2DAccuracy && d3DAccuracy == stOtherCoordinate.d3DAccuracy &&
220 eCoordinateAccuracyFixType == stOtherCoordinate.eCoordinateAccuracyFixType && bIsDifferential == stOtherCoordinate.bIsDifferential);
250 bool bWithinNorthernHemisphere;
254 double dMeridianConvergence;
256 PositionFixType eCoordinateAccuracyFixType;
257 bool bIsDifferential;
258 std::chrono::system_clock::time_point tmTimestamp;
283 double dNorthing = 0.0,
285 bool bWithinNorthernHemisphere =
true,
286 double dAltitude = 0.0,
287 double d2DAccuracy = -1.0,
288 double d3DAccuracy = -1.0,
289 double dMeridianConvergence = -1.0,
291 PositionFixType eCoordinateAccuracyFixType = PositionFixType::eUNKNOWN,
292 bool bIsDifferential =
false,
293 std::chrono::system_clock::time_point tmTimestamp = std::chrono::system_clock::time_point().
min())
296 this->dEasting = dEasting;
297 this->dNorthing = dNorthing;
299 this->bWithinNorthernHemisphere = bWithinNorthernHemisphere;
300 this->dAltitude = dAltitude;
301 this->d2DAccuracy = d2DAccuracy;
302 this->d3DAccuracy = d3DAccuracy;
303 this->dMeridianConvergence = dMeridianConvergence;
304 this->dScale = dScale;
305 this->eCoordinateAccuracyFixType = eCoordinateAccuracyFixType;
306 this->bIsDifferential = bIsDifferential;
307 this->tmTimestamp = tmTimestamp;
323 return (dEasting == stOtherCoordinate.dEasting && dNorthing == stOtherCoordinate.dNorthing && nZone == stOtherCoordinate.nZone &&
324 bWithinNorthernHemisphere == stOtherCoordinate.bWithinNorthernHemisphere && dAltitude == stOtherCoordinate.dAltitude &&
325 d2DAccuracy == stOtherCoordinate.d2DAccuracy && d3DAccuracy == stOtherCoordinate.d3DAccuracy &&
326 eCoordinateAccuracyFixType == stOtherCoordinate.eCoordinateAccuracyFixType && bIsDifferential == stOtherCoordinate.bIsDifferential);
357 stConvertCoord.d2DAccuracy = stGPSCoord.d2DAccuracy;
358 stConvertCoord.d3DAccuracy = stGPSCoord.d3DAccuracy;
359 stConvertCoord.dAltitude = stGPSCoord.dAltitude;
360 stConvertCoord.eCoordinateAccuracyFixType = stGPSCoord.eCoordinateAccuracyFixType;
361 stConvertCoord.bIsDifferential = stGPSCoord.bIsDifferential;
362 stConvertCoord.tmTimestamp = stGPSCoord.tmTimestamp;
368 GeographicLib::UTMUPS::Forward(stGPSCoord.dLatitude,
369 stGPSCoord.dLongitude,
370 stConvertCoord.nZone,
371 stConvertCoord.bWithinNorthernHemisphere,
372 stConvertCoord.dEasting,
373 stConvertCoord.dNorthing,
374 stConvertCoord.dMeridianConvergence,
375 stConvertCoord.dScale);
377 catch (
const GeographicLib::GeographicErr::exception& geError)
380 LOG_ERROR(logging::g_qSharedLogger,
"Unable to forward solve a GPSCoordinate to UTMCoordinate. GeographicLib error is: {}", geError.what());
384 return stConvertCoord;
402 stConvertCoord.d2DAccuracy = stUTMCoord.d2DAccuracy;
403 stConvertCoord.d3DAccuracy = stUTMCoord.d3DAccuracy;
404 stConvertCoord.dAltitude = stUTMCoord.dAltitude;
405 stConvertCoord.eCoordinateAccuracyFixType = stUTMCoord.eCoordinateAccuracyFixType;
406 stConvertCoord.bIsDifferential = stUTMCoord.bIsDifferential;
407 stConvertCoord.tmTimestamp = stUTMCoord.tmTimestamp;
413 GeographicLib::UTMUPS::Reverse(stUTMCoord.nZone,
414 stUTMCoord.bWithinNorthernHemisphere,
415 std::fabs(stUTMCoord.dEasting),
416 stUTMCoord.dNorthing,
417 stConvertCoord.dLatitude,
418 stConvertCoord.dLongitude,
419 stConvertCoord.dMeridianConvergence,
420 stConvertCoord.dScale);
422 catch (
const GeographicLib::GeographicErr::exception& geError)
425 LOG_ERROR(logging::g_qSharedLogger,
"Unable to reverse solve a UTMCoordinate to GPSCoordinate. GeographicLib error is: {}", geError.what());
429 return stConvertCoord;
452 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
455 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stCoord1.dLatitude,
459 stMeasurements.dDistanceMeters,
460 stMeasurements.dStartRelativeBearing,
461 stMeasurements.dEndRelativeBearing);
466 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
467 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
469 if (stMeasurements.dStartRelativeBearing < 0)
472 stMeasurements.dStartRelativeBearing += 360;
475 if (stMeasurements.dEndRelativeBearing < 0)
478 stMeasurements.dEndRelativeBearing += 360;
482 return stMeasurements;
505 GeographicLib::Geodesic geGeodesic = GeographicLib::Geodesic::WGS84();
512 stMeasurements.dArcLengthDegrees = geGeodesic.Inverse(stGPSCoord1.dLatitude,
513 stGPSCoord1.dLongitude,
514 stGPSCoord2.dLatitude,
515 stGPSCoord2.dLongitude,
516 stMeasurements.dDistanceMeters,
517 stMeasurements.dStartRelativeBearing,
518 stMeasurements.dEndRelativeBearing);
523 stMeasurements.dStartRelativeBearing = std::fmod((stMeasurements.dStartRelativeBearing + 360), 360);
524 stMeasurements.dEndRelativeBearing = std::fmod((stMeasurements.dEndRelativeBearing + 180), 360);
526 if (stMeasurements.dStartRelativeBearing < 0)
529 stMeasurements.dStartRelativeBearing += 360;
532 if (stMeasurements.dEndRelativeBearing < 0)
535 stMeasurements.dEndRelativeBearing += 360;
539 return stMeasurements;
578 const WaypointType& eType = WaypointType::eUNKNOWN,
579 const double dRadius = 0.0,
583 this->stGPSLocation = stGPSLocation;
586 this->dRadius = dRadius;
607 this->stUTMLocation = stUTMLocation;
610 this->dRadius = dRadius;
649 return (stGPSLocation == stOtherWaypoint.stGPSLocation && stUTMLocation == stOtherWaypoint.stUTMLocation && eType == stOtherWaypoint.eType &&
650 dRadius == stOtherWaypoint.dRadius && nID == stOtherWaypoint.nID);
678 double dRoverHeading;
693 this->stRoverPosition =
Waypoint(stRoverPosition);
694 this->dRoverHeading = dRoverHeading;
709 this->stRoverPosition =
Waypoint(stRoverPosition);
710 this->dRoverHeading = dRoverHeading;
759 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:396
UTMCoordinate ConvertGPSToUTM(const GPSCoordinate &stGPSCoord)
Given a GPS coordinate, convert to UTM and create a new UTMCoordinate object.
Definition GeospatialOperations.hpp:351
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
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:181
bool operator!=(const GPSCoordinate &stOtherCoordinate) const
Overridden operator not equals for GPSCoordinate struct.
Definition GeospatialOperations.hpp:233
bool operator==(const GPSCoordinate &stOtherCoordinate) const
Overridden operator equals for GPSCoordinate struct.
Definition GeospatialOperations.hpp:215
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 orientation.
Definition GeospatialOperations.hpp:99
IMUData()
Construct a new IMUData object.
Definition GeospatialOperations.hpp:113
IMUData(double dPitch, double dRoll, double dHeading)
Construct a new IMUData object.
Definition GeospatialOperations.hpp:131
This struct is used by the WaypointHandler to provide an easy way to store all pose data about the ro...
Definition GeospatialOperations.hpp:674
RoverPose(const geoops::GPSCoordinate &stRoverPosition=geoops::GPSCoordinate(), const double dRoverHeading=0.0)
Construct a new Rover Pose object.
Definition GeospatialOperations.hpp:690
bool operator==(const RoverPose &stOtherRoverPose) const
Overridden operator equals for RoverPose struct.
Definition GeospatialOperations.hpp:755
const geoops::GPSCoordinate & GetGPSCoordinate() const
Accessor for the geoops::GPSCoordinate member variable.
Definition GeospatialOperations.hpp:722
bool operator!=(const RoverPose &stOtherRoverPose) const
Overridden operator equals for RoverPose struct.
Definition GeospatialOperations.hpp:772
double GetCompassHeading() const
Accessor for the Compass Heading private member.
Definition GeospatialOperations.hpp:743
const geoops::UTMCoordinate & GetUTMCoordinate() const
Accessor for the geoops::UTMCoordinate member variable.
Definition GeospatialOperations.hpp:733
RoverPose(const geoops::UTMCoordinate &stRoverPosition, const double dRoverHeading=0.0)
Construct a new Rover Pose object.
Definition GeospatialOperations.hpp:706
This struct stores/contains information about a UTM coordinate.
Definition GeospatialOperations.hpp:244
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:282
bool operator==(const UTMCoordinate &stOtherCoordinate) const
Overridden operator equals for UTMCoordinate struct.
Definition GeospatialOperations.hpp:320
bool operator!=(const UTMCoordinate &stOtherCoordinate) const
Overridden operator not equals for UTMCoordinate struct.
Definition GeospatialOperations.hpp:339
This struct is used by the WaypointHandler class to store location, size, and type information about ...
Definition GeospatialOperations.hpp:551
const geoops::GPSCoordinate & GetGPSCoordinate() const
Accessor for the geoops::GPSCoordinate member variable.
Definition GeospatialOperations.hpp:623
bool operator==(const Waypoint &stOtherWaypoint) const
Overridden operator equals for Waypoint struct.
Definition GeospatialOperations.hpp:646
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:577
bool operator!=(const Waypoint &stOtherWaypoint) const
Overridden operator equals for Waypoint struct.
Definition GeospatialOperations.hpp:663
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:604
const geoops::UTMCoordinate & GetUTMCoordinate() const
Accessor for the geoops::UTMCoordinate member variable.
Definition GeospatialOperations.hpp:634