视觉里程计系列(1):三维空间中刚体旋转的几种表达方式

三维空间中刚体旋转的几种表达方式

旋转矩阵

旋转矩阵是一个 3 x 3 的矩阵,在 SLAM 编程中使用比较频繁,它主要有如下特点。

  • 旋转矩阵不是普通的矩阵,它有比较强的约束条件:旋转矩阵具有正交性它和它的转置矩阵的乘积是单位矩阵,且行列式值为 1。
  • 旋转矩阵是可逆矩阵,它的逆矩阵(转置矩阵)表示相反方向的旋转旋转矩阵用9个元素表示3个自由度的旋转,这种表达方式是冗余的。

四元数

四元数由一个实部和三个虚部组成,是一种非常紧凑、没有奇异的表达方式在 SLAM 中应用很广泛。在编程时需要注意以下几点。

  • 单位四元数才能描述旋转,所以使用四元数前必须归一化
  • 在线性代数库 Eigen 中,一定要注意四元数构造及初始化的实部、虚部的顺序和内部系数存储的顺序不同。

旋转向量

旋转向量用一个旋转轴 n n n 和旋转角 θ \theta θ 描述一个旋转,所以也称轴角。不过很明显,因为旋转角度有一定的周期性(360°一圈),所以这种表达方式具有奇异性。

  • 从旋转向量到旋转矩阵的转换过程称为罗德里格斯公式。很多第三方库都提供罗德里格斯函数,如 OpenCV、MATLAB 和 Eigen。
  • 旋转向量和旋转矩阵的转换关系,其实对应于李代数和李群的映射,这对于理解李代数很有帮助。

欧拉角

把一次旋转分解成3次绕不同坐标轴的旋转,比如航空领域经常使用的“偏航-俯仰-滚转”( Yaw,Pitch,Roll)就是一种欧拉角,这种表达方式最大的优势就是直观。

欧拉角在 SLAM 中使用不多,原因是它有一个致命的缺点——万向锁,即在俯仰角为土90°时,第 1 次和第 3 次旋转使用的是同一个坐轴,这样会丢失一个自由度,引起奇异性。事实上,想要无歧义地表达三维旋转,至少需要 4 个变量。

万向锁

  1. 静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止不变,所以称为静态
  2. 动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以被称为动态

动态才有万向锁

代数的角度解释

R x ( α ) = [ 1 0 0 0 cos ⁡ ( α ) − sin ⁡ ( α ) 0 sin ⁡ ( α ) c o s ( α ) ] R y ( β ) = [ cos ⁡ ( β ) 0 sin ⁡ ( β ) 0 1 0 − sin ⁡ ( β ) 0 c o s ( β ) ] R z ( θ ) = [ cos ⁡ ( θ ) − sin ⁡ ( θ ) 0 s i n ( θ ) cos ⁡ ( θ ) 0 0 0 1 ] R_{x}(\alpha)=\begin{bmatrix}1&0&0\\0&\cos(\alpha)&-\sin(\alpha)\\0&\sin(\alpha)& cos(\alpha)\end{bmatrix}\\ R_{y}(\beta)=\begin{bmatrix}\cos(\beta)&0&\sin(\beta)\\0&1&0\\-\sin(\beta)&0& cos(\beta)\end{bmatrix}\\ R_{z}(\theta)=\begin{bmatrix}\cos(\theta)&-\sin(\theta)&0\\sin(\theta)&\cos(\theta)&0\\0&0& 1\end{bmatrix} Rx(α)= 1000cos(α)sin(α)0sin(α)cos(α) Ry(β)= cos(β)0sin(β)010sin(β)0cos(β) Rz(θ)= cos(θ)sin(θ)0sin(θ)cos(θ)0001

R z ( θ ) R y ( π 2 ) R x ( α ) = = [ 0 cos ⁡ ( θ ) ⋅ sin ⁡ ( α ) − cos ⁡ ( α ) ⋅ sin ⁡ ( θ ) sin ⁡ ( α ) ⋅ sin ⁡ ( θ ) + cos ⁡ ( α ) ⋅ cos ⁡ ( θ ) 0 sin ⁡ ( α ) ⋅ sin ⁡ ( θ ) + cos ⁡ ( α ) ⋅ cos ⁡ ( θ ) cos ⁡ ( α ) ⋅ sin ⁡ ( θ ) − cos ⁡ ( θ ) ⋅ sin ⁡ ( α ) − 1 0 0 ] = [ 0 sin ⁡ ( α − θ ) cos ⁡ ( α − θ ) 0 cos ⁡ ( α − θ ) − sin ⁡ ( α − θ ) − 1 0 0 ] = R y ( π 2 ) R x ( α − θ ) \begin{aligned} & R_{z}(\theta)R_{y}(\frac{\pi}{2})R_{x}(\alpha)=\\ & =\left[\begin{array}{ccc} 0 & \cos (\theta) \cdot \sin (\alpha) - \cos (\alpha) \cdot \sin (\theta) & \sin (\alpha) \cdot \sin (\theta)+\cos (\alpha) \cdot \cos (\theta) \\ 0 & \sin (\alpha) \cdot \sin (\theta)+\cos (\alpha) \cdot \cos (\theta) & \cos (\alpha) \cdot \sin (\theta) - \cos (\theta) \cdot \sin (\alpha) \\ -1 & 0 & 0 \end{array}\right] \\ & =\left[\begin{array}{ccc} 0 & \sin (\alpha-\theta) & \cos (\alpha-\theta) \\ 0 & \cos (\alpha-\theta) & -\sin (\alpha-\theta) \\ -1 & 0 & 0 \end{array}\right] \\ & = R_{y}(\frac{\pi}{2})R_{x}(\alpha - \theta) \end{aligned} Rz(θ)Ry(2π)Rx(α)== 001cos(θ)sin(α)cos(α)sin(θ)sin(α)sin(θ)+cos(α)cos(θ)0sin(α)sin(θ)+cos(α)cos(θ)cos(α)sin(θ)cos(θ)sin(α)0 = 001sin(αθ)cos(αθ)0cos(αθ)sin(αθ)0 =Ry(2π)Rx(αθ)

关于 z z z 的变换消失了。

直观理解

欧拉角描述相对于初始状态的变换,只和最终状态有关,与过程无关。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值