4 #ifndef GAMS_POSE_GEODETIC_CONV_H_
5 #define GAMS_POSE_GEODETIC_CONV_H_
11 namespace gams {
namespace pose {
namespace geodetic_util {
85 using Matrix3 = Eigen::Matrix<double, 3, 3>;
94 const double longitude,
95 const double altitude) :
114 void getReference(
double* latitude,
double* longitude,
double* altitude)
const
122 const double latitude,
const double longitude,
const double altitude,
123 double* x,
double* y,
double* z)
127 double lat_rad =
deg2Rad(latitude);
128 double lon_rad =
deg2Rad(longitude);
130 sin(lat_rad) * sin(lat_rad));
131 *x = (
kSemimajorAxis / xi + altitude) * cos(lat_rad) * cos(lon_rad);
132 *y = (
kSemimajorAxis / xi + altitude) * cos(lat_rad) * sin(lon_rad);
139 const double x,
const double y,
const double z,
140 double* latitude,
double* longitude,
double* altitude)
147 double r = sqrt(x * x + y * y);
154 F * r * r) / pow(G, 3);
155 double S = cbrt(1 + C + sqrt(C * C + 2 * C));
156 double P = F / (3 * pow((S + 1 / S + 1), 2) * G * G);
162 (Q * (1 + Q)) - 0.5 * P * r * r);
169 *longitude =
rad2Deg(atan2(y, x));
173 const double x,
const double y,
const double z,
174 double* north,
double* east,
double* down)
const
190 const double north,
const double east,
const double down,
191 double* x,
double* y,
double* z)
const
205 const double latitude,
const double longitude,
const double altitude,
206 double* north,
double* east,
double* down)
const
211 ecef2Ned(x, y, z, north, east, down);
215 const double north,
const double east,
const double down,
216 double* latitude,
double* longitude,
double* altitude)
const
220 ned2Ecef(north, east, down, &x, &y, &z);
225 const double latitude,
const double longitude,
const double altitude,
226 double* east,
double* north,
double* up)
const
232 double aux_north, aux_east, aux_down;
233 ecef2Ned(x, y, z, &aux_north, &aux_east, &aux_down);
241 const double east,
const double north,
const double up,
242 double* latitude,
double* longitude,
double* altitude)
const
246 const double aux_north = north;
247 const double aux_east = east;
248 const double aux_down = -up;
250 ned2Ecef(aux_north, aux_east, aux_down, &x, &y, &z);
256 const double lon_radians)
258 const double sLat = sin(lat_radians);
259 const double sLon = sin(lon_radians);
260 const double cLat = cos(lat_radians);
261 const double cLon = cos(lon_radians);
264 ret(0, 0) = -sLat * cLon;
265 ret(0, 1) = -sLat * sLon;
270 ret(2, 0) = cLat * cLon;
271 ret(2, 1) = cLat * sLon;
280 return (
radians / M_PI) * 180.0;
286 return (
degrees / 180.0) * M_PI;
Helper class for translating between LLA, ECEF, and NED coordinates.
void geodetic2Enu(const double latitude, const double longitude, const double altitude, double *east, double *north, double *up) const
static void ecef2Geodetic(const double x, const double y, const double z, double *latitude, double *longitude, double *altitude)
void ned2Geodetic(const double north, const double east, const double down, double *latitude, double *longitude, double *altitude) const
void geodetic2Ned(const double latitude, const double longitude, const double altitude, double *north, double *east, double *down) const
double initial_longitude_
Matrix3 ned_to_ecef_matrix_
static double deg2Rad(const double degrees)
GeodeticConverter(const double latitude, const double longitude, const double altitude)
Matrix3 ecef_to_ned_matrix_
static Matrix3 nRe(const double lat_radians, const double lon_radians)
void enu2Geodetic(const double east, const double north, const double up, double *latitude, double *longitude, double *altitude) const
static double rad2Deg(const double radians)
static void geodetic2Ecef(const double latitude, const double longitude, const double altitude, double *x, double *y, double *z)
void getReference(double *latitude, double *longitude, double *altitude) const
void ned2Ecef(const double north, const double east, const double down, double *x, double *y, double *z) const
void ecef2Ned(const double x, const double y, const double z, double *north, double *east, double *down) const
static constexpr double kSecondEccentricitySquared
static constexpr double kFirstEccentricitySquared
static constexpr double kSemimajorAxis
static constexpr double kSemiminorAxis
static constexpr double kFlattening
Eigen::Matrix< double, 3, 3 > Matrix3
Minimal implementation of a Matrix for internal use.
static const detail::radians_t radians
Radians unit flag; see Euler constructor.
static const detail::degrees_t degrees
Degres unit flag; see Euler constructor.
Contains all GAMS-related tools, classes and code.