陀螺仪角速度的积分是否等于姿态角(欧拉角)?

1 IMU测量的是什么角速度?

IMU测量的是本体系在惯性系下的角速度在本体系下的分量,其测量的是绝对角速度 ω \omega ω。测量原理[[陀螺仪测量角速度原理|详见]]。

2 陀螺仪角速度的积分是否等于姿态角(欧拉角)?

首先回答不等于。

先给出否定的例子:
一个例子

我们仅用陀螺仪测量的角速度积分作为姿态角度,第一张图,本体系处于水平,此时三轴姿态角为0°,

第一次旋转,绕俯仰轴旋转45度,此时姿态角为:俯仰角45° 滚转角0° 偏航角0°;

第二次旋转,绕偏航轴旋转90度,此时姿态角为:俯仰角0° 滚转角45° 偏航角90°;

显然,上述过程,如果用陀螺仪测得的角速度作为积分计算姿态,则得到,俯仰角45° 滚转角0° 偏航角90°;而实际上,旋转过后,俯仰角0° 滚转角45° 偏航角90°,与实际情况不符。

俯仰角滚转角偏航角
陀螺仪测得45090
实际上04590

原因在于,角速度积分不等于姿态角,而欧拉角速度积分才等于姿态角,角速度、欧拉角、欧拉角速度三者之间存在一定的关系,即欧拉运动学方程

下面给出欧拉角运动学方程的推导过程。

欧拉角的定义
我们把坐标系旋转中的“3-2-1”旋转(Z-Y-X旋转)中的三个角度定义为偏航角 ϕ \phi ϕ、俯仰角 θ \theta θ和滚转角 ψ \psi ψ
对应的旋转矩阵分别为:
R 3 ( ϕ ) = [ cos ⁡ ϕ sin ⁡ ϕ 0 − sin ⁡ ϕ cos ⁡ ϕ 0 0 0 1 ] , R 2 ( θ ) = [ cos ⁡ θ 0 − sin ⁡ θ 0 1 0 s i n θ 0 cos ⁡ θ ] , R 1 ( ψ ) = [ 1 0 0 0 c o s ψ sin ⁡ ψ 0 − sin ⁡ ψ cos ⁡ ψ ] R_{3}(\phi)=\begin{bmatrix} \cos\phi&\sin\phi&0\\ -\sin\phi&\cos\phi&0\\ 0&0&1 \end{bmatrix}, R_{2}(\theta)=\begin{bmatrix} \cos\theta&0&-\sin\theta\\ 0&1&0\\ sin\theta&0&\cos\theta \end{bmatrix}, R_{1}(\psi)=\begin{bmatrix} 1&0&0\\ 0&cos\psi&\sin\psi\\ 0&-\sin\psi&\cos\psi\\ \end{bmatrix} R3(ϕ)= cosϕsinϕ0sinϕcosϕ0001 ,R2(θ)= cosθ0sinθ010sinθ0cosθ ,R1(ψ)= 1000cosψsinψ0sinψcosψ
旋转方向为从惯性系到本体系的旋转即:
[ x y z ] = R 1 ( ψ ) R 2 ( θ ) R 3 ( ϕ ) [ X Y Z ] \begin{bmatrix} x\\ y\\ z \end{bmatrix}= R_1(\psi)R_2(\theta)R_3(\phi) \begin{bmatrix} X\\Y\\Z \end{bmatrix} xyz =R1(ψ)R2(θ)R3(ϕ) XYZ

我们最后要得出的是 [ ω x , ω y , ω z ] ′ [\omega_x,\omega_y,\omega_z]' [ωx,ωy,ωz] [ ϕ ˙ , θ ˙ , ψ ˙ ] ′ [\dot{\phi},\dot{\theta},\dot{\psi}]' [ϕ˙,θ˙,ψ˙],之间的关系,由于 ω \omega ω通常是陀螺仪测得的,其在本体系下分解,因此将其全部转换至本体系,
[ ω x ω y ω z ] = A i ⃗ + B j ⃗ + C k ⃗ \begin{bmatrix} \omega_x\\\omega_y\\\omega_z \end{bmatrix}= A\vec{i}+B\vec{j}+C\vec{k} ωxωyωz =Ai +Bj +Ck

因此,将每一步旋转过程中出现的欧拉角速度向量,都要转化为最终在本体系下的分量。

