关于罗德里格斯公式(Rodrigues‘sFormula)的详细推导过程

article/2025/9/25 11:50:35

关于罗德里格斯公式[Rodrigues'sFormula]的详细推导过程

  • 1 旋转向量
  • 2 罗德里格斯公式
    • 2.1 罗德里格斯公式定义
    • 2.2 罗德里格斯公式推导
  • 3 旋转矩阵到旋转向量的转换

1 旋转向量

实际上,任意旋转都可以用一个旋转轴和一个旋转角来刻画。我们可以使用一个向量 u u u,其方向与旋转轴一致,其长度等于旋转角 θ \theta θ,那么向量 θ u \theta u θu就可以描述这个旋转,这种向量称为旋转向量(或轴角/角轴,Axis-Angle),只需一个三维向量即可描述旋转。同样,对于一个变换矩阵,使用一个旋转向量和一个平移向量即可表达一次变换,此时变量维数正好是六维。

2 罗德里格斯公式

2.1 罗德里格斯公式定义

维基百科给出的罗德里格斯旋转公式(Rodrigues’ rotation formula)定义如下:
如果 v v v R 3 \mathbb{R}^3 R3中的向量,并且 k k k是描述旋转轴的单位向量,根据右手法则 v v v围绕该轴旋转角度 θ \theta θ,则旋转向量 v r o t v_{rot} vrot的罗德里格斯公式为 v r o t = v c o s θ + ( k × v ) s i n θ + k ( k ⋅ v ) ( 1 − c o s θ ) . v_{rot}=vcos\theta+(k \times v)sin \theta +k(k\cdot v)(1-cos\theta). vrot=vcosθ+(k×v)sinθ+k(kv)(1cosθ).视觉SLAM十四讲中给出的用罗德里格斯公式转换的结果为: R = c o s θ I + ( 1 − c o s θ ) n n T + s i n θ n ∧ R=cos\theta I+(1-cos\theta)nn^T+sin\theta n^{\land} R=cosθI+(1cosθ)nnT+sinθn其中, R R R表示一个旋转,单位长度的向量 n n n为一个假设的旋转轴,角度为 θ \theta θ,符号 ∧ ^\land 是向量到反对称矩阵的转换符,具体含义见文章:[视觉SLAM十四讲]学习笔记1-刚体运动之旋转矩阵与变换矩阵。
我们可以看出,原始的定义和书中给出的转换结果形似,这说明这两个公式有一定的关系,下一节将通过推导过程来展示这个关系的转换。

2.2 罗德里格斯公式推导

我们可以通过三维空间中的旋转和旋转分解来进行罗德里格斯公式的推导。
首先,我们给出一些定义:令 k k k为定义旋转轴的单位向量,令 v v v为围绕 k k k旋转角度 θ \theta θ的任意向量(遵循右手法则,图中为逆时针方向)。
在图中,向量 v v v围绕 k k k旋转 θ \theta θ度得到向量 v r o t v_{rot} vrot,将向量 v v v分解为平行于旋转轴 k k k的向量 v ∣ ∣ v_{||} v∣∣和正交于(垂直)旋转轴 k k k的向量 v ⊥ v_{⊥} v v = v ∣ ∣ + v ⊥ v=v_{||}+v_{⊥} v=v∣∣+v
简单来说,根据2.1中的转换结果和下图可知, v r o t = R v v_{rot}=Rv vrot=Rv,为了求解出转换关系即 R R R我们只需要找到 v r o t v_{rot} vrot的表达式即可。
图解1
根据下图,我们可以看出,向量 v r o t v_{rot} vrot同样被分解成了两个向量 v ∣ ∣ r o t v_{||rot} v∣∣rot v ⊥ r o t v_{⊥rot} vrot,但这幅图不便于我们进行公式的推导和观察,我们可以换一种分解方式,类似于第一个图,这时向量 v ∣ ∣ v_{||} v∣∣和向量 v ∣ ∣ r o t v_{||rot} v∣∣rot将平行(重合)于旋转轴 k k k
图解2
1. v ∣ ∣ v_{||} v∣∣的旋转及 v r o t ∣ ∣ v_{rot||} vrot∣∣的表示
首先我们看一下向量 v v v的分解示意图(图中 u u u为旋转轴):
分解示意图
通过上图,我们可以看到, v ∣ ∣ v_{||} v∣∣其实就是 v v v u u u上的正交投影(Orthogonal Projection),根据正交投影的公式,我们可以得出: v ∣ ∣ = p r o j u ( v ) = u ⋅ v u ⋅ u u = u ⋅ v ∥ u ∥ 2 u = ( u ⋅ v ) u v_{||}=proj_{u}(v)=\frac{u\cdot v}{u \cdot u}u=\frac{u\cdot v}{\Vert u \Vert^2}u=(u\cdot v)u v∣∣=proju(v)=uuuvu=u2uvu=(uv)u这里, ∥ u ∥ 2 = u ⋅ u , ∥ u ∥ = 1 \Vert u \Vert^2=u \cdot u,\Vert u \Vert=1 u2=uuu=1,从而由 v = v ∣ ∣ + v ⊥ v=v_{||}+v_{⊥} v=v∣∣+v,我们可以得到 v ⊥ = v − v ∣ ∣ = v − ( u ⋅ v ) u v_{⊥}=v-v_{||}=v-(u\cdot v)u v=vv∣∣=v(uv)u,,所以 v ⊥ = v − v ∣ ∣ = v − ( u ⋅ v ) u v_{⊥}=v-v_{||}=v-(u\cdot v)u v=vv∣∣=v(uv)u
从之前的图中我们可以看到, v ∣ ∣ v_{||} v∣∣其实没有被旋转,仍然与旋转轴 u u u重合,所以: v ∣ ∣ = v ∣ ∣ r o t v_{||}=v_{||rot} v∣∣=v∣∣rot
2. v ⊥ v_{⊥} v的旋转及 v ⊥ r o t v_{⊥rot} vrot的表示
通过之前的图,我们可以看出因向量 v ⊥ v_{⊥} v正交于向量 u u u,这个旋转可以看做是平面内的一个旋转。因为旋转不改变 v ⊥ v_{⊥} v的长度,所以路径是一个圆。通过下图我们可以清晰的看到旋转的情况(第一个图为旋转情况,第二个图为旋转情况的俯视图):
示意图
有了旋转情况的俯视图,我们就可以通过平面上的旋转来分析三维旋转的情况了,为了表示旋转,我们可以构造一个同时正交于 u u u v ⊥ v_{⊥} v的向量 w w w,通过外积(叉乘),我们可以表示出来 w = u × v ⊥ w=u \times v_{⊥} w=u×v,由于我们一直使用的是右手坐标系统,所以在表示时要注意叉乘顺序。按照右手定则,新定义的向量 w w w指向的是 v ⊥ v_{⊥} v逆时针旋转 π / 2 \pi /2 π/2后的方向,同时和 v ⊥ v_{⊥} v一样位于正交于 u u u的平面内,由 ∥ u ∥ = 1 \Vert u \Vert=1 u=1,我们可以得到以下关系: ∥ w ∥ = ∥ u × v ⊥ ∥ = ∥ u ∥ ⋅ ∥ v ⊥ ∥ ⋅ s i n ( π / 2 ) = ∥ v ⊥ ∥ . \Vert w \Vert=\Vert u \times v_{⊥}\Vert=\Vert u\Vert \cdot \Vert v_{⊥}\Vert \cdot sin(\pi/2)=\Vert v_{⊥}\Vert. w=u×v=uvsin(π/2)=v∥.这里 π / 2 \pi/2 π/2 u u u v ⊥ v_{⊥} v的夹角,同时我们可以看出, w w w v ⊥ v_{⊥} v具有相同的模长,即 w w w也位于这个圆上, w w w v ⊥ v_{⊥} v即成为了一个平面上的两个坐标轴。这样,我们就可以把 v ⊥ r o t v_{⊥rot} vrot投影到 w w w v ⊥ v_{⊥} v上,我们可以将 v ⊥ r o t v_{⊥rot} vrot分解为 v r w v_{rw} vrw v r v v_{rv} vrv,通过三角函数的一些知识,我们可以得到以下关系: v ⊥ r o t = v r v + v r w = c o s ( θ ) v ⊥ + s i n ( θ ) w = c o s ( θ ) v ⊥ + s i n ( θ ) ( u × v ⊥ ) v_{⊥rot}=v_{rv}+v_{rw}=cos(\theta)v_{⊥}+sin(\theta)w=cos(\theta)v_{⊥}+sin(\theta)(u \times v_{⊥}) vrot=vrv+vrw=cos(θ)v+sin(θ)w=cos(θ)v+sin(θ)(u×v)
3. v r o t v_{rot} vrot的表示
通过1和2得到的结果,我们可以得到 v r o t v_{rot} vrot的表达式为: v r o t = v r o t ∣ ∣ + v r o t ⊥ = v ∣ ∣ + c o s ( θ ) v ⊥ + s i n ( θ ) ( u × v ⊥ ) v_{rot}=v_{rot||}+v_{rot⊥}=v_{||}+cos(\theta)v_{⊥}+sin(\theta)(u \times v_{⊥}) vrot=vrot∣∣+vrot=v∣∣+cos(θ)v+sin(θ)(u×v)对于 u × v ⊥ u \times v_{⊥} u×v,我们可以采用分配律进行变形 u × v ⊥ = u × ( v − v ∣ ∣ ) = u × v − u × v ∣ ∣ = u × v u \times v_{⊥}=u \times (v-v_{||})=u \times v-u \times v_{||}=u \times v u×v=u×(vv∣∣)=u×vu×v∣∣=u×v这里 u u u v ∣ ∣ v_{||} v∣∣平行,所以 u × v ∣ ∣ = 0 u \times v_{||}=0 u×v∣∣=0
最后代入 v ∣ ∣ = ( u ⋅ v ) u v_{||}=(u \cdot v)u v∣∣=(uv)u v ⊥ = v − ( u ⋅ v ) u v_{⊥}=v-(u \cdot v)u v=v(uv)u,得到下面的结果 v r o t = ( u ⋅ v ) u + c o s ( θ ) ( v − ( u ⋅ v ) u ) + s i n ( θ ) ( u × v ) v_{rot}=(u \cdot v)u+cos(\theta)(v-(u \cdot v)u)+sin(\theta)(u \times v) vrot=(uv)u+cos(θ)(v(uv)u)+sin(θ)(u×v) = v c o s ( θ ) + ( u × v ) s i n ( θ ) + ( u ⋅ v ) u ( 1 − c o s ( θ ) ) =vcos(\theta)+(u \times v)sin(\theta)+(u \cdot v)u(1-cos(\theta)) =vcos(θ)+(u×v)sin(θ)+(uv)u(1cos(θ))这样,我们就得到了3D空间中任意一个向量 v v v沿着单位向量(旋转轴) u u u旋转 θ \theta θ角度之后的 v r o t v_{rot} vrot
到这里,我们推导出了罗德里格斯公式的基本形式,但显然,书中给出的旋转 R R R是矩阵形式,接下来我们要将内积和外积的运算进行变形,用矩阵形式表示。
对于 ( u ⋅ v ) u (u \cdot v)u (uv)u,通过内积的展开规则 x ⋅ y = [ x , y ] = x T y x \cdot y=[x,y]=x^Ty xy=[x,y]=xTy及交换律可以得到 ( u ⋅ v ) u = ( u ⋅ u ) v = ( u ⋅ u T ) v = u u T v (u \cdot v)u=(u \cdot u)v=(u \cdot u^T)v=uu^Tv (uv)u=(uu)v=(uuT)v=uuTv同时, u × v u \times v u×v可以通过之前在:[视觉SLAM十四讲]学习笔记1-刚体运动之旋转矩阵与变换矩阵中介绍的叉乘矩阵的形式,即为 u × v = [ ( u × v ) x ( u × v ) y ( u × v ) z ] = [ u y v z − u z v y u z v x − u x v z u x v y − u y v x ] = [ 0 − k z k y k z 0 − k x − k y k x 0 ] [ v x v y v z ] = U v u \times v=\begin{bmatrix}(u \times v)_x \\ (u \times v)_y \\ (u \times v)_z \end{bmatrix}=\begin{bmatrix}u_yv_z-u_zv_y \\u_zv_x-u_xv_z \\u_xv_y-u_yv_x \end{bmatrix}=\begin{bmatrix}0&-k_z&k_y \\ k_z&0&-k_x \\ -k_y&k_x&0\end{bmatrix}\begin{bmatrix}v_x \\ v_y \\ v_z \end{bmatrix}=Uv u×v= (u×v)x(u×v)y(u×v)z = uyvzuzvyuzvxuxvzuxvyuyvx = 0kzkykz0kxkykx0 vxvyvz =Uv这里 U = u ∧ = [ 0 − k z k y k z 0 − k x − k y k x 0 ] U=u^{\land}=\begin{bmatrix}0&-k_z&k_y \\ k_z&0&-k_x \\ -k_y&k_x&0\end{bmatrix} U=u= 0kzkykz0kxkykx0 将转换后的 ( u ⋅ v ) u (u \cdot v)u (uv)u u × v u \times v u×v矩阵形式带入推导的结果,变形结果如下: v r o t = v c o s ( θ ) + ( u × v ) s i n ( θ ) + ( u ⋅ v ) u ( 1 − c o s ( θ ) ) v_{rot}=vcos(\theta)+(u \times v)sin(\theta)+(u \cdot v)u(1-cos(\theta)) vrot=vcos(θ)+(u×v)sin(θ)+(uv)u(1cos(θ)) = v c o s ( θ ) + ( 1 − c o s ( θ ) ) u u T v + s i n ( θ ) u ∧ v =vcos(\theta)+(1-cos(\theta))uu^Tv+sin(\theta)u^{\land}v =vcos(θ)+(1cos(θ))uuTv+sin(θ)uv = ( c o s ( θ ) I + ( 1 − c o s ( θ ) ) u u T + s i n ( θ ) u ∧ ) v =(cos(\theta)I+(1-cos(\theta))uu^T+sin(\theta)u^{\land})v =(cos(θ)I+(1cos(θ))uuT+sin(θ)u)v则旋转矩阵为 R = c o s ( θ ) I + ( 1 − c o s ( θ ) ) u u T + s i n ( θ ) u ∧ R=cos(\theta)I+(1-cos(\theta))uu^T+sin(\theta)u^{\land} R=cos(θ)I+(1cos(θ))uuT+sin(θ)u I I I为单位矩阵,证毕。

3 旋转矩阵到旋转向量的转换

有了上节的推导和转换结果,我们可以在转换公式的基础上,进行旋转矩阵到旋转向量的转换。
首先对转换公式两边取迹,得 t r ( R ) = c o s ( θ ) t r ( I ) + ( 1 − c o s ( θ ) ) t r ( u u T ) + s i n ( θ ) t r ( u ∧ ) tr(R)=cos(\theta)tr(I)+(1-cos(\theta))tr(uu^T)+sin(\theta)tr(u^{\land}) tr(R)=cos(θ)tr(I)+(1cos(θ))tr(uuT)+sin(θ)tr(u) = 3 c o s ( θ ) + ( 1 − c o s ( θ ) =3cos(\theta)+(1-cos(\theta) =3cos(θ)+(1cos(θ) = 1 + 2 c o s ( θ ) =1+2cos(\theta) =1+2cos(θ)因此: θ = a r c c o s t r ( R ) − 1 2 \theta =arccos\frac{tr(R)-1}{2} θ=arccos2tr(R)1对于旋转轴 u u u和之前的图及结果,我们可以知道,旋转轴上的向量在旋转后不会发生改变,说明: R u = u Ru=u Ru=u显然,旋转轴 u u u是旋转矩阵 R R R特征值 I I I对应的特征向量。求解这个方程,进行归一化,就可以得到旋转轴。


创作不易,希望大家支持,多多点赞收藏!!!!非常感谢!!!!

参考资料:
视觉SLAM十四讲:从理论到实践(第2版)(ISBN:9787121369421)
维基百科-罗德里格斯的旋转公式
四元数与三维旋转


http://chatgpt.dhexx.cn/article/brPSenH9.shtml

相关文章

Armijo-Goldstein准则及Wolfe-Powell准则

Armijo-Goldstein准则及Wolfe-Powell准则 line search(一维搜索,或线搜索)是最优化(Optimization)算法中的一个基础步骤/算法。它可以分为精确的一维搜索以及不精确的一维搜索两大类。 本文主要介绍一下,…

【格拉霍夫定理】【四连杆系统】Grashof’s Law for a Planar Four-Bar Linkage

在《Craig, John J - Introduction to Robotics_ Mechanics and Control-Pearson (2013)》一书中提到 “a four-bar linkage has only one degree of freedom” ,即“四连杆机构只有一个自由度”。本文将从零基础开始解释此句的原因。由于自学,恐有疏漏&…

开关功率器件(MOSFET IGBT)损耗仿真方法

说明:IGBT 功率器件损耗与好多因素相关,比如工作电流,电压,驱动电阻。在出设计之前评估电路的损耗有一定的必要性。在确定好功率器件的驱动参数后(驱动电阻大小,驱动电压等),开关器…

最优控制理论 六、拉格朗日乘子法和KKT条件

拉格朗日乘子法和KKT条件 1. 等式约束最优化2. 不等式约束最优化2.1 1个不等式约束2.2 KKT条件2.3 二维不等式约束图解 3. MATLAB不等式约束优化总结4. 参考文献 最优控制是建立在最优化基础上的,它所处理的是无穷维路径函数的泛函极值问题,而后者是处理…

Buck变换器MOSFET开关过程分析与损耗计算

为了方便理解MOSFET的开关过程及其损耗,以Buck变换器为研究对象进行说明(注:仅限于对MOSFET及其驱动进行分析,不涉及二极管反向恢复等损耗。) 图1所示为Buck变换器拓扑,其中用于减小主功率电路的AC Loop&am…

JAVA-如何修改源码(重写JAR包里的类)

今天写代码的时候发现alibaba的druid工具对postgresql数据库的union all语法支持不够完善,具体场景: select id,name from a union all (select id,name from b order by id); 该语法在druid工具中被解析为: select id,name from a uni…

堆的操作(Java)

文章目录 1.堆的存储方式2.堆的创建2.1向下调整2.2向上调整 3.堆的操作3.1元素插入堆3.2取堆顶元素3.3删除堆顶元素 1.堆的存储方式 由堆的概念可知,堆是一棵完全二叉树,因此可以层序的规则采用顺序的方式来存储堆。 注意: 对于非完全二叉树…

[Java]堆

目录 一、堆的概念 二、大小根堆的建立 三、 堆的调整 1. 向下调整 2. 向上调整 三、堆的删除与插入 一、堆的概念 堆可以看做一个完全二叉树,如果有一个关键码的集合K {k0,k1, k2,…,kn-1},把它的所…

JVM-堆

文章目录 堆,是运行是数据区的一部分堆内存分区:JAVA堆区细分: 设置堆内存大小与OOM设置堆空间大小 OOM Outof Memory Error 举例!!!图解对象分配过程Minor GC、Major GC、Full GC年轻代 GC(Minor GC)触发机制老年代 G…

jvm堆大小的设置

问题引入: -Xmx10240m -Xms10240m -Xmn5120m -XXSurvivorRatio3,,其最小内存值和Survivor区总大小分别是(10240m 2048m); 解析: -Xmx:最大堆大小 -Xms:初始堆大小 -Xmn:年轻…

如何修改java中堆、栈空间的默认大小

1、修改堆、栈空间大小的命令 在命令行中输入java -X可以得到设置java堆大小和栈大小的命令 2、修改java运行时的堆和栈空间 进入界面后 按AltV 3、检验堆空间修改 3.1 测试类 public class StackTest {public static void main(String[] args) {//返回Java虚拟机中的堆内存…

java 堆设置

Young:主要是用来存放新生的对象。(Eden、survivorSpaces(from、To)) Old:主要存放应用程序中生命周期长的内存对象。 Permanent:是指内存的永久保存区域,主要存放Class和Meta的信息,Class在被 Load的时候…

Java堆内存设置

堆内存设置 原理 JVM堆内存分为2块:永久空间和堆空间。 永久即持久代(Permanent Generation),主要存放的是Java类定义信息,与垃圾收集器要收集的Java对象关系不大。Heap {Old NEW {Eden,from&#xff0…

OBEX(一)

一、概述 1、OBEX v2.0(v2.0版本开始OBEX直接在L2CAP上传输,v2.0版本以前OBEX在RFCOMM上传输) 2、OBEX即Object Exchange Protocol,对象交换协议 3、OBEX协议是典型的client/server request-response模型 4、OBEX v2.0蓝牙协议…

利用docker部署oxidized网络设备备份系统

随着网络设备的增多,通过人手备份网络设备倍感压力,而且效率低。有编程基础的人可能会通过Python的parimiko 或者netmiko 连接到设备操作 把文件通过ftp 上传到FTP服务器, 在通过定时任务,定期自动备份。这个应该是现阶段主流非人民币网络玩家的最优解决方案。 今天我们来看看…

网络自动化运维第一篇 自动化备份网络配置

网络设备厂商众多,各种安全厂商,网络厂商,负载均衡厂商,如果想实现自动化备份配置,可以自己写python脚本。如果网络设备厂商多,自己写python 非常耗费时间精力。偶然在网上发现了oxidized 非常好用&#xf…

.odex文件的反编译

0x00 问题呈现 在分析某手机自带应用时,为了在JEB中反编译,将其adb pull到了电脑上。解压后发现如下文件: APK解压目录列表 惊奇的发现该APK包中没有dex文件,一开始特别疑惑没有dex文件,也就是没有代码,那…

ZeroDivisionError: integer division or modulo by zero

这里的错误就是由于数据集太小。 # 2. Split into train / validation partitionsn_val int(len(dataset) * val_percent)n_train len(dataset) - n_val#我这里是刚好有10张数据集然后其中一张被拆分为验证集导致训练集太小,从而报错。

反编译odex

需要工具: 1、baksmali-x.x.x.jar2、smali-x.x.x.jar工具下载:https://bitbucket.org/JesusFreke/smali/downloads/ 步骤: 1、odex转smali: java -jar “D:\google\tool\mony_tool\baksmali-2.2.1.jar” deodex SystemUI.odex -…

ZeroDivisionError:Integer division or modulo by zero

docker环境下,多GPU训练 方式:采用nvidia-docker创建容器 另: 在用sudo无法解决sh文件的pemission denied问题时,采用bash替代sudo