本文综合了几个相关的维基百科,加了点自己的理解,从比较基础的向量投影和叉积讲起,推导出罗德里格斯旋转公式。公式比较繁杂,如有错误,欢迎评论区指出。

  对于向量的三维旋转问题,给定旋转轴和旋转角度,用罗德里格斯(Rodrigues)旋转公式可以得出旋转后的向量。另外,罗德里格斯旋转公式可以用旋转矩阵表示,即将三维旋转的轴-角(axis-angle)表示转变为旋转矩阵表示。

向量投影(Vector projection)

  向量a在非零向量b上的向量投影指的是a在平行于向量b的直线上的正交投影。结果是一个平行于b的向量,定义为\(\mathbf{a}_1=a_1\hat{\mathbf{b}}\),其中,\(a_1\)是一个标量,称为ab上的标量投影,\(\hat{\mathbf{b}}\)是与b同向的单位向量。\(a_1=\left\Vert\mathbf{a}\right\Vert\cos\theta=\mathbf{a}\cdot \hat{\mathbf{b}}=\mathbf{a}\cdot\frac{\mathbf{b}}{\left\Vert\mathbf{b}\right\Vert}\),其中\(\cdot\)表示点积,\(\left\Vert\mathbf{a}\right\Vert\)表示a的长度,\(\theta\)表示ab的夹角。标量投影有正负,正负号与夹角\(\theta\)有关。

  有了向量投影\(\textbf{a}_1\),向量a可以表示为\(\mathbf{a}=\mathbf{a}_1+\mathbf{a}_2\),其中\(\mathbf{a}_2\)称为a from b的vector rejection(没找到比较官方的翻译),也即a向正交于b的超平面的正交投影,\(\mathbf{a}_2=\mathbf{a}-\mathbf{a}_1=\mathbf{a}-(\left\Vert\mathbf{a}\right\Vert\cos\theta)\hat{\mathbf{b}}\)。下图比较清晰地表示出\(\mathbf{a}\)、\(\mathbf{a}_1\)、\(\mathbf{a}_2\)的关系。

图1 Projection of a on b(a1), rejection of a from b(a2)

  当\(90^{\circ}<\theta\le180^{\circ}\)时,向量投影示意图如图2所示:

图2 大于90°时的向量投影示意图,此时a1b的方向相反

记号

  向量ab上的向量投影用加粗的\(\mathbf{a}_1\)表示,标量投影用不加粗的\(a_1\)。有时向量投影和vector rejection分别用\(\mathbf{a}_{\parallel\mathbf{b}}\)和\(\mathbf{a}_{\perp\mathbf{b}}\)表示。

ab表示

  当\(\theta\)未知时,可通过ab计算得出,\(\cos\theta = \frac{\mathbf{a}\cdot\mathbf{b}}{\left\Vert\mathbf{a}\right\Vert\left\Vert\mathbf{b}\right\Vert}\),从而标量投影、向量投影和vector rejection可以分别表示如下:

  • 标量投影:

    \begin{equation}
    a_1=\left\Vert\mathbf{a}\right\Vert\cos\theta=\left\Vert\mathbf{a}\right\Vert\frac{\mathbf{a}\cdot\mathbf{b}}{\left\Vert\mathbf{a}\right\Vert\left\Vert\mathbf{b}\right\Vert}=\frac{\mathbf{a}\cdot\mathbf{b}}{\left\Vert\mathbf{b}\right\Vert}
    \end{equation}

  • 向量投影:

    \begin{equation}
    \mathbf{a}_1=a_1\hat{\mathbf{b}}=\frac{\mathbf{a}\cdot\mathbf{b}}{\left\Vert\mathbf{b}\right\Vert}\frac{\mathbf{b}}{\left\Vert\mathbf{b}\right\Vert}=\left(\mathbf{a}\cdot\hat{\mathbf{b}}\right)\hat{\mathbf{b}}=\frac{\mathbf{a}\cdot\mathbf{b}}{\mathbf{b}\cdot\mathbf{b}}\mathbf{b}
    \end{equation}

  • vector rejection:

    \begin{equation}
    \mathbf{a}_2=\mathbf{a}-\mathbf{a}_1=\mathbf{a}-\frac{\mathbf{a}\cdot\mathbf{b}}{\mathbf{b}\cdot\mathbf{b}}\mathbf{b}
    \end{equation}

