ceres-solver和g2o性能比较

2023-05-16

前言

ceres-solver 和 g2o 是slam领域常见的优化器,其中ceres-solver被vins-mono使用,而g2o被orb-slam3使用,因此到底哪个优化器更适合于在slam算法开发中使用?

测试

分别基于这两种优化器实现BA过程,然后针对同一个仿真数据集进行测试,测试程序链接: https://github.com/chennuo0125-HIT/test/tree/main/ceres_g2o_comparer,按readme进行编译运行可得如下结果:

************** solve ba by g2o ***************
# Using EigenSparseCholesky poseDim 6 landMarkDim 3 blockordering 1
Performing full BA:
iteration= 0	 chi2= 238086189.574891	 time= 0.00782969	 cumTime= 0.00782969	 edges= 9135	 schur= 1	 lambda= 5991.771138	 levenbergIter= 1
iteration= 1	 chi2= 12982651.993440	 time= 0.00342487	 cumTime= 0.0112546	 edges= 9135	 schur= 1	 lambda= 1997.257046	 levenbergIter= 1
iteration= 2	 chi2= 657425.312444	 time= 0.00318212	 cumTime= 0.0144367	 edges= 9135	 schur= 1	 lambda= 665.752349	 levenbergIter= 1
iteration= 3	 chi2= 124163.255742	 time= 0.00287256	 cumTime= 0.0173092	 edges= 9135	 schur= 1	 lambda= 221.917450	 levenbergIter= 1
iteration= 4	 chi2= 75275.286988	 time= 0.00304911	 cumTime= 0.0203584	 edges= 9135	 schur= 1	 lambda= 73.972483	 levenbergIter= 1
iteration= 5	 chi2= 34439.999175	 time= 0.00264852	 cumTime= 0.0230069	 edges= 9135	 schur= 1	 lambda= 24.657494	 levenbergIter= 1
iteration= 6	 chi2= 22057.399494	 time= 0.00309912	 cumTime= 0.026106	 edges= 9135	 schur= 1	 lambda= 16.438330	 levenbergIter= 1
iteration= 7	 chi2= 18344.890824	 time= 0.00295518	 cumTime= 0.0290612	 edges= 9135	 schur= 1	 lambda= 5.479443	 levenbergIter= 1
iteration= 8	 chi2= 17868.574026	 time= 0.00397518	 cumTime= 0.0330364	 edges= 9135	 schur= 1	 lambda= 7.305924	 levenbergIter= 2
iteration= 9	 chi2= 17333.014982	 time= 0.00399876	 cumTime= 0.0370351	 edges= 9135	 schur= 1	 lambda= 9.741232	 levenbergIter= 2

point error before optimize: 2.96158
point error  after optimize: 0.462318


************** solve ba by ceres **************

Solver Summary (v 2.0.0-eigen-(3.3.7)-lapack-suitesparse-(5.7.1)-cxsparse-(3.2.0)-eigensparse-no_openmp)

                                     Original                  Reduced
Parameter blocks                          708                      706
Parameters                               2184                     2170
Effective parameters                     2169                     2157
Residual blocks                          9135                     9135
Residuals                               18270                    18270

Minimizer                        TRUST_REGION

Sparse linear algebra library    SUITE_SPARSE
Trust region strategy     LEVENBERG_MARQUARDT

                                        Given                     Used
Linear solver                    SPARSE_SCHUR             SPARSE_SCHUR
Threads                                     1                        1
Linear solver ordering              AUTOMATIC                   693,13
Schur structure                         2,3,6                    2,3,6

Cost:
Initial                          1.217168e+09
Final                            7.973251e+03
Change                           1.217160e+09

Minimizer iterations                        7
Successful steps                            7
Unsuccessful steps                          0

Time (in seconds):
Preprocessor                         0.005044

  Residual only evaluation           0.004244 (7)
  Jacobian & residual evaluation     0.010863 (7)
  Linear solver                      0.034270 (7)
Minimizer                            0.053454

Postprocessor                        0.000078
Total                                0.058576

Termination:                      CONVERGENCE (Function tolerance reached. |cost_change|/cost: 4.362464e-08 <= 1.000000e-06)


point error before optimize: 2.96158
point error  after optimize: 0.0354349

