三维空间的刚体运动

作者: 南衍儿 | 来源:发表于2019-04-25 04:21 被阅读0次

    旋转矩阵

    点,向量,坐标系

    刚体不光有位置,还有自身的姿态.位置是指刚体在空间中的哪个地方,姿态是指刚体的朝向.


    欧式变换

    相机运动是一个刚体运动,它保证了同一个向量在各坐标系下的长度和夹角都不会发生变化,这种变换称为欧式变换.
    假设有一组正交基为(e_1,e_2,e_3)下某个向量的值为 [a_1,a_2,a_3]^T,
    那么在(e_1',e_2',e_3')下,这个向量的坐标为[a_1',a_2',a_3']^T

    a=[e_1,e_2,e_3] \left [ \begin{matrix} a_1 \\ a_2 \\ a_3 \end{matrix} \right ] =[e_1',e_2',e_3'] \left [ \begin{matrix} a_1' \\ a_2' \\ a_3' \end{matrix} \right ]
    于是有
    \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 ] \left [ \begin{matrix} a_1' \\ a_2' \\ a_3' \end{matrix} \right ]\triangleq Ra'

    • \triangleq意思是定义为

    在上式中,我们把两组基之间的内积定义为矩阵R,这个矩阵刻画了旋转前后同一个向量的坐标变化关系,只要旋转时一样的,这个矩阵就是一样的,因此我们把R称为旋转矩阵
    另外,旋转矩阵是一个行列式为1的正交矩阵,反之亦然.
    旋转矩阵的集合叫做特殊正交群群( Special Orthogonal Group) 定义如下:
    SO(n)=\{R\in\mathbb{R}^{n\times n}|RR^T=I,det(R)=1\}

    上式中,SO(n)是特殊正交群的意思,n为向量的维度,I是单位矩阵.
    综上,通过旋转矩阵,我们可以直接谈论两个坐标系之间的旋转变换,而不用再从基开始谈起.也就是说旋转矩阵可以描述相机的旋转.
    且由于旋转矩阵为正交矩阵,它的逆和转置相同,故有
    a' = R^{-1}a=R^{T}a
    所以R^TR的逆运算.

    综上,向量a,经过一次旋转(用R描述)和一次平移t之后,得到的a'
    a'=Ra+t
    其中t为平移向量.


    变换矩阵与齐次坐标

    假设进行两次变换:R_1,t_1R_2,t_2,满足:
    b = R_1a+t_1
    c = R_1b+t_1
    即向量a变成c为:
    c=R_2(R_1a+t_1)+t_2
    这样的形式在多次变换后会过于复杂,引入齐次坐标和变换矩阵重写式:
    \left [ \begin{matrix} a'\\ 1 \end{matrix} \right ] = \left [ \begin{matrix} R&t\\ 0^T&1 \end{matrix} \right ] \left [ \begin{matrix} a\\ 1 \end{matrix} \right ] \triangleq T \left [ \begin{matrix} a\\ 1 \end{matrix} \right ]
    可以看到,我们在三维向量a末尾加上了1,使其变成了四维向量,称为齐次坐标^*.

    T称为变换矩阵:左上角为旋转矩阵R,右上角为平移t

    a的齐次坐标用\tilde a

    有:
    \tilde b = T_1\tilde a

    \tilde c=T_2\tilde b
    于是有
    \tilde c = T_1T_2\tilde a

    另外,在不致歧义的情况下,我们一般不区分齐次坐标和非齐次坐标的写法^{**},也就是说,上式可以写成
    c = T_1T_2a

    对于变换T,具有特殊结构:左上角为旋转矩阵R,右上角为平移向量t,左下角为0,右下角为1,这种矩阵又称为特殊欧式群(Special Euclidean Grop):
    SE(3)= \left \{ T = \left [ \begin{matrix} R&t\\ 0^T& 1 \end{matrix} \right ] \in \mathbb{R}^{4\times 4}|R\in SO(3),t\in \mathbb R \right \}

    T的逆为:
    T^{-1}= \left [ \begin{matrix} R^T&-R^Tt\\ 0^T&1 \end{matrix} \right ]

    *: 齐次坐标,通过添加最后一维,我们用四个实数描述了一个三维向量,这显然多了一个自由度,齐次坐标中,某个点乘以一个常数k,得到的向量与原来相同,也就说[1,1,1,1]^T=[2,2,2,2]^T,所以,但最后一项不为1时,我们可以将所有数除以最后一项,以获得标准坐标.
    **:当我们使用Ta时,默认是齐次坐标;当使用Ra时,默认是非齐次坐标.


    旋转向量和欧拉角

    刚体旋转自由度:一一个刚体在空间任意运动时,可分解为质心O的平动和绕通过质心轴的转动

    • 平动自由度:确定到质心的位置,需要三个坐标(x,y,z)
    • 转动自由度: (\alpha,\beta,\gamma)\三个正交的坐标轴上的旋转

    旋转矩阵有9个量(3x3矩阵),却只能表达物体的旋转(3个自由度),也就是说:SO(3)的旋转矩阵有9个量,但每次旋转只有3个自由度;
    同理,SE(3)有16个变量,可以表达6个自由度(旋转,平移).
    综上,我们想知道有没有更紧凑的表达方式.


    旋转向量

    任意一个旋转,都可以用一个旋转轴和一个旋转角来刻画.于是,我们可以使用一个向量,其方向和旋转轴一致,而长度等于旋转角.这种向量称为旋转向量.(旋转轴过质心)
    对于旋转矩阵,这种表示法只需要一个三维向量即可描述旋转.
    同样的,对于变换矩阵,我们是有一个旋转向量和一个平移向量即可表示一个变换,此时正好为6维.

    所以,旋转向量可以如下表示:
    \theta n
    其中,n为单位旋转轴,\theta为旋转角度.

    旋转向量-->旋转矩阵

    旋转向量\theta n和旋转矩阵R的转换叫做罗德里格斯公式:
    R = \cos\theta I +(1-\cos\theta)nn^T+\sin\theta n^\wedge
    其中I是单位矩阵,\wedge是向量到反对称的转换符.\wedge的定义如下:
    a\times b = \left [ \begin{matrix} i&j&k\\ a_1&a_2&a_3\\ b_1&b_2&b_3 \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 ] \triangleq a^{\wedge}b

    旋转矩阵-->旋转向量
    \theta = \arccos(\frac{tr(R)-1}{2})
    tr(R)是矩阵R的迹.

    关于旋转轴,由于旋转轴向量n在经过旋转R之后,不发生改变,于是有:
    Rn=n
    根据线性代数的知识,我们可以得出转轴n是矩阵R特征值为1的特征向量.


    欧拉角

    无论是旋转矩阵,还是旋转向量都能描述旋转.但是,对人类却十分不直观.

    欧拉角提供一种非常直观的方式来描述旋转--使用3个分离的转角,把一个旋转分解成3次绕不同轴的旋转.
    航空中的偏航角,就是ZYX旋转

    • 绕物体Z轴旋转,偏航角,yaw
    • 旋转之后的Y轴旋转,俯仰角,pitch
    • 旋转之后的X轴旋转,滚动角,roll

    此时,可以用[r,p,y]^T这样一个三维向量来描述任意旋转.
    不同的欧拉叫是按照旋转轴的顺序来称呼的.

    欧拉角具有奇异性问题,也就是万向锁问题:在俯仰角pitch为\pm 90时,第一次旋转yaw与第三次roll将使用同一个轴,使得系统丢失一个自由度.
    所以,欧拉角不适于插值和迭代,往往只用于人机交互.


    四元数

    旋转矩阵使用9个量描述3个自由度旋转,具有冗余性;欧拉角和旋转向量是紧凑的,但是具有奇异性;

    事实上,我们找不到不带奇异性的三维向量描述方式.

    在表达三维空间的旋转的时候,有一种类似于复数的代数:四元数.四元数是一种扩展复数,它即是紧凑的,又是没有奇异性的.虽然,四元数不够直观,计算也较为复杂.

    一个四元数q拥有一个实部和三个虚部,下面式子把实部写在前面(有的写在后面):
    q = q_0+q_1i+q_2j+q_3k
    i,j,k为四元数的三个虚部,满足:
    \left \{ \begin{aligned} i^2 = j^2=k^2=-1 \\ij=k,ji=-k \\jk=i,kj=-i\\ ki=j,ik=-j \end{aligned} \right .

    由于它的这种特殊表现形式,有时人们也用一个标量和一个向量来表示四元数.
    q = [s,v]
    其中
    s=q_0\in \mathbb{R},v=[q_1,q_2,q_3]^T\in \mathbb{R}^3
    这里s称为四元数的实部,v称为虚部.
    如果一个四元数的虚部为0,那么为实四元数,反之为虚四元数.
    假设某个旋转是绕单位向量n=[n_x,n_y,n_z]^T进行了角度为\theta的旋转,那么该旋转的四元数表示为:
    q = [\cos\frac{\theta}{2},n_x\sin\frac{\theta}{2},n_y\sin\frac{\theta}{2},n_z\sin\frac{\theta}{2}]^T

    反之,从单位四元数中可以计算出对应的旋转轴和夹角:
    \left \{ \begin{aligned} \theta = 2\arccos{q_0}\\ [n_x,n_y,n_z]^T = \frac{[q_1,q_2,q_3]^T}{\sin\frac{\theta}{2}} \end{aligned} \right .
    上式给我们一种"转了一半"的感觉,事实上,任意旋转都可以由两个互为相反数的四元数表示,同理,取\theta为0,得到一个没有任何旋转的四元数:
    q_0=[\pm 1,0,0,0]^T

    相关文章

      网友评论

        本文标题:三维空间的刚体运动

        本文链接:https://www.haomeiwen.com/subject/dsmogqtx.html