Ceres Solver简介及使用

      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 ,结果如下图所示:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TortoiseGit的安装和使用

1、TortoiseGit的下载安装 安装说明:因为TortoiseGit 只是一个程序壳,必须依赖一个 Git Core,所以安装前请确定已完成git安装和配置。 TortoiseGit下载地址 https://download.tortoisegit.org/tgit/ ,最新稳定版本2.11.0.0。 点进去下载程序包和语言包(非必须),安装时…

在 3ds Max 中使用Mental Ray渲染 wip 图像

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 本教程面向初学者&#xff0c;每个步骤都详细概述和显示。如果您是 3D Studio MAX 的新手&#xff0c;您可能想先尝试我们的其他一些教程。 使用默认的 3D Studio MAX 渲染器创建粘土渲染 步骤 1 在 3D S…

实战:Springboot集成Sentinel实现流量控制、熔断降级、负载保护

文章目录 前言知识积累流量控制负载保护熔断降级官方文档 实战演练部署sentinel-dashboard直接jar包部署docker-compose编排 springboot集成sentinel基础架构搭建sentinel控制台sentinel验证 延伸&#xff1a;系统自适应限流系统规则原理配置页面 写在最后 前言 前面的文章我们…

Flutter:架构概览

概览 Flutter本质上是一个跨平台的UI工具集&#xff0c;允许在各自操作系统上复用同样的代码。 尽可能提供原生体验的高性能和复用代码。 开发中&#xff0c;Flutter应用在一个VM上运行&#xff0c;使得可在保留状态且无需重新编译情况下&#xff0c;进行热加载。 发行时&…

chrome插件reading-time开发

本插件开发文档翻译于Google官方文档Chrome Extensions Tutorial: Reading time - Chrome Developers 一、reading-time reading-time项目的功能是 将预期的阅读时间添加到任何Chrome extension 和 Chrome Web Store documentation 页面里面 通过这个项目&#xff0c;我们可以…

网络套接字编程(三)(HTTP)

gitee仓库&#xff1a;https://gitee.com/WangZihao64/linux/tree/master/CalTcp 一、重谈协议 协议是一种“约定”&#xff0c;这种约定是双方都知道的。有了一致的约定&#xff0c;双方才能够正常地进行通信。协议在网络的第一篇博客中也提到过&#xff0c;协议是双方进行通…

图像增广:强化深度学习的视觉表现力

目录 摘要&#xff1a; 1. 图像增广简介 2. 图像增广的原理 3. 常见的图像增广技术 4. 如何在实际项目中应用图像增广 5.实际应用 摘要&#xff1a; 当今&#xff0c;深度学习已经在计算机视觉领域取得了令人瞩目的成就。图像增广作为一种数据处理技术&#xff0c;让我们…

一.CreateFileMapping实现的共享内存及用法

共享内存概念 1.在32位的Windows系统中&#xff0c;每一个进程都有权访问他自己的4GB&#xff08;2324294967296&#xff09;平面地址空间&#xff0c;没有段&#xff0c;没有选择符&#xff0c;没有near和far指针&#xff0c;没有near和far函数调用&#xff0c;也没有内存模式…

修改npm路径

npm config ls如果是第一次使用NPM安装包的话&#xff0c;在配置中只会看到prefix的选项&#xff0c;就是NPM默认的全局安装目录。但是如果有多次使用NPM安装包的话&#xff0c;就会看到cache和prefix两个路径。 新建两个文件夹node_global_modules和node_cache npm config s…

【CesiumJS入门】(7)绘制多段线(动态实时画线)

前言 鼠标左键添加点、右键完成绘制,单击右侧弹窗关闭按钮清空绘制。参考沙盒示例&#xff1a;Drawing on Terrain 直接上代码了 /** Date: 2023-07-12 18:47:18* LastEditors: ReBeX 420659880qq.com* LastEditTime: 2023-07-16 16:26:19* FilePath: \cesium-tyro-blog\s…

Verdi之波形展示nWave

6.nWave 6.1 添加波形文件 1.打开nWave界面&#xff0c;具体操作如下&#xff1a; 2.正式添加波形&#xff0c;使用快捷键G或者点击以下图标&#xff0c;选择需要的信号。 也可以在 n Trace中选中信号后&#xff0c;鼠标中键拖拽&#xff0c;或者ctrlw进行添加&#xff1b; 6…

R和python中dataframe读取方式总结

首先我有一个如图所示的文件 如果在python中读取 import pandas as pd df pd.read_csv("./6group_count.csv",index_col0) df而在R中读取的方式如下 df read.csv("./6group_count.csv",row.names 1)

MySQL---索引

目录 一、索引的分类 二、索引的底层原理是什么&#xff1f; 2.1、Innodb和MyIsAM两种引擎搜索数据时候的区别&#xff1a; 2.2、为什么MySQL&#xff08;MyIsAM、Innodb&#xff09;索引选择B树而不是B树呢&#xff1f; 2.3、Innodb的主键索引和二级索引&#xff08;辅助…

【Ajax】笔记-Ajax案例准备与请求基本操作

案例准备HTML 按钮div <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>AJAX GET 请求</title&g…

2D、3D机器视觉各有优势与局限,融合应用将成工业领域生产新方式

在智能制造的浪潮中&#xff0c;制造行业生产线亟需转型升级&#xff0c;为国内机器视觉市场释放出了惊人的机器视觉技术及产品需求。在自动化工业质量控制和在线检测领域&#xff0c;2D机器视觉与3D机器视觉都具有重要的作用。那在机器视觉自动化场景中该如何选择合适的机器视…

python 乘法口诀

下面是一个用Python打印乘法口诀表的代码&#xff1a; print("乘法口诀表:")for i in range(1, 10):for j in range(1, i1):print(f"{j} {i} {i*j}", end"\t")print()

Blazor前后端框架Known-V1.2.4

V1.2.4 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazor…

【图像处理】Python判断一张图像是否亮度过低,图片模糊判定

文章目录 亮度判断模糊判断 亮度判断 比如&#xff1a; 直方图&#xff1a; 代码&#xff1a; 这段代码是一个用于判断图像亮度是否过暗的函数is_dark&#xff0c;并对输入的图像进行可视化直方图展示。 首先&#xff0c;通过import语句导入了cv2和matplotlib.pyplot模块…

Element-Plus搭建CMS页面结构 引入第三方图标库iconfont(详细)

Element-Plus组件库使用 element plus组件库是由饿了么前端团队专门针对vue框架开发的组件库&#xff0c;专门用于电脑端网页的。因为里面集成了很多组件&#xff0c;所以使用他可以非常快速的帮我们实现网站的开发。 安装&#xff1a; npm install element-plus --save 引入…

jenkins 采用ssh方式连接gitlab连接不上

一、gitlab 添加jenkins服务器的公钥 jenkins 生成秘钥命令 ssh-keygen -t rsa2.jenkins 秘钥地址&#xff1a; cd /root/.ssh3.复制公钥 到gitlab 添加 cat id_rsa_pub4.添加私钥到jenkins cat id_rsa5.绑定&#xff08;顺利的话到这里就结束了&#xff09; &#xff0…