有趣的四元数,无聊的Rotation,舒心的EulerAngle

常见的姿态的表示有欧拉角,四元数,旋转矩阵三种方式。其中欧拉角的表示是最直观的,
说白的就是给人看的。但是欧拉角这个东西有很多问题。

1. 万向锁死结
2. 定义是有先后旋转顺序的
3. 空间的姿态是用旋转表示的,应该用乘法。

由此,在工程中,很多时候都是采用四元数的方式进行运算,原因在于:

  1. 四元数不存在奇异问题,也就是没有万向锁死结的问题
  2. 四元数采用四个数来表示旋转,相比旋转矩阵,结构更紧凑
  3. 从IMU中读取到的数据,通常采用秦永元老师的方法求解出姿态数据,而此时的姿态数据是采用四元数进行表示的

但是,四元数具有二义性的问题。这里要展开说明一下:
首先,定义四元数 q = [ q 0 ( t ) q v T ( t ) ] T ∈ R × R 3 × 1 q = \begin{bmatrix} q_0(t) & q^T_v(t) \end{bmatrix}^T \in \mathbb{R \times R}^{3\times 1} q=[q0(t)qvT(t)]TR×R3×1, 其中 q 0 ( t ) q_0(t) q0(t) 表示四元数的实数部分, q v ( t ) q_v(t) qv(t)表示虚数部分。另一方面,四元数还可以采用旋转轴和旋转角的方式来表示,即
q 0 ( t ) = c o s ( θ 2 ) q v ( t ) = [ n x s i n ( θ 2 ) n y s i n ( θ 2 ) n z s i n ( θ 2 ) ] q_0(t) = cos(\frac{\theta}{2}) \\ q_v(t) = \begin{bmatrix} n_x sin(\frac{\theta}{2}) \\ n_y sin(\frac{\theta}{2}) \\ n_z sin(\frac{\theta}{2}) \\ \end{bmatrix} q0(t)=cos(2θ)qv(t)=nxsin(2θ)nysin(2θ)nzsin(2θ)
其中, n = [ n x n y n z ] n = \begin{bmatrix} n_x& n_y& n_z \end{bmatrix} n=[nxnynz] 表示旋转轴, θ \theta θ表示旋转角。

另外,四元数的共轭,也就是实部相等,虚部相反的四元数。

四元数的逆,由于四元数的模值为1,所以等于四元数的共轭。

我们来看一下,四元数的逆
虚部相反之后,我们可以理解为旋转轴反向了。同时,又由于
s i n ( 2 π − θ 2 ) = s i n ( θ 2 ) sin(\frac{2\pi - \theta}{2}) = sin(\frac{\theta}{2}) sin(22πθ)=sin(2θ),所以我们可以理解为绕着相反的旋转轴直接旋转 2 π − θ 2\pi-\theta 2πθ的角度,而这种情况下正好和之前的旋转方向相反,旋转角度总和和 2 π 2\pi 2π。而四元数的逆本身表示反向旋转。那么就会出现一个有趣的现象:
即同一个四元数表示绕着旋转轴旋转了 θ \theta θ 以及 2 π − θ 2\pi -\theta 2πθ
而旋转矩阵的控制方式的没有上述问题,但是旋转矩阵的计算方法采用的是一个 3 × 3 3\times 3 3×3的矩阵进行运算,针对三个姿态角,九个数据来进行表示,是一种冗余表示,且旋转矩阵 R R R是一个具有自约束的矩阵,在控制设计中多才采用的是矩阵运行,证明较为复杂。

在工程中多采用四元数进行姿态控制,为了避免二义性的出现,在apm和PX4代码中都采用了相应的方法进行回避
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值