ICP-通过一组匹配的3D点估计相机运动

问题描述

假设有两组已匹配的3D点:

  • 源点云 { p i ∈ R 3 } i = 1 N \{ \mathbf{p}_i \in \mathbb{R}^3 \}_{i=1}^N {piR3}i=1N
  • 目标点云 { q i ∈ R 3 } i = 1 N \{ \mathbf{q}_i \in \mathbb{R}^3 \}_{i=1}^N {qiR3}i=1N

目标是求解刚体变换旋转矩阵 R ∈ SO ( 3 ) \mathbf{R} \in \text{SO}(3) RSO(3) 和平移向量 t ∈ R 3 \mathbf{t} \in \mathbb{R}^3 tR3,使得变换后的源点云与目标点云对齐,即最小化以下目标函数:
min ⁡ R , t ∑ i = 1 N ∥ R p i + t − q i ∥ 2 . \min_{\mathbf{R}, \mathbf{t}} \sum_{i=1}^N \left\| \mathbf{R} \mathbf{p}_i + \mathbf{t} - \mathbf{q}_i \right\|^2. R,tmini=1NRpi+tqi2.

SVD方法

分析计算

1. 去中心化与平移向量的求解

首先计算两组点的质心:
μ p = 1 N ∑ i = 1 N p i , μ q = 1 N ∑ i = 1 N q i . \boldsymbol{\mu}_p = \frac{1}{N} \sum_{i=1}^N \mathbf{p}_i, \quad \boldsymbol{\mu}_q = \frac{1}{N} \sum_{i=1}^N \mathbf{q}_i. μp=N1i=1Npi,μq=N1i=1Nqi.
将每个点减去质心,得到去中心化的坐标:
x i = p i − μ p , y i = q i − μ q . \mathbf{x}_i = \mathbf{p}_i - \boldsymbol{\mu}_p, \quad \mathbf{y}_i = \mathbf{q}_i - \boldsymbol{\mu}_q. xi=piμp,yi=qiμq.
此时,目标函数可简化为:
min ⁡ R , t ∑ i = 1 N ∥ R x i − y i + ( t − μ q + R μ p ) ∥ 2 . \min_{\mathbf{R}, \mathbf{t}} \sum_{i=1}^N \left\| \mathbf{R} \mathbf{x}_i - \mathbf{y}_i + (\mathbf{t} - \boldsymbol{\mu}_q + \mathbf{R} \boldsymbol{\mu}_p) \right\|^2. R,tmini=1N Rxiyi+(tμq+Rμp) 2.
令括号内项为零,可得平移向量的最优解:
t = μ q − R μ p . \mathbf{t} = \boldsymbol{\mu}_q - \mathbf{R} \boldsymbol{\mu}_p. t=μqRμp.
代入后,优化问题简化为仅关于旋转矩阵 R \mathbf{R} R 的最小化问题:
min ⁡ R ∑ i = 1 N ∥ R x i − y i ∥ 2 . \min_{\mathbf{R}} \sum_{i=1}^N \left\| \mathbf{R} \mathbf{x}_i - \mathbf{y}_i \right\|^2. Rmini=1NRxiyi2.


2. 目标函数的展开与迹形式转换

