姿态解算算法推导

2023-11-01

学习视频:https://www.bilibili.com/video/BV1V7411g7h7?p=6&spm_id_from=pageDriver

一、四元数、欧拉角、方向余弦阵在姿态解算中使用

姿态角是由旋转产生的,一般旋转有4种表示方式:方向余弦矩阵表示、欧拉角表示、轴角表示、四元数表示。其中方向余弦矩阵表示适合变换向量,欧拉角最直观,轴角表示适合几何推导,而在组合旋转方面,四元数表示最佳。因为姿态解算需要频繁组合旋转和用旋转变换向量。
所以我们使用四元数来保存飞行器的姿态(也就是飞机在地球坐标系中的俯仰/横滚/航向状态)。姿态控制算法的输入参数必须要是欧拉角。所以在需要控制的时候,会将四元数转化为欧拉角,但是四元数转化成欧拉角又需要借助方向余弦阵来实现。
姿态解算到姿态控制的整个流程。MPU9250输出的3个维度的陀螺仪值、3个维度的加速度值、3个维度的磁力计值,每个值为16位精度。MPU9250输出的AD值通过姿态解算算法得到飞行器当前的姿态(姿态使用四元数表示),然后将四元数转化为欧拉角,用于姿态控制算法(PID控制)中。
在这里插入图片描述

二、Mahony互补滤波算法分析

1.欧拉角描述的方向余弦矩阵

定理:空间中坐标系的任意旋转,等效于依次绕三个坐标轴的定轴旋转
在这里插入图片描述
如上图所示紫色的坐标系记为b系,蓝色的坐标系记为n系。b系是由n系任意旋转得到。那么这个旋转等效于绕Xn轴旋转,绕Yn轴旋转,绕Zn轴旋转的叠加。但是这种旋转怎么表示呢?换句话说p点旋转到p’他们的坐标有什么对应关系呢?
下面我们以绕Zn 轴旋转为例,推导一下空间旋转过程中坐标是怎么样转化的:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将上述三个式子写成矩阵形式:
在这里插入图片描述
整理一下:
在这里插入图片描述
这样我们就用有欧拉角 α \alpha α组成的 C 1 2 C_1^2 C12描述了这次旋转。那么同理我们也可以推出图12-7的三个旋转阵。
在这里插入图片描述
接着我们将这三个旋转阵,组合成一个旋转矩阵。其实也就是将这三个矩阵进行乘法运算(左乘)。运算如下:
在这里插入图片描述
那么这个 C n b C_n^b Cnb。矩阵就是方向余弦矩阵(也称旋转矩阵),这个矩阵也就描述了b 系相对于n系的旋转。如果我们知道任意向量在b系中的坐标,那么就可以利用方向余弦矩阵确定它在n系中的坐标,反之亦然。
这个方向余弦矩阵还有一个特点就是这个矩阵的元素都是由欧拉角 θ 、 γ 、 ψ \theta、\gamma、\psi θγψ的正弦和余弦的组合成的,而我们需要的姿态也就是这三个角,那么我们该怎么求出 θ 、 γ 、 ψ \theta、\gamma、\psi θγψ呢?那我们只需套用欧拉角的微分方程就可以解出这三个角,但是由于欧拉角微分方程中包含了大量的三角运算,这给实时解算带来了一定的困难而且当俯仰角为90度时方程式会出现神奇的“死锁”。所以欧拉角方法只适用于水平姿态变化不大的情况,而不适用于全姿态飞行器的姿态确定。
下面我们继续寻找看看有没有其他方法更简便的方法,现在我们将 C b n C_b^n Cbn记做:
在这里插入图片描述
由于n系至b系旋转过程中坐标系始终保持直角坐标系,所以 C n b C_n^b Cnb是正交矩阵也就有了:
在这里插入图片描述
也就是说矩阵 C b n C_b^n Cbn可以将b系的向量转换到n系表示,矩阵 C n b C_n^b Cnb可以将n系的向量转换到b系表示。
仔细观察上面式子可以得到如下式子:
在这里插入图片描述
也就是如果我们能求出, C n b C_n^b Cnb矩阵中的T32、T31、T12、T22的值就可以求出这个三个欧拉角。

