学习目标
- 三维空间的刚体运动描述方式:旋转矩阵、变换矩阵、四元数、欧拉角
- Eigen库的矩阵、几何模块的使用方法
旋转矩阵
三维空间点的描述
假设在一个线性空间中,找到了空间中的一组基(e1,e2,e3)(e_1,e_2,e_3)(e1,e2,e3),那么任意向量a⃗\vec{a}a在这组基下就有一个坐标
a=[e1e2e3][a1a2a3]=a1e1+a2e2+a3e3
a=\left[\begin{matrix}e_1&e_2&e_3\end{matrix}\right]\left[
\begin{matrix}
a_1\\
a_2 \\
a_3 \\
\end{matrix}
\right]=a_1e_1+a_2e_2+a_3e_3
a=[e1e2e3]⎣⎡a1a2a3⎦⎤=a1e1+a2e2+a3e3
这里(a1,a2,a3)T(a_1,a_2,a_3)^T(a1,a2,a3)T称为a在此基下的坐标,坐标的具体取值,一是和向量本身有关,二是和坐标系(基)的选取有关
向量的点积
a⋅b=aTb=∑i=13aibi=∣a∣∣b∣cos<a,b>a\cdot{b}=a^Tb=\sum^3_{i=1}{a_i}{b_i}=|a||b|cos<a,b>a⋅b=aTb=i=1∑3aibi=∣a∣∣b∣cos<a,b>
其中<a,b>指向量a,b的夹角。内积也可以描述向量间的投影关系
向量的外积
a×b=∥e1e2e3a1a2a3b1b2b3∥=[a2b3−a3b2a3b1−a1b3a1b2−a2b1]=[0−a3a2a30−a1−a2a10]ba\times{b}=\left\|\begin{matrix} e_1&e_2&e_3\\a_1&a_2&a_3\\b_1&b_2&b3 \end{matrix} \right\|=\left[\begin{matrix}{a_2b_3}-{a_3b_2}\\ a_3b_1-a_1b_3\\ a_1b_2-a_2b_1 \end{matrix}\right]=\left[\begin{matrix}0&-a_3&a_2\\ a_3&0&-a_1\\ -a_2&a_1&0 \end{matrix}\right]b a×b=∥∥∥∥∥∥e1a1b1e2a2b2e3a3b3∥∥∥∥∥∥=⎣⎡a2b3−a3b2a3b1−a1b3a1b2−a2b1⎦⎤=⎣⎡0a3−a2−a30a1a2−a10⎦⎤b外积的结果视一个向量,它的方向垂直于这两个向量,大小为∣a∣∣b∣sin<a,b>|a||b|sin<a,b>∣a∣∣b∣sin<a,b>,是两个向量张成的四边形有向面积。
欧式变换
欧式变换解决的问题
相机视野中的某个向量ppp,它在相机坐标系下的坐标为pcp_cpc,而从世界坐标系下看,它的坐标为pwp_wpw,那么,这两个坐标之间是如何转换的呢?这时,就需要先得到该点针对机器人坐标系的坐标值,再根据机器人位姿变换到世界坐标系中。我们用一个矩阵TTT来描述。

