added updateNoiseModels functionality
parent
70956bb447
commit
6b890cec0e
|
@ -359,6 +359,11 @@ virtual class TransformBtwRobotsUnaryFactorEM : gtsam::NonlinearFactor {
|
||||||
Vector calcIndicatorProb(const gtsam::Values& x);
|
Vector calcIndicatorProb(const gtsam::Values& x);
|
||||||
void setValAValB(const gtsam::Values valA, const gtsam::Values valB);
|
void setValAValB(const gtsam::Values valA, const gtsam::Values valB);
|
||||||
|
|
||||||
|
void updateNoiseModels(const gtsam::Values& values, const gtsam::NonlinearFactorGraph& graph);
|
||||||
|
void updateNoiseModels_givenCovs(const gtsam::Values& values, Matrix cov1, Matrix cov2, Matrix cov12);
|
||||||
|
Matrix get_model_inlier_cov();
|
||||||
|
Matrix get_model_outlier_cov();
|
||||||
|
|
||||||
void serializable() const; // enabling serialization functionality
|
void serializable() const; // enabling serialization functionality
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -302,6 +302,94 @@ namespace gtsam {
|
||||||
return currA_T_currB_msr.localCoordinates(currA_T_currB_pred);
|
return currA_T_currB_msr.localCoordinates(currA_T_currB_pred);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
SharedGaussian get_model_inlier() const {
|
||||||
|
return model_inlier_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
SharedGaussian get_model_outlier() const {
|
||||||
|
return model_outlier_;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
Matrix get_model_inlier_cov() const {
|
||||||
|
return (model_inlier_->R().transpose()*model_inlier_->R()).inverse();
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
Matrix get_model_outlier_cov() const {
|
||||||
|
return (model_outlier_->R().transpose()*model_outlier_->R()).inverse();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
void updateNoiseModels(const gtsam::Values& values, const gtsam::NonlinearFactorGraph& graph){
|
||||||
|
/* Update model_inlier_ and model_outlier_ to account for uncertainty in robot trajectories
|
||||||
|
* (note these are given in the E step, where indicator probabilities are calculated).
|
||||||
|
*
|
||||||
|
* Principle: R += [H1 H2] * joint_cov12 * [H1 H2]', where H1, H2 are Jacobians of the
|
||||||
|
* unwhitened error w.r.t. states, and R is the measurement covariance (inlier or outlier modes).
|
||||||
|
*
|
||||||
|
* TODO: improve efficiency (info form)
|
||||||
|
*/
|
||||||
|
|
||||||
|
// get joint covariance of the involved states
|
||||||
|
std::vector<gtsam::Key> Keys;
|
||||||
|
Keys.push_back(keyA_);
|
||||||
|
Keys.push_back(keyB_);
|
||||||
|
Marginals marginals( graph, values, Marginals::QR );
|
||||||
|
JointMarginal joint_marginal12 = marginals.jointMarginalCovariance(Keys);
|
||||||
|
Matrix cov1 = joint_marginal12(keyA_, keyA_);
|
||||||
|
Matrix cov2 = joint_marginal12(keyB_, keyB_);
|
||||||
|
Matrix cov12 = joint_marginal12(keyA_, keyB_);
|
||||||
|
|
||||||
|
updateNoiseModels_givenCovs(values, cov1, cov2, cov12);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* ************************************************************************* */
|
||||||
|
void updateNoiseModels_givenCovs(const gtsam::Values& values, const Matrix& cov1, const Matrix& cov2, const Matrix& cov12){
|
||||||
|
/* Update model_inlier_ and model_outlier_ to account for uncertainty in robot trajectories
|
||||||
|
* (note these are given in the E step, where indicator probabilities are calculated).
|
||||||
|
*
|
||||||
|
* Principle: R += [H1 H2] * joint_cov12 * [H1 H2]', where H1, H2 are Jacobians of the
|
||||||
|
* unwhitened error w.r.t. states, and R is the measurement covariance (inlier or outlier modes).
|
||||||
|
*
|
||||||
|
* TODO: improve efficiency (info form)
|
||||||
|
*/
|
||||||
|
|
||||||
|
const T& p1 = values.at<T>(keyA_);
|
||||||
|
const T& p2 = values.at<T>(keyB_);
|
||||||
|
|
||||||
|
Matrix H1, H2;
|
||||||
|
T hx = p1.between(p2, H1, H2); // h(x)
|
||||||
|
|
||||||
|
Matrix H;
|
||||||
|
H.resize(H1.rows(), H1.rows()+H2.rows());
|
||||||
|
H << H1, H2; // H = [H1 H2]
|
||||||
|
|
||||||
|
Matrix joint_cov;
|
||||||
|
joint_cov.resize(cov1.rows()+cov2.rows(), cov1.cols()+cov2.cols());
|
||||||
|
joint_cov << cov1, cov12,
|
||||||
|
cov12.transpose(), cov2;
|
||||||
|
|
||||||
|
Matrix cov_state = H*joint_cov*H.transpose();
|
||||||
|
|
||||||
|
// model_inlier_->print("before:");
|
||||||
|
|
||||||
|
// update inlier and outlier noise models
|
||||||
|
Matrix covRinlier = (model_inlier_->R().transpose()*model_inlier_->R()).inverse();
|
||||||
|
model_inlier_ = gtsam::noiseModel::Gaussian::Covariance(covRinlier + cov_state);
|
||||||
|
|
||||||
|
Matrix covRoutlier = (model_outlier_->R().transpose()*model_outlier_->R()).inverse();
|
||||||
|
model_outlier_ = gtsam::noiseModel::Gaussian::Covariance(covRoutlier + cov_state);
|
||||||
|
|
||||||
|
// model_inlier_->print("after:");
|
||||||
|
// std::cout<<"covRinlier + cov_state: "<<covRinlier + cov_state<<std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* ************************************************************************* */
|
/* ************************************************************************* */
|
||||||
|
|
||||||
/** number of variables attached to this factor */
|
/** number of variables attached to this factor */
|
||||||
|
|
Loading…
Reference in New Issue