假设,惯性系为 ( I ⃗ , J ⃗ , K ⃗ ) (\vec{I},\vec{J},\vec{K}) (I ,J ,K ),第一次旋转产生的新坐标系为 ( I ⃗ ′ , J ⃗ ′ , K ⃗ ′ ) (\vec{I}',\vec{J}',\vec{K}') (I ,J ,K ),第二次旋转产生的新坐标系为 ( I ⃗ ′ ′ , J ⃗ ′ ′ , K ⃗ ′ ′ ) (\vec{I}'',\vec{J}'',\vec{K}'') (I ′′,J ′′,K ′′),第三次旋转产生的新坐标系为 ( i ⃗ , j ⃗ , k ⃗ ) (\vec{i},\vec{j},\vec{k}) (i ,j ,k )

从第三次旋转开始看,第三次旋转了 ψ \psi ψ角度,产生的角速度向量为
[ i ⃗ j ⃗ k ⃗ ] [ ψ ˙ 0 0 ] \begin{bmatrix} \vec{i}& \vec{j}& \vec{k} \end{bmatrix} \begin{bmatrix} \dot{\psi}\\0\\0 \end{bmatrix} [i j k ] ψ˙00

第二次旋转了 θ \theta θ角度,产生的角速度向量为
[ I ⃗ ′ ′ J ⃗ ′ ′ K ⃗ ′ ′ ] [ 0 θ ˙ 0 ] = [ i ⃗ j ⃗ k ⃗ ] R 1 ( ψ ) [ 0 θ ˙ 0 ] \begin{bmatrix} \vec{I}''&\vec{J}''&\vec{K}'' \end{bmatrix} \begin{bmatrix} 0\\ \dot{\theta}\\ 0\\ \end{bmatrix}= \begin{bmatrix} \vec{i}& \vec{j}& \vec{k} \end{bmatrix} R_1(\psi) \begin{bmatrix} 0\\ \dot{\theta}\\ 0\\ \end{bmatrix} [I ′′J ′′K ′′] 0θ˙0 =[i j k ]R1(ψ) 0θ˙0

第一次旋转了 ϕ \phi ϕ角度,产生的角速度向量为
[ I ⃗ ′ J ⃗ ′ K ⃗ ′ ] [ 0 0 ϕ ˙ ] = [ i ⃗ j ⃗ k ⃗ ] R 1 ( ψ ) R 2 ( θ ) [ 0 0 ϕ ˙ ] \begin{bmatrix} \vec{I}'&\vec{J}'&\vec{K}' \end{bmatrix} \begin{bmatrix} 0\\0\\\dot{\phi} \end{bmatrix} =\begin{bmatrix} \vec{i}& \vec{j}& \vec{k} \end{bmatrix} R_1(\psi)R_2(\theta) \begin{bmatrix} 0\\0\\\dot{\phi} \end{bmatrix} [I J K ] 00ϕ˙ =[i j k ]R1(ψ)R2(θ) 00ϕ˙

把上述三个式子相加,可得到
[ ω x ω y ω z ] 在 i j k 中表示 = R 1 ( ψ ) R 2 ( θ ) [ 0 0 ϕ ˙ ] + R 1 ( ψ ) [ 0 θ ˙ 0 ] + [ ψ ˙ 0 0 ] \begin{bmatrix} \omega_x\\\omega_y\\\omega_z \end{bmatrix}_{在ijk中表示}= R_1(\psi)R_2(\theta) \begin{bmatrix} 0\\0\\\dot{\phi} \end{bmatrix}+ R_1(\psi) \begin{bmatrix} 0\\ \dot{\theta}\\ 0\\ \end{bmatrix}+ \begin{bmatrix} \dot{\psi}\\ 0\\ 0\\ \end{bmatrix} ωxωyωz ijk中表示=R1(ψ)R2(θ) 00ϕ˙ +R1(ψ) 0θ˙0 + ψ˙00
展开后,可得:
[ ω x ω y ω z ] = [ 1 0 0 0 c o s ψ sin ⁡ ψ 0 − sin ⁡ ψ cos ⁡ ψ ] [ cos ⁡ θ 0 − sin ⁡ θ 0 1 0 s i n θ 0 cos ⁡ θ ] [ 0 0 ϕ ˙ ] + [ 1 0 0 0 c o s ψ sin ⁡ ψ 0 − sin ⁡ ψ cos ⁡ ψ ] [ 0 θ ˙ 0 ] + [ 1 0 0 0 1 0 0 0 1 ] [ ψ ˙ 0 0 ] \begin{bmatrix} \omega_x\\\omega_y\\\omega_z \end{bmatrix}= \begin{bmatrix} 1&0&0\\ 0&cos\psi&\sin\psi\\ 0&-\sin\psi&\cos\psi\\ \end{bmatrix} \begin{bmatrix} \cos\theta&0&-\sin\theta\\ 0&1&0\\ sin\theta&0&\cos\theta \end{bmatrix} \begin{bmatrix} 0\\ 0\\ \dot{\phi}\\ \end{bmatrix}+ \begin{bmatrix} 1&0&0\\ 0&cos\psi&\sin\psi\\ 0&-\sin\psi&\cos\psi\\ \end{bmatrix} \begin{bmatrix} 0\\ \dot{\theta}\\ 0\\ \end{bmatrix}+ \begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&1 \end{bmatrix} \begin{bmatrix} \dot{\psi}\\ 0\\ 0\\ \end{bmatrix} ωxωyωz = 1000cosψsinψ0sinψcosψ cosθ0sinθ010sinθ0cosθ 00ϕ˙ + 1000cosψsinψ0sinψcosψ 0θ˙0 + 100010001 ψ˙00

最终得到
[ ω x ω y ω z ] = [ 1 0 − sin ⁡ θ 0 c o s ψ cos ⁡ θ sin ⁡ ψ 0 − sin ⁡ ψ cos ⁡ θ cos ⁡ ψ ] [ ψ ˙ θ ˙ ϕ ˙ ] \begin{bmatrix} \omega_x\\\omega_y\\\omega_z \end{bmatrix}= \begin{bmatrix} 1&0&-\sin\theta\\ 0&cos\psi&\cos\theta\sin\psi\\ 0&-\sin\psi&\cos\theta\cos\psi\\ \end{bmatrix} \begin{bmatrix} \dot{\psi}\\\dot{\theta}\\\dot{\phi} \end{bmatrix} ωxωyωz = 1000cosψsinψsinθcosθsinψcosθcosψ ψ˙θ˙ϕ˙

姿态角,可以从上式解出,值得注意的是,小角度下,上式可以进一步简化为:
[ ω x ω y ω z ] = [ 1 0 0 0 1 0 0 0 1 ] [ ψ ˙ θ ˙ ϕ ˙ ] \begin{bmatrix} \omega_x\\\omega_y\\\omega_z \end{bmatrix}= \begin{bmatrix} 1&0&0\\ 0&1&0\\ 0&0&1\\ \end{bmatrix} \begin{bmatrix} \dot{\psi}\\\dot{\theta}\\\dot{\phi} \end{bmatrix} ωxωyωz = 100010001 ψ˙θ˙ϕ˙
此时角速度积分近似等于欧拉角速度积分等于欧拉角。

上式解方程过于困难,因此后续引入了四元数运动学方程来进行姿态解算。

3 关于欧拉角万向锁的解释

无伤理解欧拉角中的“万向死锁”现象_哔哩哔哩_bilibili

把一个问题想清楚并讲清楚不容易,感谢各位看官点赞!

### 使用陀螺仪进行姿态解算以获得欧拉角 #### 方法概述 为了通过陀螺仪数据计算设备的姿态,通常采用一阶差分方法来离散化微分方程并求解姿态角。然而,在某些情况下会出现分母等于零的现象,这标志着达到了所谓的“奇异性”,即无法利用该方法完成全部三个自由度上的角度测量[^1]。 #### 实现过程 对于基于6轴传感器(加速度计+陀螺仪)的姿态估计来说,可以先初始化各个方向的角度值为0°;之后每读取一次新的角速度样本就更新当前时刻下的pitch、roll以及yaw参数: - **Roll (横滚)** 和 **Pitch (俯仰)** 的变化率可以直接由三轴陀螺仪测得的数据积分得出; - 而由于地球重力场的存在使得沿Z轴存在固定的向量G=(0, 0,-g),因此可以通过分析X-Y平面上投影长度的变化情况间接推导出Yaw (偏航) 角度改变的信息。 需要注意的是,上述提到的两个角度——俯仰角(Pitch)和翻滚角(Roll)—的具体定义取决于所使用的硬件平台及其坐标系设置方式。例如,在一些应用场合下可能规定前者对应于绕Y轴转动而后者则是关于X轴发生的变动;而在其他场景里两者的关系可能会反过来。所以在编写具体的程序之前一定要确认好这些细节,并据此调整相应的算法逻辑[^2]。 ```python import numpy as np def update_angles(gyro_data, dt): """ 更新欧拉角 参数: gyro_data : list or tuple of floats 来自IMU模块中的角速率信息 [wx, wy, wz] dt : float 时间间隔 返回: roll_pitch_yaw : ndarray shape(3,) 新的状态向量包含[roll, pitch, yaw] """ wx, wy, wz = gyro_data # 初始化状态变量 roll = 0.0 pitch = 0.0 yaw = 0.0 # 计算增量 d_roll = wx * dt d_pitch = wy * dt d_yaw = wz * dt # 应用修正因子处理奇异点问题 if abs(np.cos(pitch)) < 1e-7: # 当cos(pitch)=0时发生奇异性 d_roll = 0 # 更新角度 roll += d_roll pitch += d_pitch yaw += d_yaw return np.array([roll, pitch, yaw]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值