欧式变换由旋转和平移组成。首先考虑旋转,设单位正交基(e1,e2,e3)(e_1,e_2,e_3)(e1,e2,e3)经过旋转变成(e1′,e2′,e3′)(e'_1,e'_2,e'_3)(e1′,e2′,e3′)。设向量aaa在两个坐标系下的坐标为[a1,a2,a3]T[a_1,a_2,a_3]^T[a1,a2,a3]T和[a1′,a2′,a3′]T[a_1',a_2',a_3']^T[a1′,a2′,a3′]T。根据坐标的定义有:
[e1e2e3][a1a2a3]=[e1′e2′e3′][a1′a2′a3′]\left[\begin{matrix}e_1&e_2&e_3\end{matrix}\right]\left[
\begin{matrix}
a_1\\
a_2 \\
a_3 \\
\end{matrix}
\right]= \left[\begin{matrix}e_1'&e_2'&e_3'\end{matrix}\right]\left[
\begin{matrix}
a_1'\\
a_2' \\
a_3' \\
\end{matrix}
\right][e1e2e3]⎣⎡a1a2a3⎦⎤=[e1′e2′e3′]⎣⎡a1′a2′a3′⎦⎤
将上式左右两边同时左乘[e1Te2Te3T]\left[\begin{matrix}e_1^T\\e_2^T\\e_3^T\end{matrix}\right]⎣⎡e1Te2Te3T⎦⎤,则左边系数变为单位阵,则有:
[a1a2a3]=[e1Te1′e1Te2′e1Te3′e2Te1′e2Te2′e2Te3′e3Te1′e3Te2′e3Te3′]=Ra′\left[\begin{matrix}a_1\\a_2\\a_3\end{matrix}\right]=\left[\begin{matrix}e_1^Te_1'&e_1^Te_2'&e_1^Te_3'\\e_2^Te_1'&e_2^Te_2'&e_2^Te_3'\\e_3^Te_1'&e_3^Te_2'&e_3^Te_3'\end{matrix}\right]=Ra'⎣⎡a1a2a3⎦⎤=⎣⎡e1Te1′e2Te1′e3Te1′e1Te2′e2Te2′e3Te2′e1Te3′e2Te3′e3Te3′⎦⎤=Ra′
矩阵RRR即为旋转矩阵,也被称为方向余弦矩阵,它是一个行列式为1的正交矩阵,反之也成立,可以将nnn维旋转矩阵的集合定义如下:
SO(n)={R∈Rn×n∣RRT=I,det(R)=1}SO(n)=\left\{ { R\in{R^{n\times n}|RR^T=I,det(R)=1}}\right \}SO(n)={R∈Rn×n∣RRT=I,det(R)=1}
SO(n)SO(n)SO(n)是特殊正交群,SO(3)SO(3)SO(3)就是指三维空间的旋转。通过旋转矩阵,我们可以直接讨论两个坐标系之间的旋转变换,而不用再从基开始谈起。
由于旋转矩阵为正交矩阵,它的逆(转置)描述了一个相反的旋转,按照上面的定义方式有:
a′=R−1a=RTaa'=R^{-1}a=R^Taa′=R−1a=RTa
RTR^TRT刻画了一个相反的旋转
考虑到欧式变换中的平移ttt,则有
a′=Ra+ta'=Ra+ta′=Ra+t
上面的描述还存在一个问题就是当变换存在多次时描述会变得很繁琐,因此我们引入齐次坐标重写矩阵:
[a′1]=[Rt0T1]=T[a1]\left[\begin{matrix}a'\\1\end{matrix}\right]=\left[\begin{matrix}R&t\\0^T&1\end{matrix}\right]=T\left[\begin{matrix}a\\1\end{matrix}\right][a′1]=[R0Tt1]=T[a1]
这是一个数学技巧:我们在三维向量得末尾添加1,将其变成了四维向量,称为齐次坐标,矩阵TTT称为变换矩阵。
关于变换矩阵TTT,它具有比较特别得结构,左上角为旋转矩阵,右侧为平移向量,左下角为0向量,右下角为1。这种矩阵又称为特殊欧式群:
SE(3)={T=[Rt0T1]∈R4×4∣R∈SO(3),t∈R3}SE(3)=\left\{ T=\left[ \begin{matrix}R&t\\0^T&1 \end{matrix}\right]\in R^{4\times4} |R\in SO(3),t\in R^3\right\}SE(3)={T=[R0Tt1]∈R4×4∣R∈SO(3),t∈R3}
与SO(3)SO(3)SO(3)一样,求解该矩阵得逆表示一个反向得变换:
T−1=[RT−RTt0T1]T^{-1}=\left[ \begin{matrix} R^T&-R^Tt\\0^T&1\end{matrix}\right]T−1=[RT0T−RTt1]
综上我们介绍了向量及其坐标表示,并介绍了向量间得运算;然后坐标系之间得运动由欧式变换描述,它由平移和旋转组成。旋转可以由旋转矩阵S0(3)S0(3)S0(3)描述,而平移直接由一个R3R^3R3向量描述。最后,如果将平移和旋转放在一个矩阵中,就形成了变换矩阵SE(3)SE(3)SE(3)
旋转向量和欧拉角
旋转向量
当用变换矩阵描述一个6自由度得三维刚体运动时,存在以下两个缺点:
1.S0(3)S0(3)S0(3)得旋转矩阵有9个量,但一次旋转只有3个自由度。因此这种表达方式是冗余得。同理,变换矩阵用16个量表达了6个自由度得变换。那么,是否有更紧凑得表示呢?
2. 旋转矩阵自身带有约束:它必须是个正交矩阵,且行列式为1。变换矩阵也是如此。当想估计或优化一个旋转矩阵或变换矩阵时,这些约束会使得求解变得更困难。
定义一个旋转向量,该旋转向量由一个旋转轴和一个旋转角来描述,假设旋转轴为一个单位长度得向量nnn,角度为θ\thetaθ,,那么向量θn\theta nθn来描述这个旋转。则旋转向量到旋转矩阵得转换有:
R=cosθI+(1−cosθ)nnT+sinθnR=cos\theta I+(1-cos\theta)nn^T+sin\theta nR=cosθI+(1−cosθ)nnT+sinθn^
符号^是向量到反对称矩阵得转换符。反之也可以从一个旋转矩阵到旋转向量得转换。
θ=arccostr(R)−12\theta=arccos\frac{tr(R)-1}{2}θ=arccos2tr(R)−1
欧拉角
用“偏航-俯仰-滚转”(yaw-pitch-roll)3个角度来描述一个旋转,假设一个刚体的前方(朝向我们的方向)为X轴,右侧为Y轴,上方为Z轴,那么,ZYX转角相当于把任意旋转分解成以下3个轴上的转角:
- 绕物体的Z轴旋转,得到偏航角yaw
- 绕旋转之后的Y轴旋转,得到俯仰角pitch
- 绕旋转之后的X轴旋转,得到滚转角roll
四元数
一个四元数qqq拥有一个实部和三个虚部:
q=q0+q1i+q2j+q3kq=q_0+q_1i+q_2j+q_3kq=q0+q1i+q2j+q3k
其中,i,j,k为四元数的三个虚部。这三个虚部满足以下关系式:
{i2=j2=k2=−1ij=k,ji=−kjk=i,kj=−iki=j,ik=−j\left \{ \begin{matrix}i^2=j^2=k^2=-1\\ij=k,ji=-k\\jk=i,kj=-i\\ki=j,ik=-j \end{matrix}\right.⎩⎪⎪⎨⎪⎪⎧i2=j2=k2=−1ij=k,ji=−kjk=i,kj=−iki=j,ik=−j
如果把i,j,k看成三个坐标轴,那么它们与自己的乘法和复数一样,相互之间的乘法和外积一样,有时也可以用一个标量和一个向量来表达四元数:
a=[s,v]T,s=q0∈R,v=[q1,q2,q3]T∈R3a=[s,v]^T, s=q_0\in R,v=[q_1,q_2,q_3]^T\in R^3a=[s,v]T,s=q0∈R,v=[q1,q2,q3]T∈R3
这里,s称为四元数的实部,而v称为它的虚部。如果一个四元数的虚部为0,则称为实四元数,反之,若它的实部为0,则称为虚四元数。
四元数的运算
-
加法和减法
四元数qa,qbq_a,q_bqa,qb的加减运算为:
qa+qb=[sa±sb,va±vb]Tq_a+q_b=[s_a \plusmn s_b, v_a\plusmn v_b]^T qa+qb=[sa±sb,va±vb]T -
乘法
乘法是将qaq_aqa的每一项和qbq_bqb的每一项进行相乘,最后相加
qaqb=[sasb−vaTvb,savb+sbva+va×vb]Tq_aq_b=[s_as_b-v_a^Tv_b,s_av_b+s_bv_a+v_a\times v_b]^Tqaqb=[sasb−vaTvb,savb+sbva+va×vb]T -
模长
∣∣qa∣∣=sa2+xa2+ya2+za2||q_a||=\sqrt{s_a^2+x_a^2+y_a^2+z_a^2}∣∣qa∣∣=sa2+xa2+ya2+za2 -
共轭
四元数的共轭是把虚部取成相反数:
qa∗=sa−xai−yaj−zak=[sa,−va]Tq_a^*=s_a-x_ai-y_aj-z_ak=[s_a,-v_a]^Tqa∗=sa−xai−yaj−zak=[sa,−va]T -
逆
一个四元数的逆为:
q−1=q∗/∣∣q∣∣2q^{-1}=q^*/||q||^2q−1=q∗/∣∣q∣∣2 -
数乘
kq=[ks,kv]Tkq=[ks,kv]^Tkq=[ks,kv]T
相似变换
相似变换比欧式变换多了一个自由度,它允许物体进行均匀缩放,其矩阵表示为:
Ts=[sRt0T1]T_s = \left[\begin{matrix}sR&t\\0^T&1\end{matrix} \right] Ts=[sR0Tt1]
放射变换
TA=[At0T1]T_A=\left[ \begin{matrix}A&t\\0^T&1 \end{matrix} \right]TA=[A0Tt1]
摄影变换
Tp=[AtaTv]T_p =\left[ \begin{matrix}A&t\\a^T&v \end{matrix} \right] Tp=[AaTtv]
综上常见的变换性质比较:

该博客聚焦于三维空间刚体运动描述。介绍了旋转矩阵、变换矩阵、四元数、欧拉角等描述方式,讲解了向量的点积、外积运算,阐述了欧式变换由旋转和平移组成,还提及旋转向量、欧拉角、四元数的概念及运算,最后对比了相似、放射、摄影变换性质。
3218

被折叠的 条评论
为什么被折叠?



