MPU6050 获取角度理论推导(二)---6轴融合算法

2023-10-30

接着上篇文章:

https://mp.csdn.net/postedit/101777018

  • 姿态角解算---互补滤波算法及理论推导

 

一般在程序中,姿态解算的方式有两种:一种是欧拉角法,一种是四元数法。

这里不介绍欧拉角法,只介绍四元数法。

互补滤波算法:

顾名思义,是多组数据结合互补,并进行滤波处理稳定输出,得到姿态的算法。而我们使用的传感器就是加速度计和陀螺仪。加速度计用于测量加速度,陀螺仪用于测量角速度。 加速度计的静态稳定性更好,而在运动时其数据相对不可靠;陀螺仪的动态稳定性更好,但是静止时数据相对不可靠。所以,我们可以通过加速度计的输出来修正陀螺仪的漂移误差,换句话说,通过加速度计来修正陀螺仪

首先,我们取定导航坐标系n中标准重力加速度g,定义为 ,那么将导航坐标系n下的  转换为载体坐标系b下的: 。 

这里用到了 ,前面在推导基础公式时导出了使用四元数表示的旋转矩阵

 

公式如下:

但是我们要用的是 ,所以还要对  做一个矩阵逆变换。由于它是正交矩阵,对于正交矩阵有这个性质:正交矩阵的逆矩阵等于其的转置。所以我们很容易得到: 

将上式代入  ,而且我们已知 ,所以得到:

接着再定义载体坐标系b中加速度计输出为a,由于前面计算导航坐标系时我们采用的重力加速度是标准重力加速度,所以还需要对其进行归一化,才能继续运算。 
设加速度计三个轴的值分别是ax,ay,az。 

首先求模: 。 


归一化:

 

根据框图的说明再整理一下前面得到的结果: 
标准重力加速度 从n系转到b系中的矩阵表示:

b系下加速度计测量得到的加速度的矩阵表示:

(备注:这是归一化之后的值)

 和  做向量叉乘,即可得到给陀螺仪的校正补偿值e。

表示成矩阵形式更为直观:

然后再使用PI控制器进行滤波,准确地说事消除漂移误差,只要存在误差控制器便会持续作用,直至误差为0。控制的效果取决于P和I参数,分别对应比例控制和积分控制的参数。

这里给出PI控制的公式: 

 是我们要负反馈给陀螺仪进行校正补偿的值,  是比例控制项,  是积分控制项,在程序中采用离散累加计算。关于PID控制理论的东西,这里不做赘述。

如框图中所写,接下来将前面得到的补偿值 加在陀螺仪输出的数据上进行校正。

跟着框图往下走:

将前面的陀螺仪数据通过四元数微分方程转换为四元数输出。 
因为有几个地方我也没搞懂,所以就简单介绍一下四元数微分方程,详细步骤请查阅秦永元的惯性导航一书(第三篇 9.2.3节): 
由于载体的运动,四元数Q是变量,其参数可以表示成关于时间的函数。 

使用四元数的三角形式:

 

 为刚体瞬时绕轴转过的角度,  为归一化后的位置矢量。

设角速度为:

对四元数的三角表示形式求导:

因为  , 且  。

所以:

将上式表示成矩阵形式:

或者

上面的两个公式被称为四元数微分方程。利用陀螺仪的数据进行离散累积便可得到四元数的值,最后再转换成欧拉角形式输出即可。

 

下面也添加了一些注释,把互补滤波算法的理论部分过了一遍后再来对着代码读一遍,应该不会觉得有多难了吧。程序中就只是把前面推导的公式一个个用上去了而已,如果不懂原理直接使用也不会有太大问题。

程序中的积分运算是采用离散累积的方法运算的。PID控制器只是起到了一个稳定数据消除漂移误差的作用。

 

 

 

再附上代码:

#define Kp 10.0f               // proportional gain governs rate of convergence to accelerometer/magnetometer

#define Ki 0.008f            // integral gain governs rate of convergence of gyroscope biases

#define halfT 0.001f        // half the sample period采样周期的一半

 

float q0 = 1, q1 = 0, q2 = 0, q3 = 0;    // quaternion elements representing the estimated orientation

float exInt = 0, eyInt = 0, ezInt = 0;    // scaled integral error

void IMUupdate(float gx, float gy, float gz, float ax, float ay, float az)

