根据向量求旋转矩阵

这篇具有很好参考价值的文章主要介绍了根据向量求旋转矩阵。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近在进行项目的时候需要将两个面进行旋转统一到一个面,但matlab中并没有一个合适的库函数去做这件事,于是自己开发,但网上很多对罗德里格公式的推导并不是很清晰,各关系式之间的逻辑关系之间的阐述有断层,也没有配相关的代码解析。

在开始推导之前,可以先带着一个问题,加入你有两个单位向量,如何把他们旋转到重合?
根据向量求旋转矩阵

看上图,初始我们有向量V和单位向量K,V围绕单位向量K旋转角度为θ得到的向量为Vrot,我们将向量V和Vrot进行分解,如上图所示(该图出自维基百科,如果看不到可以搜索罗德里格矩阵公式)。
V = V T + V Ⅱ ( 1 ) V r o t = V T t o r + V Ⅱ r o t ( 2 ) V=V_T+V_Ⅱ \quad (1)\\ V_{rot}=V_{Ttor}+V_{Ⅱrot} \quad (2) V=VT+V(1)Vrot=VTtor+Vrot(2)

其中很明显的一点是V与VⅡrot是相等的。因为向量V在围绕单位向量K旋转的过程中K方向的分量(范数和方向)不会改变。

由于K是单位向量,所以V与K以及V之间的关系为
V Ⅱ = ( V ⋅ K ) K ( 3 ) 其中 ( V ⋅ K ) 是 V 在单位向量 K 上的投影 V_{Ⅱ}=(V\cdot K)K \quad(3) \\其中(V\cdot K)是 V在单位向量K上的投影 V=(VK)K3)其中(VK)V在单位向量K上的投影
我们讲公式3与公式1结合即(1)公式两侧同时减去(3)那么得到下面一个公式
V T = V − ( V ⋅ K ) K 将 V 的左边乘以 ( K ⋅ K ) , 上式就变为 V T = ( K ⋅ K ) V − ( V ⋅ K ) K ( 4 ) 根据叉积公式 A × ( B × C ) = ( A ⋅ C ) B − ( A ⋅ B ) C 所以( 4 )式就变为 V T = K × ( V × K ) ( 5 ) V_T=V-(V\cdot K)K \\ 将V的左边乘以(K\cdot K) ,上式就变为\\ V_T=(K\cdot K)V-(V \cdot K) K \quad (4)\\ 根据叉积公式 A \times (B \times C)=(A\cdot C)B-(A\cdot B)C\\ 所以(4)式就变为 \\ V_T=K\times(V\times K) \quad(5) VT=V(VK)KV的左边乘以(KK),上式就变为VT=(KK)V(VK)K(4)根据叉积公式A×(B×C)=(AC)B(AB)C所以(4)式就变为VT=K×(V×K)(5)
下面有很重要的一个点式很多说明罗德里格公式里没有说明的:

​ 向量V与单位向量K的叉积得到的新向量与VT成90°,且两者的模相等,这是由于(你可以证明一下,这很简单)
∣ K × V ∣ = ∣ K ∣ ⋅ ∣ V ∣ s i n ( δ ) δ 为 K V 之间的夹角 |K\times V|=|K|\cdot|V|sin(\delta) \quad \delta 为K \quad V之间的夹角 K×V=KVsin(δ)δKV之间的夹角
现在我们看如何用VT ,K,V来表达VTrot