展开平方误差:
∑ i = 1 N ∥ R x i − y i ∥ 2 = ∑ i = 1 N ( R x i − y i ) ⊤ ( R x i − y i ) . \sum_{i=1}^N \left\| \mathbf{R} \mathbf{x}_i - \mathbf{y}_i \right\|^2 = \sum_{i=1}^N \left( \mathbf{R} \mathbf{x}_i - \mathbf{y}_i \right)^\top \left( \mathbf{R} \mathbf{x}_i - \mathbf{y}_i \right). i=1NRxiyi2=i=1N(Rxiyi)(Rxiyi).
进一步展开并利用迹的线性性质:
= ∑ i = 1 N ( x i ⊤ R ⊤ R x i − 2 y i ⊤ R x i + y i ⊤ y i ) . = \sum_{i=1}^N \left( \mathbf{x}_i^\top \mathbf{R}^\top \mathbf{R} \mathbf{x}_i - 2 \mathbf{y}_i^\top \mathbf{R} \mathbf{x}_i + \mathbf{y}_i^\top \mathbf{y}_i \right). =i=1N(xiRRxi2yiRxi+yiyi).
由于 R ⊤ R = I \mathbf{R}^\top \mathbf{R} = \mathbf{I} RR=I,第一项简化为 x i ⊤ x i \mathbf{x}_i^\top \mathbf{x}_i xixi,与 R \mathbf{R} R 无关。优化问题等价于最大化交叉项:
max ⁡ R ∑ i = 1 N y i ⊤ R x i = max ⁡ R tr ( R ⊤ ∑ i = 1 N y i x i ⊤ ) . \max_{\mathbf{R}} \sum_{i=1}^N \mathbf{y}_i^\top \mathbf{R} \mathbf{x}_i = \max_{\mathbf{R}} \text{tr}\left( \mathbf{R}^\top \sum_{i=1}^N \mathbf{y}_i \mathbf{x}_i^\top \right). Rmaxi=1NyiRxi=Rmaxtr(Ri=1Nyixi).
定义协方差矩阵:
H = ∑ i = 1 N y i x i ⊤ . \mathbf{H} = \sum_{i=1}^N \mathbf{y}_i \mathbf{x}_i^\top. H=i=1Nyixi.


3. 通过SVD求解旋转矩阵

