@@ -16,8 +16,6 @@ Glider::Glider(const std::string& path)
1616 Parameters params = Parameters::Load (path);
1717 factor_manager_ = FactorManager (params);
1818
19- origin_x_ = params.origin_x ;
20- origin_y_ = params.origin_y ;
2119 frame_ = params.frame ;
2220 correct_imu_ = params.correct_imu ;
2321
@@ -74,9 +72,6 @@ void Glider::addGPS(int64_t timestamp, Eigen::Vector3d& gps)
7472 char zone[4 ];
7573 geodetics::LLtoUTM (gps (0 ), gps (1 ), northing, easting, zone);
7674
77- easting = easting - origin_x_;
78- northing = northing - origin_y_;
79-
8075 meas.head (2 ) << easting, northing;
8176 meas (2 ) = gps (2 );
8277
@@ -88,40 +83,41 @@ void Glider::addIMU(int64_t timestamp, Eigen::Vector3d& accel, Eigen::Vector3d&
8883 if (frame_ == " ned" )
8984 {
9085 // transfrom to enu
91- Eigen::Quaterniond quat_ned (quat (0 ), quat (1 ), quat (2 ), quat (3 ));
92- Eigen::Quaterniond quat_enu = ned_to_enu_quat_ * quat_ned;
93- Eigen::Vector4d vec_enu;
94- vec_enu << quat_enu.w (), quat_enu.x (), quat_enu.y (), quat_enu.z ();
86+ Eigen::Quaterniond eig_quat (quat (0 ), quat (1 ), quat (2 ), quat (3 ));
87+ Eigen::Matrix3d imu_rot = eig_quat.toRotationMatrix ();
88+ // Vectornav gives BODY wrt NED, we need NED wrt BODY --> so take the inverse
89+ Eigen::Matrix3d imu_enu = ned_to_enu_rot_ * imu_rot.inverse ();
90+ Eigen::Quaterniond imu_quat (imu_enu);
91+ Eigen::Vector4d imu_vec (imu_quat.w (), imu_quat.x (), imu_quat.y (), imu_quat.z ());
9592
9693 Eigen::Vector3d accel_enu = ned_to_enu_rot_ * accel;
9794 Eigen::Vector3d gyro_enu = ned_to_enu_rot_ * gyro;
98-
95+
9996 if (correct_imu_)
10097 {
101- Eigen::Vector4d quat_corr = correctImuOrientation (vec_enu );
98+ Eigen::Vector4d quat_corr = correctImuOrientation (imu_vec );
10299 factor_manager_.addImuFactor (timestamp, accel_enu, gyro_enu, quat_corr);
103100 }
104101 else
105102 {
106- factor_manager_.addImuFactor (timestamp, accel_enu, gyro_enu, vec_enu );
103+ factor_manager_.addImuFactor (timestamp, accel_enu, gyro_enu, imu_vec );
107104 }
108-
109105 }
110106 else if (frame_ == " enu" )
111107 {
112108 if (correct_imu_)
113109 {
114110 Eigen::Vector4d quat_corr = correctImuOrientation (quat);
115111 factor_manager_.addImuFactor (timestamp, accel, gyro, quat_corr);
116- }
112+ }
117113 else
118114 {
119115 factor_manager_.addImuFactor (timestamp, accel, gyro, quat);
120116 }
121117 }
122118 else
123119 {
124- throw std::runtime_error (" IMU Frame, not supported use ned or enu " );
120+ throw std::runtime_error (" IMU Frame, not supported use ENU or NED " );
125121 return ;
126122 }
127123}
@@ -151,9 +147,9 @@ void Glider::addOdom(int64_t timestamp, Eigen::Isometry3d& pose)
151147 // Convert orb pose to ENU
152148 Eigen::Matrix3d odom_to_enu;
153149 double h = initial_heading_;
154- odom_to_enu << std::cos (h), -std::sin (h), 0 .0d ,
155- std::sin (h), std::cos (h), 0 .0d ,
156- 0 .0d , 0 .0d , 1 .0d ;
150+ odom_to_enu << std::cos (h), -std::sin (h), 0.0 ,
151+ std::sin (h), std::cos (h), 0.0 ,
152+ 0.0 , 0.0 , 1.0 ;
157153 Eigen::Isometry3d enu_pose = pose.rotate (odom_to_enu);
158154
159155 // calculate the relative pose in ENU frame
0 commit comments