************** cost time **************
g2o cost time: 68.4571 [ms]
ceres cost time: 63.1568 [ms]

结论

基于"说明"中的仿真数据集,可以初步确定ceres-solver在优化精度和耗时方面都优于g2o.

说明

  1. 测试程序中的仿真数据来源于 g2o 中的 ba_demo.cpp,g2o测试用例也是基于该程序改的。
  2. 该测试用例只使用了一组仿真数据集,不足以获得较全面的结论,如果大家有好的测试用例或者别的结论,可以保持交流,我的邮箱: chennuo0125@163.com
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ceres-solver和g2o性能比较 的相关文章

  • SLAM本质剖析-G2O(转载,感觉写得不错)

    这块还是写得不错的 转载自 xff1a https mp weixin qq com s NeveBIh5bb37CUyVVNocLw SLAM本质剖析 G2O 原创 lovely yoshino 古月居 今天 0 前言 在了解SLAM的原
  • SLAM本质剖析-Ceres

    转载自 xff1a https mp weixin qq com s fKlG9LWlPI52wStUAv18iw SLAM本质剖析 Ceres 原创 lovely yoshino 古月居 今天 在了解SLAM的原理 流程后 xff0c 个
  • Ceres 自动求导解析-从原理到实践

    Ceres 自动求导解析 从原理到实践 文章目录 Ceres 自动求导解析 从原理到实践1 0 前言2 0 Ceres求导简介3 0 Ceres 自动求导原理3 1 官方解释3 2 自我理解 4 0 实践4 1 Jet 的实现4 2 多项式
  • 非线性优化库学习资料:Ceres Gtsam G2o

    其中 Ceres 资料最完善也相对稳定 xff0c 是谷歌的非线性优化库 xff0c Google Cartographer 就是调用了该库 http www ceres solver org tutorial html 既可以作为 Cer
  • slam优化eigen,ceres,g2o,gtsam,pcl

    eigen SLAM本质剖析 Eigen 古月居 ceres https guyuehome com 34633 g2o SLAM本质剖析 G2O 古月居 gtsam SLAM本质剖析 GTSAM 古月居 pcl https www guy
  • g2o非线性优化架构详解图

    流程 xff1a 1 每次添加边的时候 xff0c 会对jacobian workspace更新size xff0c 最终size等于所有边中顶点相关顶点数量最多的顶点数 xff1b 这样做的原因是所有边求解雅克比矩阵 xff0c 用的是同
  • Building ceres-solver fail with eigen3 "error: no type named ‘Literal’ in ‘struct Eigen::NumTraits"

    以前编译ceres solver没有出现过问题 xff0c 最近在编译时报出一个问题 xff1a 75 Building CXX object internal ceres CMakeFiles jet test dir jet test
  • Ceres的自动求导实现原理剖析

    目录 数学原理实现原理总结 首先注意数值求导和自动求导在使用的时候的不同之处 实际上 xff0c 正是自动求导这个地方使用了类模板 xff0c 导致它不仅可以传入参数 xff0c 还可以传入Jet类型的数据 xff0c 从而实现了参数的雅可
  • Ceres 自动求导解析-从原理到实践

    Ceres 自动求导解析 从原理到实践 文章目录 Ceres 自动求导解析 从原理到实践1 0 前言2 0 Ceres求导简介3 0 Ceres 自动求导原理3 1 官方解释3 2 自我理解 4 0 实践4 1 Jet 的实现4 2 多项式
  • 做SLAM实验时g2o的安装问题cmake的版本问题及git下载历史版本代码方法总结

    博主之前跑了ORBSLAM2做了相关实验 半年没碰之后 又重新来弄发现 WTF g2o用不了 cmake版本过低无法编译 直接修改CMakeLists txt文件还不行 好吧 我屈服了 升级cmake吧 升级到了3 2爽歪歪腰不酸了腿也利索
  • Matlab ode 求解器:改变状态和指定时间

    我正在求解 t 0 时的一组 ODE dy dt 所有初始条件 t 0 y 0 0 0 0 我可以在不同时间向 y 值添加一些数字 例如 在 t 10 时 应将 y1 添加到该数字 在 t 20 时 应将 y2 添加到该数字等 并求解方程
  • 如何使用 Numba 加速 Python 中 scipy.sparse.linalg 中提供的稀疏线性系统求解器?

    我希望使用 Numba 加速我的代码的稀疏系统求解器部分 这是我到目前为止所拥有的 Both numba and numba scipy packages are installed I am using PyCharm IDE impor
  • Python 求解一个变量的方程

    我正在尝试使用 SymPy 求解 python 中的方程 我有一个生成的方程 类似于function y 8 0 y 3 0 我将其与 SymPy 一起使用来创建一个如下所示的新方程 eq sympy Eq function 2 哪个输出y
  • 从真值表创建降序二元决策图 (ROBDD)

    是否有一个软件包 最好是应用程序 而不是库 可以根据给定的真值表 以某种文本格式 创建降序二元决策图 ROBDD 你也可以尝试这个 http formal cs utah edu 8080 pbl BDD php http formal c
  • 用于未定方程组的 C++ 库 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我一直在寻找一个 C 库来解决这样的不确定系统 q 是向量 w x y z 变量和 a b c d 常
  • 使用回溯的数独求解器

    我最近一直在研究回溯数独求解算法 目前我想问一下我应该如何将我的solve 方法从void更改为boolean 我正在使用一个非常简单的回溯算法 它目前工作正常 但我宁愿有一个布尔值而不是一个空值 因为有一个打印堆栈不是很好 Thanks
  • Excel 解算器具有非相邻单元格约束?

    我是 Excel 求解器的新手 只是在拿起一本数据科学书籍后才了解它 我想更熟悉这个工具 所以我一直在尝试解决不同的问题 但我被困在一个问题上 我什至不确定是否可以使用求解器 基本上 我需要检查的约束是两个单元格是否相邻 我的问题 我有一堆
  • Sympy nsolve 函数和多种解决方案

    我用 python 做了这个小测试程序来看看如何solve and nsolve工作 from sympy import theta Symbol theta phi Symbol phi def F theta phi return si
  • 从字符串解方程得到 C 的结果

    我想知道是否有人有关于如何做一些听起来很简单但在尝试编程时看起来并不像的事情的信息或经验 这个想法是 给出一个包含方程的字符串 例如 2 x 10 这很简单 但它可能会变得非常复杂 例如 sqrt 54 35 x 2 等等on 程序将返回
  • R(以前称为 Excel Solver)中预算分配的优化

    我将 Excel 中遇到的问题翻译成 R 我想以 Gesamt 由函数返回 最大化的形式分配固定预算 NrwGes lt function Budget Speed maxnrw cpcrp BudgetA lt Budget 1 Budg

