MPU6050软件姿态解算

2023-05-16

我是勤劳的搬运工。

转自 http://blog.sina.com.cn/s/blog_c5a00db10102wd7d.html

         http://mini.eastday.com/mobile/180306210610472.html

使用MPU6050硬件DMP解算姿态是非常简单的,下面介绍由三轴陀螺仪和加速度计的值来使用四元数软件解算姿态的方法。

我们先来看看如何用欧拉角描述一次平面旋转(坐标变换):

MPU6050的四元数解算姿态方法

 

设坐标系绕旋转α角后得到坐标系,在空间中有一个矢量在坐标系中的投影为,在内的投影为由于旋转绕进行,所以Z坐标未变,即有。

MPU6050的四元数解算姿态方法

转换成矩阵形式表示为:

MPU6050的四元数解算姿态方法

整理一下:

MPU6050的四元数解算姿态方法

所以从旋转到可以写成上面仅仅是绕一根轴的旋转,如果三维空间中的欧拉角旋转要转三次:

MPU6050的四元数解算姿态方法
上面得到了一个表示旋转的方向余弦矩阵。

不过要想用欧拉角解算姿态,其实我们套用欧拉角微分方程就行了:

MPU6050的四元数解算姿态方法

上式中左侧,是本次更新后的欧拉角,对应row、pit、yaw。右侧,是上个周期测算出来的角度,三个角速度由直接安装在四轴飞行器的三轴陀螺仪在这个周期转动的角度,单位为弧度,计算间隔时T陀螺角速度,比如0.02秒0.01弧度/秒=0.0002弧度。间因此求解这个微分方程就能解算出当前的欧拉角。

前面介绍了什么是欧拉角,而且欧拉角微分方程解算姿态关系简单明了,概念直观容易理解,那么我们为什么不用欧拉角来表示旋转而要引入四元数呢?

一方面是因为欧拉角微分方程中包含了大量的三角运算,这给实时解算带来了一定的困难。而且当俯仰角为90度时方程式会出现神奇的“GimbalLock”。所以欧拉角方法只适用于水平姿态变化不大的情况,而不适用于全姿态飞行器的姿态确定。

四元数法只求解四个未知量的线性微分方程组,计算量小,易于操作,是比较实用的工程方法。

我们知道在平面(x,y)中的旋转可以用复数来表示,同样的三维中的旋转可以用单位四元数来描述。我们来定义一个四元数:

MPU6050的四元数解算姿态方法

我们可以把它写成,其中,。那么是矢量,表示三维空间中的旋转轴。w是标量,表示旋转角度。那么就是绕轴旋转w度,所以一个四元数可以表示一个完整的旋转。只有单位四元数才可以表示旋转,至于为什么,因为这就是四元数表示旋转的约束条件。

而刚才用欧拉角描述的方向余弦矩阵用四元数描述则为:

MPU6050的四元数解算姿态方法

所以在软件解算中,我们要首先把加速度计采集到的值(三维向量)转化为单位向量,即向量除以模,传入参数是陀螺仪x、y、z值和加速度计x、y、z值:

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

