Ubuntu安装使用Ceres Solver

【版权声明】
本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。  

        Ceres Solver是一个开源的C++库,用于建模和求解大型复杂的非线性最小二乘问题。它被广泛应用于计算机视觉、机器人学、统计学等领域,特别是在三维重建、相机标定、导航、地图制作等任务中。Ceres Solver由谷歌研发并维护,因其强大的功能和灵活性而受到许多研究者和工程师的青睐。

1、核心特性

        自动微分:Ceres提供自动微分功能,可以自动计算给定函数的导数,这对于最小二乘问题的求解至关重要。

        多种求解器支持:Ceres内置了多种线性求解器和非线性求解策略,包括稀疏和密集矩阵的处理方法,用户可以根据问题特点选择最合适的求解器。

        鲁棒核函数:为了处理离群点对最小二乘优化的影响,Ceres提供了多种鲁棒核函数,帮助改善优化结果的稳定性和准确性。

        高效:Ceres针对性能进行了优化,能够高效地处理大规模的优化问题。

        易用性:尽管Ceres是一个功能强大的库,但它的API设计得非常易于使用,使得用户可以相对容易地构建和求解最小二乘问题。

2、安装

        官方安装地址:Installation — Ceres Solver(http://ceres-solver.org/installation.html)

        Ceres Solver可以在多种操作系统上安装,包括Linux、macOS和Windows。以下是在Ubuntu上安装Ceres的基本步骤:

        2.1 安装依赖

        首先需要安装Ceres的依赖库,包括CMake、Google glog、Eigen等。

sudo apt-get update
sudo apt-get install  liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev libatlas-base-dev libeigen3-dev

        2.2 下载Ceres Solver

        从Ceres Solver的官方网站或GitHub仓库下载源代码。

git clone https://github.com/ceres-solver/ceres-solver

        2.3 编译和安装

        使用CMake构建并安装Ceres。

cd ceres-solver
mkdir build
cd build
cmake ..
make -j
sudo make install

        2.4 编译失败案例

        大部分编译失败案例需要是由安装版本与系统环境中依赖项的版本不一致导致的,往往需要降低Ceres版本,如参考文献[1]。

        如果出现错误“internal/ceres/CMakeFiles/ceres_internal.dir/cuda_sparse_matrix.cc.o”,那么可能是因为glog版本导致的。理论上glog版本至少为0.3.5即可,但是编译过程中仍然出现了以上问题。报错完整内容如下所示。

internal/ceres/CMakeFiles/ceres_internal.dir/build.make:1083: recipe for target 'internal/ceres/CMakeFiles/ceres_internal.dir/cuda_sparse_matrix.cc.o' failed
make[2]: *** [internal/ceres/CMakeFiles/ceres_internal.dir/cuda_sparse_matrix.cc.o] Error 1
/root/project/cpp_project/ceres-solver/internal/ceres/cuda_kernels_bsm_to_crs.cu.cc(135): warning #2912-D: constexpr if statements are a C++17 feature
/root/project/cpp_project/ceres-solver/internal/ceres/cuda_kernels_bsm_to_crs.cu.cc(135): warning #2912-D: constexpr if statements are a C++17 feature
/root/project/cpp_project/ceres-solver/internal/ceres/cuda_kernels_bsm_to_crs.cu.cc(135): warning #2912-D: constexpr if statements are a C++17 feature
/root/project/cpp_project/ceres-solver/internal/ceres/cuda_kernels_bsm_to_crs.cu.cc(135): warning #2912-D: constexpr if statements are a C++17 feature
/root/project/cpp_project/ceres-solver/internal/ceres/cuda_kernels_bsm_to_crs.cu.cc(135): warning #2912-D: constexpr if statements are a C++17 feature
[ 26%] Linking CUDA static library ../../lib/libceres_cuda_kernels.a
[ 26%] Built target ceres_cuda_kernels
CMakeFiles/Makefile2:2071: recipe for target 'internal/ceres/CMakeFiles/ceres_internal.dir/all' failed
make[1]: *** [internal/ceres/CMakeFiles/ceres_internal.dir/all] Error 2
Makefile:145: recipe for target 'all' failed
make: *** [all] Error 2

        上述问题解决方式是重新安装glog。不能再通过apt-get install libgoogle-glog-dev方法安装,这种方法很可能安装的是低版本glog,且无法制定版本。因此,下面采用源码编译的方式来进行安装。步骤如下所示。

sudo apt-get remove libgoogle-glog-dev
git clone https://gitee.com/boxingcao/glog.git
apt-get install autoconf automake libtool
cd glog
mkdir build
cd build
cmake ..
make
sudo make install

3、示例程序

        以下是一个简单的Ceres Solver示例,演示如何使用Ceres求解一个简单的最小二乘问题:

#include <ceres/ceres.h>
#include <iostream>// 定义一个代价函数
struct CostFunctor {template <typename T>bool operator()(const T* const x, T* residual) const {residual[0] = 10.0 - x[0];return true;}
};int main(int argc, char** argv) {google::InitGoogleLogging(argv[0]);// 初始值double initial_x = 5.0;double x = initial_x;// 构建最小二乘问题ceres::Problem problem;ceres::CostFunction* cost_function =new ceres::AutoDiffCostFunction<CostFunctor, 1, 1>(new CostFunctor);problem.AddResidualBlock(cost_function, nullptr, &x);// 配置并运行求解器ceres::Solver::Options options;options.linear_solver_type = ceres::DENSE_QR;options.minimizer_progress_to_stdout = true;ceres::Solver::Summary summary;ceres::Solve(options, &problem, &summary);std::cout << summary.BriefReport() << "\n";std::cout << "x : " << initial_x << " -> " << x << "\n";return 0;
}

        这个简单的例子展示了如何定义一个代价函数,创建一个最小二乘问题,配置求解器并运行求解过程,最后输出优化结果。Ceres Solver的灵活性和强大功能使其成为解决非线性最小二乘问题的首选库之一。

4、CMakeLists.txt

cmake_minimum_required(VERSION 3.20)
project(hello_world)find_package(Ceres REQUIRED)
message("Ceres: " ${CERES_LIBRARIES})
message("Ceres_DIR: " ${Ceres_DIR})include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include/usr/local/include/usr/include//usr/include/eigen3
)set(CMAKE_BUILD_TYPE "Debug") # 默认是Release模式,设置为Debug才能调试
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) # 设置可执行文件的输出目录add_executable(hello_world test_ceres.cpp)target_link_libraries(${PROJECT_NAME} PRIVATE Ceres::ceres)

