Ceres Solver简介及使用

news2024/11/25 5:31:08

      Ceres Solver是一个开源的C++库,用于建模和解决大型、复杂的优化问题。它是一个成熟、功能丰富且高性能的库,自2010年以来一直在Google生产中使用。最新发布版本为2.1.0,license为BSD,它支持在Windows、Linux、Mac、Android、iOS上编译,源码地址:https://ceres-solver.googlesource.com/ceres-solver 
      Ceres Solver可用于解决两类问题
      (1).具有边界约束的非线性最小二乘(Non-linear Least Squares)问题;
      (2).一般无约束优化问题。
      Ceres Solver依赖项
      (1).必须的:CMake、Eigen、glog、gflags;
      (2).可选的:SuiteSparse、BLAS and LAPACK、CUDA。
      Ceres Solver在Ubuntu 20.04上编译:eigen, glog, gflags, ceres-solver都在/home/spring/Soft目录下

      (1).clone eigen源码:这里使用3.3.7版本,依次执行如下命令:

git clone https://gitlab.com/libeigen/eigen.git
cd eigen
git checkout 3.3.7

      编译eigen,在eigen目录下执行build_eigen.sh,其内容如下:

#! /bin/bash

if [[ ! -d "build" ]]; then
    mkdir build
    cd build
else
    cd build
fi

cmake \
    -DCMAKE_CXX_FLAGS=-fPIC \
    -DCMAKE_C_FLAGS=-fPIC \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=../install \
    ..
make -j2
make install

      (2).clone glog源码:这里使用v0.4.0版本,依次执行如下命令:

git clone https://github.com/google/glog.git
cd glog
git checkout v0.4.0

      编译glog,在glog目录下直接执行build_glog.sh,其内容与build_eigen.sh完全一致。

      (3).clone gflags源码:这里使用v2.2.2版本,依次执行如下命令:

git clone https://github.com/gflags/gflags.git
cd gflags
git checkout v2.2.2

      编译gflags,在gflags目录执行build_gflags.sh,其内容与build_eigen.sh完全一致。

      (4).clone Ceres Solver源码:这里使用1.14.0版本,依次执行如下命令:

git clone https://ceres-solver.googlesource.com/ceres-solver
cd ceres-solver
git checkout 1.14.0

      编译ceres-solver,在ceres-solver目录执行build_ceres-solver.sh,其内容如下:

#! /bin/bash

if [[ ! -d "build" ]]; then
    mkdir build
    cd build
else
    cd build
fi

path=/home/spring/Soft

cmake \
    -DCMAKE_CXX_FLAGS=-fPIC \
    -DCMAKE_C_FLAGS=-fPIC \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=../install \
    -DEigen3_DIR=${path}/eigen/install/share/eigen3/cmake \
    -Dglog_DIR=${path}/glog/install/lib/cmake/glog \
    -Dgflags_DIR=${path}/gflags/install/lib/cmake/gflags \
    ..
make -j2
make install

      Ceres Solver调用:在/home/spring/Soft目录下新建test目录,此目录内文件内容依次如下

      (1).main.cpp:

#include <iostream>
#include <glog/logging.h>
#include <ceres/ceres.h>

using namespace ceres;

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)
{
    // reference: http://ceres-solver.org/nnls_tutorial.html
    google::InitGoogleLogging(argv[0]);

    // The variable to solve for with its initial value.
    double initial_x = 5.0;
    double x = initial_x;

    // Build the problem.
    Problem problem;

    // Set up the only cost function (also known as residual). This uses
    // auto-differentiation to obtain the derivative (jacobian).
    CostFunction* cost_function = new AutoDiffCostFunction<CostFunctor, 1, 1>(new CostFunctor);
    problem.AddResidualBlock(cost_function, nullptr, &x);

    // Run the solver!
    Solver::Options options;
    options.linear_solver_type = ceres::DENSE_QR;
    options.minimizer_progress_to_stdout = true;
    Solver::Summary summary;
    Solve(options, &problem, &summary);

    std::cout << summary.BriefReport() << "\n";
    std::cout << "x : " << initial_x << " -> " << x << "\n";
    return 0;
}

      (2).build.sh:

#! /bin/bash

if [[ ! -d "build" ]]; then
    mkdir build
    cd build
else
    cd build
