当前位置: 首页 > news >正文

高翔博士slambook2 ch9 编译运行笔记

一、主要内容

ch9讲如何把多个相机位姿和大量三维地图点放在一起优化,使整体重投影误差最小。Bundle Adjustment,简称BA,光束法平差 / 捆集调整,是视觉SLAM和SFM中非常重要的后端优化方法。

在视觉SLAM中,通常有多个相机位姿、多个三维地图点、很多图像观测,这些数据一开始都是有误差的,因此用BA来同时调整相机位姿和三维地图点,使它们投影到图像上的位置尽量接近真实观测位置。

min Σ || u_observed - u_projected ||²

BA 是一个很大的非线性最小二乘问题。

二、安装依赖

下载 Ceres 2.1.0 + Eigen 3.3.7

最重要的放在最前面,我在编译ch9代码时掉坑里了,一直报错Eigen的版本号对不上,要求版本3.3.7,结果读出来是空值。

-- Found required Ceres dependency: absl version 20240116 in /usr/local/lib/cmake/absl CMake Error at CMakeLists.txt:11 (Find_Package): Found package configuration file: /usr/local/lib/cmake/Ceres/CeresConfig.cmake but it set Ceres_FOUND to FALSE so package "Ceres" is considered to be NOT FOUND. Reason given by package: Found Eigen dependency, but the version of Eigen found () does not exactly match the version of Eigen Ceres was compiled with (3.3.7). This can cause subtle bugs by triggering violations of the One Definition Rule. See the Wikipedia article http://en.wikipedia.org/wiki/One_Definition_Rule for more details

于是我apt重装了Eigen,fail。

于是我源码重装了Eigen,指定版本3.3.7,fail。(这里已经确定了Eigen版本正确,就是3.3.7)

cd ~/Desktop rm -rf eigen git clone https://gitlab.com/libeigen/eigen.git cd eigen git checkout 3.3.7 rm -rf build mkdir build cd build cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=/usr/local sudo make install #确认eigen版本 grep -R "EIGEN_WORLD_VERSION\|EIGEN_MAJOR_VERSION\|EIGEN_MINOR_VERSION" /usr/local/include/eigen3/Eigen/src/Core/util/Macros.h

报错如下

Found package configuration file: /usr/local/lib/cmake/Ceres/CeresConfig.cmake but it set Ceres_FOUND to FALSE so package "Ceres" is considered to be NOT FOUND. Reason given by package: Found Eigen dependency, but the version of Eigen found () does not exactly match the version of Eigen Ceres was compiled with (3.3.7). This can cause subtle bugs by triggering violations of the One Definition Rule. See the Wikipedia article http://en.wikipedia.org/wiki/One_Definition_Rule for more details -- Configuring incomplete, errors occurred!

找AI看了下,是因为Ceres是之前编译的,和当前的Eigen版本没有绑定,于是我重新编译了2.2.1版本的Ceres。

#安装依赖 sudo apt update sudo apt install -y build-essential cmake git sudo apt install -y libsuitesparse-dev sudo apt install -y libgoogle-glog-dev libgflags-dev cd ~/Desktop rm -rf ceres-solver #下载Ceres源码 + 指定版本2.1.0 git clone https://github.com/ceres-solver/ceres-solver.git cd ceres-solver git checkout 2.1.0 #用eigen3.3.7重新编译 rm -rf build mkdir build cd build cmake .. \ -DCMAKE_BUILD_TYPE=Release \ -DEigen3_DIR=/usr/local/eigen-3.3.7/share/eigen3/cmake \ -DCMAKE_PREFIX_PATH=/usr/local/eigen-3.3.7 \ -DBUILD_TESTING=OFF \ -DBUILD_EXAMPLES=OFF \ -DMINIGLOG=OFF \ -DCMAKE_INSTALL_PREFIX=/usr/local make -j$(nproc) sudo make install sudo ldconfig

三、编译代码

前面的依赖问题解决了以后,就可以开始编译ch9的代码了。