5、运行结果

6、参考文献

[1] https://blog.csdn.net/qq_39369161/article/details/129089592

【版权声明】
本文为博主原创文章,未经博主允许严禁转载,我们会定期进行侵权检索。  

更多python与C++技巧、三维算法、深度学习算法总结、大模型请关注我的博客:https://blog.csdn.net/suiyingy,或”乐乐感知学堂“公众号。Python三维领域专业书籍推荐:《人工智能点云处理及深度学习算法》。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/529418.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB 可调节的一致性,其他数据库都不行系列 (白皮书 翻译)--1

开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, Oceanbase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;…

STM32CubeIDE基础学习-STM32CubeIDE软件工程文件拷贝粘贴

STM32CubeIDE基础学习-STM32CubeIDE软件工程文件拷贝粘贴 前言 在后面开发程序时&#xff0c;往往不需要再重新新建工程的了&#xff0c;可以直接在原有的工程基础上直接复制粘贴新增功能就可以了。 具体的操作方法步骤如下介绍&#xff1a; 第一步&#xff1a;找到一个原有的…

3d视觉笔记 | 神经辐射场NeRF(Neural Radiance Fields)

NeRF概念 NeRF&#xff08;Neural Radiance Fields&#xff0c;神经辐射场&#xff09;是一种用于3D场景重建和图像渲染的深度学习方法。它由Ben Mildenhall等人在2020年的论文《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis》中首次提出。NeRF通过…

