【C++】开源:ceres和g2o非线性优化库配置使用

😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
这篇文章主要介绍ceres和g2o非线性优化库配置使用。
无专精则不能成,无涉猎则不能通。——梁启超
欢迎来到我的博客,一起学习,共同进步。
喜欢的朋友可以关注一下,下次更新不迷路🥞

文章目录

    • :smirk:1. 项目介绍
    • :blush:2. 环境配置
    • :satisfied:3. 使用说明

😏1. 项目介绍

ceres项目Github地址:https://github.com/ceres-solver/ceres-solver

ceres项目Github地址:https://github.com/RainerKuemmerle/g2o

Ceres Solver和g2o都是用于求解非线性最小二乘问题的C++库,主要用于图优化等领域。它们有一些共同点,但也有一些区别。

Ceres Solver:

  • Ceres Solver是一个功能强大的C++库,专门用于求解大规模稀疏和稠密非线性最小二乘问题。
  • 它支持各种类型的误差函数,如光束法平差、非线性回归、SLAM、视觉定位等。
  • Ceres Solver提供了多种优化算法,包括LM(Levenberg-Marquardt)、GN(Gauss-Newton)等,并且可根据问题特点进行自定义优化策略。
  • 它具有灵活的接口和标准化的问题表示方式,可以轻松地与其他库进行集成。
  • Ceres Solver支持自动求导,可以通过使用用户提供的误差函数的解析梯度或数值微分来计算导数。
  • Ceres Solver是开源的,遵循BSD许可证。

g2o:

  • g2o是一个通用的C++库,用于求解图优化问题,例如视觉SLAM、3D重建、机器人运动估计等。
  • g2o支持稀疏矩阵和滤波器算法,并提供了灵活的接口和模块化设计。
  • 它支持多种顶点和边类型,并允许用户自定义顶点、边类型和优化策略。
  • g2o提供了多种优化算法,如GN(Gauss-Newton)、LM(Levenberg-Marquardt)等。
  • g2o也是开源的,遵循BSD许可证。

Ceres Solver和g2o在SLAM、机器人运动估计等领域得到了广泛应用。

😊2. 环境配置

下面进行环境配置:

ceres:

# 安装依赖
sudo apt install cmake libgoogle-glog-dev libgflags-dev libatlas-base-dev libsuitesparse-dev -y
# ceres-1.14
wget ceres-solver.org/ceres-solver-1.14.0.tar.gz
tar -zxvf ceres-solver-1.14.0.tar.gz
cd ceres-solver-1.14.0
mkdir build && cd build
cmake .. && make
sudo make install

g2o:

# 安装依赖
sudo apt-get install libeigen3-dev libsuitesparse-dev qt5-qmake libqglviewer-dev-qt5
git clone https://github.com/RainerKuemmerle/g2o.git
cd g2o
mkdir build && cd build
cmake .. && make
sudo make install

😆3. 使用说明

下面进行使用分析:

ceres:

构建代价函数Cost_Functor:

// 定义一个实例化时才知道的类型T
template <typename T>

// 运算符()的重载,用来得到残差fi
bool operator()(const T* const x, T* residual) const {
     residual[0] = T(10.0) - x[0];
     return true;
   }

构建最小二乘问题problem:

Problem problem;
CostFunction* cost_function = new AutoDiffCostFunction<CostFunctor, 1, 1>(new CostFunctor);
problem.AddResidualBlock(cost_function, NULL, &x);

求解器参数配置Solver:

Solver::Options options;
options.linear_solver_type = ceres::DENSE_QR;
options.minimizer_progress_to_stdout = true;
Solver::Summary summary;
Solve(options, &problem, &summary);
cout << summary.BriefReport() << "\n";//输出优化的简要信息

用Ceres Solver库解决一个简单的非线性最小二乘问题示例:

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

// 代价函数类定义
struct CostFunctor {
  template <typename T>
  bool operator()(const T* const x, T* residual) const {
    // 定义目标函数:f(x) = 10 - x
    residual[0] = T(10.0) - x[0];
    return true;
  }
};