2.四元数描述的方向余弦矩阵

**思考:**既然欧拉角能描述方向余弦矩阵,那么我们是否也能用四元数来描述方向余弦矩阵呢?
答案是肯定的,四元数描述的方向余弦矩阵 C n b C_n^b Cnb如下:
在这里插入图片描述
具体的推导过程大家参考:四元数与姿态阵间的关系——《惯性导航》–秦永元P292-297。
既然方向余弦矩阵 C n b C_n^b Cnb的元素,都已经被四元数的四个变量给替换掉了。那么我们求解姿态的问题就转化成了求解这一组四元数的问题了。
在这里插入图片描述
一旦求解出qo,q1,q2,q3,也就能反解出欧拉角了。

3.求解四元数

通过前面的分析我知道,一组四元数已经足够表达一个飞行器的完整姿态了,因为通过四元数可以构建出一个方向余弦矩阵了,而方向余弦矩阵正是由于飞行器在空间中发生旋转所引起的,因此我们也就可以说一组四元数就包含了一个完整的旋转过程,也就我们说的飞行姿态。那么我们想要得到飞行姿态,只需要实时更新四元数就行了。
那么我们就可以构建四元数关于时间的微分方程,来研究四元数的变化过程。因为考虑到陀螺仪测量的角速度,所以我们用四元数的三角表示式来建立一个微分方程,如果可以求解出该微分方程,那么也就成功的解出了四元数。
三角表示式:
在这里插入图片描述
令四元数对时间t进行微分,可得到微分方程化简后如下:
在这里插入图片描述
记为: d Q / d t = Φ ⋅ Q dQ/dt= \Phi\cdot Q dQ/dt=ΦQ;接下来就剩下求解这个微分方程了,但是求解这个微分方程,还需要考虑单片机只能处理离散数据的特点。因此选择一阶龙格库塔法来求解微分方程,一阶龙格库塔法可以通过有限次迭代求解出函数的微分方程的解。
设有微分方程:
在这里插入图片描述
根据一阶龙格库塔法可以得到求解y的迭代公式:
在这里插入图片描述

套用公式可得四元数微分方程:
在这里插入图片描述
写成矩阵形式如下:
在这里插入图片描述
观察上面的公式: [ q 0 q 1 q 2 q 3 ] t + Δ t T [q_0 q_1 q_2 q_3]_{t+\Delta t}^T [q0q1q2q3]t+ΔtT是当前四元数, [ g 0 q 1 q 2 q 3 ] t T [g_0q_1 q_2 q_3]_t^T [g0q1q2q3]tT是上个周期的四元数, Δ t \Delta t Δt是计算周期,最后这个矩阵里的元素是各轴角速度 ( W x , W y , W z ) (W_x ,W_y,W_z) Wx,Wy,Wz)与四元数 ( q 0 , q 1 , q 2 , q 3 ) (q_0,q_1,q_2,q_3) q0,q1,q2,q3的组合。角速度 ( W x , W y , W z ) (W_x ,W_y ,W_z) Wx,Wy,Wz)数据是可以通过陀螺仪测出来的,如果陀螺仪的数据是理想状态,那么我们就可以求出准确的四元数。但是事与愿违由于噪声的影响会引入误差,因此我们需要使用加速度计和磁力计对陀螺仪数据进行校准。所以说我们在套用上面公式求解四元数时,一定要先保证陀螺仪数据的可靠性。

4.传感器数据的融合

