cggos / imu_x_fusion

IMU + X(GNSS, 6DoF Odom) Loosely-Coupled Fusion Localization based on ESKF, IEKF, UKF(UKF/SPKF, JUKF, SVD-UKF) and MAP
https://msf.cgabc.xyz/
GNU General Public License v3.0
915 stars 163 forks source link

2D平面约束 #35

Open improve100 opened 2 years ago

improve100 commented 2 years ago

你好,我想添加一个2d平面约束,这样对吗?
void forceTwoD() { Eigen::Matrix<double, 9, 1> residual; residual.setZero(); residual(2) = -kfptr->stateptr->p_GI(2) - 47; residual(5) = -kfptr->stateptr->v_GI(2); // Eigen::Matrix3d r_GI = kfptr->stateptr->r_GI; Eigen::Vector3d angle = computeAngles(kfptr->stateptr->r_GI); residual(6) = -angle(0); residual(7) = -angle(1);

Eigen::Matrix<double, 9, 16> Hx_;
Hx_.setZero();
// H.block<3, 3>(0, 0) = Eigen::Matrix3d::Identity();
// H(2,2) = 1;
Hx_(5,5) = 1;
Hx_(6,6) = 1;
Hx_(7,7) = 1;

Eigen::Matrix<double, 16, 15> X_dx_;
X_dx_.setZero();
X_dx_.block<6,6>(0,0) = Eigen::Matrix<double,6,6>::Identity();
X_dx_.block<6,6>(10,9) = Eigen::Matrix<double,6,6>::Identity();
// Eigen::Isometry3d Twb;
// Twb.matrix() = kf_ptr_->state_ptr_->r_GI;
// X_dx_.block<3,3>(6,6) = -Twb.linear();
Eigen::Quaterniond q(kf_ptr_->state_ptr_->r_GI);
X_dx_.block<4,3>(6,6) = 0.5*(Eigen::Matrix<double,4,3>()<<-q.x(),-q.y(),-q.z(),
                             q.w(),-q.z(),q.y(),
                             q.z(),q.w(),-q.x(),
                             -q.y(),q.x(),q.w()).finished();

Eigen::Matrix<double, 9, 15> H;
H.setZero();
H = Hx_ * X_dx_;

Eigen::Matrix<double,9,9> V;
// V.setZero();
// V = Eigen::Matrix<double,9,9>::Identity() * std::numeric_limits<double>::max();
V = Eigen::Matrix<double,9,9>::Identity();
// V(2,2) = 1;
V(5,5) = 5e1;
V(6,6) = 0.1;
V(7,7) = 0.1;

kf_ptr_->update_measurement(H, V, residual);
// DebugLog(kf_ptr_->ss,"Yellow");

}

cggos commented 2 years ago

@improve100 如果可以的话,最好提供下详细的算法文档