研究慣性導(dǎo)航的小伙伴都比較關(guān)心一件事链峭,那就是協(xié)方差怎么來,或者說信息矩陣如何得到又沾,當(dāng)然協(xié)方差的用處我就不多說了弊仪。
我之前的做法,都是自己臨時拼一個信息矩陣杖刷,之后求個逆励饵,最近發(fā)現(xiàn)了一個更為簡單的方法。
ceres-solver中提供了Covariance Estimation方法類滑燃,用于得到最優(yōu)解的協(xié)方差役听。
理論我就不多寫了,省得論文查重過不了。典予。
總的來說調(diào)用很簡單甜滨。
比如pose的協(xié)方差如何得到呢?
pose的維度是6瘤袖,所以協(xié)方差是6*6那么大艳吠,因此寫兩行:
Eigen::Matrix<double, 6, 6, Eigen::RowMajor> cov_pose = Eigen::Matrix<double, 6, 6, Eigen::RowMajor>::Zero();
// 然后正常solve你的problem
...
// solve完成后,請打代碼
ceres::Covariance::Options cov_options;
ceres::Covariance covariance(cov_options);
std::vector<std::pair<const double*, const double*> > covariance_blocks; //這個是你要算的兩個玩意兒的協(xié)方差孽椰,地球人都知道協(xié)方差是要有兩個變量的昭娩,當(dāng)然自己對自己就是方差了
covariance_blocks.push_back(std::make_pair(pose.data(), pose.data())); //你要算pose的協(xié)方差,請把要算的pose的數(shù)據(jù)指針這樣排好
//要算什么就加入什么黍匾,當(dāng)然也可以無腦都搞栏渺,或許就有點慢而已
covariance.Compute(covariance_blocks, &problem);
covariance.GetCovarianceBlockInTangentSpace(pose.data(),pose.data(), cov_pose.data()); //這里得調(diào)用切空間那個接口,因為pose的協(xié)方差定義在切空間上
于是你就得到了協(xié)方差了锐涯。磕诊。