24void Gnss::setReference(
const double& referenceLatitude,
const double& referenceLongitude,
const double& referenceAltitude,
25 const double& referenceHeading) {
45Eigen::Vector3d
Gnss::gnssToCartesian(
const double& latitudeInDegrees,
const double& longitudeInDegrees,
const double& altitude) {
53 Eigen::Vector3d position;
54 position(0) = cn * lat_tmp + sn * lon_tmp;
55 position(1) = sn * lat_tmp - cn * lon_tmp;
62 Eigen::Vector3d gpsCoordinates;
69 return gpsCoordinates;
74 const double S =
alpha_ * log(tan(M_PI_4 + latitudeInRad / 2.0)) -
75 alpha_ * sqrt(
e2_) / 2.0 * log((1 + sqrt(
e2_) * sin(latitudeInRad)) / (1 - sqrt(
e2_) * sin(latitudeInRad))) +
k_;
76 const double b = 2 * (atan(exp(S)) - M_PI_4);
80 const double lHat = atan(sin(l) / (sin(
b0_) * tan(b) + cos(
b0_) * cos(l)));
81 const double bHat = asin(cos(
b0_) * sin(b) - sin(
b0_) * cos(b) * cos(l));
84 const double Y =
r_ * lHat;
85 const double X =
r_ / 2.0 * log((1 + sin(bHat)) / (1 - sin(bHat)));
87 return Eigen::Vector3d(Y, X, altitude) -
xyzOffset_;
92Eigen::Vector3d
Gnss::gnssToLv03(
const double latitudeInDegrees,
const double longitudeInDegrees,
const double altitude) {
93 Eigen::Vector3d position =
gnssToLv03Raw(latitudeInDegrees, longitudeInDegrees, altitude);
94 Eigen::Vector3d positionOut = Eigen::Vector3d::Zero();
102Eigen::Vector3d
Gnss::gnssToLv03Raw(
const double latitudeInDegrees,
const double longitudeInDegrees,
const double altitude) {
103 double east =
wGStoCHy(latitudeInDegrees, longitudeInDegrees);
104 double north =
wGStoCHx(latitudeInDegrees, longitudeInDegrees);
105 return Eigen::Vector3d(east, north, altitude);
113 const double latAux = (lat - 169028.66) / 10000.0;
114 const double lonAux = (lon - 26782.5) / 10000.0;
116 double x = (200147.07 + (308807.95 * latAux) + (3745.25 * std::pow(lonAux, 2)) + (76.63 * std::pow(latAux, 2)) -
117 (194.56 * std::pow(lonAux, 2) * latAux) + (119.79 * std::pow(latAux, 3)));
125 const double latAux = (lat - 169028.66) / 10000.0;
126 const double lonAux = (lon - 26782.5) / 10000.0;
128 double y = (600072.37 + (211455.93 * lonAux) - (10938.51 * lonAux * latAux) - (0.36 * lonAux * std::pow(latAux, 2)) -
129 (44.54 * std::pow(lonAux, 3)));
134 int degree = std::floor(dec);
135 int minute = std::floor((dec - degree) * 60.0);
136 double second = (((dec - degree) * 60.0) - minute) * 60.0;
137 return degree + (
static_cast<double>(minute) / 100.0) + (second / 10000.0);
141 int degree = std::floor(dms);
142 int minute = std::floor((dms - degree) * 100.0);
143 double second = (((dms - degree) * 100.0) - minute) * 100.0;
144 return second + (minute * 60.0) + (degree * 3600.0);
double wGStoCHy(double lat, double lng)
double referenceLatitude_
Reference latitude of the GPS measurements [deg].
Eigen::Vector3d besselEllipsoidToMercator(const double &latitudeInRad, const double &longitudeInRad, const double &altitude)
double sexAngleToSeconds(double dms)
Eigen::Vector3d referencePointLv03_
double referenceAltitude_
Reference altitude of the GPS measurements [m].
void setMercatorReferenceFrame(const Eigen::Vector3d newReferencePoint)
Eigen::Vector3d xyzOffset_
const double excentricity2_
double referenceLongitude_
Reference longitude of the GPS measurements [deg].
Eigen::Vector3d gnssToLv03(const double latitude_in_degrees, const double longitude_in_degrees, const double altitude)
void setReference(const double &referenceLatitude, const double &referenceLongitude, const double &referenceAltitude, const double &referenceHeading)
double referenceHeading_
Reference heading for the GPS measurements [rad].
Eigen::Vector3d cartesianToGps(const Eigen::Matrix< double, 3, 1 > position) const
double wGStoCHx(double lat, double lng)
Eigen::Vector3d gnssToCartesian(const double &latitudeInDegrees, const double &longitudeInDegrees, const double &altitude)
void calculateConversionParameters()
Eigen::Vector3d gnssToLv03Raw(const double latitude_in_degrees, const double longitude_in_degrees, const double altitude)
double decToSexAngle(double dec)
const double equatorialRadius_