惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
Martin Fowler
Martin Fowler
MongoDB | Blog
MongoDB | Blog
博客园 - Franky
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Microsoft Security Blog
Microsoft Security Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园_首页
腾讯CDC
D
Docker
The Cloudflare Blog
量子位
爱范儿
爱范儿
L
LangChain Blog
博客园 - 三生石上(FineUI控件)
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏
Blog — PlanetScale
Blog — PlanetScale
Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
Vercel News
Vercel News
MyScale Blog
MyScale Blog

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录
光束平差法(Bundle Adjustment)
Yiwei Zhang · 2024-09-29 · via 又见苍岚

bundle adjustment, 中文名称是光束法平差,经典的BA目的是优化相机的pose和landmark,其在SfM和SLAM 领域中扮演者重要角色。本文记录相关内容。

简介

bundle adjustment,中文名称是光束法平差,经典的BA目的是优化相机的pose和landmark,其在SfM和SLAM 领域中扮演者重要角色.目前大多数书籍或者参老文献将其翻译成"捆绑调整"是不太严谨的做法.bundle adjustment 最早是19世纪由搞大地测量学(测绘学科)的人提出来的,19世纪中期的时候,geodetics的学者就开始研究large scale triangulations(大型三角剖分)。20世纪中期,随着camera和computer的出现,photogrammetry(摄影测量学)也开始研究adjustment computation,所以他们给起了个名字叫bundle adjustment(隶属摄影测量学科前辈的功劳)。21世纪前后,robotics领域开始兴起SLAM,最早用的recursive bayesian filter(递归贝叶斯滤波),后来把问题搞成个graph然后用least squares方法求解。

这些东西归根结底就是Gauss大神“发明”的least squares method(最小二乘法)。当年天文学家Piazzi整天闲得没事看星星,在1801年1月1号早上发现了一个从来没观测到的星星,再接下来的42天里做了19次观测之后这个星星就消失了。当时的天文学家为了确定这玩意到底是什么绞尽了脑汁,这时候Gauss出现了,(最初)只用了3个观察数据,就用least squares算出了这个小行星的轨道,接下来天文学家根据Gauss的预测,也重新发现了这个小行星(虽然有小小的偏差),并将其命名为Ceres,也就是谷神星。Google的ceres-solver就是根据这个来命名的。[ref: How Gauss Determined the Orbit of Ceres]

Bundle Adjustment

所谓bundle,来源于bundle of light,其本意就是指的光束,这些光束指的是三维空间中的点投影到像平面上的光束,而重投影误差正是利用这些光束来构建的,因此称为光束法,强调光束也正是描述其优化模型是如何建立的。剩下的就是平差,那什么是平差呢?

测量平差:由于测量仪器的精度不完善和人为因素及外界条件的影响,测量误差总是不可避免的。为了提高成果的质量,处理好这些测量中存在的误差问题,观测值的个数往往要多于确定未知量所必须观测的个数,也就是要进行多余观测。有了多余观测,势必在观测结果之间产生矛盾,测量平差的目的就在于消除这些矛盾而求得观测量的最可靠结果并评定测量成果的精度。测量平差采用的原理就是“最小二乘法”。

算法理论

观测值:像点坐标 优化量(平差量):pose 和landmark 因为一旦涉及平差,就必定有如下公式:观测值+观测值改正数=近似值+近似值改正数,那么bundle adjustment 的公式还是从共线条件方程出发:

优化函数(误差方程)如下,其中 $u_{ij}$ 是像点坐标,$C_j$ 是相机投影矩阵,$X_i$ 是三维点坐标:

$$ \min\sum_{i=1}^n\sum_{j=1}^m\left(u_{ij}-\pi(C_j,X_i)\right)^2 $$

更详细一点,将问题抽象为图模型,这个图模型的节点由相机 $P_0$ 和三维空间点构成 $X_j$ 构成,如果点 $X_j$ 投影到相机 $P_i$ 的图像上则将这两个节点连接起来。

令点$X_j$在相机$P_i$拍摄到的图像归一化坐标系上的坐标为$k(u_{ij}^T,1)^{^{\prime\prime}}=K_i^{-1}x_{ij}$,其重投影后的图像归一化坐标系下坐标 为$k^{\prime}(v_{ij}^T,1)^T=K_i^{-1}P_iX_j$,其中$K_i^{-1}$是为了在计算时能不受相机内参影响$k$和$k^{\prime}$是将齐次坐标转换为非齐次坐标的常数项,可以 得到该重投影误差为 $$ e_{ij}=\|u_{ij}-v_{ij}\| $$ BA 是要将所有重投影误差的和最小化,那么这里自然就要开始求和了。 $$ \min_{R_i,t_i,X_j}\sum_{i,j}\sigma_{ij}\|u_{ij}-v_{ij}\| $$ 其中当点$X_j$在相机$P_i$中有投影时$\sigma_{ij}=1$,否则为$\sigma_{ij}=0$。

非线性优化

可以使用各种优化算法来进行计算,BA现在基本都是利用LM(Levenberg-Marquardt)算法并在此基础上利用BA模型的稀疏性质来进行计算的,

LM算法是最速下降法(梯度下降法)和Gauss-Newton的结合体

参考资料

文章链接:
https://www.zywvvd.com/notes/3d/bundle-adjustment/bundle-adjustment/