{

  float norm;

//  float hx, hy, hz, bx, bz;

  float vx, vy, vz;// wx, wy, wz;

  float ex, ey, ez;

 

  // 先把这些用得到的值算好

  float q0q0 = q0*q0;

  float q0q1 = q0*q1;

  float q0q2 = q0*q2;

//  float q0q3 = q0*q3;

  float q1q1 = q1*q1;

//  float q1q2 = q1*q2;

  float q1q3 = q1*q3;

  float q2q2 = q2*q2;

  float q2q3 = q2*q3;

  float q3q3 = q3*q3;

 

  if(ax*ay*az==0)

        return;

 

  norm = sqrt(ax*ax + ay*ay + az*az);       //acc数据归一化

  ax = ax /norm;

  ay = ay / norm;

  az = az / norm;

 

  // estimated direction of gravity and flux (v and w)估计重力方向和流量/变迁

  vx = 2*(q1q3 - q0q2);                                             //四元素中xyz的表示

  vy = 2*(q0q1 + q2q3);

  vz = q0q0 - q1q1 - q2q2 + q3q3 ;

 

  // error is sum of cross product between reference direction of fields and direction measured by sensors

  ex = (ay*vz - az*vy) ;                                             //向量外积在相减得到差分就是误差

  ey = (az*vx - ax*vz) ;

  ez = (ax*vy - ay*vx) ;

 

  exInt = exInt + ex * Ki;         //对误差进行积分

  eyInt = eyInt + ey * Ki;

  ezInt = ezInt + ez * Ki;

 

  // adjusted gyroscope measurements

  gx = gx + Kp*ex + exInt;         //将误差PI后补偿到陀螺仪,即补偿零点漂移

  gy = gy + Kp*ey + eyInt;

  gz = gz + Kp*ez + ezInt;         //这里的gz由于没有观测者进行矫正会产生漂移,表现出来的就是积分自增或自减

 

  // integrate quaternion rate and normalise   //四元素的微分方程

  q0 = q0 + (-q1*gx - q2*gy - q3*gz)*halfT;

  q1 = q1 + (q0*gx + q2*gz - q3*gy)*halfT;

  q2 = q2 + (q0*gy - q1*gz + q3*gx)*halfT;

  q3 = q3 + (q0*gz + q1*gy - q2*gx)*halfT;

 

  // normalise quaternion

  norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);

  q0 = q0 / norm;

  q1 = q1 / norm;

  q2 = q2 / norm;

  q3 = q3 / norm;

 

  //Q_ANGLE.Yaw = atan2(2 * q1 * q2 + 2 * q0 * q3, -2 * q2*q2 - 2 * q3* q3 + 1)* 57.3; // yaw

  Q_ANGLE.Y  = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch

  Q_ANGLE.X = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll

}

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