cd ~/Desktop/slambook2/ch9 rm -rf build mkdir build cd build cmake .. \ -DEigen3_DIR=/usr/local/eigen-3.3.7/share/eigen3/cmake \ -DCeres_DIR=/usr/local/lib/cmake/Ceres \ -DSophus_DIR=/usr/local/lib/cmake/Sophus \ -DCMAKE_PREFIX_PATH="/usr/local/eigen-3.3.7;/usr/local" make -j$(nproc)

编译结果如图:

四、运行实例

查看生成的exe文件

find . -type f -executable

结果如图:

4.1 运行Ceres BA

ch9程序的运行一般需要输入BAL数据集文件,在ch9文件夹下。

./bundle_adjustment_ceres ../problem-16-22106-pre.txt

运行结果如图

4.2 运行g2o BA

./bundle_adjustment_g2o ../problem-16-22106-pre.txt

运行结果如图

五、总结

ch9 开始进入SLAM后端优化,将前面的位姿、地图点、投影模型、优化方法全部结合起来,做全局或局部优化。

http://www.rkmt.cn/news/1452493.html

相关文章:

  • 人机交互设计指南:构建可信AI产品的四大核心原则与实战模式
  • 2026 深度测评|视频去水印软件实测对比,手机电脑热门工具全盘点
  • html零基础入门指南:用快马平台生成代码示例快速掌握标签语法
  • Visual Studio图像调试器开发指南:从原理到实现
  • 如何在10分钟内完成BepInEx游戏插件框架安装:完整指南
  • 保姆级教程:用yum downloadonly为银河麒麟V10 ARM系统制作Docker离线安装包
  • AI智能体与软考架构设计深层关联(4)
  • 3步解决城通网盘下载难题:ctfileGet直连地址获取终极指南
  • 局部可重构码:微软研究院如何将存储纠删码理论转化为多产品线实践
  • 从一道CTF逆向题出发,手把手教你用Z3-Solver写一个‘方程解析器’
  • 告别电脑束缚!用CW-Writer离线烧录器搞定CW32芯片量产,保姆级配置流程
  • 生物信息学新手必看:从Excel整理ID到批量下载NCBI数据的完整工作流
  • 告别手动部署!用WIX为你的.NET 7 WinForm程序打造一体化安装包(含.NET运行时自动检测)
  • Java实现的RSA文件加解密工具包,含源码、设计文档与答辩PPT
  • Xilinx FPGA上可直接综合的OFDM基带通信全链路工程(含16QAM与维特比译码)
  • 用快马平台快速构建账号管理演示原型,探索自动化流程设计
  • 新建工厂选倍速链线还是柔性生产线?
  • 保姆级教程:用Python和OpenCV搞定Cityscapes数据集预处理(从下载到512x1024裁剪)
  • 舟山家庭教育指导师报名入口:怎么报名怎么考?授权机构:中山优才教育 - 实时教育培训动态
  • 金融系统真正缺的不是更多审批,而是可被约束的最终执行权
  • WSL2下CUDA版本切换踩坑记:从12.0降级到11.1,成功安装diff-gaussian-rasterization
  • 从配置文件到爬虫数据:手把手教你用Python的ast.literal_eval处理5种奇葩字符串格式
  • 告别Visual Studio的臃肿:用VSCode + .NET 8快速搭建轻量级C#开发环境(附Code Runner一键运行配置)
  • Kaizen:Windows上免装Java的Elasticsearch轻量管理工具(绿色便携)
  • Bili2text:一站式B站视频转文字解决方案,高效提取视频内容价值
  • 告别盲盒生成!用PyTorch实战cGAN/ACGAN,手把手教你生成指定数字的MNIST图片
  • C#写的Modbus RTU串口调试小工具,发指令自动加CRC校验码
  • 别只盯着PSNR!从MIMO-UNet到DeepRFT,我这样拆解和‘魔改’残差模块
  • 亚马逊云科技全面发力 Agentic AI:从桌面助手到垂直场景,联手 OpenAI 重构企业生产力
  • 别再滥用eval了!Python安全解析字符串的‘守护神’ast.literal_eval保姆级教程