一文助你Ceres 入门 您所在的位置:网站首页 入侵van秘密工作站 一文助你Ceres 入门

一文助你Ceres 入门

2023-09-21 09:56| 来源: 网络整理| 查看: 265

Ceres solver 是谷歌开发的一款用于非线性优化的库,在谷歌的开源激光雷达slam项目cartographer中被大量使用。Ceres官网上的文档非常详细地介绍了其具体使用方法,相比于另外一个在slam中被广泛使用的图优化库G2O,ceres的文档可谓相当丰富详细(没有对比就没有伤害,主要是G2O资料太少了,对比起来就显得ceres的很多),下面我就介绍下如何使用ceres库进行简单的非线性优化,给各位ceres的初学者一个低门槛的入门教程,能比较直观地对使用ceres库求解优化问题的过程有一个清晰的了解。话不多说,开整。

新手村-Ceres简易例程

使用Ceres求解非线性优化问题,一共分为三个部分: 1、 第一部分:构建cost fuction,即代价函数,也就是寻优的目标式。这个部分需要使用仿函数(functor)这一技巧来实现,做法是定义一个cost function的结构体,在结构体内重载()运算符,具体实现方法后续介绍。 2、 第二部分:通过代价函数构建待求解的优化问题。 3、 第三部分:配置求解器参数并求解问题,这个步骤就是设置方程怎么求解、求解过程是否输出等,然后调用一下Solve方法。

好了,此时你应该对ceres的大概使用流程有了一个基本的认识。下面我就基于ceres官网上的教程中的一个例程来详细介绍一下ceres的用法。 Ceres官网教程给出的例程中,求解的问题是求x使得 12(10−x)2 取到最小值。(很容易心算出x的解应该是10) 好,来看代码:

#include #include using namespace std; using namespace ceres; //第一部分:构建代价函数,重载()符号,仿函数的小技巧 struct CostFunctor { template bool operator()(const T* const x, T* residual) const { residual[0] = T(10.0) - x[0]; return true; } }; //主函数 int main(int argc, char** argv) { google::InitGoogleLogging(argv[0]); // 寻优参数x的初始值,为5 double initial_x = 5.0; double x = initial_x; // 第二部分:构建寻优问题 Problem problem; CostFunction* cost_function = new AutoDiffCostFunction(new CostFunctor); //使用自动求导,将之前的代价函数结构体传入,第一个1是输出维度,即残差的维度,第二个1是输入维度,即待寻优参数x的维度。 problem.AddResidualBlock(cost_function, NULL, &x); //向问题中添加误差项,本问题比较简单,添加一个就行。 //第三部分: 配置并运行求解器


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有