MPU6050 获取角度理论推导(二)---6轴融合算法 的相关文章

  • MPU6050温度的计算公式

    在惯导融合的代码中常见计算MPU6050温度的公式 xff0c 如 xff1a temperature 61 36 53f 43 double GetData TEMP OUT H 340 0f 或者 Temp 61 36 53 43 Te
  • mpu6050角度滤波

    文章 xff1a https www cnblogs com we1238 articles 7562028 html 输入量 通过mup6050姿态传感器 xff0c 我们可以分别得到X Y Z轴三个方向的加速度和角速度分量 输出量 我们
  • MPU6050介绍及姿态解算

    1 介绍 xff1a MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件 xff0c 相较于多组件方案 xff0c 免除了组合陀螺仪与加速器时之轴间差的问题 xff0c 减少了安装空间 xff08 1 x
  • MPU6050-扫盲

    文章部分内容转载于 https blog csdn net zmjames2000 article details 88379640 管脚名称说明VCC3 3 5V xff08 内部有稳压芯片 xff09 GND地线SCLMPU6050作为
  • MPU6050温度计算公式

    Tem为16位数据 Tem 43 12412 340 61 Tem 340 43 36 5 Tem每340对应1摄氏度 12412代表0摄氏度
  • MPU6050的一些问题及解决办法

    最近做的项目要用到MPU6050 xff0c 出现了以下这些问题 xff1a 当然 xff0c 也有一些奇怪的事 xff0c 我是在淘宝上买的现成的模块 xff0c 那个ADO无论接地还是高电平 xff0c MPU的地址都是用0xD0 xf
  • DSP28系列—MPU6050漂移补偿方案的探索

    说在前面的话 xff1a 大家都知道 xff0c 陀螺仪是一种能测量角速度的器件 xff0c 是姿态解算 角度测量等任务中无法缺少的工具 单轴的陀螺仪配合单轴的加速度计 xff0c 就能结算出一个姿态角 在平衡车的应用中 xff0c 一维的
  • MPU6050软件姿态解算

    我是勤劳的搬运工 转自 http blog sina com cn s blog c5a00db10102wd7d html http mini eastday com mobile 180306210610472 html 使用MPU60
  • 自平衡小车控制(stc12+mpu6050程序)

    自平衡小车控制 xff08 stc12 43 mpu6050程序 xff09 两轮自平衡车最终版控制程序 xff08 6轴MPU6050 43 互补滤波 43 PWM电机 xff09 单片机STC12C5A60S2 晶振 xff1a 20M
  • Jetson nano i2c教程(MPU6050 + PCA9685)

    首先介绍nano板子上的i2c相关的硬件信息 xff1a 安装所需要的i2c库 sudo apt get install l y i2c tools 完成nano中io与i2c设备的硬件接线 本次案例使用的是PCA9685和MPU6050
  • MPU6050误差分析

    MPU6050模块 xff0c 如图 1所示 该模块集成了一片MPU6050芯片和一片STM8S003F3P6单片机 xff0c 具有串口和I2C接口 MPU6050中的DMP xff08 数字运动处理器 xff09 对姿态进行融合 xff
  • mpu6000、mpu6050陀螺仪加速度计互补滤波数据融合算法原理推导

    时间比较紧 xff0c 就只传照片了
  • MAG02 IMU传感器模块替代MPU6050模块介绍

    MAG02模块内置TDK高精度6轴IMU 惯性测量单元 xff09 传感器芯片 xff0c 通过处理器读取传感器数据 xff0c 并经过内部复杂运算后通过串口输出加速度 xff0c 角速度 xff0c 角度等数据 xff0c 大大减轻了用户
  • mpu6050 z轴校准_技术科普丨TOF标定校准知多少?

    近年来 xff0c 手机摄像头很大的一项技术革新是3D技术 xff0c 而很大部分的3D技术依托于TOF摄像头模组 关于TOF模组的原理和应用 xff0c 之前科普文有很多介绍 xff0c 此处不予赘述 今天我们来聊聊TOF的校准标定 TO
  • stm32使用MPU6050读取温度值验证I2C

    通过MPU6050测温来进行I2C的验证学习 关于MPU6050寄存器相关可以参考https blog csdn net he yuan article details 76559569 I2C时序很多 xff0c 我是直接以原子I2C的程
  • MPU6050介绍及姿态解算

    1 介绍 xff1a MPU6050 是 InvenSense 公司推出的全球首款整合性 6 轴运动处理组件 xff0c 相较于多组件方案 xff0c 免除了组合陀螺仪与加速器时之轴间差的问题 xff0c 减少了安装空间 xff08 1 x
  • MPU6050温度计算公式

    Tem为16位数据 Tem 43 12412 340 61 Tem 340 43 36 5 Tem每340对应1摄氏度 12412代表0摄氏度
  • MPU6050教程(转载)

    如果你想玩四轴 xff0c 想搞什么空中鼠标 xff0c 平衡车等待 xff0c 那么MPU6050真的是太强大了 xff0c 能做很多东西 但是论坛上MPU6050整个教学过程基本上是没有的 xff0c 资源共享 xff0c 不应该只在自
  • 【STM32】I2C练习,HAL库读取MPU6050角度陀螺仪

    I2C练习 MPU6050简介 寄存器查询表格 STM32CubeMx配置 代码文件 mpu6050 h文件 mpu6050 c文件 main c文件 总结 MPU6050简介 MPU 6000 6050 为全球首例整合性6轴运动处理组件
  • 单片机MPU9250/6050陀螺仪芯片驱动

    单片机MPU9250 6050陀螺仪芯片驱动 CubeMX配置 驱动代码 项目需要陀螺仪检测设备位置角度信息 所以就有了本文章 代码借鉴了github上大佬写的应用了卡尔曼滤波 关于寄存器的说明参考 当然驱动代码中也附带了说明 https