陀螺仪,测量角速度,具有高动态特性,它是一个间接测量角度的器件。它测量的是角速度,要将角速度对时间积分才能得到角度。由于噪声等误差影响,在积分作用下不断积累,最终导致陀螺仪的低频干扰和漂移
假设陀螺仪固定不动,理想角速度值是0dps(degree per second),但是有一个偏置0.1dps 加在上面,于是测量出来是0.1dps,积分一秒之后,得到的角度是0.1度,1分钟之后是6度,还能忍受,一小时之后是360度,转了一圈,也就是说,陀螺仪在短时间内有很大的参考价值。使用陀螺仪获得角度,一定要考虑积分误差的问题
加速度计,测量当前加速度(包含重力加速度g)的方向(也叫重力感应器),在悬停时,输出为g。由其测量原理导致的高频信号敏感,使得加速度计在振动环境中高频干扰较大。
加速度计若是绕着重力加速度的轴转动,则测量值不会改变,也就是说无法感知这种水平旋转。
在这里插入图片描述
上面解四元数微分方程的公式里,直接用到了角速度数据,所以我们需要尽可能减小陀螺仪的积分误差,我们数据融合的思路是用加速度数据来校准陀螺仪数据的积分误差。那么我们该怎么让陀螺仪数据与加速度数据建立关系呢?
这时候我们就需要用方向余弦阵了:
在这里插入图片描述
设在导航坐标系(n系)下有重力加速度向量g,把 g n g_n gn旋转到机体坐标系(b 系),得到其机体坐标系的重力加速度向量 v b v_b vb,则两者的转换关系可以用方向余弦矩阵 C n b C_n^b Cnb来实现转换如下:
在这里插入图片描述
观察上计算结果我们可以发现 [ v b x v b y v b z ] T = [ T 31 T 32 T 33 ] T [v_{bx} v_{by} v_{bz}]^T=[T _{31} T_{32} T_{33}]^T [vbxvbyvbz]T=[T31T32T33]T,我们发现转换到b系下的 [ v b x v b y v b z ] T [v_{bx} v_{by} v_{bz}]^T [vbxvbyvbz]T恰好是方向余弦矩阵 C n b C_n^b Cnb的第三列,并且第三列是用四元数进行表示的,也就是说四元数和机体的重力加速度是可以相互推导的,并且四元数又是用角速度数据求出来的。那么关系如下:
在这里插入图片描述
由图12-11可知四元数和理论重力加速度( v b v_b vb)可以相互推导得出,理论上四元数推出来的 v b v_b vb应该和加速度计测量的实际重力加速度( a b a_b ab)完全重合( v b v_b vb, a b a_b ab都是向量),但是由于四元数是由角速度数据解算出来的,由于角速度数据有误差,导致了 v b v_b vb a b a_b ab不再重合,那么我们此时就可以通过向量的叉积(外积),来度量这个误差的大小。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.误差补偿

上面已经利用向量的叉积度量了 v b v_b vb a b a_b ab的误差error,那么这个error该如何补偿到陀螺仪数据上呢?
我们这里需要借助PID控制思想,用PI(比例-积分)控制器来控制补偿值的大小,PI控制器公式如下:
在这里插入图片描述
利用比例项来控制传感器的可信度,其中Kp越大就越相信加速度计,Kp越小就越相信陀螺仪,积分项来消除静态误差。
把PI控制器计算出来的补偿值加在角速度上,既可得到可信度较高的陀螺仪数据,然后再带入到一阶龙格库塔法公式里就可以得到当前的四元数。
在这里插入图片描述

由衷的感谢小马哥的课程讲解,让我可以入门姿态解算算法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