Aigtek功率放大器的构成要素包括哪些

功率放大器是电子设备中常见的元件&#xff0c;用于增强信号的功率。它由多个构成要素组成&#xff0c;每个要素都在确保放大器高效性能方面发挥着重要作用。下面来介绍功率放大器的构成要素。 输入级&#xff1a;输入级是功率放大器的第一个部分&#xff0c;用于接收输入信号并…

基于51单片机的智能散热风扇设计9.86

摘要 基于51单片机的智能散热风扇的设计主要可以分为监测单元、控制单元和中央处理单元。本系统采用单片机STC89C52RC作为主控制器&#xff0c;采用数字型温度传感器DS18B20作为监测单元&#xff0c;主要就是采集温度数据&#xff0c;通过一系列的计算转化成实际温度数值。为了…

C++ 队列

目录 队列的应用场景 1、429. N 叉树的层序遍历 2、 103. 二叉树的锯齿形层序遍历 3、662. 二叉树最大宽度 4、515. 在每个树行中找最大值 队列的应用场景 广度优先搜索&#xff08;BFS&#xff09;&#xff1a;队列是广度优先搜索算法的核心数据结构。在BFS中&#xff…

allegro PCB设计心得笔记(二) -- ERROR(SPMHUT-144): Illegal arc specification

使用Allegro PCB Editor设计PCB&#xff0c;其中使用了中文丝印&#xff0c;设计完成后&#xff0c;进行Tools -> Database Check&#xff0c;提示如下错误&#xff1a; 对PCB文件进行反复检查&#xff0c;也没有找到具体问题&#xff0c;但是删除中文丝印封装后&#xff0c…

后悔没有早点看到这份产品说明书模板

产品说明书是连接产品与消费者的桥梁&#xff0c;它对产品具有多重好处。一份设计精良、内容准确的产品说明书有助于消费者全面了解产品&#xff0c;确保用户正确使用产品&#xff1b;减少消费者因误操作导致的故障&#xff0c;降低企业的售后服务成本&#xff1b;增强消费者对…

JAVA开发常见小问题整合

文章目录 1&#xff1a;身份证工具类相关方法1.1 身份证脱敏处理 2&#xff1a;字符串补零处理(此处是JAVA类的方法&#xff0c;并无引用StrUtil)3&#xff1a;springboot前后端分离&#xff0c;后端返回json字符串带斜杠问题处理4&#xff1a;WebUploader 文件上传组件 -编辑回…

Java学习笔记15——类型转换(基本数据类型)

Java语言&#xff0c;要求严格声明变量的类型。数据类型的转换是在所赋值的数据的数值类型和被变量的数据类型不一致时发生的&#xff0c;它需要从一种数据类型转换成另一种数据类型。 在Java中&#xff0c;对于除了boolean类型以外的7种基本类型&#xff0c;在把某个类型的值…

四川易点慧电子商务有限公司抖音小店安全正规

在如今网络购物日益普及的时代&#xff0c;消费者对于购物平台的选择越来越挑剔。四川易点慧电子商务有限公司抖音小店以其安全正规的经营模式&#xff0c;赢得了广大消费者的信赖和好评。本文将为您详细介绍四川易点慧电子商务有限公司抖音小店的优势和特点&#xff0c;让您在…

​​​​​​​ARCGIS API for Python进行城市区域提取

ArcGIS API for Python主要用于Web端的扩展和开发&#xff0c;提供简单易用、功能强大的Python库&#xff0c;以及大数据分析能力&#xff0c;可轻松实现实时数据、栅格数据、空间数据等多源数据的接入和GIS分析、可视化&#xff0c;同时提供对平台的空间数据管理和组织管理功能…