叉积

定义

  叉积(又称向量积)是三维空间(\(\mathbb{R}^3\))向量的二元操作,用符号\(\times\)表示,给定两个线性独立的向量ab,叉积\(\mathbf{a}\times\mathbf{b}\)的结果是一个向量,这个向量与ab都正交,也就是正交于ab所在的平面。为什么要强调线性独立呢,因为非线性独立的两个向量(同向或反向)的叉积为\(\mathbf{0}\)。

  叉积定义为:

\begin{equation}
\mathbf{a}\times\mathbf{b}=\left\Vert\mathbf{a}\right\Vert\left\Vert\mathbf{b}\right\Vert\sin(\theta)\mathbf{n}
\end{equation}

其中,\(\theta\)表示ab的夹角,\(0^\circ\le\theta\le180^\circ\),\(\mathbf{n}\)正交于ab所在的平面,方向通常由右手法则确定,如下图所示: 

图3 通过右手法则确定叉积方向

性质

  右手法则决定了叉积不符合交换律,而符合反交换律,即\(\mathbf{a}\times\mathbf{b}=-\mathbf{b}\times\mathbf{a}\),如图4所示:

图4 反交换律

  由公式也可以看出当ab的不线性独立时,即夹角为\(0^\circ\)或\(180^\circ\)时,叉积为零向量\(\mathbf{0}\)。叉积随夹角\(\theta\)的变化如图5所示。

图5 叉积随夹角变化示意图

  另外,叉积符合分配律,即\(\mathbf{a}\times(\mathbf{b}+\mathbf{c})=\mathbf{a}\times\mathbf{b}+\mathbf{a}\times\mathbf{c}\)。如图6所示,左图向量bc都被分解为vector projection和vector rejection两部分,右图则解释了分配律成立的原因,看图时要注意图中的平行四边形和正方形都表示了相等的关系。

图6 叉积分配律示意图

坐标表示

  考虑右手法则定义的标准三维坐标系,三个坐标轴\(\mathbf{i}\)、\(\mathbf{j}\)、\(\mathbf{{k}}\)如图7所示,并满足以下等式关系:
\[
\mathbf{i}\times\mathbf{j}=\mathbf{k}\\
\mathbf{j}\times\mathbf{k}=\mathbf{i}\\
\mathbf{k}\times\mathbf{i}=\mathbf{j}
\]
同样,由叉积的反交换律可得下面三个等式关系:
\[
\mathbf{j}\times\mathbf{i}=-\mathbf{k}\\
\mathbf{k}\times\mathbf{j}=-\mathbf{i}\\
\mathbf{i}\times\mathbf{k}=-\mathbf{j}
\]
由平行向量的叉积为零向量可得:\(\mathbf{i}\times\mathbf{i}=\mathbf{j}\times\mathbf{j}=\mathbf{k}\times\mathbf{k}=\mathbf{0}\)。
  由图7也可得,任意一个三维向量都可以表示为三个基向量的线性组合,例如:
\[
\mathbf{a}=a_1\mathbf{i}+a_2\mathbf{j}+a_3\mathbf{k}\\
\mathbf{b}=b_1\mathbf{i}+b_2\mathbf{j}+b_2\mathbf{k}
\]

图7 三维坐标系基向量与向量a的表示

  进而,可以用坐标表示叉积运算如下:

\begin{equation}
\begin{split}
\mathbf{a}\times\mathbf{b}&=(a_1\mathbf{i}+a_2\mathbf{j}+a_3\mathbf{k})\times(b_1\mathbf{i}+b_2\mathbf{j}+b_2\mathbf{k})\\
&=(a_2b_3-a_3b_2)\mathbf{i}+(a_3b_1-a_1b_3)\mathbf{j}+(a_1b_2-a_2b_1)\mathbf{k}\\
&=\left|\begin{array}{cccc}
i & j & k \\
a_1 & a_2 & a_3\\
b_1 & b_2 & b_3
\end{array}\right|
\end{split}
\end{equation}

上式中,将括号展开分别进行叉积推导出第二个等号,而第三个等号则可通过行列式计算得出。
  进一步,可将叉积表示为矩阵与向量相乘的形式,由于\(\mathbf{a}\times\mathbf{b}=(a_2b_3-a_3b_2, a_3b_1-a_1b_3,a_1b_2-a_2b_1)\),则叉积可表示为:

\begin{equation}
\begin{split}
\mathbf{a}\times\mathbf{b}=\left[\mathbf{a}\right]_\times\mathbf{b}=\left[\begin{array}{cccc}
0 & -a_3 & a_2\\
a_3 & 0 & -a_1\\
-a_2 & a_1 & 0
\end{array}
\right]\left[
\begin{array}{cc}
b_1\\b_2\\b_3
\end{array}\right]=\left[\mathbf{b}\right]^T_\times\mathbf{a}=\left[\begin{array}{cccc}
0 & b_3 & -b_2\\
-b_3 & 0 & b_1\\
b_2 & -b_1 & 0
\end{array}
\right]\left[
\begin{array}{cc}
a_1\\a_2\\a_3
\end{array}\right]
\end{split}
\end{equation}

其中,\(\left[\mathbf{a}\right]_\times\)(slam14讲书上记为\(\mathbf{a}^\wedge\))表示由向量\(\mathbf{a}\)得到的反对称矩阵,定义为:

\begin{equation}
\begin{split}
\left[\mathbf{a}\right]_\times=\left[\begin{array}{cccc}
0 & -a_3 & a_2\\
a_3 & 0 & -a_1\\
-a_2 & a_1 & 0
\end{array}
\right]
\end{split}
\end{equation}

通过该反对称矩阵的定义可以将叉积表示为矩阵与向量的乘法。

罗德里格斯旋转公式

  考虑\(\mathbf{v}\in\mathbb{R}^3\)的三维旋转问题,旋转轴\(\mathbf{k}\)是单位向量,旋转角为\(\theta\),按照右手法则(即逆时针)旋转。则可通过罗德里格斯旋转公式得出旋转后的向量\(\mathbf{v}_{rot}\)为:

\begin{equation}
\mathbf{v}_{rot}=\cos\theta\mathbf{v}+(1-\cos\theta)(\mathbf{k}\cdot\mathbf{v})\mathbf{k}+\sin\theta\mathbf{k}\times\mathbf{v}
\end{equation}

推导过程

  由上文中向量投影部分的知识我们知道,一个向量\(\mathbf{v}\)可以分解为平行于\(\mathbf{k}\)的分量\(\mathbf{v}_\parallel\)和正交于\(\mathbf{k}\)的分量\(\mathbf{v}_{\perp}\):

\begin{equation}
\mathbf{v}=\mathbf{v}_{\parallel}+\mathbf{v}_\perp
\end{equation}

图8 向量的分解图示

如图8所示,因为\(\mathbf{k}\)为单位向量,由向量投影部分知识可得

\begin{equation}
\mathbf{v}_\parallel=(\mathbf{v}\cdot\mathbf{k})\mathbf{k}
\end{equation}

\begin{equation}
\mathbf{v}_\perp=\mathbf{v}-\mathbf{v}_\parallel=\mathbf{v}-(\mathbf{k}\cdot\mathbf{v})\mathbf{k}=-\mathbf{k}\times(\mathbf{k}\times\mathbf{v})
\end{equation}

