罗德里格斯公式的推导过程

2023-10-07 19:40

本文主要是介绍罗德里格斯公式的推导过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在学高翔博士的《视觉SLAM十四讲》,看到第三章中的课后题中要求理解罗德里格斯公式的推导过程,所以在CSDN上搜了一篇文章,原文链接http://blog.csdn.net/q583956932/article/details/78933245

原文写的十分精湛,大家可以直接看原文就好了,

以下是我在看这篇文章时所需要巩固的知识点(现在是大三狗,早把大一的知识点忘了。。。)

点积(来自维基百科):

        是两个向量上的函數并返回一个标量的二元运算,它的结果是欧几里得空间的标准内积。兩個向量的点积寫作a·b数量积标量积。

代数定义:

两个向量 a → {\displaystyle {\vec {a}}} \vec{a} = [a1, a2,…, an]和 b → {\displaystyle {\vec {b}}} \vec{b} = [b1, b2,…, bn]的点积定义为:

a → ⋅ b → = ∑ i = 1 n a i b i = a 1 b 1 + a 2 b 2 + ⋯ + a n b n {\displaystyle {\vec {a}}\cdot {\vec {b}}=\sum _{i=1}^{n}a_{i}b_{i}=a_{1}b_{1}+a_{2}b_{2}+\cdots +a_{n}b_{n}} \vec{a}\cdot \vec{b} = \sum_{i=1}^n a_ib_i = a_1b_1 + a_2b_2 + \cdots + a_nb_n

这裡的Σ是求和符号,而n是向量空間的維數。

例如,两个三维向量[1, 3, -5]和[4, -2, -1]的点积是

  [ 1 , 3 , − 5 ] ⋅ [ 4 , − 2 , − 1 ] = ( 1 ) ( 4 ) + ( 3 ) ( − 2 ) + ( − 5 ) ( − 1 ) = 4 − 6 + 5 = 3 {\displaystyle {\begin{aligned}\ [1,3,-5]\cdot [4,-2,-1]&=(1)(4)+(3)(-2)+(-5)(-1)\\&=4-6+5\\&=3\end{aligned}}} {\displaystyle {\begin{aligned}\ [1,3,-5]\cdot [4,-2,-1]&=(1)(4)+(3)(-2)+(-5)(-1)\\&=4-6+5\\&=3\end{aligned}}}

点积还可以写为:

a → ⋅ b → = | a → b → T | {\displaystyle {\vec {a}}\cdot {\vec {b}}=|{\vec {a}}{\vec {b}}^{T}|} {\displaystyle {\vec {a}}\cdot {\vec {b}}=|{\vec {a}}{\vec {b}}^{T}|}

这裡, b → T {\displaystyle {\vec {b}}^{T}} {\displaystyle {\vec {b}}^{T}}是行向量 b → {\displaystyle {\vec {b}}} \vec{b}的转置,而 | a → b → T | {\displaystyle |{\vec {a}}{\vec {b}}^{T}|} {\displaystyle |{\vec {a}}{\vec {b}}^{T}|} a → b → T {\displaystyle {\vec {a}}{\vec {b}}^{T}} {\displaystyle {\vec {a}}{\vec {b}}^{T}}的行列式。使用上面的例子,一个1×3矩阵(行向量)乘以一个3×1矩阵(列向量)的行列式就是结果(通过矩阵乘法得到1×1矩阵,再利用行列式得出純量答案):

| [ 1 3 − 5 ] [ 4 − 2 − 1 ] T | = | 3 | = 3 {\displaystyle |{\begin{bmatrix}1&3&-5\end{bmatrix}}{\begin{bmatrix}4&-2&-1\end{bmatrix}}^{T}|=|3|=3} {\displaystyle |{\begin{bmatrix}1&3&-5\end{bmatrix}}{\begin{bmatrix}4&-2&-1\end{bmatrix}}^{T}|=|3|=3}

几何定义:

在欧几里得空间中,点积可以直观地定义为

