当前位置: 首页 > news >正文

【知识杂记】陀螺仪直接积分就能获得角度吗?

单轴与三轴陀螺仪的姿态解算:从欧拉角到四元数

惯性测量单元(IMU)在导航与控制领域扮演着核心角色,其核心任务之一便是姿态解算。然而,在陀螺仪的姿态解算中,单轴与三轴方案的数学处理方式存在根本差异。本文旨在阐明为何单轴陀螺仪可直接通过积分获取角度,而三轴系统则必须依赖四元数。


单轴陀螺仪的解算原理:平面旋转的简化

当物体运动被严格限定在单一旋转平面时,其姿态解算可被极大地简化。例如,在二维平面上测量偏航角(Yaw)的单轴陀螺仪。在此场景中,不存在轴间耦合效应,且旋转满足可交换性(Commutativity)。

其姿态更新可直接通过角速度对时间进行积分实现:

θ(t)=θ(t0)+∫t0tω(t) dt\theta(t) = \theta(t_0) + \int_{t_0}^{t} \omega(t) \,dtθ(t)=θ(t0)+t0tω(t)dt

这种方法之所以成立,是因为其物理模型已被约束为简单的平面运动,规避了三维旋转的复杂性。


三维旋转的挑战:为何直接积分不可行

相较于平面运动,三维空间中的旋转是一个非线性、非交换的过程。若对三轴陀螺仪测得的角速度(ωx,ωy,ωz\omega_x, \omega_y, \omega_zωx,ωy,ωz)简单地进行积分并采用欧拉角(Roll, Pitch, Yaw)表示姿态,将面临以下三个核心难题:

  1. 万向锁问题(Gimbal Lock)
    欧拉角在特定姿态(如俯仰角为 ±90∘\pm 90^\circ±90)时,会使其中两个旋转轴重合,导致系统失去一个自由度,无法再区分该方向上的旋转。这使得姿态表示出现奇异性,导致解算算法在此状态下失效或不稳定。

  2. 旋转的不可交换性(Non-Commutativity)
    三维空间中的旋转顺序会影响最终结果。即,先绕 xxx 轴旋转再绕 yyy 轴旋转,与先绕 yyy 轴旋转再绕 xxx 轴旋转,所得到的最终姿态是不同的。简单的积分无法捕捉这种内在的非交换性,从而导致姿态解算累积误差。

  3. 轴间耦合效应
    陀螺仪测量的是物体在本体坐标系(Body Frame)下的角速度。当物体旋转时,这个坐标系自身也在随之旋转。这意味着,在一个轴上测得的角速度,实际上是该轴角速度与旋转导致的坐标系变换的综合效应。直接积分无法准确处理这种动态的轴间耦合关系。


四元数的解决方案:无奇异性的姿态表示

为克服欧拉角的局限性,四元数(Quaternion) 作为一种四维超复数被引入,用于表示三维空间中的旋转。其核心优势在于:

  • 无奇异性:四元数可以无缝地表示三维空间中的任何旋转,不存在万向锁问题。
  • 统一更新机制:四元数的姿态更新通过四元数微分方程实现,将三轴角速度作为一个整体进行处理,天然地遵循旋转的非交换性。

dqdt=12q⊗ω\frac{d\mathbf{q}}{dt} = \frac{1}{2}\mathbf{q} \otimes \omegadtdq=21qω

此方程将陀螺仪的测量值(ω\omegaω)作为输入,通过四元数乘法(⊗\otimes)实时更新姿态四元数(q\mathbf{q}q)。通过数值积分求解该方程,即可在避免万向锁的同时,精确地跟踪物体的动态姿态。

四元数的微分方程如何求解这个方程?

四元数的微分方程

四元数的姿态更新核心在于将陀螺仪在本体坐标系(Body Frame)下的角速度测量值,转换为四元数惯性坐标系(Inertial Frame)下的变化率。这个关系由四元数的微分方程来描述。

设一个四元数 q=[q0,q1,q2,q3]T\mathbf{q} = [q_0, q_1, q_2, q_3]^Tq=[q0,q1,q2,q3]T 表示从惯性坐标系到本体坐标系的旋转。设陀螺仪测量的角速度向量为 ωb=[ωx,ωy,ωz]T\boldsymbol{\omega}_b = [\omega_x, \omega_y, \omega_z]^Tωb=[ωx,ωy,ωz]T

我们将角速度向量 ωb\boldsymbol{\omega}_bωb 表示为一个纯四元数(Pure Quaternion),即标量部分为0,向量部分为 ωb\boldsymbol{\omega}_bωb