关于上式最后一个等号的推导如下:

  回顾叉积的知识,\(\mathbf{k}\times\mathbf{v}=\mathbf{k}\times(\mathbf{v}_{\parallel}+\mathbf{v}_\perp)=\mathbf{0}+\mathbf{k}\times\mathbf{v}_\perp=\mathbf{k}\times\mathbf{v}_\perp\),\(\mathbf{k}\times\mathbf{v}\)可以看做将\(\mathbf{v}_\perp\)以\(\mathbf{k}\)为旋转轴逆时针旋转了\(90^\circ\)。正如图9所示,\(\mathbf{v}\)分解为\(\mathbf{v}_\parallel\)和\(\mathbf{v}_\perp\),用右手法则不难确定出\(\mathbf{k}\times\mathbf{v}\)的方向,进而不难发现,\(\mathbf{k}\times(\mathbf{k}\times\mathbf{v})\)可以看做将\(\mathbf{v}_\perp\)以\(\mathbf{k}\)为旋转轴逆时针旋转了\(180^\circ\),图9中的(椭)圆正反映了\(\mathbf{k}\times(\mathbf{k}\times\mathbf{v})\)、\(\mathbf{k}\times\mathbf{v}\)、\(\mathbf{v}_\perp\)三者“大小相等”的关系。最终,可知\(\mathbf{v}_\perp=-\mathbf{k}\times(\mathbf{k}\times\mathbf{v})\)。
  

图9 罗德里格斯旋转公式几何图示

  从图8还可以看出,v的平行分量\(\mathbf{v}_\parallel\)不会因为旋转而改变,旋转后的向量\(\mathbf{v}_{rot}\)的平行分量依然等于\(\mathbf{v}_\parallel\),即\(\mathbf{v}_{\parallel rot}=\mathbf{v}_\parallel\)。
  而v的正交分量\(\mathbf{v}_\perp\)在旋转过程中大小不变,方向会发生变化,即

\begin{equation}
\begin{split}
&|\mathbf{v}_{\perp rot}|=|\mathbf{v}_\perp|\\
&\mathbf{v}_{\perp rot}=\cos\theta\mathbf{v}_\perp+\sin\theta\mathbf{k}\times\mathbf{v}_\perp=\cos\theta\mathbf{v}_\perp+\sin\theta\mathbf{k}\times\mathbf{v}
\end{split}
\end{equation}

上述第2个等式通过图9可以得出,将圆看做\(xOy\)坐标系平面,\(\mathbf{v}_\perp\)所在的直线看做\(x\)轴,\(\mathbf{k}\times\mathbf{v}\)所在的直线看做\(y\)轴,结合三角函数,很容易用\(\mathbf{v}_\perp\)和\(\mathbf{k}\times\mathbf{v}\)表示出\(\mathbf{v}_\perp\)。

  到这已经得出罗德里格斯公式了:

\begin{equation}
\begin{split}
\mathbf{v}_{rot}&=\mathbf{v}_{\parallel rot}+\mathbf{v}_{\perp rot}\\
&=\mathbf{v}_\parallel+\cos\theta\mathbf{v}_\perp+\sin\theta\mathbf{k}\times\mathbf{v}\\
&=\mathbf{v}_\parallel+\cos\theta(\mathbf{v}-\mathbf{v}_\parallel)+\sin\theta\mathbf{k}\times\mathbf{v}\\
&=\cos\theta\mathbf{v}+(1-\cos\theta)\mathbf{v}_\parallel+\sin\theta\mathbf{k}\times\mathbf{v}\\
&=\cos\theta\mathbf{v}+(1-\cos\theta)(\mathbf{k}\cdot\mathbf{v})\mathbf{k}+\sin\theta\mathbf{k}\times\mathbf{v}
\end{split}
\end{equation}