由上图可得
V T r o t = V T c o s ( θ ) + K × V s i n ( θ ) ( 6 ) V_{Trot}=V_Tcos(\theta)+K\times V sin(\theta) \quad (6) VTrot=VTcos(θ)+K×Vsin(θ)(6)
再讲(6)式与(2)式结合
V r o t = V T cos ⁡ ( θ ) + K × V sin ⁡ ( θ ) + V Ⅱ 将 V T 用 ( V − V Ⅱ ) 替换,上式将变为 V r o t = ( V − V Ⅱ ) cos ⁡ ( θ ) + K × V sin ⁡ ( θ ) + V Ⅱ 将括号拆开并重新整合 V r o t = ( 1 − cos ⁡ ( θ ) ) V Ⅱ + cos ⁡ ( θ ) V + sin ⁡ ( θ ) ( K × V ) ( 7 ) V_{rot}=V_{T}\cos(\theta)+K\times V \sin(\theta)+V{Ⅱ}\\将V_T用(V-V_Ⅱ)替换,上式将变为\\ V_{rot}=(V-V_Ⅱ)\cos(\theta)+K\times V \sin(\theta)+V{Ⅱ}\quad 将括号拆开并重新整合\\ V_{rot}=(1-\cos(\theta))V_Ⅱ+\cos(\theta)V+\sin(\theta)(K\times V) \quad (7) Vrot=VTcos(θ)+K×Vsin(θ)+VVT(VV)替换,上式将变为Vrot=(VVcos(θ)+K×Vsin(θ)+V将括号拆开并重新整合Vrot=(1cos(θ))V+cos(θ)V+sin(θ)(K×V)(7)
将7式中的V用(3)式替换消元,且在等式右侧加减V,则变为下式:
V r o t = V − V + ( 1 − cos ⁡ ( θ ) ) ( V ⋅ K ) K + cos ⁡ ( θ ) V + sin ⁡ ( θ ) ( K × V ) = V − ( 1 − cos ⁡ ( θ ) ) V + ( 1 − cos ⁡ ( θ ) ) ( V ⋅ K ) K + sin ⁡ ( θ ) ( K × V ) = V + [ ( 1 − cos ⁡ ( θ ) ) ( ( V ⋅ K ) K − ( K ⋅ K ) V ] + sin ⁡ ( θ ) ( K × V ) = V + ( 1 + cos ⁡ ( θ ) ) [ K × ( K × V ) ] + sin ⁡ ( θ ) ( K × V ) ( 8 ) V_{rot}=V-V+(1-\cos(\theta))(V \cdot K) K+\cos(\theta)V+\sin(\theta)(K\times V) \\ =V-(1-\cos(\theta))V+(1-\cos(\theta))(V\cdot K)K +\sin(\theta)(K\times V)\\ =V+[(1-\cos(\theta))((V \cdot K)K-(K\cdot K)V]+\sin(\theta)(K\times V)\\ =V+(1+\cos(\theta))[K\times(K\times V)]+\sin(\theta)(K\times V) \quad(8) Vrot=VV+(1cos(θ))(VK)K+cos(θ)V+sin(θ)(K×V)=V(1cos(θ))V+(1cos(θ))(VK)K+sin(θ)(K×V)=V+[(1cos(θ))((VK)K(KK)V]+sin(θ)(K×V)=V+(1+cos(θ))[K×(K×V)]+sin(θ)(K×V)(8)
下面介绍叉乘矩阵(这个我不太熟悉,你如果想深入了解,可以看一下别人的博客,很有意思 推荐博客

根据向量求旋转矩阵

那么我们使Rk为K x V的叉乘矩阵 则K x V就变为了RkV,而K x(K x V)经过两次变换就成为了Rk2

将8式通过叉乘矩阵整合之后可得
V r o t = V + ( 1 + cos ⁡ ( θ ) ) R k 2 V + sin ⁡ ( θ ) V = [ 1 + ( 1 + cos ⁡ ( θ ) ) R k 2 + R k ] V ( 9 ) V_{rot}=V+(1+\cos(\theta))R_k^2 V+\sin(\theta)V\\ =[1+(1+\cos(\theta))R_k^2+R_k]V \quad(9) Vrot=V+(1+cos(θ))Rk2V+sin(θ)V=[1+(1+cos(θ))Rk2+Rk]V(9)
而9式就是我们常见的罗德里格旋转矩阵的公式了。是不是很简单

下面贴出罗德里格旋转矩阵的Matlab实现:文章来源地址https://www.toymoban.com/news/detail-469690.html

function rat=rotate(b,a) %the rotate matrix for rot*a'=b'
b=b/norm(b);%将传入的向量单位化
a=a/norm(a);
rotationangle=acos(dot(a,b));%求出两向量之间的夹角
rotationaxis=cross(a,b);%求出他们的旋转轴,也是两个向量构成的法向量
rotationaxis=rotationaxis/norm(rotationaxis);%将旋转轴单位化
matrix=zeros(3,3); 
matrix(1,2)=-rotationaxis(1,3);%设计叉乘矩阵
matrix(1,3)=rotationaxis(1,2);
matrix(2,1)=rotationaxis(1,3);
matrix(2,3)=-rotationaxis(1,1);
matrix(3,1)=-rotationaxis(1,2);
matrix(3,2)=rotationaxis(1,1);
rat=eye(3)+(1-cos(rotationangle))*matrix*matrix+sin(rotationangle)*matrix;%应用罗德里格公式求出旋转矩阵
end

到了这里,关于根据向量求旋转矩阵的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 旋转矩阵R、平移向量t以及变换矩阵T的定义及其下标的含义

    首先,只考虑旋转。 假设坐标系1: { X 1 , Y 1 , Z 1 } {X_1, Y_1, Z_1} { X 1 ​ , Y 1 ​ , Z 1 ​ } 经过 纯旋转 之后得到坐标系2: { X 2 , Y 2 , Z 2 } {X_2, Y_2, Z_2} { X 2 ​ , Y 2 ​ , Z 2 ​ } (如上图),其中坐标系1对应的单位正交基为 ( e 1 , e 2 , e 3 ) left(e_{1}, e_{2}, e_{3}right) ( e 1 ​ , e

    2023年04月23日
    浏览(48)
  • 雅可比旋转(Jacobi法)求对称矩阵的特征值和特征向量

    该方法是求解 对称矩阵 全部特征值和特征向量的一种方法,它基于以下结论: ① 任何实对称矩阵A可以通过正交相似变换成对角型 ,即存在正交矩阵Q,使得 Q T A Q = d i a g ( λ 1 , λ 2 , … , λ n ) Q^TAQ=diag(λ1,λ2,…,λn) Q T A Q = d ia g ( λ 1 , λ 2 , … , λn ) 其中λi(i=1,2,…,n)是A的特征

    2024年01月23日
    浏览(48)
  • 如何理解“对矩阵进行初等行变换不改变其列向量的线性关系”?

    一. 对矩阵进行初等行变换不改变其列向量的线性关系 对矩阵A进行初等行变换相当于左乘一个可逆矩阵P。 把A看作是列向量组,若有Ax=0,则其中的x就说明了列向量的线性关系: [ α 1 , α 2 , α 3 ] [ x 1 x 2 x 3 ] = [ 0 ] left[ alpha_1 ,alpha_2, alpha_3 right] begin{bmatrix} x_1\\\\ x_2\\\\ x_3 e

    2024年02月12日
    浏览(40)
  • MATLAB中对方阵行列式的求解、矩阵的累加和与累乘积进行求解、矩阵的排序、矩阵的秩和迹、以及矩阵的特征值和特征向量的求解

    目录 1、方阵的行列式计算 2、累加和与累乘积 (1)累加和 (2)累乘积 3、对于数据进行排序 4、求矩阵的秩 5、矩阵的迹 6、计算矩阵的特征值和特征向量 在线性代数中,对于一个方阵进行求值运算需要先将其转换为行列式,MATLAB中提供过了det函数用于对于方阵的行列式进

    2023年04月22日
    浏览(61)
  • 企业如何搭建矩阵内容,才能真正实现目的?

    当下,新媒体矩阵营销已成为众多企业的营销选择之一,各企业可以通过新媒体矩阵实现扩大品牌声量、维持用户关系、提高销售业绩等不同的目的。 而 不同目的的矩阵,它的内容运营模式会稍有差别,评价体系也会大不相同 。 企业在运营某类矩阵账号前需明晰方向,围绕

    2024年02月13日
    浏览(41)
  • 软件进行压力测试的主要目的

    软件进行压力测试是指通过模拟大量用户访问和负载压力,在正常和峰值使用情况下对软件系统进行测试的过程。软件进行压力测试的主要目的是确保软件在实际应用中能够稳定、可靠地运行,满足用户的需求。   首先,软件进行压力测试的主要目的是评估系统的性能和稳定

    2024年02月16日
    浏览(44)
  • 进行性能压力测试的原因、目的和好处

    性能压力测试是指在模拟高负载、高并发情况下对软件系统进行测试,以衡量系统在实际使用过程中的性能表现。这些测试可以为生产环境中的应用程序提供关键数据,并帮助开发人员从根本上了解系统的实际性能。在本文中,我们将探讨进行性能压力测试的原因、目的和好

    2024年02月10日
    浏览(77)
  • 进行压力测试的目的是什么?重要性体现在哪?

    进行压力测试的目的是什么?重要性体现在哪?压力测试是通过施加一定压力或负荷于测试对象,以评估其结构、性能和可靠性的过程。它可以是静态压力测试,即施加一定压力并持续一段时间,也可以是动态压力测试,即施加变化的压力或冲击负荷。压力测试通常通过测量

    2024年02月11日
    浏览(36)
  • 使用微信小程序进行毕业设计选题的目的

     博主介绍 :《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年01月22日
    浏览(39)
  • 【MTK平台】根据kernel log分析wifi scan的时候流程

    一 概要: 本文主要讲解根据kernel log分析下 当前路径下(vendor/mediatek/kernel_modules/connectivity/wlan/core/gen4m/)wifi scan的时候代码流程 二. Log分析: 先看Log: 2.1)在Framework层WifiManager.java 方法中,做了一个标记,可以精准的确认时间 这段log可以看出11:03:14.979502时候设置界面开始扫

    2024年02月10日
    浏览(76)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包