ceres-solver无脑搞定协方差小技巧

研究惯性导航的小伙伴都比较关心一件事,那就是协方差怎么来,或者说信息矩阵如何得到,当然协方差的用处我就不多说了。
我之前的做法,都是自己临时拼一个信息矩阵,之后求个逆,最近发现了一个更为简单的方法。
ceres-solver中提供了Covariance Estimation方法类,用于得到最优解的协方差。
理论我就不多写了,省得论文查重过不了。。
总的来说调用很简单。
比如pose的协方差如何得到呢?
pose的维度是6,所以协方差是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; //这个是你要算的两个玩意儿的协方差,地球人都知道协方差是要有两个变量的,当然自己对自己就是方差了
covariance_blocks.push_back(std::make_pair(pose.data(), pose.data())); //你要算pose的协方差,请把要算的pose的数据指针这样排好
//要算什么就加入什么,当然也可以无脑都搞,或许就有点慢而已
covariance.Compute(covariance_blocks, &problem);
covariance.GetCovarianceBlockInTangentSpace(pose.data(),pose.data(), cov_pose.data()); //这里得调用切空间那个接口,因为pose的协方差定义在切空间上

于是你就得到了协方差了。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文先简要明了地介绍了特征向量和其与矩阵的关系,然后再以其为基础解释协方差矩阵和主成分分析法的基本概念,最后我们结...
    xiao_dong_zi阅读 4,139评论 0 10
  • 一前言 特征值 奇异值 二奇异值计算 三PCA 1)数据的向量表示及降维问题 2)向量的表示及基变换 3)基向量 ...
    Arya鑫阅读 10,664评论 2 43
  • 上次那篇文章在理论层次介绍了下协方差矩阵,没准很多人觉得这东西用处不大,其实协方差矩阵在好多学科里都有很重要的作用...
    尼小摩阅读 6,199评论 0 3
  • by jie 2018.7 一. g2o的整体结构 说到整体的结构,不得不用一张比较概括的图来说明: 这张图最好跟...
    远行_2a22阅读 11,289评论 1 8
  • 正月十七,中雨淅沥。 我打伞走过马路,踩起水花无数。 大风吹的伞都拿不住,可我还要努力不能止步。 下雨气温降低,还...
    solo_4e30阅读 221评论 0 0