fi

path=/home/spring/Soft

cp ${path}/glog/install/lib/libglog.a .
cp ${path}/gflags/install/lib/libgflags.a .
cp ${path}/ceres-solver/install/lib/libceres.a .

cmake ..
make

      (3).CMakeLists.txt:

cmake_minimum_required(VERSION 3.15)
project(test_ceres-solver)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp")

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/../eigen/install/include/eigen3
    ${CMAKE_CURRENT_SOURCE_DIR}/../glog/install/include
    ${CMAKE_CURRENT_SOURCE_DIR}/../gflags/install/include
    ${CMAKE_CURRENT_SOURCE_DIR}/../ceres-solver/install/include
)

add_executable(${CMAKE_PROJECT_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp)
target_link_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/build)
target_link_libraries(${CMAKE_PROJECT_NAME} ceres glog gflags pthread)

      执行:

      首先执行:./build.sh

      然后执行:./build/test_ceres-solver ,结果如下图所示:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

D. Black Cells

Problem - 1821D - Codeforces 思路&#xff1a;我们能够发现题意的区间是不重叠的&#xff0c;并且任意两个区间之间的间隔至少是2&#xff0c;我们会发现一个性质&#xff0c;它一定是从前缀中进行选择的&#xff0c;但是前缀中长度为1的区间可以不选择&#xff0c;因为如果长…

STM32单片机示例:使用定时器触发DMA

文章目录 前言基础说明关键配置与代码示例链接 前言 单片机中使用定时器触发DMA是比较好用的一种操作&#xff0c;这里将对此做个示例说明。 基础说明 ST官方的例程中有一个 TIM_DMA 的例程&#xff0c;其功能是启用一个定时器&#xff0c;设置其中一路通道输出PWM&#xff…

【深入浅出Spring原理及实战】「夯实基础系列」360全方位渗透和探究Spring的核心注解开发和实现指南(Spring5的常见的注解)

360全方位渗透和探究Spring的核心注解开发和实现指南 Spring的注解介绍核心基础注解核心注解分析xml文件的配置configuration的配置 Lazy && ScopeComponentScan添加Controller、Service、Repository注入到spring容器ComponentScan多包扫描的属性排除某些包或者类的扫描…

SpringBoot读取配置的6种方式

1. 概述 通过了解springboot加载配置&#xff0c;可以更方便地封装自定义Starter。 在SpringBoot中&#xff0c;可以使用以下6种方式读取 yml、properties配置&#xff1a; 使用Value注解&#xff1a;读取springboot全局配置文件单个配置。使用Environment接口&#xff1a;通过…

详解c++---异常

目录标题 c语言传统处理错误的方式c异常的使用异常的规则服务器常用的异常继承体系异常安全异常的规范异常的优缺点&#xff1a; c语言传统处理错误的方式 第一种&#xff1a; 程序在运行过程中终止了程序&#xff0c;比如说assert int main() {int i 0;scanf("%d"…

5.5 python函数式编程之--返回函数、匿名函数、偏函数(暂时稍微了解即可)

1、 先回归历史&#xff1a;什么是函数函数就是通过将局部【目标】实现并封装起来&#xff0c; 后续可直接拿来用2、 函数式编程&#xff1a; 是把运算过程尽量写成一系列嵌套的函数调用一、返回函数 返回函数&#xff1a; 函数作为返回值闭包&#xff1a; 函数内部定义函…

OJ练习第138题——树中距离之和

树中距离之和 力扣链接&#xff1a;834. 树中距离之和 题目描述 给定一个无向、连通的树。树中有 n 个标记为 0…n-1 的节点以及 n-1 条边 。 给定整数 n 和数组 edges &#xff0c; edges[i] [ai, bi]表示树中的节点 ai 和 bi 之间有一条边。 返回长度为 n 的数组 answe…

Vue项目搭建过程

Vue项目搭建过程 1、安装NodeJs 1.1 下载安装包 在 http://nodejs.cn/download/ 上下载64位安装包&#xff0c;然后进行安装&#xff0c;和普通软件的安装一样。 C:\Users\Administrator>node -v v16.13.1C:\Users\Administrator>npm -v 8.5.51.2 安装cnpm # 安装cn…

什么是「推荐系统」,有哪些主要的推荐方法?