对协方差矩阵 H \mathbf{H} H 进行奇异值分解(SVD):
H = U Σ V ⊤ . \mathbf{H} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^\top. H=V.
目标函数可写为:
tr ( R ⊤ H ) = tr ( R ⊤ U Σ V ⊤ ) . \text{tr}(\mathbf{R}^\top \mathbf{H}) = \text{tr}(\mathbf{R}^\top \mathbf{U} \mathbf{\Sigma} \mathbf{V}^\top). tr(RH)=tr(RV).
利用迹的循环置换性质 ( tr ( A B C ) = tr ( B C A ) (\text{tr}(ABC) = \text{tr}(BCA) (tr(ABC)=tr(BCA),可重写为:
tr ( V ⊤ R ⊤ U Σ ) . \text{tr}(\mathbf{V}^\top \mathbf{R}^\top \mathbf{U} \mathbf{\Sigma}). tr(VR).
M = V ⊤ R ⊤ U \mathbf{M} = \mathbf{V}^\top \mathbf{R}^\top \mathbf{U} M=VRU,则目标函数简化为:
tr ( M Σ ) . \text{tr}(\mathbf{M} \mathbf{\Sigma}). tr().
由于 M \mathbf{M} M 是正交矩阵 ( M ⊤ M = I (\mathbf{M}^\top \mathbf{M} = \mathbf{I} (MM=I),其对角线元素绝对值不超过1。为了使 tr ( M Σ ) \text{tr}(\mathbf{M} \mathbf{\Sigma}) tr() 最大,需使 M \mathbf{M} M的对角线元素尽可能大。 M = I \mathbf{M} = \mathbf{I} M=I,迹达到最大值 tr ( Σ ) \text{tr}(\mathbf{\Sigma}) tr(Σ),即:
M = I ⟹ V ⊤ R ⊤ U = I . \mathbf{M} = \mathbf{I} \implies \mathbf{V}^\top \mathbf{R}^\top \mathbf{U} = \mathbf{I}. M=IVRU=I.
解得旋转矩阵:
R ⊤ = V U ⊤ ⟹ R = U V ⊤ . \mathbf{R}^\top = \mathbf{V} \mathbf{U}^\top \implies \mathbf{R} = \mathbf{U} \mathbf{V}^\top. R=VUR=UV.

验证行列式

  • det ⁡ ( R ) = 1 \det(\mathbf{R}) = 1 det(R)=1,解有效。
  • det ⁡ ( R ) = − 1 \det(\mathbf{R}) = -1 det(R)=1(存在反射),需修正为:
    R = V [ 1 0 0 0 1 0 0 0 − 1 ] U ⊤ . \mathbf{R} = \mathbf{V} \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & -1 \end{bmatrix} \mathbf{U}^\top. R=V 100010001 U.
4. 迭代优化(可选)

若点对匹配不完美或存在噪声,可多次迭代:

  1. 用当前 R , t \mathbf{R}, \mathbf{t} R,t 变换源点云: p i ′ = R p i + t \mathbf{p}'_i = \mathbf{R} \mathbf{p}_i + \mathbf{t} pi=Rpi+t
  2. 重新计算误差并更新变换,直至收敛。

5. 公式总结
  1. 质心计算
    μ p = 1 N ∑ i = 1 N p i , μ q = 1 N ∑ i = 1 N q i . \boldsymbol{\mu}_p = \frac{1}{N} \sum_{i=1}^N \mathbf{p}_i, \quad \boldsymbol{\mu}_q = \frac{1}{N} \sum_{i=1}^N \mathbf{q}_i. μp=N1i=1Npi,μq=N1i=1Nqi.
  2. 协方差矩阵
    H = ∑ i = 1 N ( q i − μ q ) ( p i − μ p ) ⊤ . \mathbf{H} = \sum_{i=1}^N (\mathbf{q}_i - \boldsymbol{\mu}_q)(\mathbf{p}_i - \boldsymbol{\mu}_p)^\top. H=i=1N(qiμq)(piμp).
  3. SVD分解与旋转矩阵
    H = U Σ V ⊤ , R = V U ⊤ ( 确保 det ⁡ ( R ) = 1 ) . \mathbf{H} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^\top, \quad \mathbf{R} = \mathbf{V} \mathbf{U}^\top \quad (\text{确保} \det(\mathbf{R}) = 1). H=V,R=VU(确保det(R)=1).
  4. 平移向量
    t = μ q − R μ p . \mathbf{t} = \boldsymbol{\mu}_q - \mathbf{R} \boldsymbol{\mu}_p. t=μqRμp.

几何解释

通过SVD分解,协方差矩阵 H \mathbf{H} H 的奇异向量反映了点云之间的主要对齐方向。最优旋转矩阵 R \mathbf{R} R 通过最大化点对之间的协方差,使得变换后的源点云与目标点云在最小二乘意义下对齐。平移向量 t \mathbf{t} t 则通过质心差校正整体偏移。


算法步骤总结

  1. 去中心化:计算质心并减去,得到 x i \mathbf{x}_i xi y i \mathbf{y}_i yi
  2. 构建协方差矩阵 H = ∑ y i x i ⊤ \mathbf{H} = \sum \mathbf{y}_i \mathbf{x}_i^\top H=yixi
  3. SVD分解 H = U Σ V ⊤ \mathbf{H} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^\top H=V
  4. 求解旋转矩阵 R = V U ⊤ \mathbf{R} = \mathbf{V} \mathbf{U}^\top R=VU,调整行列式。
  5. 计算平移向量 t = μ q − R μ p \mathbf{t} = \boldsymbol{\mu}_q - \mathbf{R} \boldsymbol{\mu}_p t=μqRμp

代码示例(Python)

import numpy as npdef solve_icp(source_points, target_points):# 输入:source_points (n×3), target_points (n×3)# 输出:R (3×3), t (3×1)# 计算质心mu_p = np.mean(source_points, axis=0)mu_q = np.mean(target_points, axis=0)# 去中心化X = source_points - mu_pY = target_points - mu_q# 协方差矩阵H = X.T @ Y# SVD分解U, S, Vt = np.linalg.svd(H)# 计算旋转矩阵R = Vt.T @ U.T# 处理反射情况if np.linalg.det(R) < 0:Vt[-1, :] *= -1R = Vt.T @ U.T# 计算平移向量t = mu_q - R @ mu_preturn R, t# 示例数据
source = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
target = np.array([[2, 3, 4], [5, 6, 7], [8, 9, 10]])R, t = solve_icp(source, target)
print("Rotation Matrix:\n", R)
print("Translation Vector:\n", t)

关键点

  1. 闭式解:通过SVD直接求解最优变换,无需迭代(适用于精确匹配)。
  2. 反射问题:需检查 det ⁡ ( R ) \det(\mathbf{R}) det(R),避免反射变换。
  3. 迭代优化:若存在噪声或匹配误差,需多次迭代优化。

通过上述步骤,可高效求解已知匹配3D点对的刚体变换,适用于点云配准、物体位姿估计等场景。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 入门 (超级详细)

一、什么是Java Java是一种高级编程语言&#xff0c;由Sun Microsystems公司于1995年推出。Java具有跨平台性、面向对象、健壮性、安全性、可移植性等特点&#xff0c;被广泛应用于企业级应用开发、移动应用开发、大数据处理、云计算等领域。Java程序可以在不同的操作系统上运…

02_NLP文本预处理之文本张量表示法

文本张量表示法 概念 将文本使用张量进行表示,一般将词汇表示为向量,称为词向量,再由各个词向量按顺序组成矩阵形成文本表示 例如: ["人生", "该", "如何", "起头"]># 每个词对应矩阵中的一个向量 [[1.32, 4,32, 0,32, 5.2],[3…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.4.2内存与磁盘配置陷阱

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 Elasticsearch内存与磁盘配置深度避坑指南1. 内存管理核心原理1.1 内存分配矩阵1.2 内存压力预警线 2. 堆内存配置陷阱解析2.1 错误配置案例2.2 正确配置公式2.3 堆内存与分…

每日一题-奶酪题(蓝桥杯)【模拟】

题目要求 题目思路 假设有一个立方体奶酪&#xff0c;N2 1✖1✖N的奶酪块有3种&#xff08;x方向&#xff0c;y方向&#xff0c;z方向&#xff09; 如果x方向上想放 1✖1✖N的奶酪块&#xff0c;需要x方向上的有连续n个奶酪块被切走。同理&#xff0c;y方向和z方向也一样 …

git详细使用教程

文章目录 一、 git介绍与安装1、git介绍2、git的安装3、git使用前的说明 二、git的基础使用1、走进git之前2、git基础使用1、git init 项目初始化&#xff08;init&#xff09;成仓库&#xff08;repository&#xff09;2、git add 管理文件3、git commit 把文件提交到仓库&…

iOS接入Flutter项目

首先要把iOS项目和flutter项目统一目录下&#xff0c;而且需要注意的是flutter是module。 第一步&#xff1a;Flutter相关内容的创建 module创建命令&#xff1a; flutter create --templatemodule my_flutter&#xff0c;之后再执行 flutter pub get flutter build ios …

SEKI —— 基于大型语言模型的自进化与知识启发式神经架构搜索

01、项目概述 我们引入了一种基于新型大型语言模型&#xff08; LLM &#xff09;的神经架构搜索&#xff08; NAS &#xff09;方法&#xff0c;名为 SEKI 。SEKI 受到现代 LLM 中思维链&#xff08; CoT &#xff09;范式的启发&#xff0c;分为两个关键阶段运行&#xff1a…

【现代深度学习技术】卷积神经网络03:填充和步幅

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…

探秘基带算法:从原理到5G时代的通信变革【一】引言

文章目录 一、引言1.1 研究背景与意义1.2 研究目的与方法1.3 研究内容与创新点 本博客为系列博客&#xff0c;主要讲解各基带算法的原理与应用&#xff0c;包括&#xff1a;viterbi解码、Turbo编解码、Polar编解码、CORDIC算法、CRC校验、FFT/DFT、QAMtiaozhi/解调、QPSK调制/解…

Free Auto Clicker - 在任意位置自动重复鼠标点击

“想让鼠标自己动起来&#xff0c;解放双手去做更有趣的事&#xff1f;”Free Auto Clicker 就像你的数字小助手&#xff0c;能在任意位置自动重复点击鼠标。从玩游戏到刷网页&#xff0c;这款免费工具让你告别枯燥的重复操作&#xff0c;效率瞬间起飞&#xff01; 你有没有想…

【SQL】MySQL中的字符串处理函数:concat 函数拼接字符串,COALESCE函数处理NULL字符串

MySQL中的字符串处理函数&#xff1a;concat 函数 一、concat &#xff08;&#xff09;函数 1.1、基本语法1.2、示例1.3、特殊用途 二、COALESCE&#xff08;&#xff09;函数 2.1、基本语法2.2、示例2.3、用途 三、进阶练习 3.1 条件和 SQL 语句3.2、解释 一、concat &…

蓝桥杯web第三天

展开扇子题目&#xff0c; #box:hover #item1 { transform:rotate(-60deg); } 当悬浮在父盒子&#xff0c;子元素旋转 webkit display: -webkit-box&#xff1a;将元素设置为弹性伸缩盒子模型。-webkit-box-orient: vertical&#xff1a;设置伸缩盒子的子元素排列方…

VSCode知名主题带毒 安装量900万次

目前微软已经从 Visual Studio Marketplace 中删除非常流行的主题扩展 Material Theme Free 和 Material Theme Icons&#xff0c;微软称这些主题扩展包含恶意代码。 统计显示这些扩展程序的安装总次数近 900 万次&#xff0c;在微软实施删除后现在已安装这些扩展的开发者也会…

离散傅里叶变换(Discrete Fourier Transform, DFT)及其在图像处理中的应用

离散傅里叶变换&#xff08;DFT&#xff09;及其在图像处理中的应用 什么是离散傅里叶变换&#xff1f; 离散傅里叶变换&#xff08;Discrete Fourier Transform, DFT&#xff09;是一种强大的数学工具&#xff0c;用于将离散信号从时域&#xff08;或空间域&#xff09;转换…

金融支付行业技术侧重点

1. 合规问题 第三方支付系统的平稳运营&#xff0c;严格遵循《非银行支付机构监督管理条例》的各项条款是基础与前提&#xff0c;其中第十八条的规定堪称重中之重&#xff0c;是支付机构必须牢牢把握的关键准则。 第十八条明确指出&#xff0c;非银行支付机构需构建起必要且独…

JavaWeb-jdk17安装

下载jdk17 地址&#xff1a;https://www.oracle.com/java/technologies/downloads/#jdk17-windows 安装jdk 配置环境变量 右键点击我的电脑>属性>高级系统设置>环境变量 在系统变量Path变量中添加 测试 java -version javac -version

java后端开发day24--阶段项目(一)

&#xff08;以下内容全部来自上述课程&#xff09; GUI&#xff1a;Graphical User Interface 图形用户接口&#xff0c;采取图形化的方式显示操作界面 分为两套体系&#xff1a;AWT包&#xff08;有兼容问题&#xff09;和Swing包&#xff08;常用&#xff09; 拼图小游戏…

[Web 安全] PHP 反序列化漏洞 —— PHP 魔术方法

关注这个专栏的其他相关笔记&#xff1a;[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客 PHP 魔术方法 - 简介 - PHP 魔术方法 - 简单教程&#xff0c;简单编程PHP 中&#xff0c;以两个下划线 ( __ ) 开头方法称之为 「 魔术方法 」 这些 「 魔术方法 」 在 [PHP](/l/yufei/php…

【音视频】音频基础

一、音频基础 1.1 声音的物理性质 ——振动 声音是一种由物体振动引发的物理现象&#xff0c;如小提琴的弦声等。物体的振动使其四周空气的压强产生变化&#xff0c;这种忽强忽弱变化以波的形式向四周传播&#xff0c;当被人耳所接收时&#xff0c;我们就听见了声音。 1.2 声…

Hive-04之存储格式、SerDe、企业级调优

一、主题 hive表的数据压缩和文件存储格式hive的自定义UDF函数hive的JDBC代码操作hive的SerDe介绍和使用hive的优化 二、要点 1. hive表的文件存储格式 Hive支持的存储数的格式主要有&#xff1a;TEXTFILE&#xff08;行式存储&#xff09; 、SEQUENCEFILE(行式存储)、ORC&…