矩阵形式

  在叉积部分提到过叉积可以表示为矩阵乘向量的形式,类似地,罗德里格斯旋转公式可以表示为旋转矩阵乘以向量的形式,\(\mathbf{v}_{rot}=\mathbf{R}\mathbf{v}\),其中\(\mathbf{R}\)是旋转矩阵。在slam14讲\(^{[4]}\)中的表示如下:
\begin{equation}
\mathbf{R}=\cos\theta\mathbf{I}+(1-\cos\theta)\mathbf{k}\mathbf{k}^T+\sin\theta\mathbf{k}^\wedge
\end{equation}
其中,\(\mathbf{I}\)表示单位矩阵,\(\mathbf{k}\)表示旋转向量(书中用\(\mathbf{n}\)表示旋转向量),\(\mathbf{k}^\wedge\)表示由\(\mathbf{k}\)得到的反对称矩阵。从式(13)不难看出上式,另外,结合式(13)还可以得到下面这个式子:

\begin{equation}
\begin{split}
\mathbf{v}_{rot}&=\mathbf{v}_{\parallel rot}+\mathbf{v}_{\perp rot}\\
&=\mathbf{v}_\parallel+\cos\theta\mathbf{v}_\perp+\sin\theta\mathbf{k}\times\mathbf{v}\\
&=\mathbf{v}-\mathbf{v}_\perp+\cos\theta\mathbf{v}_\perp+\sin\theta\mathbf{k}\times\mathbf{v}\\
&=\mathbf{v}+(\sin\theta)\mathbf{k}\times\mathbf{v}+(1-\cos\theta)\mathbf{k}\times\mathbf{k}\times\mathbf{v}
\end{split}
\end{equation}

从而,得出这个维基百科上的矩阵表示:

\begin{equation}
\begin{split}
\mathbf{v}_{rot}=\mathbf{R}\mathbf{v}=\mathbf{v}+(\sin\theta)\mathbf{K}\mathbf{v}+(1-\cos\theta)\mathbf{K}^2\mathbf{v}
\end{split}
\end{equation}

其中,\(\mathbf{R}=\mathbf{I}+(\sin\theta)\mathbf{K}+(1-\cos\theta)\mathbf{K}^2\),\(\mathbf{K}\)表示由旋转向量\(\mathbf{k}\)生成的反对称矩阵。

参考:

[1] Rodrigues' rotation formula
[2] Cross product
[3] Vector projection
[4] 视觉SLAM十四讲:从理论到实践

