四轴姿态解算-imu算法

news2024/11/20 8:36:10

理论篇

欧拉角四元数方向余弦矩阵

  • 强调三者描述的是坐标系A,A`之间的变换关系

欧拉角,四元数,方向余弦矩阵都可以描述四轴的姿态变换
注意这里强调的是变换
三者转换公式
在这里插入图片描述
在这里插入图片描述

一阶龙格库塔法

核心要点简介: 假设一阶函数随时间关系如: y = a * T1+b 则,在经过时间△t后,公式变为y = a * (T1 + △t) + b

由此衍生 四元数q在经历△t时间后的新四元数推导公式
【高中数学的一阶求导与多项式之间的关系】

在这里插入图片描述
可得出更新四元数的程序代码为:(其中w为陀螺仪角速度)
q0=q0+(-wxq1-wyq2-wzq3)half_T;
q1=q1+(wx
q0+wz
q2-wyq3)half_T;
q2=q2+(wy
q0-wz
q1+wxq3)half_T;
q3=q3+(wz
q0+wy
q1-wx*q2)*half_T;

  • 总结: 上述的数学定义是我们进行姿态解算的基础理论
  • 通过角速度与时间的积分,在已知四元数初始值,便可以求得△t时间的四元数
  • 通过四元数便可以求得姿态角,同时避免了万向锁问题,从而可以进行全姿态360度飞行控制

6轴IMU(Mahony)姿态融合原理图

在这里插入图片描述

原理解释
n系的加速度归一化,也就是地球参考坐标系的加速度为重力加速度,按道理在x,y,z轴为0,0,g,归一化为0,0,11
通过余弦矩阵的第三行得到在机体坐标系下加速度的投影向量
通过陀螺仪测量值与重力加速度通过四元数转换到机体坐标系的加速度进行向量叉乘从而获得误差e
通过KI积分补偿误差,并通过KP与角速度数据融合
通过一阶龙格库塔法更新四元数

向量叉乘含义: 为a向量在b向量上的投影
所以可以将重力加速度在地球坐标系下的值投影到机体坐标系,从而与陀螺仪测量值进行比较

余弦矩阵第三行的含义
每一行代表x1、y1、z1分别在(x,y,z)轴上的分量,所以第三行可以表示在z轴的投影

实践篇

mahony算法实现

void imuUpdate(Axis3f acc, Axis3f gyro, state_t *state , float dt)	/*数据融合 互补滤波*/
{
	float normalise;
	float ex, ey, ez;
	float halfT = 0.5f * dt;
	float accBuf[3] = {0.f};
	Axis3f tempacc = acc;
	// 角速度
	gyro.x = gyro.x * DEG2RAD;	/* 度转弧度 */
	gyro.y = gyro.y * DEG2RAD;
	gyro.z = gyro.z * DEG2RAD;

	/* 加速度计输出有效时,利用加速度计补偿陀螺仪*/
	if((acc.x != 0.0f) || (acc.y != 0.0f) || (acc.z != 0.0f))
	{
		/*单位化加速计测量值*/
		normalise = invSqrt(acc.x * acc.x + acc.y * acc.y + acc.z * acc.z);
		acc.x *= normalise;
		acc.y *= normalise;
		acc.z *= normalise;

		// 矩阵第三行
		rMat[2][0] = 2.0f * (q1q3 + -q0q2);
	    rMat[2][1] = 2.0f * (q2q3 - -q0q1);
	    rMat[2][2] = 1.0f - 2.0f * q1q1 - 2.0f * q2q2;

		/*加速计读取的方向与重力加速计方向的差值,用向量叉乘计算*/
		ex = (acc.y * rMat[2][2] - acc.z * rMat[2][1]);
		ey = (acc.z * rMat[2][0] - acc.x * rMat[2][2]);
		ez = (acc.x * rMat[2][1] - acc.y * rMat[2][0]);
		
		/*误差累计,与积分常数相乘*/
		exInt += Ki * ex * dt ;  
		eyInt += Ki * ey * dt ;
		ezInt += Ki * ez * dt ;
		
		/*用叉积误差来做PI修正陀螺零偏,即抵消陀螺读数中的偏移量*/
		gyro.x += Kp * ex + exInt;
		gyro.y += Kp * ey + eyInt;
		gyro.z += Kp * ez + ezInt;
	}
	/* 一阶龙格库塔算法,四元数运动学方程的离散化形式和积分 */
	float q0Last = q0;
	float q1Last = q1;
	float q2Last = q2;
	float q3Last = q3;
	q0 += (-q1Last * gyro.x - q2Last * gyro.y - q3Last * gyro.z) * halfT;
	q1 += ( q0Last * gyro.x + q2Last * gyro.z - q3Last * gyro.y) * halfT;
	q2 += ( q0Last * gyro.y - q1Last * gyro.z + q3Last * gyro.x) * halfT;
	q3 += ( q0Last * gyro.z + q1Last * gyro.y - q2Last * gyro.x) * halfT;
	
	/*单位化四元数*/
	normalise = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
	q0 *= normalise;
	q1 *= normalise;
	q2 *= normalise;
	q3 *= normalise;
	
	imuComputeRotationMatrix();	/*计算旋转矩阵*/
	
	/* 四元数计算roll pitch yaw 欧拉角*/
	state->attitude.pitch = -asinf(rMat[2][0]) * RAD2DEG; 
	state->attitude.roll = atan2f(rMat[2][1], rMat[2][2]) * RAD2DEG;
	state->attitude.yaw = atan2f(rMat[1][0], rMat[0][0]) * RAD2DEG;

}

附录

  • 此外,通过dmp库可直接获取四元数从而获得姿态信息
  • AHRS航姿参考系统在此基础上融入磁力计信息[后续介绍]
  • 四轴姿态控制推荐采用串级pid[必须]
  • 保持绝对定位,还需要引入光流传感器,气压计等,从而在姿态的基础上进一步通过x,y,z位置pid控制四轴位置+姿态

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/591318.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python中-1的用法介绍

Python中-1的用法介绍 什么是-1? 在Python中,-1是一个特殊的索引值,它表示从序列的末尾开始向前数1个元素。这在对于列表、字符串、元组等序列类型进行操作时非常有用。 如何使用-1? 假设我们有一个列表: l [1, …

达梦数据库8安装教程

第一步:双击驱动 注意:如果双击显示没有驱动,则安装WinCDEmu软件。 第二步:双击setup.exe安装包 第三步:选择时区 第四步:验证key文件 因为我们是免费试用,所以没有key文件,直接下一…

14:00面试,14:06就出来了,问的问题有点变态。。。

从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到5月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%,…

【第二节】变量和简单的数据类型

本节将结束python当中的变量和一部分数据类型(字符串和数字),并且介绍一些对应的方法 变量 在上一节的最后我们打印出了hello world print(hello world!)这次我们使用下面的代码实现一样的功能 message = hello world! print(message)可以看到 打印结果一模一样,而我们…

什么是IPAM?如何使用IPAM来管理IP地址和DHCP?

在计算机网络中,IPAM(IP Address Management)是一种用于管理IP地址和DHCP(Dynamic Host Configuration Protocol)的工具或系统。IPAM旨在简化和集中管理IP地址分配、子网划分和DHCP配置等任务。本文将详细介绍IPAM的概…

MVC 接收不到参数? —— 看我如何给你安排得明明白白

文章结构 问题背景:问题处理总结 问题背景: 现有如下代码: PostMapping(value "/payment/create") ResponseBody public CommonResult create(Payment payment) {}乍眼看去是不是很好,至少没啥问题很自然&#xff0c…

关于VUE3的一些基础知识点笔记

关于VUE3的一些基础知识点笔记 VUE3 vue2与vue3的一个重要区别是vue2是选项式API(composition API)而vue3是组合式API(option API)。 组合式API就是所有逻辑都在setup函数中,使用ref、watch等函数来组织代码&#xff…

使用HTTP协议在k780网站上获取天气-----天气预报

文章目录 项目介绍一、项目任务二、项目流程规划以及代码实现1.总流程2.引入库3.总体流程相关函数 三、功能函数的实现1. TCP函数2. 输入城市信息3. 查询今天天气4. 查询未来一周天气5. 查询历史天气6. 退出 总结 项目介绍 本期主要使用TCP网络编程实现天气预报的功能&#xff…

基于Html5的在线资料库的设计与实现(asp.NET,SQLServer)

在线资料库系统采用.NET开发平台进行开发,开发工具采用Microsoft Visual Studio 2010集成开发环境,后台编程语言采用C#编程语言来进行编程开发,数据库我们采用当下流行的SQL Server 2008数据库管理系统来存放平台中的数据信息,整个…

【Windows设置篇】字符集-简繁体的切换

【Windows设置篇】字符集-简繁体的切换 微软自带键盘,有次傻啦吧唧的一直找繁体切换简体的方法,进设置里面切换地区,更换地址也不行,后面才发现是在"字符集"里面切换—【蘇小沐】 文章目录 【Windows设置篇】字符集-简…

Maven jar 包下载失败问题处理【配置Maven国内源】

前言 很多同学在Maven里下载一些依赖的时候,即下载【jar 包】的时候总是会出现一些问题,这里专门做一个教程讲解一下 其实这和你的Maven配置是有关系的,因为Maven是一个国际站点,它的仓库是在国外的,所以我们有时候在下…

【C++】函数高级 - 默认参数,占位参数,函数重载基本语法,函数重载注意事项

No.Contents1【C】基础知识 - HelloWorld,注释,变量,常量,关键字,标识符2【C】数据类型 - 整型,sizeof,实型,字符型,转义字符,字符串类型,布尔类型…

chatgpt赋能python:Python中浮点数的定义

Python中浮点数的定义 什么是浮点数? 在计算机科学中,浮点数(floating-point number)是一种用于表示实数的近似值的数值类型。Python中的浮点数是由整数部分和小数部分组成的,可以使用小数点来表示。例如&#xff0c…

考研C语言第七章

7.2函数的声明定义,函数的分类和调用 1、函数声明要在main函数上面,这样main函数才可以进行调用 第一节课主要就学了函数的调用,项目在开发的时候分工用的比较多 主要结构: func.c里面进行函数的定义 不是很重要,进…

IDEA+Mysql+Sqlserver安装步骤_kaic

下载Intellij 开发工具,如果有请检查软件是否过期,如果过期卸载电脑上的Intellij软件。卸载步骤: 打开控制面板,选择卸载程序找到Intellij右键卸载 如果没有请保存文档中的Intellij.zip压缩包,进行安装,安装步骤 双…

查看 HTTP 请求的数据.

文章结构 如果是 GET 请求如果是 POST 请求方法1:DEBUG 窗口(**爽、超级爽、吴迪爽**):方法2:写方法读取流中数据(繁琐,难用): 我们可能会碰到 MVC 拿不到前端的参数&…

何时加索引,性别字段和逻辑删除字段应不应该加

首先哪些地方加索引(按照sql执行顺序写) 1、from表扫描连接处索引 2、where后条件去走索引 3、group by加索引 4、select查询不用加 5、order by排序加索引 (对于第四点,覆盖索引:查询的字段都被索引覆盖,…

chatgpt赋能python:Python中用什么表示空格

Python中用什么表示空格 空格在编程中是一个非常重要的概念,特别是在Python中。Python是一门非常灵活的语言,空格是它语法的一个关键组成部分。今天我们将探讨的是Python中用什么表示空格。 空格是Python中的一个重要概念,它被用来表示代码…

spdk记录

spdk记录 hello_bdev命令行参数 往期文章: spdk环境搭建 hello_bdev 代码路径:examples/bdev/hello_world/hello_bdev.c 可执行文件路径:build/examples/hello_bdev 刚开始直接执行hello_bdev显示找不到Malloc0 ./build/examples/hello_b…

Vue3-devtools开发者工具正确安装方法

目录 前言:1、下载安装2、添加扩展 前言: 最近在学习Vue3,学习Vue3自然离不开调试工具Vue3-Devtools,所以我们需要来下载这个调试工具并放入谷歌浏览器里的扩展程序里面。帮助我们更好的调试vue3里的程序。 1、下载安装 Github下…