搜索
查看
编辑修改
首页
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
手把手教你给电脑安装manjaroLinux操作系统_manjaro linux
2
crossover软件2023跨电脑系统兼容工具好用吗?_crossover软件好用吗
3
解读iaas-pre-host.脚本(国基北盛)_iaas-pre-host b
4
QT配置android环境,简单易懂_qt andriod
5
opencv 暴力特征匹配+FLANN特征匹配_java使用opencv的bf匹配器
6
“AttributeError: module ‘cv2‘ has no attribute ‘SIFT_create‘ “_attributeerror: module 'cv2.cv2' has no attribute
7
阿里云域名备案流程分析和采坑总结_并在开通之日起30日内登录全国互联网安全管理平台提
8
C++判断质数
9
Docker 容器编排之 --- docker-compose 详解_docker-compose.yml 用#号注释吗
10
elasticsearch 基础介绍及使用 (high-level-client)_elasticsearch highlevelclient
当前位置:
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
win11
配置
CUDA
+cuDNN+Anaconda+
Miniconda
+Pytorch+yolov...
Win11系统配置
CUDA
+cuDNN+Anaconda+
Miniconda
+Pytorch+
yolov5
。安装完成后,...
赞
踩
article
spring
boot
中
open
feign
接口
拦截
实现_
open
feign
捕获
异常
统一处理...
spring
mvc 过滤器 RestTemplate ribbon 过滤器
feign
过滤器使用_
open
feign
...
赞
踩
article
Leetcode
763 划分字母
区间
...
则每个元素到其在s中出现的最后位置形成
区间
。
Leetcode
763 划分字母
区间
题意理解:...
赞
踩
article
定时
任务
异常
终止
spring
VS JDK_
异常
结束
的
任务
...
之前遇到过定时
任务
异常
终止
的
问题,此次对 jdk
的
ScheduledThreadPoolExecutor 与 spr...
赞
踩
article
单片机
学习笔记---
AT24C02
(
I2C
总线
)...
AT24C02
是一种可以实现掉电不丢失的存储器,可用于保存
单片机
运行时想要永久保存的数据信息存储介质:E2PROM(电可...
赞
踩
article
[
Docker
]
部署
nps
和
npc
实现内网穿透
_
docker
nps
npc
...
本地机建议选择一台 7*24 小时运行的设备,一般是路由器或者 NAS ,我这里就选择群晖了,DSM 有很好用的 doc...
赞
踩
article
docker
运行
花生壳
实现内外网穿透_
docker
phddns
...
docker
运行
花生壳
实现内外网穿透_
docker
phddns
docker
phddns
环...
赞
踩
article
抛出
空
指针
异常
是否
会
导致整个
spring
boot
服务
停止_代用空值
会
抛出
空
指针
异常
会
对系统运行有影...
多线程中,线程A中
抛出
空
指针
异常
,
会
不
会
影响
线程B的运行。
会
不
会
让整个程序停止。结果:定时任务是多个线程执行的,其中一个...
赞
踩
article
Spring
Cloud微
服务
使用OpenFeign实现调用其他模块
接口
方法_
springcloud
...
前言:
Spring
cloud微
服务
架构现在是最为流行
的
开发架构之一,它想要开发一种由多个小
服务
组成
的
应用。每个
服务
运行...
赞
踩
article
vite4
.x+
vue
3.x项目搭建一
vue
-
router
_
vite4
.x+
vue
3.x项目搭建ax...
vite2.x+
vue
3.x项目搭建一
vue
-
router
_
vite4
.x+
vue
3.x项目搭建
axios
vite4
.x...
赞
踩
article
30
行
python
代码
实现
“
代码
雨”...
当然,真实情况与上述想象当然是毫不相干了,但是既然有了想象,为啥不去靠自己的尝试去
实现
一下呢?所以,我们这次就用非常简单...
赞
踩
article
微
服务
之间
调用
的
异常
应该如何
处理
_
feign
服务
间
调用
异常
...
typescript复制代码@Slf4j@Bean/*** 重新实现
feign
的
异常
处理
,捕捉restful接口返回
的
j...
赞
踩
article
【
unity3D
插件】
Embedded
Browser
(ZF
Browser
) — 快速实现PC端内嵌...
unity3d
嵌入
网页
...
赞
踩
article
ESP32
无法连接阿里云,MQTT通讯失败_
esp32
mqtt
_
client
: no
scheme
...
找了个
ESP32
控制小灯的教程,根据教程一步一步做的,可最后就是无法激活阿里云设备,云端运行日志不停刷460代码,MQT...
赞
踩
article
31.
JAVA
异步编程:
计划
任务
_
scheduledexecutorservice
.schedule...
1.ScheduledExecutorService在有些情况下,我们可能需要事先提交一个
任务
,这个
任务
并不是立即被执行...
赞
踩
article
CAN
协议
-数据帧-
标准
帧简介_
can
标准
帧...
CAN
(Controller Area Network)是一种串行通信
协议
,用于在不同的电子设备之间进行通信。它最初是由...
赞
踩
article
Python
之
代码
雨
代码
实现
001
_
python
背景下雨
代码
实现
...
Python
之
代码
雨
代码
实现
001
_
python
背景下雨
代码
实现
python
背景下雨
代码
实现
...
赞
踩
article
UDP
协议
是
什么?作用
是
什么?_
udp
是
什么
协议
...
udp
什么
是
UDP
?
UDP
报头TCP和
UDP
区别
UDP
方式传输数据
UDP
的应用场景
UDP
的单播、广播、组播组播的优点IP...
赞
踩
article
C#
学习相关系列之
数据类型
---
Diactionary
字典
的
用法_
c#
字典
orderby
...
本文介绍
C#
常用
的
数据类型
中
的
字典
及其相关用法_
c#
字典
orderby
c#
字典
orderby
...
赞
踩
article
计算机
毕业设计
Node
.
js
+
Vue
玩得开心旅游网站(程序+源码+LW+部署)_
vue
+node
js
...
该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流项目运行环境配置:项目技术:Express框架 ...
赞
踩
相关标签
YOLO
spring boot
java
spring
leetcode
算法
数据结构
定时任务
单片机
51单片机
stm32
mcu
物联网
嵌入式硬件
学习
docker
运维
容器
linux
node.js
vue.js
python
pygame
开发语言