随机推荐

  • [持续开源中]用2000元左右做水下机器人

    1 水下机器人功能 1 平稳的运动控制 2 高清视频 3 定深悬停 巡航 2 相关技术 2 1 PC上位机 1 C Winform MVC 现有 2 C MAUI MVVM Socket 开发中 2 2 下位机 水下机器人 2 2 1 So
  • 最长连续子序列的起始位置

    用结构体保存结果 注意的是最长连续子序列需要的是连续 所以dp的状态方程别写错了 include
  • inotify_init使用

    用于监控文件 目录的修改创建删除等操作 也可以配合epoll使用 include
  • Upload-Labs-Windows Pass-01

    题目 解题 步骤1 上传文件 上传一句话木马 编辑文件a php 内容为 直接上传的话 会提示错误 题目要求选择图片格式上传 文件名改为a jpg 内容为 然后通过burp suite来修改上传文件名字 步骤2 改文件名 把a jpg改为a
  • 组件库技术选型总结

    Monorepo Multirepo 架构 Multirepo指的是将模块分为多个仓库 每个团队都拥有自己的仓库 他们可以使用自己的构建流程 代码规范等 但是同时也会存在很多问题 比如模块中间如果存在相互依赖 就必须到目标仓库里进行bug修
  • android动态权限的源码解析

    android 动态权限 android权限的类型 在android9 0中定义了很多权限 如下
  • LeetCode-七进制数、最小高度二叉搜索树

    只是为了记录每天的练习 要好好加油啊呜呜呜现在的我还太拉了 思路很直接啊 就是转进制 数字转字符串 class Solution public string convertToBase7 int num if num 0 特殊情况 retu
  • HelloSpring---第一个spring项目

    1 Spring概述 1 1 简介 Spring 春天 gt 给软件行业带来了春天 2002年 Rod Jahnson首次推出了Spring框架雏形interface21框架 2004年3月24日 Spring框架以interface21框
  • websocket php连接数,swoole websocket协程服务端 因为客户端连接数量过多崩溃

    问题描述 websocket 携程风格的服务端 同时300多个客户端连接的时候 PHP Fatal error Uncaught Error Maximum function nesting level of 256 reached abo
  • ARM汇编多寄存器寻址

    原文转自 http hi baidu com mugua item c43f37cc55a75d35ee4665e6 多寄存器和堆栈寻址的用法 多寄存器寻址 LDMIA LDMIB STMIA STMIB LDMDA LDMDB STMDA
  • 使用Python实现公司地址的(3-4级)标准化

    这个博客的目的是实现公司地址的模糊匹配与3 4级标准化 也可以迁移到房产信息 电话号码之类的字段上 本来的应用场景是反团伙欺诈以及失联客户的修复 大概的意思就是说多个相同公司的同事都在我公司借贷的欺诈可能性要高于其他客户 以及造假的房产信息
  • linux安装百度云盘

    之前window下一直使用绿色 你懂的 的百度云 但时切换到Ubuntu 系统之后 要下载好几个G的百度云资源却没有Linux版的客户端 网上又说使用bcloud 但是在16 04环境安装后总是登录不上 索性直接找了个浏览器插件下载 用起来
  • 股票API下单接口是怎样传入交易数据的?

    股票API下单接口传入交易数据的方法有四种 但主要使用的还是csvdatasetconfig和函数 不过基于当前的线程组或者请求创建CSV数据文件配置组件 如果这份数据只有这一个请求会用 那么就基于请求创建即可 如果这份数据会被这个线程组里
  • IDEA 快捷键等小技巧积累

    快捷键 全局搜索 Ctrl N 利用类名查找类文件 查看类继承关系 Ctrl H 查询某个符号被使用的所有地方 Alt F7 其他 自动导包 代码模板 code template
  • 【node.js】 Windows 下更新 node.js

    文章目录 一 node js 更新 一 查询 node js 版本 二 查询 node js 安装位置 三 官网下载安装包 四 安装到原位置 覆盖旧版本 二 npm 更新 一 查看版本 二 更新版本 三 yarn 更新 一 查看版本 二 更
  • (六)Java操作elasticSearch(2)

    Java操作elasticSearch 2 一 DSL查询文档 0 DSL 1 DSL查询分类 2 全文检索查询 3 精准查询 4 地理坐标查询 5 组合查询 二 搜索结果的处理 0 搜索结果处理整体语法 1 排序 2 分页 3 高亮 三
  • VMware Fusion 挂载物理机硬盘(整盘)

    以下操作前提 系统为 Mac OS OSX 安装了 VMware Fusion 实现原理 类似ESXI中的RDM映射 将物理硬盘映射到一个VM虚拟磁盘 可供VM选择的虚拟磁盘文件 首先查询本机硬盘情况 diskutil list 采用SCS
  • S50非接触式IC卡性能简介(M1)

    主要指标 容量为8K位EEPROM 分为16个扇区 每个扇区为4块 每块16个字节 以块为存取单位 每个扇区有独立的一组密码及访问控制 每张卡有唯一序列号 为32位 具有防冲突机制 支持多卡操作 无电源 自带天线 内含加密控制逻辑和通讯逻辑
  • chatgpt赋能python:Python主动抛出异常详解:了解如何正确地处理异常

    Python主动抛出异常详解 了解如何正确地处理异常 在Python开发中 异常处理是非常重要的一部分 可以使我们的程序更加健壮和可靠 然而并不是所有的错误都是由Python解释器捕获的 我们有时需要手动抛出异常 在本文中 我们将介绍Pyt
  • MPU6050 获取角度理论推导(二)---6轴融合算法

    接着上篇文章 https mp csdn net postedit 101777018 姿态角解算 互补滤波算法及理论推导 一般在程序中 姿态解算的方式有两种 一种是欧拉角法 一种是四元数法 这里不介绍欧拉角法 只介绍四元数法 互补滤波算法