罗德里格斯旋转公式(Rodrigues' rotation formula)推导的更多相关文章

  1. c++ 知道旋转前后矩阵向量值 求旋转矩阵c++/c#代码 知道两个向量求他们的旋转矩阵

    原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/12115244.html 知道旋转前后矩阵向量值 如何去求旋转矩阵R 的c++/c#代码??? ...

  2. 【多视图几何】TUM 课程 第2章 刚体运动

    课程的 YouTube 地址为:https://www.youtube.com/playlist?list=PLTBdjV_4f-EJn6udZ34tht9EVIW7lbeo4 .视频评论区可以找到课 ...

  3. 回顾Games101图形学(一)几何变换中一些公式的推导

    回顾Games101 chatper1 - 6 前言 本文只写回顾后重新加深认识的知识 透视除法的意义 经过MVP矩阵之后,将模型空间下某点的坐标,转换成了裁剪空间下的坐标,此时因为裁剪空间的范围是x ...

  4. 【Notes_3】现代图形学入门——基础变换、MVP变换模型

    基础变换(二维) 三维变化与二维变换矩阵类似 齐次坐标下的基础变换 Scale: \[S(s_x,s_y) =\begin{pmatrix} s_x &0 &0\\ 0 & s ...

  5. 【Notes】现代图形学入门_01

    跟着闫令琪老师的课程学习,总结自己学习到的知识点 课程网址GAMES101 B站课程地址GAMES101 课程资料百度网盘[提取码:0000] 计算机图形学概述 计算机图形学是一门将模型转化到屏幕上图 ...

  6. UR机械臂运动学正逆解方法

    最近几个月因为工作接触到了机械臂的项目,突然对机械臂运动方法产生了兴趣,也就是如何控制机械臂的位置和姿态.借用一张网上的图片,应该是ur5的尺寸.我用到的是ur3机械臂,除了尺寸不一样,各关节结构和初 ...

  7. 【视觉SLAM14讲】ch3课后题答案

    1.验证旋转矩阵是正交矩阵 感觉下面这篇博客写的不错 http://www.cnblogs.com/caster99/p/4703033.html 总结一下:旋转矩阵是一个完美的矩阵——正交矩阵.①行 ...

  8. CS184.1X 计算机图形学导论(第三讲)

    第一单元(介绍关于变换的数学知识) :基本二维变换 模型坐标系,世界坐标系 1.缩放 Scale(规模,比例) Sx表示在x方向上放大的倍数,Sy表示在y方向上放大的倍数,因此X坐标乘以Sx,Y坐标乘 ...

  9. 旋转矩阵(Rotation Matrix)的推导及其应用

    向量的平移,比较简单. 缩放也较为简单 矩阵如何进行计算呢?之前的文章中有简介一种方法,把行旋转一下,然后与右侧对应相乘.在谷歌图片搜索旋转矩阵时,看到这张动图,觉得表述的很清晰了. 稍微复杂一点的是 ...

随机推荐

  1. C# 根据链接提取div内容

    安装NuGet包    HtmlAgilityPack var wc = new WebClient(); wc.Encoding = Encoding.GetEncoding("UTF-8 ...

  2. 2019-2020春江云暖你先知,CAE/EDA/高校等CloudHPC领域年均复合增长率超21%

    原创: 灵魂工作室 速石科技 我猜,我们是最早和你说春天来了的人. 一年前,我们还在小心谨慎地定义着Cloud HPC,一脸娇羞地拿Novartis 诺华制药在5年前做的案例当作标杆. 不久前,Hyp ...

  3. Spring Boot2 系列教程 (二) | 第一个 SpringBoot 工程详解

    微信公众号:一个优秀的废人 如有问题或建议,请后台留言,我会尽力解决你的问题. 前言 哎呦喂,按照以往的惯例今天周六我的安排应该是待在家学学猫叫啥的.但是今年这种日子就可能一去不复返了,没法办法啊.前 ...

  4. POJ Muddy Fields 泥泞的牧场 二分图

    Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 13235   Accepted: 4879 汪星人 ...

  5. SpringSecurity 默认表单登录页展示流程源码

    SpringSecurity 默认表单登录页展示流程源码 本篇主要讲解 SpringSecurity提供的默认表单登录页 它是如何展示的的流程, 涉及 1.FilterSecurityIntercep ...

  6. 使用Oracle Stream Analytics 21步搭建大数据实时流分析平台

    概要: Oracle Stream Analytics(OSA)是企业级大数据流实时分析计算平台.它可以通过使用复杂的关联模式,扩充和机器学习算法来自动处理和分析大规模实时信息.流式传输的大数据可以源 ...

  7. .Net core路由高级用法

    先说startup中的路由 这里是我们现在用的默认路由,但是在使用当中也有麻烦.总而言之 用的不爽. 使用属性路由:RouteAttribute特性 默认的HomeController下面的Index ...

  8. golang判断目录项中是目录还是文件。

    package main import ( "fmt" "os") func main() { //目录的操作 fmt.Println("请输入文件目 ...

  9. CF572_Div2_D2

    题意 http://codeforces.com/contest/1189/problem/D2 思考 显然地,如果出现度数为2且两条出边边权不相同的情况,是无法构造合法方案的. 下面考虑缩边后的树, ...

  10. XSS Challenges学习笔记 Stage#1~ Stage#19

    开门见山 Stage #1 http://xss-quiz.int21h.jp/?sid=2a75ff06e0147586b7ceb0fe68ee443b86a6e7b9 这一道题发现我们写入的内容直 ...