随机推荐

  • TFmini Plus在开源飞控PX4上的应用

    TFmini Plus在开源飞控PX4上的应用 PX4有着自己独特的优势 xff0c 受到广大爱好者的喜爱 TFmini Plus是北醒公司推出的性价比极高的激光雷达 xff0c 受到广大爱好者的追捧 本文介绍TFmini Plus和PX4
  • TFmini在开源飞控pixhawk上的应用

    TFmini在开源飞控pixhawk上的应用 TFmini可以直接连接Pixhawk的串口使用 飞行器可以使用TFmini来实现定高或者避障功能 本文档适用于pixhawk ArduCopter V3 6 2或更高版固件 xff08 注 x
  • 北邮oj-旋转图像

    include lt bits stdc 43 43 h gt using namespace std define maxn 105 int buf maxn maxn int ans maxn maxn int main int T N
  • 获取激光雷达数据

    从激光雷达获得距离 搭建turtlebot仿真环境 下载 sudo apt get install ros kinetic turtlebot 配置环境 sudo apt get install ros kinetic joy 将turtl
  • kube-proxy BoundedFrequencyRunner导致死循环分析

    kube proxy使用了k8s官方工具库中的BoundedFrequencyRunner实现基于事件及时间间隔的配置同步 1 BounderFrequencyRunner构建 1 1 相关核心代码 name Runner名称 func s
  • 捷联惯导系统学习2.6(圆锥误差补偿多子样算法)

    若圆锥运动的四元数更新方程为 xff1a Q t m 61 Q
  • 捷联惯导系统学习5.1(最小方差估计和线性最小方差估计)

    最小方差估计 最小均方误差MMSE 也称条件期望估计 使方差最小即 xff1a X 系 统 状 态 量
  • 13-Websocket协议与MQ协议

    Websocket协议 基于TCP全双工协议 xff0c 即可以从客户端向服务器端发送请求 xff0c 也可以从服务器端主动向客户端发送消息 HTTP协议只能从客户端向服务器发送请求 xff0c 服务器端收到请求后 xff0c 做出响应 x
  • HeadFirest设计模式学习笔记

    设计原则 1 经常会发生变化的部分应该从整体中抽取并封装起来 xff0c 以便以后可以很轻易的对这部分代码进行改动或者是扩充 xff0c 而不会影响到不需要变化的其他部分 2 针对接口编程 xff0c 而不是针对实现编程 3 多用组合 xf
  • ROS控制UR机器人(1)-安装与配置

    一 Universal robot的软件包安装 方法1 xff1a 直接安装Universal Robots机器人的功能包 xff08 kinetic及以下版本 xff09 span class token function sudo sp
  • 机器视觉(5)-realsense相机使用教程

    realsense相机是英特尔开发的RGBD相机系列 xff0c 我们可以通过相机得到彩色图和深度图 xff0c 方便我们后续进行视觉开发 根据不同的需求 xff0c 我们一般要经过图像采集的几个步骤 xff0c 具体如下 一 打开相机并获
  • 激光雷达与毫米波雷达对比

    激光雷达是一种采用非接触激光测距技术的扫描式传感器 xff0c 其工作原理与一般的雷达系统类似 xff0c 通过发射激光光束来探测目标 xff0c 并通过搜集反射回来的光束来形成点云和获取数据 xff0c 这些数据经光电处理后可生成为精确的
  • Android Studio Build Output 栏内乱码的解决方案

    一 如图1 所示 xff0c Android Studio版本是4 1 3 xff0c AS工具Help About即可看到下图 图1 二 乱码如下图 xff1a 如图2所示 xff0c Build Output栏中出现了乱码 xff0c
  • 网络工程师必须搞清楚MPLS与专线的区别

    今天同事突然问我一个问题 xff0c MPLS与专线的区别 我想了想 xff0c 然后稀里糊涂的说了一堆 xff0c 感觉自己没讲清楚 xff0c 所以 xff0c 网上找了点资料 xff0c 结合自己的理解 xff0c 码文如下 xff1
  • 我的ADRC调参经验总结

    提示 xff1a 本文是在前人基础上搭建的ADRC模型 xff0c 并根据这一模型学习如何对其进行调参时产生的 xff0c 部分结论来自论文 目录 前言一 控制系统简介二 调参步骤1 前后结果效果对比2 调参经验 总结参考链接 前言 ADR
  • k8s client-go workqueue

    1 基础队列 1 1 基础队列接口 type Interface interface Add item interface 向队列中添加一个元素 xff0c interface 类型 xff0c 说明可以添加任何类型的元素 Len int
  • 相机与imu的标定(Kalibr)

    在进行vio算法开发前最重要的事是对设备内参外参的标定 xff0c 其准确性直接决定了算法的有效性 xff0e 这里我将对最著名的kalibr标定工具的使用步骤进行说明 xff0c 包括安装 相机标定 imu标定 相机与imu联合标定等步骤
  • 解决cv_bridge依赖opencv版本问题

    1 问题来源 在安装ros的过程中 xff0c 系统会默认安装cv bridge库 xff0c 但该库指定了依赖的opencv库路径 xff0c 拿ros melodic版本来说 xff0c 默认依赖opencv库 usr lib x86
  • 使用ORB_SLAM3运行Realsense T265

    关于硬件 官网说明 使用说明 Realsense T265是一款跟踪相机 xff0c 配有两个FOV为111 7 x 108 6的广角相机 xff0c 并且带有IMU BMI055 惯性测量单元 设备内部配有vpu处理器并嵌入了建图和定位算
  • ceres-solver和g2o性能比较

    前言 ceres solver 和 g2o 是slam领域常见的优化器 xff0c 其中ceres solver被vins mono使用 xff0c 而g2o被orb slam3使用 xff0c 因此到底哪个优化器更适合于在slam算法开发