26 std::vector<double> sigmaPosition;
27 config[
"noise"][
"position"].
getElement<std::vector<double>>(&sigmaPosition,
"sigma");
28 this->
errorSigmaPosition = Eigen::Vector3d(sigmaPosition[0], sigmaPosition[1], sigmaPosition[2]);
29 std::vector<double> meanPosition;
30 config[
"noise"][
"position"].
getElement<std::vector<double>>(&meanPosition,
"mean");
31 this->
errorMeanPosition = Eigen::Vector3d(meanPosition[0], meanPosition[1], meanPosition[2]);
33 std::vector<double> sigmaVelocity;
34 config[
"noise"][
"velocity"].
getElement<std::vector<double>>(&sigmaVelocity,
"sigma");
35 this->
errorSigmaVelocity = Eigen::Vector3d(sigmaVelocity[0], sigmaVelocity[1], sigmaVelocity[2]);
36 std::vector<double> meanVelocity;
37 config[
"noise"][
"velocity"].
getElement<std::vector<double>>(&meanVelocity,
"mean");
38 this->
errorMeanVelocity = Eigen::Vector3d(meanVelocity[0], meanVelocity[1], meanVelocity[2]);
40 std::vector<double> sigmaOrientation;
41 config[
"noise"][
"orientation"].
getElement<std::vector<double>>(&sigmaOrientation,
"sigma");
42 this->
errorSigmaOrientation = Eigen::Vector3d(sigmaOrientation[0], sigmaOrientation[1], sigmaOrientation[2]);
43 std::vector<double> meanOrientation;
44 config[
"noise"][
"orientation"].
getElement<std::vector<double>>(&meanOrientation,
"mean");
45 this->
errorMeanOrientation = Eigen::Vector3d(meanOrientation[0], meanOrientation[1], meanOrientation[2]);
53Eigen::Vector3d
wgs84toEcef(
double lat,
double lon,
double alt)
56 double deg2rad = M_PI / 180.0;
58 double b = 6356752.314;
60 double esqr = 1 - std::pow(b / a, 2);
61 double N = a / (sqrt(1 - esqr * std::pow(std::sin(lat * deg2rad), 2)));
62 double X = (N + h) * std::cos(lat * deg2rad) * std::cos(lon * deg2rad);
63 double Y = (N + h) * std::cos(lat * deg2rad) * std::sin(lon * deg2rad);
64 double Z = std::sin(lat * deg2rad) * ((1 - esqr) * N + h);
65 return Eigen::Vector3d(X, Y, Z);
81 double lon = std::atan2(y, x);
82 double p = std::hypot(x, y);
83 double deg2rad = M_PI / 180.0;
85 double b = 6356752.314;
87 double esqr = 1 - std::pow(b / a, 2);
91 double lat = std::atan2(p, z);
93 for (
int i = 0; i < 7; ++i)
95 double rn =
getRn(lat);
96 h = (p / std::cos(lat)) - rn;
97 lat = std::atan((z / p) / (1 - esqr * rn / (rn + h)));
101 return Eigen::Vector3d(lat, lon, h);
120bool GnssSensor::RunTick(Eigen::Vector3d& gnssOrigin, Eigen::Vector3d& enuToTrackRotation, Eigen::Vector3d& trans,
121 Eigen::Vector3d& rot,
double time, Eigen::Vector3d velocity, Eigen::Vector3d omega, Eigen::Vector3d start_position,
122 Eigen::Vector3d start_orientation,
bool trackPreTransformed)
127 double originLat = gnssOrigin.x();
128 double originLon = gnssOrigin.y();
129 double originAlt = gnssOrigin.z();
130 auto originEcef =
wgs84toEcef(originLat, originLon, originAlt);
131 Eigen::Vector3d ecefRef = Eigen::Vector3d(originEcef.x(), originEcef.y(), originEcef.z());
133 Eigen::Vector3d rotTrackToENU(enuToTrackRotation.x(), enuToTrackRotation.y(), enuToTrackRotation.z());
135 Eigen::Vector3d actualTrackCar = start_position;
137 if (trackPreTransformed)
139 actualTrackCar =
eulerAnglesToRotMat(start_orientation).transpose() * trans + start_position;
141 Eigen::Vector3d enuCar = rotMatTrackToEnu * actualTrackCar;
143 std::default_random_engine generator(
noiseSeed);
157 enuCar.x() += distX(generator);
158 enuCar.y() += distY(generator);
159 enuCar.z() += distZ(generator);
160 Eigen::Vector3d ecefCar = rotEnuToEcef * enuCar + ecefRef;
162 Eigen::Vector3d positionWgs =
ecefToWgs84(ecefCar.x(), ecefCar.y(), ecefCar.z());
164 Eigen::Vector3d velENU
166 if (trackPreTransformed)
178 if (trackPreTransformed)
186 =
quatFromEulerAngles(Eigen::Vector3d(distXOr(generator), distYOr(generator), distZOr(generator)));
193 Eigen::Vector3d testVec = testMat * Eigen::Vector3d(1, 0, 0);
194 double angleN = std::atan2(testVec.y(), testVec.x());
211 value.
vel_east = velENU.x() + distXVel(generator);
212 value.
vel_north = velENU.y() + distYVel(generator);
213 value.
vel_up = velENU.z() + distZVel(generator);
bool RunTick(Eigen::Vector3d &gnssOrigin, Eigen::Vector3d &enuToTrackRotation, Eigen::Vector3d &trans, Eigen::Vector3d &rot, double time, Eigen::Vector3d velocity, Eigen::Vector3d omega, Eigen::Vector3d start_position, Eigen::Vector3d start_orientation, bool trackPreTransformed)