{ float norm; 

float vx, vy, vz; float ex, ey, ez;           

norm = sqrt(ax*ax + ay*ay + az*az);       

ax = ax / norm; 

ay = ay / norm; 

az = az / norm;  

下面把四元数换算成方向余弦中的第三行的三个元素。刚好vx、vy、vz 。其实就是上一次的欧拉角(四元数)的机体坐标参考系换算出来的重力的单位向量。

estimated direction of gravity vx = 2*(q1*q3 - q0*q2);

vy = 2*(q0*q1 + q2*q3); 

vz = q0*q0 - q1*q1 - q2*q2 + q3*q3; 

axyz是机体坐标参照系上,加速度计测出来的重力向量,也就是实际测出来的重力向量。

axyz是测量得到的重力向量,vxyz是陀螺积分后的姿态来推算出的重力向量,它们都是机体坐标参照系上的重力向量。

那它们之间的误差向量,就是陀螺积分后的姿态和加计测出来的姿态之间的误差。

向量间的误差,可以用向量叉积(也叫向量外积、叉乘)来表示,exyz就是两个重力向量的叉积。

这个叉积向量仍旧是位于机体坐标系上的,而陀螺积分误差也是在机体坐标系,而且叉积的大小与陀螺积分误差成正比,正好拿来纠正陀螺。(你可以自己拿东西想象一下)由于陀螺是对机体直接积分,所以对陀螺的纠正量会直接体现在对机体坐标系的纠正。

integral error scaled integral gain exInt = exInt + ex*Ki;

eyInt = eyInt + ey*Ki; 

ezInt = ezInt + ez*Ki; 

用叉积误差来做PI修正陀螺零偏

integral error scaled integral gain exInt = exInt + ex*Ki; 

eyInt = eyInt + ey*Ki; 

ezInt = ezInt + ez*Ki;  // adjusted gyroscope measurements 

gx = gx + Kp*ex + exInt; 

gy = gy + Kp*ey + eyInt; 

gz = gz + Kp*ez + ezInt; 

四元数微分方程,其中T为测量周期,为陀螺仪角速度,以下都是已知量,这里使用了一阶龙哥库塔求解四元数微分方程:

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;   

最后根据四元数方向余弦阵和欧拉角的转换关系,把四元数转换成欧拉角:

MPU6050的四元数解算姿态方法 

所以有:

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

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

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

 

下面补充一下四元数与欧拉角之间的转换:

规定:

1、航空次序欧拉角:

Z轴(航偏角,yaw,Ψ)

Y轴(俯仰角,pitch,θ)

X轴(滚转角,roll,Φ)

2、导航坐标系(N系)为O-ENU坐标系,即东北天坐标系。且机体坐标系初始状态与导航坐标系重合。即有: 导航坐标系X轴指向正东方向,机头也朝向正东方向;

导航坐标系Y轴指向正北方向,机左翼指向正北方向;

导航坐标系Z轴垂直地表指向天空,垂直机体指向天空。

3、每个轴都以逆时针旋转的角度为正角度。

第一步:求姿态矩阵

1、旋转Z轴

旋转前坐标:(x0, y0, z0), 旋转后坐标:(x1, y1, z1)

2、旋转Y轴

旋转前坐标:(x1, y1, z1), 旋转后坐标:(x2, y2, z2)

3、旋转X轴

旋转前坐标:(x2, y2, z2), 旋转后坐标:(x3, y3, z3)

4、设导航坐标系(N系)坐标为(x0, y0, z0),

载体坐标系(B系)坐标为(x3, y3, z3)

则:

二、四元数旋转矩阵

设旋转前坐标:(x0, y0, z0), 旋转后坐标:(x3, y3, z3)

三、四元数转换欧拉角

以上矩阵一一对应。

四、欧拉角转四元数

按照旋转顺序:ZYX

则(设旋转前坐标:(x0, y0, z0), 旋转后坐标:(x3, y3, z3)):

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

MPU6050软件姿态解算 的相关文章

  • MPU6050 6轴姿态传感器的分析与使用(一)

    一 MPU6050简介 MPU6050是一个6轴姿态传感器 xff08 3轴加速度计和3轴陀螺仪传感器 xff09 xff0c 可以测量芯片自身X Y Z轴的加速度 角度参数 xff0c 通过数据融合 xff0c 可以得到姿态角 二 简介分
  • MPU6050温度的计算公式

    在惯导融合的代码中常见计算MPU6050温度的公式 xff0c 如 xff1a temperature 61 36 53f 43 double GetData TEMP OUT H 340 0f 或者 Temp 61 36 53 43 Te
  • 正点原子mpu6050数据读取失败问题

    如果下载他们官方的程序都读不出来的话 看看你买的是stm32f407的V3版本吗 xff1f 这个版本是只有磁力计的官方代码 你用V3板跑他们的mpu的代码就会读不出来 xff0c 那个mpu6050的代码是已经停产的V2板子的
  • MPU6050-扫盲

    文章部分内容转载于 https blog csdn net zmjames2000 article details 88379640 管脚名称说明VCC3 3 5V xff08 内部有稳压芯片 xff09 GND地线SCLMPU6050作为
  • 最简单DIY基于STM32F407探索者开发板的MPU6050陀螺仪姿态控制舵机程序

    STM32库函数开发系列文章目录 第一篇 xff1a STM32F103ZET6单片机双串口互发程序设计与实现 第二篇 xff1a 最简单DIY基于STM32单片机的蓝牙智能小车设计方案 第三篇 xff1a 最简单DIY基于STM32F40
  • DSP28系列—MPU6050漂移补偿方案的探索

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

    今天玩了一个MPU6050模块 xff0c 在这里跟大家分享一下 xff0c 希望对大家有所帮助 我用的控制板是我自己画图打板的 xff0c 使用的MCU是STM32F411RCT6 使用的MPU6050如下图 xff0c 在某宝上买的 M
  • MPU6050误差分析

    MPU6050模块 xff0c 如图 1所示 该模块集成了一片MPU6050芯片和一片STM8S003F3P6单片机 xff0c 具有串口和I2C接口 MPU6050中的DMP xff08 数字运动处理器 xff09 对姿态进行融合 xff
  • ROS读取MPU6050数据

    上一篇讲到使用I2C连接Jetson Nano和MPU6050并使用python读取 xff0c 本次基于roscpp连接读取IMU数据 RTIMULib RTIMULib是本次使用的IMU库 xff0c 支持多种常见的IMU模块 xff0
  • HAL库 MPU6050的使用

    HAL库 amp amp MPU6050 HAL库 MPU6050的使用 xff1a 今天在本教程中 xff0c 我们将使用STM32接口MPU6050 xff08 GY 521 xff09 加速度计陀螺仪 同时 xff0c 我将在PC上利
  • 陀螺仪加速度计MPU6050

    转载自 xff1a http www crazepony com wiki mpu6050 html 陀螺仪 陀螺仪 xff0c 测量角速度 xff0c 具有高动态特性 xff0c 它是一个间接测量角度的器件 它测量的是角度的导数 xff0
  • MPU6050在ROS中应用

    arduino下读取MPU6050数据 参考 xff1a http diyhacking com arduino mpu 6050 imu sensor tutorial 硬件 arduino uno或arduino mega2560mpu
  • 模块学习(二)——MPU6050

    去年电赛备赛期间 xff0c 学的STM32标准库 xff0c 那一整个繁琐直接给我劝退了 xff0c 当时学习MPU6050时就非常痛苦 xff0c 代码也看不懂 xff0c 无非抄来抄去 xff0c 然后就是编译 xff0c 改错 xf
  • Arduino操作MPU6050模块

    MPU6050是集成三轴陀螺仪 xff0c 三轴加速度计 xff0c 温度传感器于一体的模块 本文档基于Adafruit MPU6050实现MPU6050模块基本操作 Adafruit MPU6050库 xff1a https github
  • MPU6050 简介

    目录 关于MPU6050芯片 关于小板 关于厂家和DATASHEET 关于漂移 关于角加速度还是角速度 关于精度和量程 xff08 可调 xff0c 可选 xff09 关于功耗 xff0c 陀螺仪 43 加速器工作电流 xff1a 3 8m
  • stm32使用MPU6050读取温度值验证I2C

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

    1 个人总结 常用的MPU6050有八个针脚 xff0c VCC 跟GND 给模块供电 xff0c 模块通讯方式采用IIC通讯 xff0c SCL跟SDA为信号传递通道 xff0c XDA 跟 XCl是用来外接电磁传感器 xff0c 玩过M
  • Micropython——九轴传感器(MPU6050)的使用及算法(二)

    前言 xff1a 在上篇文章中 xff0c 简单地实现了九轴传感器 xff08 MPU6050 xff09 的获取加速度 角速度以及温度的数值 但是 xff0c 我们知道 xff0c 对于MPU6050来说 xff0c 其提供的数据会夹杂有
  • 基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序

    基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序 目录 基于MSP432P401R的MPU6050陀螺仪串口输出姿态角程序 前言 一 实验器材 二 硬件资源 1 usb转ttl 2 串口1 波特率 9600 P2 2 P2
  • THWATCH-01 陀螺仪 MPU6050 HAL库 正点原子 STM32驱动 计步

    THWATCH 01 陀螺仪 MPU6050 HAL库 正点原子 STM32驱动 计步 一级目录 二级目录 三级目录 一 cubemx配置 1 使用cubemx配置串口 2 配置IIC1 3 配置时钟和SWDIO下载口 二 修改KEIL工程

随机推荐

  • 单边谱和双边谱

    实际中 xff0c 只会有单边谱 xff0c 并不会有负频率的信号 在引入欧拉公式后 xff0c 出现了双边谱 单边谱转换为双边谱 xff0c 幅度会降低一半 xff0c 其他不变
  • 小白也能搞通UDP通信(88E1111 RGMII 接口)

    一 网络协议 下表描述了整个从上到下的网络协议层 xff1a 这些网络协议在FPGA实际开发的过程中用到的就是传输层 网络层 数据链路层和物理层 xff0c 在我们的举例中用到UDP IP ARP协议 xff0c 物理层就用88E1111
  • 485通讯和modbus通讯协议

    485通信 xff1a 采用差分信号 xff1a A比B电压高是1 xff0c A比B电压低是0 xff0c 电压高低值在0 2V 6V之间 硬件连接上 xff1a 所有A接到一起 xff0c 所有B接到一起AB之间要加匹配电阻100欧到1
  • MODBUS RTU

    Modbus xff1a 是一种单主 从通信协议 MODBUS网络上只有一个主站 xff0c 主站在MODBUS网络没有地址 xff0c 从站的地址范围为0 247 xff0c 其中0为广播地址 xff0c 从站的实际地址为1 247 MO
  • TM4C123-HWREG()及外设寄存器地址说明

    参考文件 xff1a ti TivaWare C Series 2 1 4 178 inc hw types hti TivaWare C Series 2 1 4 178 inc hw memmap htm4c123gh6pz datas
  • I2C协议

    物理层 xff1a 1 一个I2C总线中可连接多个I2C通信设备 xff0c 支持多个主机及多个从机 2 两线制 xff1a 一条双向串行通信的数据线 xff08 SDA xff09 xff0c 一条串行时钟线 xff08 SCL xff0
  • SPI协议

    物理层 xff1a 1 四线制或三线制 xff1a 四线制时3条总线分别为SCK MOSI MISO xff0c 片选线为NSS xff08 CS xff09 三线制与其不同的是MOSI和MISO合并为一条线 xff0c 端口为双向端口 x
  • 数据处理:修改rosbag topic的frame_id

    1 安装srv tools工具 git clone https github com srv srv tools git 将其作为功能包放到ros工作空间下编译即可 2 使用示例 rosrun bag tools change frame
  • STM32 Cubemax(十二) ——利用状态机实现按键的长短按和双击

    STM32 Cubemax 十二 利用状态机实现按键的长短按和双击 文章目录 STM32 Cubemax 十二 利用状态机实现按键的长短按和双击前言一 状态图二 Cubemax配置1 IO口配置2 定时器配置 三 代码1 编写有关按键的结构
  • python中的闭包函数

    闭包函数初探 通常我们定义函数都是这样定义的 def foo pass 其实在函数式编程中 xff0c 函数里面还可以嵌套函数 xff0c 如下面这样 def foo print 34 hello world in foo 34 def b
  • 树莓派+Ubuntu16.04 MATE+ROS(kinetic)的安装

    树莓派 43 Ubuntu16 04 MATE 43 ROS xff08 kinetic xff09 的安装 零 准备工作 1 树莓派板子 2 电源 xff1a 3A以上 xff0c 供电要充足 xff0c 否则无法启动或影响使用 3 显示
  • canal

    目录 搭建canal测试canal 监控MySQL的binlog的工具 搭建canal 1 开启mysql binlog cp usr share mysql my medium cnf etc my cnf 修改my cnf vim et
  • docker 镜像注册【图文教程】

    docker镜像官网 xff1a https hub docker com 进行登录注册 账号 只能使用4到30个字母和数字 那就名字拼音吧 邮箱 正确的邮箱即可 后续会验证 xff0c 务必真实 密码 密码至少为9个字符 第一个勾选框 偶
  • 使用gazebo实现turtlebot入门级开发

    实验室准备新进两台Turtlebot2 xff0c 为了更快上手 xff0c 便提前开始熟悉一下Turtlebot xff0c 通果查阅相关资料 xff0c 我写了一个demo程序 xff0c 并在gazebo模拟环境下进行了测试 该dem
  • 手写智能指针(类)

    基础知识 xff1a 智能指针的设计与实现 1 智能指针类将一个计数器与类指向的对象相关联 xff0c 引用计数跟踪该类有多少个对象共享同一指针 2 每次创建类的新对象时 xff0c 初始化指针并将引用计数置为1 xff1b 3 当对象作为
  • 求职历程

    前言 xff1a 个人求职有大部分的时间花在了城市与企业性质的纠结上 首先是个人打算 xff0c 因研究生课题偏嵌入式相关 xff0c 所以给自己定下的目标是找嵌入式相关的工作 xff0c 而弱化了互联网求职的刷题关和计算机基础关 而在求职
  • 剑指 Offer 57 - II. 和为s的连续正数序列

    剑指 Offer 57 II 和为s的连续正数序列 难度 简单 输入一个正整数 target xff0c 输出所有和为 target 的连续正整数序列 xff08 至少含有两个数 xff09 序列内的数字由小到大排列 xff0c 不同序列按
  • 使用层次遍历重建二叉树并遍历

    58同城的一道题 xff0c 蛮有意思的 利用层次遍历后的数组 xff0c 进行二叉树的重建 数值 1代表NULL 解题思路 xff1a 那么我们依然使用队列 xff0c 进行层次遍历 xff0c 进行重建 xff0c 这边有的问题是当示例
  • C++秋招知识点总结

    先介绍下本人的情况 xff0c 本人研究生双非院校 xff0c 本科也是普通二本 xff0c 也无实习无项目非科班出生 刷了将近半年的题和自学了相关知识点 xff0c 最终拿到华为 海康 大华 同花顺 深信服 CVTE 紫光展锐offer
  • MPU6050软件姿态解算

    我是勤劳的搬运工 转自 http blog sina com cn s blog c5a00db10102wd7d html http mini eastday com mobile 180306210610472 html 使用MPU60