struct KinVec{ double x,y,z; }; struct MovementVec{ double dSpd,dClb,dCrs; }; struct LLA_Rad{ double dLon,dLat; }; struct UVW{ double dU,dV,dW; }; struct Movement { double dCrs, dSpd, dClb; }; Eigen::Vector3d Generate_Kin_Vect(MovementVec Mov_Dat, LLA_Rad LLA_rCoord) { //Transform Mov_Dat to topocentric vector // UVW UVW_Coord; Eigen::Vector3d ENU; ENU[0] = Mov_Dat.dSpd * cos(Mov_Dat.dClb) * sin(Mov_Dat.dCrs); ENU[1] = Mov_Dat.dSpd * cos(Mov_Dat.dClb) * cos(Mov_Dat.dCrs); ENU[2] = Mov_Dat.dSpd * sin(Mov_Dat.dClb); //Transform topocentric vector to geocentric vector // Eigen::Vector3d UVW(UVW_Coord.dU,UVW_Coord.dV, UVW_Coord.dW); LOG_S(INFO)<<"UVW: "<< ENU[0]<< " "<< ENU[1]<< " " << ENU[2] ; Eigen::Matrix3d LocalRotationMatrix; LocalRotationMatrix << -sin(LLA_rCoord.dLon), - cos(LLA_rCoord.dLon)*sin(LLA_rCoord.dLat) , cos(LLA_rCoord.dLon)*cos(LLA_rCoord.dLat) , cos(LLA_rCoord.dLon), - sin(LLA_rCoord.dLon)* sin(LLA_rCoord.dLat), sin(LLA_rCoord.dLon) *cos(LLA_rCoord.dLat), 0 , cos(LLA_rCoord.dLat) , sin(LLA_rCoord.dLat); return LocalRotationMatrix*ENU; }; struct Kin_Vect { double dVx, dVy, dVz; }; struct XYZ { double dX,dY,dZ; }; const double dEPS = 0.000001; double ShiftRadCrs(double Rad) { while(Rad < 0) { Rad += 2 * M_PI; } while (Rad > 2 * M_PI) { Rad -= 2 * M_PI; } return Rad; }; double ShiftRadClb(double Rad) { while(Rad < -M_PI) { Rad += 2 * M_PI; } while (Rad > M_PI) { Rad -= 2 * M_PI; } return Rad; }; Movement Generate_Movement(Eigen::Vector3d Kin_Dat, LLA_Rad LLA_rCoord, XYZ XYZ_Coord) { Movement Result; // Transform geocentric vector to topocentric vector Eigen::Vector3d ENU; // UVW UVW_Coord; // UVW_Coord.dU = -(Kin_Dat.dVx) * sin(LLA_rCoord.dLon) + // (Kin_Dat.dVy) * cos(LLA_rCoord.dLon); // UVW_Coord.dV = -(Kin_Dat.dVx) * sin(LLA_rCoord.dLat) * cos(LLA_rCoord.dLon) - // (Kin_Dat.dVy) * sin(LLA_rCoord.dLat) * sin(LLA_rCoord.dLon) + // (Kin_Dat.dVz) * cos(LLA_rCoord.dLat); // UVW_Coord.dW = (Kin_Dat.dVx) * cos(LLA_rCoord.dLat) * cos(LLA_rCoord.dLon) + // (Kin_Dat.dVy) * cos(LLA_rCoord.dLat) * sin(LLA_rCoord.dLon) + // (Kin_Dat.dVz) * sin(LLA_rCoord.dLat); Eigen::Matrix3d LocalRotationMatrix; LocalRotationMatrix<< - sin(LLA_rCoord.dLon) , cos(LLA_rCoord.dLon) , 0, - sin(LLA_rCoord.dLat) * cos(LLA_rCoord.dLon), - sin(LLA_rCoord.dLat) * sin(LLA_rCoord.dLon), cos(LLA_rCoord.dLat), cos(LLA_rCoord.dLat) * cos(LLA_rCoord.dLon), cos(LLA_rCoord.dLat) * sin(LLA_rCoord.dLon), sin(LLA_rCoord.dLat); ENU = LocalRotationMatrix * Kin_Dat; LOG_S(INFO)<<"ENU: "<< ENU[0]<< " "<