a → ⋅ b → = | a → | | b → | cos ⁡ θ {\displaystyle {\vec {a}}\cdot {\vec {b}}=|{\vec {a}}|\,|{\vec {b}}|\cos \theta \;}  \vec{a} \cdot \vec{b} = |\vec{a}| \, |\vec{b}| \cos \theta \;

这里 | x → {\displaystyle {\vec {x}}} \vec{x}| 表示 x → {\displaystyle {\vec {x}}} \vec{x}的模(长度),θ表示两个向量之间的角度。注意:点积的形式定义和这个定义不同;在形式定义中, a → {\displaystyle {\vec {a}}} \vec{a} b → {\displaystyle {\vec {b}}} \vec{b}的夹角是通过上述等式定义的。这样,两个互相垂直的向量的点积总是零。若 a → {\displaystyle {\vec {a}}} \vec{a} b → {\displaystyle {\vec {b}}} \vec{b}都是单位向量(长度为1),它们的点积就是它们的夹角的余弦。那么,给定两个向量,它们之间的夹角可以通过下列公式得到:

cos ⁡ θ = a ⋅ b | a → | | b → | {\displaystyle \cos {\theta }={\frac {\mathbf {a\cdot b} }{|{\vec {a}}|\,|{\vec {b}}|}}}  \cos{\theta} = \frac{\mathbf{a \cdot b}}{|\vec{a}| \, |\vec{b}|}

这个运算可以简单地理解为:在点积运算中,第一个向量投影到第二个向量上(这裡,向量的顺序是不重要的,点积运算是可交换的),然后通过除以它们的标量长度来“标准化”。这样,这个分数一定是小于等于1的,可以简单地转化成一个角度值。

标量投影:
A·B = |A| |B| cos(θ).|A| cos(θ)是AB的投影。

欧氏空间中向量A在向量B上的标量投影是指

A B = | A | cos ⁡ θ {\displaystyle A_{B}=|\mathbf {A} |\cos \theta } A_B=|\mathbf A|\cos\theta

这里θ是AB的夹角。从点积的几何定义 A ⋅ B = | A | | B | cos ⁡ θ {\displaystyle \mathbf {A} \cdot \mathbf {B} =|\mathbf {A} ||\mathbf {B} |\cos \theta } \mathbf A\cdot\mathbf B=|\mathbf{A}||\mathbf{B}|\cos\theta不难得出,两个向量的点积: A ⋅ B {\displaystyle \mathbf {A} \cdot \mathbf {B} } \mathbf A\cdot\mathbf B可以理解为向量 A {\displaystyle \mathbf {A} } \mathbf A在向量 B {\displaystyle \mathbf {B} } \mathbf B上的投影再乘以B的长度。

A ⋅ B = A B | B | = B A | A | {\displaystyle \mathbf {A} \cdot \mathbf {B} =A_{B}|\mathbf {B} |=B_{A}|\mathbf {A} |} 外积(来自维基百科):
   

两个向量 a {\displaystyle \mathbf {a} } \mathbf {a} b {\displaystyle \mathbf {b} } \mathbf {b} 的叉积写作 a × b {\displaystyle \mathbf {a} \times \mathbf {b} } {\displaystyle \mathbf {a} \times \mathbf {b} }(有时也被写成 a ∧ b {\displaystyle \mathbf {a} \wedge \mathbf {b} } {\displaystyle \mathbf {a} \wedge \mathbf {b} },避免和字母 x 混淆)。叉积可定义为:

a × b = | a | | b | sin ⁡ θ n ^ {\displaystyle \mathbf {a} \times \mathbf {b} =\left|\mathbf {a} \right|\left|\mathbf {b} \right|\sin \theta \;{\hat {\mathbf {n} }}{\displaystyle \mathbf {a} \times \mathbf {b} =\left|\mathbf {a} \right|\left|\mathbf {b} \right|\sin \theta \;{\hat {\mathbf {n} }}}

在这里 θ {\displaystyle \theta } \theta 表示 a {\displaystyle \mathbf {a} } \mathbf {a} b {\displaystyle \mathbf {b} } \mathbf {b} 之间的角度( 0 ∘ ≤ θ ≤ 180 ∘ {\displaystyle 0^{\circ }\leq \theta \leq 180^{\circ }} {\displaystyle 0^{\circ }\leq \theta \leq 180^{\circ }}),它位于这两个向量所定义的平面上。而 n ^ {\displaystyle {\hat {\mathbf {n} }}} {\hat  {​{\mathbf  {n}}}} 是一个与 a {\displaystyle \mathbf {a} } \mathbf {a} b {\displaystyle \mathbf {b} } \mathbf {b} 所构成的平面垂直的单位向量。这个定义有个问题,就是同时有两个单位向量都垂直于 a {\displaystyle \mathbf {a} } \mathbf {a} b {\displaystyle \mathbf {b} } \mathbf {b} :若 n ^ {\displaystyle {\hat {\mathbf {n} }}} {\hat  {​{\mathbf  {n}}}} 满足垂直的条件,那么 − n ^ {\displaystyle -{\hat {\mathbf {n} }}} {\displaystyle -{\hat {\mathbf {n} }}}也满足。“正确”的向量由向量空间的方向确定,即按照给定直角坐标系的左右手定则。若( i {\displaystyle \mathbf {i} } {\mathbf  {i}} j {\displaystyle \mathbf {j} } \mathbf{j} k {\displaystyle \mathbf {k} } \mathbf{k})满足右手定则,则( a {\displaystyle \mathbf {a} } \mathbf {a} b {\displaystyle \mathbf {b} } \mathbf {b} a × b {\displaystyle \mathbf {a} \times \mathbf {b} } {\displaystyle \mathbf {a} \times \mathbf {b} })也满足右手定则;或者两者同时满足左手定则。一个简单的确定满足“右手定则”的结果向量的方向的方法是这样的:若坐标系满足右手定则,当右手的四指从 a {\displaystyle \mathbf {a} } \mathbf {a} 以不超过180°的转角转向 b {\displaystyle \mathbf {b} } \mathbf {b} 时,竖起的大拇指指向是 a × b {\displaystyle \mathbf {a} \times \mathbf {b} } {\displaystyle \mathbf {a} \times \mathbf {b} } 的方向。由于向量的叉积由坐标系确定,所以其结果被称为「伪向量」。


原文开始:

   

  罗德里格斯公式(Rodriguez formula)是计算机视觉中的一大经典公式,在描述相机位姿的过程中很常用。公式:

R=I+sin(θ)K+(1cos(θ))K2

  从旋转矩阵 R 讲起,在三维空间中,旋转矩阵 R 可以对坐标系(基向量组)进行刚性的旋转变换。

R=rxxryxrzxrxyryyrzyrxzryzrzz

  通常为了方便计算,基向量组中的向量是相互正交的且都为单位向量,那么 R 就是一个标准正交矩阵。两个重要性质:

  • RTR=R1R=E
  • |R|=1

  假设原坐标系基向量矩阵为 B ,旋转后的坐标系基向量矩阵为 C

B=[bxbybz]=100010001

C=RB

  其变换过程如图所示:

这里写图片描述

C=rxxryxrzxrxyryyrzyrxzryzrzz[bxbybz]

  根据线性代数的定义,旋转矩阵 R 就是从基向量矩阵 B 到基向量矩阵 C 的过渡矩阵。由于旋转矩阵 R 是标准3阶正交矩阵,故旋转矩阵 R 的自由度为3,这说明最少可以用三个变量来表示旋转矩阵 R ,这就是 罗德里格斯公式(Rodriguez formula)存在的基础。

  罗德里格斯公式(Rodriguez formula)首先要确定一个三维的单位向量 k=[kxkykz]T (两个自由度)和一个标量 θ (一个自由度)。





证明方法一:

这里写图片描述

(图片摘自Wiki)

  先考虑对一个向量作旋转,其中 v 是原向量,三维的单位向量 k=[kxkykz]T 是旋转轴, θ 是旋转角度, vrot 是旋转后的向量。

  先通过点积得到 v k 方向的平行分量 v

v=(vk)k

  再通过叉乘得到与 k 正交的两个向量 v w

v=vv=v(vk)k=k×(k×v)(1)
w=k×v

  这样,我们就得到了3个相互正交的向量。不难得出:

vrot=v+cos(θ)v+sin(θ)w

  再引入叉积矩阵的概念:记 K k=[kxkykz]T 的叉积矩阵。显然 K 是一个反对称矩阵。

K=0kzkykz0kxkykx0

  他有如下性质:

k×v=Kv

  为了利用该性质,需要将 vrot 代换为 v k 的叉积关系,先根据(1)式做代换:

v=v+k×(k×v)

  然后得到:
vrot=v+k×(k×v)cos(θ)k×(k×v)+sin(θ)k×v

  根据叉积矩阵性质:

vrot=v+(1cos(θ))K2v+sin(θ)Kv
vrot=(I+(1cos(θ))K2+sin(θ)K)v

  最后将 vvrot 换为 BC ,就是罗德里格斯公式的标准形式。

B=(I+(1cos(θ))K2+sin(θ)K)CR=I+(1cos(θ))K2+sin(θ)K

  方法一证毕。


在想理解公式一的时候,把W=kXv代入,能更方便理解一些。
就是这样,感谢原文作者分享

这篇关于罗德里格斯公式的推导过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/160016

相关文章

最新版IDEA配置 Tomcat的详细过程

《最新版IDEA配置Tomcat的详细过程》本文介绍如何在IDEA中配置Tomcat服务器,并创建Web项目,首先检查Tomcat是否安装完成,然后在IDEA中创建Web项目并添加Web结构,接着,... 目录配置tomcat第一步,先给项目添加Web结构查看端口号配置tomcat    先检查自己的to

SpringBoot集成SOL链的详细过程

《SpringBoot集成SOL链的详细过程》Solanaj是一个用于与Solana区块链交互的Java库,它为Java开发者提供了一套功能丰富的API,使得在Java环境中可以轻松构建与Solana... 目录一、什么是solanaj?二、Pom依赖三、主要类3.1 RpcClient3.2 Public

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SpringBoot整合kaptcha验证码过程(复制粘贴即可用)

《SpringBoot整合kaptcha验证码过程(复制粘贴即可用)》本文介绍了如何在SpringBoot项目中整合Kaptcha验证码实现,通过配置和编写相应的Controller、工具类以及前端页... 目录SpringBoot整合kaptcha验证码程序目录参考有两种方式在springboot中使用k

SpringBoot整合InfluxDB的详细过程

《SpringBoot整合InfluxDB的详细过程》InfluxDB是一个开源的时间序列数据库,由Go语言编写,适用于存储和查询按时间顺序产生的数据,它具有高效的数据存储和查询机制,支持高并发写入和... 目录一、简单介绍InfluxDB是什么?1、主要特点2、应用场景二、使用步骤1、集成原生的Influ

SpringBoot实现websocket服务端及客户端的详细过程

《SpringBoot实现websocket服务端及客户端的详细过程》文章介绍了WebSocket通信过程、服务端和客户端的实现,以及可能遇到的问题及解决方案,感兴趣的朋友一起看看吧... 目录一、WebSocket通信过程二、服务端实现1.pom文件添加依赖2.启用Springboot对WebSocket

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

作业提交过程之HDFSMapReduce

作业提交全过程详解 (1)作业提交 第1步:Client调用job.waitForCompletion方法,向整个集群提交MapReduce作业。 第2步:Client向RM申请一个作业id。 第3步:RM给Client返回该job资源的提交路径和作业id。 第4步:Client提交jar包、切片信息和配置文件到指定的资源提交路径。 第5步:Client提交完资源后,向RM申请运行MrAp

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

uva 10014 Simple calculations(数学推导)

直接按照题意来推导最后的结果就行了。 开始的时候只做到了第一个推导,第二次没有继续下去。 代码: #include<stdio.h>int main(){int T, n, i;double a, aa, sum, temp, ans;scanf("%d", &T);while(T--){scanf("%d", &n);scanf("%lf", &first);scanf