搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
weixin_40725706
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
小项目2——(未登录)指定微博账号基本公开信息的搜集_weibo 230283
2
在 WSL2 中使用 NVIDIA Docker 进行全栈开发和深度学习 TensorFlow pytorch GPU 加速_wsl2 docker nvidia
3
若依框架---权限控制角色设计_若依权限字符
4
ubuntu18.04安装mysql8.0详细教程及踩坑解决方法(包含删除Mysql5.7版本方法)_ubuntu编译安装mysql
5
vue与react的diff算法_vue diff算法和react的diff算法
6
xsl判断节点存在_判断图中是否有环的两种方法
7
git commit -m
8
mysql基础操作和查询语句_mysql查询语句返回字段为value
9
Ubuntu系统中Python脚本的开机自启动以及持续检测运行状态_ubuntu开机自启动python程序
10
自动跟随机器人:一种简易的自动跟随方案,自动跟随小车、自动跟随平衡小车、STM32、基于超声波的自动跟随小车_esp32 超声波实现自动跟随
当前位置:
article
> 正文
MPU6050的四元数解算姿态方法_imu 四元素法
作者:weixin_40725706 | 2024-02-15 11:32:12
赞
踩
imu 四元素法
使用MPU6050硬件DMP解算姿态是非常简单的,下面介绍由三轴陀螺仪和加速度计的值来使用四元数软件解算姿态的方法。
我们先来看看如何用欧拉角描述一次平面旋转(坐标变换):
设坐标系绕旋转α角后得到坐标系,在空间中有一个矢量在坐标系中的投影为,在内的投影为由于旋转绕进行,所以Z坐标未变,即有。
转换成矩阵形式表示为:
整理一下:
所以从旋转到可以写成上面仅仅是绕一根轴的旋转,如果三维空间中的欧拉角旋转要转三次:
上面得到了一个表示旋转的方向余弦矩阵。
不过要想用欧拉角解算姿态,其实我们套用欧拉角微分方程就行了:
上式中左侧,是本次更新后的欧拉角,对应row、pit、yaw。右侧,是上个周期测算出来的角度,三个角速度由直接安装在四轴飞行器的三轴陀螺仪在这个周期转动的角度,单位为弧度,计算间隔时T陀螺角速度,比如0.02秒0.01弧度/秒=0.0002弧度。间因此求解这个微分方程就能解算出当前的欧拉角。
前面介绍了什么是欧拉角,而且欧拉角微分方程解算姿态关系简单明了,概念直观容易理解,那么我们为什么不用欧拉角来表示旋转而要引入四元数呢?
一方面是因为欧拉角微分方程中包含了大量的三角运算,这给实时解算带来了一定的困难。而且当俯仰角为90度时方程式会出现神奇的“GimbalLock”。所以欧拉角方法只适用于水平姿态变化不大的情况,而不适用于全姿态飞行器的姿态确定。
四元数法只求解四个未知量的线性微分方程组,计算量小,易于操作,是比较实用的工程方法。
我们知道在平面(x,y)中的旋转可以用复数来表示,同样的三维中的旋转可以用单位四元数来描述。我们来定义一个四元数:
我们可以把它写成,其中,。那么是矢量,表示三维空间中的旋转轴。w是标量,表示旋转角度。那么就是绕轴旋转w度,所以一个四元数可以表示一个完整的旋转。只有单位四元数才可以表示旋转,至于为什么,因为这就是四元数表示旋转的约束条件。
而刚才用欧拉角描述的方向余弦矩阵用四元数描述则为:
所以在软件解算中,我们要首先把加速度计采集到的值(三维向量)转化为单位向量,即向量除以模,传入参数是陀螺仪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;
最后根据四元数方向余弦阵和欧拉角的转换关系,把四元数转换成欧拉角:
所以有:
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
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/weixin_40725706/article/detail/84178
推荐阅读
article
ERROR
: Could
not
build
wheels
for
opencv
-
python
wh...
pip install --upgrade -r requirements.txt -i https://mirror....
赞
踩
article
使用
CSS
自定义
属性
实现页面的主题切换_--
bg
-
color
...
CSS
自定义
属性
(Custom Properties),在一个css选择器内部进行定义,
使用
两个短横连接线 `--` 作...
赞
踩
article
高斯分布
的
随机数
生成器_
box
muller
fpga...
高斯分布
的
随机数
生成器实现的过程是先查找相关
高斯分布
随机数
在vivado实现的博客,先大概认识一下,然后到知网找相关的硕...
赞
踩
article
内表行数
统计的三种
方法
...
1.LOOP AT itab.n = n + 1.ENDLOOP.该
方法
是通过循环内部表自己累加行数。2.DESCRIB...
赞
踩
article
1
0 分钟用
Python
编写一
个
贪
吃
蛇
小游戏_
贪
吃
蛇
吃
1
个
或2
个
,几次能
吃
完
python
...
贪
吃
蛇
,大家应该都玩过。当初第一次接触
贪
吃
蛇
的时候 ,还是能砸核桃的诺基亚上,当时玩的不亦乐乎。今天,我们用
Python
...
赞
踩
article
授权系统
源码
_
spring
security
oauth2
源码
解析...
当你掌握某个技术,每次再重新去研究的时候都会有不一样的感悟。随的时间的推移每个人的能力都有不一样的提高,这时候再去回头看...
赞
踩
article
TransUNet
_
attributeerror
: "'
skip
_
channels
...
TransUNet
代码调试记录bug1.运行测试代码test.pyAttributeError: “‘
skip
_chan...
赞
踩
article
RT-
Thread
软件包
-
软件包
分类-
IoT
-
rw007
①...
RW007是由上海睿赛德电子科技有限公司开发基于 WIFI SOC的SPI/UART 高速wifi模块。该仓库为rw00...
赞
踩
article
java
周期
执行
_
java
ScheduledExecutorService
执行
周期
性任务...
ScheduledExecutorService
是jdk1.5之后提供的替代Timer的一个类。下面为大家提供一个简单...
赞
踩
article
scheduledfuture
.
cancel
不会立即
终止
_
Java
终止
线程
的
三种方式...
最近在复习多
线程
,那就给大家讲解一下JAVA
线程
的
终止
的
方式吧。在
Java
中有以下 3 种方法可以
终止
正在运行
的
线程
...
赞
踩
article
.NET
解决
高
并发
方案
_.net 高
并发
解决
方案
...
.NET
解决
高
并发
方案
_.net 高
并发
解决
方案
.net 高
并发
解决
方案
简言 一,什么是高
并发
...
赞
踩
article
c
语言
烟花
的
代码
源
代码
,
c
语言
实现的简单屏幕
烟花
程序...
#in
c
lude "stdlib.h"#in
c
lude "graphi
c
s.h"#in
c
lude "stdio.h"#i...
赞
踩
article
vue
的8大
生命周期
...
Vue2 的
生命周期
钩子函数在不同阶段提供了不同的功能,帮助我们更好地管理和优化组件的性能。在创建阶段,我们可以进行数据...
赞
踩
article
spring
boot
实战
项目
—
—
个人博客系统_
spring
boot
实践之十三
10
spring
...
1.
项目
介绍1.1
项目
效果博客首页登录功能注册功能文章分类文章归档文章页面发布文章 (集成富文本编译器)1.2
项目
使用技...
赞
踩
article
unity
如何不用
lookAt
修改
物体
朝向
_
unity
修改
朝向
...
unity
如何不用
lookAt
修改
物体
朝向
_
unity
修改
朝向
unity
修改
朝向
...
赞
踩
article
oauth2.0
授权
码
模式
简单理解...
什么是 oauth协议 ?百度百科上有解释:允许用户提供一个令牌,而不是用户名和密
码
来访问他们存放在特定服务提供者的数据...
赞
踩
article
SpringSecurity+
SpringSecurityOauth2
集成实现权限框架,
Redis
分...
写在前面:当我们开始使用Security的时候,常常因为各种注入,而迷糊,但是很害怕使用
security
,感觉很重很难用...
赞
踩
article
Java
ScheduledExecutorService
_
java
scheduledexecut...
ScheduledExecutorService
简介
ScheduledExecutorService
的主要功能是将定...
赞
踩
article
轻松搞懂
均匀
分布
、
高斯
分布
、
瑞利
分布
、莱斯
分布
(含
MATLAB
代码)_
高斯
分布
和
瑞利
分布
...
文章目录1、
均匀
分布
2、
高斯
分布
(正态
分布
)3、
瑞利
分布
4、莱斯
分布
1、
均匀
分布
在概率论和统计学中,
均匀
分布
也叫矩形
分布
...
赞
踩
article
Java
网络
编程——
UDP
_
java
udp...
UDP
(User Datagram Protocol)是一种无连接的传输协议,不保证传输数据的可靠性。在
网络
通信中,UD...
赞
踩
相关标签
opencv
人工智能
paddle
前端
html
javascript
css
算法
fpga开发
ViewUI
Python
授权系统源码
深度学习
linux
stm32
java
arm开发
运维
物联网
java 周期执行
scheduledfuture.cancel 不会立即终止
数据库
服务器
c 语言烟花的代码源代码
vue.js