int main(int argc, char** argv) {
  // 初始化问题
  ceres::Problem problem;

  // 添加一个残差块
  double initial_x = 5.0;  // 初始值
  ceres::CostFunction* cost_function =
      new ceres::AutoDiffCostFunction<CostFunctor, 1, 1>(new CostFunctor);
  problem.AddResidualBlock(cost_function, nullptr, &initial_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 << "Final x = " << initial_x << "\n";

  return 0;
}

在这里插入图片描述

以上。

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

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

相关文章

极客教程 scrapy和selenium

selenium 极客教程 使用python 调用scrapy的 爬虫Spider并且相互之间可以正常传参实现全局 常规情况创建&#xff0c;使用命令 scrapy genspider baidu "baidu.com"Python中Scrapy框架详解 浏览器调试模式下&#xff08;F12 或 右键检查&#xff09;Command sh…

linux 下 网卡命名改名

Linux 操作系统的网卡设备的传统命名方式是 eth0、eth1、eth2等&#xff0c;而 CentOS7 提供了不同的命名规则&#xff0c;默认是网卡命名会根据网卡的硬件信息&#xff0c;插槽位置等有关&#xff1b;来分配。这样做的优点是命名全自动的、可预知的&#xff0c;缺点是比 eth0、…

【数学】CF1514 C

Problem - 1514C - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>using i64 long long;constexpr int N 2e5 10; constexpr int M 2e5 10; constexpr int mod 998244353;void solve() {int n;std::cin >> n;std:…

基于SpringBoot+Vue的地方美食分享网站设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Tailwind CSS:简洁高效的工具,提升前端开发体验

112. Tailwind CSS&#xff1a;简洁高效的工具&#xff0c;提升前端开发体验 1. 什么是Tailwind CSS&#xff1f; Tailwind CSS是由Adam Wathan、Jonathan Reinink、David Hemphill和Steve Schoger等人共同创建的一种现代CSS框架。与传统的CSS框架不同&#xff0c;Tailwind CS…

OpenEuler 上安装redis服务

访问redis的下载地址 Index of /releases/地址&#xff1a;Index of /releases/ 选择对应的版本。我选择5.0的版本。 下载对应的版本redis wget https://download.redis.io/releases/redis-5.0.8.tar.gz 解压 redis tar -zxvf redis-5.0.9.tar.gz 进入redis目录 cd redis-5…

[git] git基础知识

git是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的各种项目 git易于学习&#xff0c;性能极快 什么是版本控制&#xff1f; 版本控制是一种记录文件内容变化&#xff0c;以便将来查阅特定版本修订情况&#xff0c;可以记录文件修改历史…

React 全栈体系(一)

第一章 React入门 一、React简介 1. 是什么&#xff1f; 是一个将数据渲染为HTML视图的开源JavaScript库。 2. 谁开发的&#xff1f; 由Facebook开源 3. 为什么要学&#xff1f; 原生JavaScript操作DOM繁琐&#xff0c;效率低&#xff08;DOM-API 操作 UI&#xff09; 使…

竞赛项目 深度学习图像风格迁移 - opencv python

文章目录 0 前言1 VGG网络2 风格迁移3 内容损失4 风格损失5 主代码实现6 迁移模型实现7 效果展示8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习图像风格迁移 - opencv python 该项目较为新颖&#xff0c;适合作为竞赛课题…

消息中间件 Asio (C++)

折腾了一上午&#xff0c;看到这个结果的时候泪目了兄弟闷&#xff0c;讲真。我的asio客户端成功收到服务端发来的消息了。虽然这确实是极其智障又简单的入门哈哈 下载独立版本 asio网络通信库新建cmake工程&#xff0c;CMakeLists.txt加载asioasio最简单的服务端和客户端代码…

echarts 横向柱状图

<template><div ref"chart" style"height: 100%"></div> </template><script> import * as echarts from "echarts"; var cate ["质量通病1", "质量通病2", "质量通病3", "质…

【C++】static_cast基本用法(详细讲解)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Kotlin~Mediator中介者模式

概念 创建一个中介来降低对象之间的耦合度&#xff0c;关系”多对多“变为“一对多”。 角色介绍 Mediator&#xff1a;抽象中介者&#xff0c;接口或者抽象类。ConcreteMediator&#xff1a;中介者具体实现&#xff0c;实现中介者接口&#xff0c;定义一个List管理Colleagu…

【前端】CSS垂直居中的7种方法

文章目录 line-height绝对定位margin:autoflex绝对定位margin:负值定位transformvertical-align:middledisplay:table-cell思维导图 前文&#xff1a;【前端】CSS水平居中的6种方法_karshey的博客-CSDN博客 有很多相似的部分。 line-height 适用于单行的行内元素设置line-he…

uniapp 左右滑动切换页面并切换tab

实现效果如图 要实现底部内部的左右滑动切换带动上方tab栏的切换&#xff0c;并且下方内容要实现纵向滚动 &#xff0c;所以需要swiper&#xff0c;swiper-item,scroll-view组合使用 tab栏部分 <view class"tabs"><view class"tab_item" v-for&…

由于找不到msvcp100.dll无法继续执行代码怎么解决

当遇到程序无法正常运行&#xff0c;提示缺少msvcp100.dll文件时&#xff0c;最初的反应可能是困惑和不知所措。然而&#xff0c;通过修复msvcp100.dll文件&#xff0c;我发现这个问题实际上并不复杂&#xff0c;并且可以通过一些简单的步骤解决。 在修复msvcp100.dll文件的时候…

【FAQ】视频监控EasyCVR平台登录密码忘记?如何通过navicat连接数据库进行修改?

TSINGSEE青犀视频监控管理平台EasyCVR可以根据不同的应用场景需求&#xff0c;让平台在内网、专网、VPN、广域网、互联网等各种环境下进行音视频的采集、接入与多端分发。在视频能力上&#xff0c;平台可实现视频实时直播、云端录像、云存储、回放与检索、告警上报、视频快照、…

DAY02_Spring—第三方资源配置管理Spring容器Spring注解开发Spring整合Mybatis和Junit

目录 一 第三方资源配置管理1 管理DataSource连接池对象问题导入1.1 管理Druid连接池1.2 管理c3p0连接池 2 加载properties属性文件问题导入2.1 基本用法2.2 配置不加载系统属性2.3 加载properties文件写法 二 Spring容器1 Spring核心容器介绍问题导入1.1 创建容器1.2 获取bean…

REDIS集群

目录 前言 一、概述 二、架构细节 三、选举过程 四、搭建 前言 Redis集群是指将多个Redis节点组成一个集群&#xff0c;通过节点间的数据分布和协调来提供高可用性和性能的数据库解决方案。每个节点可以存储数据&#xff0c;处理请求&#xff0c;并与其他节点进行通信&#xff…

RestTemplate 请求转发异常 ERR_CONTENT_DECODING_FAILED 200 (OK)

#1 问题描述 在基于Spring Boot的项目中实现了请求转发&#xff08;使用 RestTemplate 的 exchange 方法&#xff09;的功能&#xff0c;忽然在前端报net::ERR_CONTENT_DECODING_FAILED 200 (OK)的错误&#xff0c;后端及上游系统日志均显示请求已完成。 #2 原因探寻 上述错…