1 什么是推荐系统 什么是推荐系统&#xff1f;根据维基百科的定义&#xff0c; 它是一种信息过滤系统&#xff0c;主要功能是预测用户对物品 的评分和偏好。这一定义回答了推荐系统的功能是过滤信息、连接用户和推送信息。将这一定义扩 展一下&#xff0c; 推荐系统就是自动联…

文献阅读:MathPrompter: Mathematical Reasoning using Large Language Models

文献阅读&#xff1a;MathPrompter: Mathematical Reasoning using Large Language Models 1. 内容简介2. 方法细节3. 实验内容4. 结论&思考 文献链接&#xff1a;https://arxiv.org/abs/2303.05398 1. 内容简介 这篇文章是今年3月份的时候微软提出的一篇工作&#xff0…

SpringBoot中间件—ORM(Mybatis)框架实现

目录 定义 需求背景 方案设计 代码展示 UML图 实现细节 测试验证 总结 定义&#xff1a; ORM&#xff1a;Object Relational Mapping --> 对象关系映射&#xff0c;是一种程序设计技术&#xff0c;用于实现面向对象编程语言里面不同类型系统的数据之间的转换 需求背…

前端|CSS(一)| pink老师

参考视频&#xff1a;黑马程序员前端CSS3基础教程&#xff0c;前端必备基础 目录 &#x1f4da;CSS引入 &#x1f407;引入CSS样式表 &#x1f4da;CSS基础选择器 &#x1f407;标签选择器 &#x1f407;类选择器&#xff08;最常用&#xff09; &#x1f407;id选择器 …

VIM文本如何复制到系统剪切板?

今天从vim上用鼠标复制代码&#xff0c;发现把VIM当中的行号也复制进去了&#xff0c;就很麻烦&#xff0c;于是简单研究了下&#xff0c;如果vim支持clipboard的话就比较好办&#xff0c;具体支持与否&#xff0c;使用命令查看&#xff1a; vim --version | grep "clipb…

C语言指针面试题

C语言指针面试题 一.指针和数组1.一维数组2.字符数组3.二维数组 二.指针 一.指针和数组 1.一维数组 int a[] {1,2,3,4};(1)printf("%d\n",sizeof(a));// 16(2)printf("%d\n",sizeof(a0));// 4/8(3)printf("%d\n",sizeof(*a));// 4(4)printf(&…

xred病毒分析

概述 xred病毒是一种感染型病毒&#xff0c;会感染系统中特定目录下的exe和xlsx文件&#xff0c;该病毒会将自身伪装成Synaptics触摸板驱动程序&#xff0c;使用Dephi编写。 样本的基本信息 Verified: Unsigned Link date: 6:22 1992/6/20 Company: Synaptics Description: S…

vue3 前端编码规范

prettier 配置 1. vscode 安装prettier 的 插件 2. 新建 .prettierrc 文件 {"semi": false, // 不尾随分号"singleQuote": true, // 使用单引号"trailingComma": "none" // 多行逗号分隔的语法&#xff0c;最后一行不加逗号 }eslin…

WPF嵌入外部exe应用程序-实现基本的嵌入

WPF嵌入外部exe应用程序 使用场景功能实现嵌入基本功能实现1.导入windows API2.运行外部程序3. 获取窗体句柄4. 嵌入窗体5.设置子窗体位置整个代码 嵌入存在的问题&#xff1a; 使用场景 在WPF桌面应用程序开发过程中&#xff0c;有时候需要将其他程序结合到一起&#xff0c;让…

Linux尖刀——shell

目录 知识点 lsblk grep awk tail du df 对新增存储设备的检测与分区 用lsblk查询块设备 用dmesg看内核打印信息 用ls查看新增设备 对rootfs空间使用情况的监控 知识点 首先想要用shell脚本解决一些问题肯定要熟悉linux的命令 lsblk -t或–tree&#xff1a;以…

Redis进阶底层原理- 缓冲区

Redis中使用了很多缓冲区&#xff0c;在redis各个环节起到了非常核心的作用。下面来一一介绍一下&#xff1a; 输入输出缓冲区&#xff08;客户端缓冲区&#xff09; Redis中的输入输出缓冲区是为了平衡客户端发送命令和服务端处理命令的速度差异&#xff0c;如果客户端发送指…