姿态解算算法推导 的相关文章

  • Linux shell编程学习笔记32:declare 命令

    0 前言 在 Linux shell编程学习笔记16 bash中的关联数组 https blog csdn net Purpleendurer article details 134053506 spm 1001 2014 3001 550
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 137-基于stm32单片机智能保温杯控制装置Proteus仿真+源程序

    资料编号 137 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DS18B20传感器 电机 制作一个基于stm32单片机智能保温杯控制装置Proteus仿真 2 通过DS18b20传感器检测当前保温杯水的温度 并且
  • HAL库STM32常用外设教程(二)—— GPIO输入\输出

    HAL库STM32常用外设教程 二 GPIO输入 输出 文章目录 HAL库STM32常用外设教程 二 GPIO输入 输出 前言 一 GPIO功能概述 二 GPIO的HAl库驱动 三 GPIO使用示例 1 示例功能 四 代码讲解 五 总结
  • rt-thread studio中新建5.02版本报错

    先吐槽一下 rt thread studio出现BUG真多 好多时间都是在找BUG 但里面用好多控件还是挺好用的 真是又爱又恨 所以一般使用功能不多的话还是用keil多一点 创建5 02版本工程之后直接进行编译 直接会报下面这个错误 资源
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32F103

    提示 来源正点原子 参考STM32F103 战舰开发指南V1 3PDF资料 文章目录 前言 一 pandas是什么 二 使用步骤 1 引入库 2 读入数据 总结 前言 提示 这里可以添加本文要记录的大概内容 开发环境硬件普中科技 接线图在g
  • HAL库学习

    CMSIS简介 CMSIS Cortex Microcontroller Software Interface Standard 微控制器软件接口标准 由ARM和其合作的芯片厂商 ST NXP 软件工具厂商 KEIL IAR 共同制定的标准
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • 一文图解 Transformer,小白也看得懂(完整版)

    原作者 Jay Alammar 原链接 https jalammar github io illustrated transformer 1 导语 谷歌推出的 BERT 模型在11项NLP任务中夺得SOTA结果 引爆了整个NLP界 而BER
  • C 库函数 - mktime()

    描述 C 库函数 time t mktime struct tm timeptr 把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数 发生错误时返回 1 声明 下面是 mktime 函数的声明 time
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 无法使用 OpenOCD 找到脚本文件

    我正在尝试按照本教程将 OpenOCD 与我的 ST 发现板一起使用 https japaric github io discovery README html https japaric github io discovery READM
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • STM32F4XX的12位ADC采集数值超过4096&右对齐模式设置失败

    文章目录 一 前言 二 问题1 数值超过4096 三 问题1的排错过程 四 问题2 右对齐模式设置失败 五 问题2的解决方法 5 1 将ADC ExternalTrigConv设置为0 5 2 使用ADC StructInit 函数 一 前
  • 核心耦合内存在 STM32F4xx 上可执行吗?

    尝试从 STM32F429s CCM 运行代码 但每当我命中 CCM 中的第一条指令时 我总是会遇到硬故障 并且 IBUSERR 标志被设置 该指令有效且一致 STM32F4xx 是否可能不允许从 CCM 执行 数据访问效果良好 alios
  • HAL_Delay() 陷入无限循环

    我被 HAL Delay 函数困住了 当我调用此函数 HAL Delay 时 控制陷入无限循环 在寻找问题的过程中 我发现了这个 http www openstm32 org forumthread2145 threadId2146 htt
  • 当端点和 PMA 地址均更改时,CubeMX 生成的 USB HID 设备发送错误数据

    我正在调试我正在创建的复合设备的问题 并在新生成的仅 CubeMX 代码中重新创建了该问题 以使其更容易解决 我添加了少量代码main 让我发送 USB HID 鼠标点击 并在按下蓝色按钮时使 LED 闪烁 uint8 t click re
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL

随机推荐

  • 浏览器地址栏输入一个网址到页面展示网页内容的这段时间内,浏览器和服务器都发生了什么事情?

    1 在接受到用户输入的网址后 浏览器会开启一个线程来处理这个请求 对用户输入的URL地址进行分析判断 如果是HTTP协议就按照HTTP方式来处理 2 调用浏览器引擎中的对应方法 比如WebView中的loadUrl方法 分析并加载这个URL
  • UE5 添加插件

    1 编辑 gt 插件 gt 添加 2 选择插件类型 输入插件名称 设置插件目录 点击 创建插件 3 在工程目录下生成Plugins目录 而且在Plugins目录下生成各个插件的目录
  • 爽,我终于掌握了selenium图片滑块验证码

    因为种种原因没能实现愿景的目标 在这里记录一下中间结果 也算是一个收场吧 这篇文章主要是用selenium解决滑块验证码的个别案列 思路 用selenium打开浏览器指定网站 将残缺块图片和背景图片下载到本地 对比两张图片的相似地方 计算要
  • typeScript中tsconfig.json无故报错

    报错 原因 是由于该文件的同级目录下 没有ts文件 所以会报这种类似于语法错误的 只要在同级下创建一个ts文件即可
  • 回调函数的用法和好处

    回调函数的用法和好处 2009 07 01 18 19 Agzer0 分类 其他编程语言 浏览7080次 1 回调函数的功能是什么 有什么好处 有没有坏处 2 可以的话请编写一个简答的回调函数 看看怎样调用实现的 WndProc里面的不算
  • 数据结构2.4.1顺序队列

    include
  • [1] quick-cocos2d-x 介绍

    quick cocos2d x 是一个可以让您觉得 爽快 的 cocos2d x 的扩展版 基于 cocos2d x 完全的跨平台能力 优异的性能和可靠性 而 quick cocos2d x 在这一切的基础上 添加了完善的 Lua 脚本语言
  • MySQL基础语法--(标量子查询,列子查询,行子查询)

    概念 出现在其他语句内部的SELECT 语句 可以理解为嵌套在一个查询语句中的另外一个SELECT的查询语句 外部查询语句称为主查询或者外查询 分类 按照子查询出现的位置 select 后面 FROM 后面支持表子查询 WHERE 或HAV
  • C语言注释风格(函数、功能、输入、输出、返回)

    C语言编程规范 注释 规则 1 一般情况下 源程序有效注释量必须在20 以上 说明 注释的原则是有助于对程序的阅读理解 在该加的地方都加了 注释不宜太多也不能太少 注释语言必须准确 易懂 简洁 2 说明性文件 如头文件 h文件 inc文件
  • dubbo整合nacos

    文章目录 前言 一 搭建工程框架 新建maven空工程作为父工程 新建服务提供者provider模块 新建消费者 consumer模块 新建公共接口interface模块 二 各模块代码 2 1服务提供者 boot user service
  • 【Linux命令-shell】案例练习:进度条、菜单选择、fork炸弹

    目录 1 进度条 2 菜单选择 3 fork炸弹 1 进度条 progress sh文件内容如下 bin bash bar while do echo en 033 42m 033 0m en是不换行 42m是背景色 sleep 0 5 间
  • 闪烁星空背景(html/css)

    效果视频 starts 源码
  • 无需外设实现电脑远程开机

    所谓的远程开机本质上就是触发电脑电源的断电 通电功能 台式机 笔记本都是同样的道理 向日葵等远程软件的什么智能插拔 某某棒等本质上就是这个原理 并没有特殊功能 就是借助BIOS自身的功能 实现通断电触发开机 没必要花那个冤枉钱 开机原理 电
  • python爬虫网络请求超时_python爬虫多次请求超时的几种重试方法

    第一种方法 headers Dict url https www baidu com try proxies None response requests get url headers headers verify False proxi
  • Checklist设计编写规范及模板

    一 编写CHECK LIST的目的 1 保障所有的测试面都考虑到并被记录 与无线相关的接口要考虑到无线 联动优势的退款要考虑到断账日前后 2 保障TESTCASE已经覆盖所有的测试主体 3 提高TESTCASE的REVIEW通过率 二 CH
  • 用rust写一个玩具解释器2(lexer)

    词法分析器 输入 由字符 ASCII码 组成的字符串 输出 token 任务 读取输入 并且按规则输出token token 想简单点 就是一个字符串和它的类型 比如说关键字 变量名 非法字符串 所以说我们现在需要 read char sk
  • android opengl函数库之间的关系

    EGL 目录生成libEGL so eglApi cpp eglGetDisplay 触发loader加载libEGL xxx so libGLESv1 CM xxx so libGLESv2 xxx so 或者libGLES androi
  • 蓝桥杯真题:分巧克力

    我们要求出满足条件的大的边长m 首先我们知道最长的边长是100000 最小的边长是1 那么我们可以来二分 最初设l 1 r 100000 之后进行如下操作 1 求中点位置mid l r 2 2 对边长mid记录每个巧克力可以分成多少块 容易
  • PC817+TL431的组合设计

    在隔离型开关电源中经常会采用光耦PC817匹配运放TL431来实现隔离反馈功能 其中TL431是主要的环路补偿器件 实现PID或者Type类补偿器 而PC817则主要用来实现隔离功能 但实际中如果光耦PC817的周边电阻匹配不恰当也会导致某
  • 姿态解算算法推导

    学习视频 https www bilibili com video BV1V7411g7h7 p 6 spm id from pageDriver 一 四元数 欧拉角 方向余弦阵在姿态解算中使用 姿态角是由旋转产生的 一般旋转有4种表示方式