ω=[0,ωx,ωy,ωz]T\boldsymbol{\omega} = [0, \omega_x, \omega_y, \omega_z]^Tω=[0,ωx,ωy,ωz]T

四元数的微分方程为:

q˙=12q⊗ω\dot{\mathbf{q}} = \frac{1}{2} \mathbf{q} \otimes \boldsymbol{\omega}q˙=21qω

其中:

  • q˙\dot{\mathbf{q}}q˙ 是四元数 q\mathbf{q}q 对时间的导数,表示其变化率。
  • ⊗\otimes 表示四元数乘法。

这个方程的意义在于,它用一种简洁优雅的形式,将**当前姿态(q\mathbf{q}q当前旋转角速度(ω\boldsymbol{\omega}ω)**联系起来,给出了姿态随时间的变化率。

将其展开为矩阵形式,可以更直观地看出其计算过程:

[q˙0q˙1q˙2q˙3]=12[0−ωx−ωy−ωzωx0ωz−ωyωy−ωz0ωxωzωy−ωx0][q0q1q2q3]\begin{bmatrix} \dot{q}_0 \\ \dot{q}_1 \\ \dot{q}_2 \\ \dot{q}_3 \end{bmatrix} = \frac{1}{2} \begin{bmatrix} 0 & -\omega_x & -\omega_y & -\omega_z \\ \omega_x & 0 & \omega_z & -\omega_y \\ \omega_y & -\omega_z & 0 & \omega_x \\ \omega_z & \omega_y & -\omega_x & 0 \end{bmatrix} \begin{bmatrix} q_0 \\ q_1 \\ q_2 \\ q_3 \end{bmatrix}q˙0q˙1q˙2q˙3=210ωxωyωzωx0ωzωyωyωz0ωxωzωyωx0q0q1q2q3


微分方程的求解:两种主要方法

在实际应用中,陀螺仪的角速度是离散采样的,因此我们需要在每个采样周期内求解这个微分方程。常用的求解方法有两种:一阶近似二阶近似

设采样周期为 Δt\Delta tΔt,在时刻 kkk 的角速度为 ωk\boldsymbol{\omega}_kωk

1. 一阶龙格-库塔法(欧拉法)

这是最简单、最常用的求解方法,本质上是将微分方程进行一阶泰勒展开

  • 原理:我们假设在短时间 Δt\Delta tΔt 内,角速度 ωk\boldsymbol{\omega}_kωk 保持恒定。那么四元数的更新可以近似为:

qk+1=qk+Δt⋅q˙k\mathbf{q}_{k+1} = \mathbf{q}_k + \Delta t \cdot \dot{\mathbf{q}}_kqk+1=qk+Δtq˙k

  • 具体步骤

    1. 将陀螺仪测量的角速度 ωk=[ωx,ωy,ωz]T\boldsymbol{\omega}_k = [\omega_x, \omega_y, \omega_z]^Tωk=[ωx,ωy,ωz]T 转换为一个增量旋转四元数 Δqk\Delta\mathbf{q}_kΔqk。这个增量四元数表示在 Δt\Delta tΔt 时间内的微小旋转。

    Δqk=[cos⁡(∥ωk∥Δt2),ωx∥ωk∥sin⁡(∥ωk∥Δt2),ωy∥ωk∥sin⁡(∥ωk∥Δt2),ωz∥ωk∥sin⁡(∥ωk∥Δt2)]T\Delta\mathbf{q}_k = \left[ \cos\left(\frac{\left\lVert \boldsymbol{\omega}_k \right\rVert \Delta t}{2}\right), \frac{\omega_x}{\left\lVert \boldsymbol{\omega}_k \right\rVert} \sin\left(\frac{\left\lVert \boldsymbol{\omega}_k \right\rVert \Delta t}{2}\right), \frac{\omega_y}{\left\lVert \boldsymbol{\omega}_k \right\rVert} \sin\left(\frac{\left\lVert \boldsymbol{\omega}_k \right\rVert \Delta t}{2}\right), \frac{\omega_z}{\left\lVert \boldsymbol{\omega}_k \right\rVert} \sin\left(\frac{\left\lVert \boldsymbol{\omega}_k \right\rVert \Delta t}{2}\right) \right]^TΔqk=[cos(2ωkΔt),ωkωxsin(2ωkΔt),ωkωysin(2ωkΔt),ωkωzsin(2ωkΔt)]T

    1. 利用四元数乘法来更新姿态。

    qk+1=qk⊗Δqk\mathbf{q}_{k+1} = \mathbf{q}_k \otimes \Delta\mathbf{q}_kqk+1=qkΔqk

  • 优点:计算简单、实时性好。

  • 缺点:当角速度较大时,其近似误差也会随之增大。

2. 二阶龙格-库塔法

为了提高精度,尤其是在高动态运动下,可以使用二阶或更高阶的求解方法。这里以二阶法为例。

  • 原理:它利用了当前时刻和下一个时刻的角速度信息来提高求解精度。

  • 具体步骤

    1. 计算初始的增量旋转四元数 Δq1\Delta\mathbf{q}_1Δq1 (与一阶法相同)。

    Δq1=[cos⁡(∥ωk∥Δt2),… ]T\Delta\mathbf{q}_1 = \left[ \cos\left(\frac{\left\lVert \boldsymbol{\omega}_k \right\rVert \Delta t}{2}\right), \dots \right]^TΔq1=[cos(2ωkΔt),]T

    1. 计算中间的角速度。首先用 Δq1\Delta\mathbf{q}_1Δq1 预测一个中间姿态 qmid=qk⊗Δq1\mathbf{q}_{mid} = \mathbf{q}_k \otimes \Delta\mathbf{q}_1qmid=qkΔq1。然后将陀螺仪在 k+1k+1k+1 时刻的测量值 ωk+1\boldsymbol{\omega}_{k+1}ωk+1 转换为本体坐标系下的角速度,并计算一个修正的增量四元数 Δq2\Delta\mathbf{q}_2Δq2

    2. 结合两者,得到最终的更新四元数。由于计算复杂,通常在工程中会使用近似或等效的等效旋转矢量方法来简化计算。

  • 优点:精度显著高于一阶方法,尤其适用于高动态环境。

  • 缺点:计算量增加。

在实际的IMU姿态解算中,通常会使用一阶近似方法,因为它的计算效率高,能够满足大多数实时应用的需求。对于高动态和高精度要求场景,可以考虑使用二阶或更高阶的求解器。此外,无论使用哪种方法,为了防止数值误差积累导致四元数范数偏离1,每次更新后都需要进行归一化处理。


贴一张武大讲义中的精炼图。
在这里插入图片描述

http://www.dtcms.com/a/341388.html

相关文章:

  • 【C++】C++的类型转换
  • 《P1967 [NOIP 2013 提高组] 货车运输》
  • 多线程 + 事务传播误用导致的问题
  • 【北京迅为】iTOP-4412精英版使用手册-第三十二章 网络通信-TCP套字节
  • 如何排查服务器DNS解析失败的问题
  • TypeScript中的枚举
  • UE5分享序列播放器的停止与设置播放范围
  • 8.20作业
  • [Mysql数据库] 用户管理选择题
  • IIS访问报错:HTTP 错误 500.19 - Internal Server Error
  • rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(一)基本代码
  • python的校园顺路代送系统
  • Seaweed-APT:AI视频生成模型,单步生成2秒钟的1280x720 24fps视频
  • 46.安卓逆向2-补环境-使用unidbg(使用apk文件补环境)
  • 面试记录5 .net
  • 电商大数据的采集过程详解​【采集内容|采集渠道|采集步骤|注意事项】
  • 算法第34天|动态规划:打家劫舍Ⅰ、打家劫舍Ⅱ、打家劫舍Ⅲ
  • 为了更强大的空间智能,如何将2D图像转换成完整、具有真实尺度和外观的3D场景?
  • (双类别检测:电动车 + 头部,再对头部分类)VS 单类别检测 + ROI 分类器 方案
  • 小迪安全v2023学习笔记(六十七讲)—— Java安全JNDI注入五大不安全组件RCE不出网
  • 2025年中高级后端开发Java岗八股文最新开源
  • 利用 PHP 爬虫获取店铺所有商品实战指南
  • Spring Boot 3.4.x 性能优化实战:用 Undertow 替换 Tomcat 全指南​
  • 自动驾驶汽车机器学习安全实用解决方案
  • 三坐标性能的创新重构,“高精度、紧凑型、高稳定性”三位一体
  • 鸿蒙中Profiler的使用
  • STM32学习笔记16-SPI硬件控制
  • MySQL 语法基础入门:从零开始掌握数据库操作
  • CoreShop微信小程序商城框架开启多租户-添加一个WPF客户端以便进行本地操作(5)
  • 读《精益数据分析》:规模化(Scale)—— 复制成功,进军新市场