四旋翼姿态解算常用的两种算法-互补滤波和梯度下降算法

2023-05-16

  上一篇讲了四元数、欧拉角和方向余弦的知识,不熟悉的请到这篇博客查看点击打开链接 

  介绍两种算法前,先定义两个坐标系。导航坐标系(参考坐标系)n,选取东北天右手直角坐标系作为导航坐标系n、载体坐标系(机体坐标系)b,选取右手直角坐标系定义:四轴向右为X正方向,向前为Y轴正方向,向上为Z轴正方向。

  互补滤波算法:通过加速度计的输出稳定性来修正陀螺仪的积分漂移误差。(既通过修正陀螺仪的测量角速度来实现)一句话就是利用加速度计来修正陀螺仪。

  取导航坐标系中的标准重力加速度,定义为,那么将转换至载体坐标系b中的表达式为

  定义载体坐标系b系中加速度计的输出为,由于重力加速度为标准重力加速度,所以这里要对加速度计输出归一化后才能继续运算,因此归一化后的载体坐标系加速度计输出为

  对做向量积运算,即可得到对陀螺仪的补偿校正误差

其中为向量积运算,坐标运算公式为

  采用PI控制器来消除误差

其中即为陀螺仪的校正补偿项,采用离散累加来计算。

补偿到陀螺仪后,再由四元数微分方程计算出最后的姿态。下面给出互补滤波的算法原理框图

梯度下降法:梯度下降法的思想与互补滤波相同,都是用加速度计的稳定性来补偿陀螺仪的漂移。

不同点:梯度下降法是由加速度计计算出一组姿态四元数,再和陀螺仪计算出来的姿态四元数进行融合。互补滤波算法是利用中立即速度转换到b系后与归一化的b系加加速度计输出做向量积,求得陀螺仪的校正误差来校正陀螺仪。

因为在求解中用了梯度下降的原理,因此称为梯度下降算法。

  首选构造目标函数:

  对目标函数求偏导得到对应的雅可比矩阵:

  再由雅可比矩阵求出对应目标函数的梯度

 

 

  根据梯度下降法的定义有:

 

式中,为梯度下降的步长。然后对将陀螺仪计算出来的姿态和梯度下降法求出来的姿态进行融合,

其中为权重,并且满足。上述公式取得最优姿态解的条件为的收敛速度和的发散速度相等,因此可得,

式中,为系统的采样周期,为陀螺仪的测量误差,可以查询PDF得到。因为四旋翼在高速运行下,比较大,因此上式近似为,

由于比较大,则对由梯度下降计算公式来说,上一次的姿态可以忽略,直接由梯度负方向迭代到目标姿态,即可以重新定义为

 

由陀螺仪计算的姿态四元数公式为,

公式代入

得到,

将上述公式简单定义为如下所示,

其中

因此可以得到梯度下降算法的姿态融合公式,

下面给出梯度下降的算法原理框图

这两种方法介绍完毕,都是自己的理解,欢迎大家交流指正。

由于梯度下降的代码,师兄已经在博客中贴出,这里我就不再给出,大家可以到这个博客中查看点击打开链接

互补滤波的代码给出如下,

  

	float recipNorm;					
	float halfvx, halfvy, halfvz;		
	float halfex, halfey, halfez;		
	float qa, qb, qc;
	float delta;						
	
	
	gx = gx * DEG2RAD;
	gy = gy * DEG2RAD;
	gz = gz * DEG2RAD;
	
	
	if(!((ax == 0.0f) && (ay == 0.0f) && (az == 0.0f))) 
	{
		
		arm_sqrt_f32(ax * ax + ay * ay + az * az, &recipNorm);
		ax /= recipNorm;
		ay /= recipNorm;
		az /= recipNorm; 

		
		halfvx = att.q[1] * att.q[3] - att.q[0] * att.q[2];
		halfvy = att.q[0] * att.q[1] + att.q[2] * att.q[3];
		halfvz = att.q[0] * att.q[0] - 0.5f + att.q[3] * att.q[3];
		
		
		halfex = (ay * halfvz - az * halfvy);
		halfey = (az * halfvx - ax * halfvz);
		halfez = (ax * halfvy - ay * halfvx);

		if(g_twoKi > 0.0f) 
		{
			g_integralFBx += g_twoKi * halfex * CNTLCYCLE;		
			g_integralFBy += g_twoKi * halfey * CNTLCYCLE;
			g_integralFBz += g_twoKi * halfez * CNTLCYCLE;
			gx += g_integralFBx;		
			gy += g_integralFBy;
			gz += g_integralFBz;
		}
		else	
		{
			g_integralFBx = 0.0f;
			g_integralFBy = 0.0f;
			g_integralFBz = 0.0f;
		}
		
		
		gx += g_twoKp * halfex;
		gy += g_twoKp * halfey;
		gz += g_twoKp * halfez;
	}
	/*
		
		* 
		* .	1      
		* q	= - * q x Omega    
		*	2
		*  .
		* [q0] [0  -wx	-wy	-wz] [q0]
		*  .				
		* [q1] [wx   0	 wz	-wy] [q1]
		*  .  =  				* 
		* [q2] [wy -wz	 0	 wx] [q2]
		*   . 			
		* [q3] [wz	wy	-wx  0 ] [q3]
	*/
	gx *= (0.5f * CNTLCYCLE);
	gy *= (0.5f * CNTLCYCLE);
	gz *= (0.5f * CNTLCYCLE);
	qa = att.q[0];
	qb = att.q[1];
	qc = att.q[2];
	
	delta = (CNTLCYCLE * gx) * (CNTLCYCLE * gx) + (CNTLCYCLE * gy) * (CNTLCYCLE * gy) + (CNTLCYCLE * gz) * (CNTLCYCLE * gz);
	att.q[0] = (1.0f - delta / 8.0f) * att.q[0] + (-qb * gx - qc * gy - att.q[3] * gz);
	att.q[1] = (1.0f - delta / 8.0f) * att.q[1] + ( qa * gx + qc * gz - att.q[3] * gy);
	att.q[2] = (1.0f - delta / 8.0f) * att.q[2] + ( qa * gy - qb * gz + att.q[3] * gx);
	att.q[3] = (1.0f - delta / 8.0f) * att.q[3] + ( qa * gz + qb * gy -   qc * gx);
	
	
	arm_sqrt_f32(att.q[0] * att.q[0] + att.q[1] * att.q[1] + att.q[2] * att.q[2] + att.q[3] * att.q[3], &recipNorm);
	att.q[0] /= recipNorm;
	att.q[1] /= recipNorm;
	att.q[2] /= recipNorm;
	att.q[3] /= recipNorm;
	
	
	att.angle[PITCH] = atan2(2.0f * att.q[2] * att.q[3] + 2.0f * att.q[0] * att.q[1], -2.0f * att.q[1] * att.q[1] - 2.0f * att.q[2]* att.q[2] + 1.0f) * RAD2DEG;	// Pitch
	att.angle[ROLL] = asin(-2.0f * att.q[1] * att.q[3] + 2.0f * att.q[0]* att.q[2]) * RAD2DEG;																		// Roll
	att.angle[YAW] = atan2(2.0f * att.q[1] * att.q[2] + 2.0f * att.q[0] * att.q[3], -2.0f * att.q[3] * att.q[3] - 2.0f * att.q[2] * att.q[2] + 1.0f) * RAD2DEG;		// Yaw

 

 

 

 

 

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

四旋翼姿态解算常用的两种算法-互补滤波和梯度下降算法 的相关文章

  • SLAM: SLAM基本流程—VSLAM扫盲之旅

    在很多机器人的论文和书籍里面 xff0c 劈头第一页即是 xff0c 经典的SLAM视觉框架是过去十几年前已经成熟的研究结果 xff0c 这个框架和算法本身已经没有太多理论可以操作的空间 封杀了很多人的SLAM科研之路 xff0c 把SLA
  • 三维重建:SLAM的尺度和方法论问题

    百度百科的定义 此文引用了其他博客的一些图像 xff0c 如有侵权 xff0c 邮件联系删除 作为算法的SLAM xff0c 被称为同步相机位姿确定和地图构建 作为一个工程的SLAM xff0c 有众多的算法 在计算机视觉中 三维重建是指根
  • 相机标定:PNP基于单应面解决多点透视问题

    利用二维视野内的图像 xff0c 求出三维图像在场景中的位姿 xff0c 这是一个三维透视投影的反向求解问题 常用方法是PNP方法 xff0c 需要已知三维点集的原始模型 本文做了大量修改 xff0c 如有不适 xff0c 请移步原文 xf
  • 三维重建7:Visual SLAM算法笔记

    VSLAM研究了几十年 xff0c 新的东西不是很多 xff0c 三维重建的VSLAM方法可以用一篇文章总结一下 此文是一个好的视觉SLAM综述 xff0c 对视觉SLAM总结比较全面 xff0c 是SLAM那本书的很好的补充 介绍了基于滤
  • 基于stm32c8t6的两轮平衡小车 第二篇——原理图及CubeMx配置

    目录 1 原理图 2 CubeMx配置 xff08 1 xff09 创建工程 xff08 2 xff09 配置时钟树 xff08 3 xff09 仿真模式选择 xff08 4 xff09 TIM2配置为PWM输出模式 xff08 5 xff
  • 解决Mac下安装Homebrew慢的问题

    一 方法一 国内安装Homebrew很慢 xff0c 可以使用下面的方法 xff1a span class token function curl span fsSL https gitee com xueweihan codes vfrg
  • 麻将和牌算法

    麻将牌有1 xff0d 9万 xff0c 1 xff0d 9条 xff0c 1 xff0d 9筒 xff0c 东南西北 xff0c 中发白各4张 xff0c 共34种136张牌 有些地方的麻将还有梅兰花竹 春夏秋冬各一张 一般将梅兰花竹 春
  • Springboot2中文件上传报java.io.FileNotFoundException: C:\Users\WIzarder\AppData\Local\Temp\tomcat.8080.589

    Springboot2文件上传中用MultipartFile接受文件 xff0c 上传报错java io FileNotFoundException C Users WIzarder AppData Local Temp tomcat 80
  • String为什么叫不可变字符序列,StringBuffer和StringBuild为什么是可变字符序列

    String为什么叫不可变字符序列 xff0c StringBuffer和StringBuild为什么是可变字符序列 xff1f 当我第一次学习JavaSE基础知识里 xff0c 学习String和StringBuffer和StringBu
  • Linux中xshell连接不上问题

    inux中Xshell连接失败 原因 xff1a 网络配置问题 xff0c 还有可能是防火墙问题 xff0c ssh未开启问题 xff0c 本人遇到的是网络配置问题 首先是配置Linux网络 cd etc sysconfig network
  • 项目迁移AndroidX

    什么是AndroidX 简单地说就是新的库可以在不同的Android版本上使用 比如之前我们如果使用support为27 1 1的相关依赖库时 可能需要所有相关的support 库都为27 1 1 如果其中有bug的话 xff0c 可能需要
  • Win11更新后电脑没有声音,声卡驱动失效,卸载重装依然无效

    win11更新后声卡驱动失效 xff0c 没有声音 原因 xff1a windows自动更新会更新你的声卡驱动 xff0c 声卡驱动冲突了 解决办法 xff1a 卸载重装声卡驱动依然无效走下面流程 右击电脑 gt 管理 gt 设备管理器 g
  • Docker Unbuntu容器里面运行apt-get update命令报错

    最近在尚硅谷学习docker命令 xff0c 学习到给ubuntu添加vim命令时候运行apt get update报错如下所示 搜索了半天发现很多人让配置dns啥的 xff0c 有一个博主推荐在运行容器的时候添加一个参数可以解决上述问题
  • 华为2288H服务器配置raid

    本次配置的服务器品牌型号为华为2288H 清除现有的raid重新设置就可以 xff0c 只有设备在uefi模式下才能看到配置raid xff0c 所以要先在bios下把传统模式改成uefi模式
  • MBR&/BOOT和GRUB三者关系总结

    做了一个大自然的搬运工 介绍的不错 备份下 MBR是硬盘上的一个扇区 包含三部分内容 xff08 引导程序 分区表及分隔标识 xff0c MBR总计512字节 xff1b 其中引导程序最多占446个字节 xff09 xff1b 为什么需要这
  • 寄存器映射与直接操作寄存器

    一 存储器映射 与重映射 存储器本身不具有地址信息 xff0c 它的地址是由芯片厂商或用户分配 xff0c 给 物理 存储器分配 逻辑 地址的过程就称为存储器映射 xff0c 通过这些逻辑地址就可以访问到相应的存储器的物理存储单元 如果给存
  • html+js翻页时钟

    html 43 js翻页时钟 index html lt doctype html gt lt html gt lt head gt lt meta charset 61 34 utf 8 34 gt lt title gt html5带翻
  • 云计算的主要部署模式

    云计算与大数据 云计算的最终目标是将计算 服务和应用作为一种公共设施提供给公众 xff0c 使人们能够像使用水 电 煤气和电话那样使用计算机资源 云计算技术都是基于3种特殊的云计算服务模式 xff0c 它们都具有流行 有效 灵活 用户友好等
  • TP5 + PHPWord导出word文档中文出现乱码的问题

    场景 xff1a 项目需要将html页面转word文档 1 下载安装phpword插件composer require phpoffice phpword 2 安装成功在tp目录下的vendor会出现phpoffice文件夹 xff0c 说
  • 基于 Matlab/simulink的锂电池建模与仿真——复现论文《基于二阶EKF的锂离子电池SOC估计的建模与仿真》的仿真部分

    运用simulink实现该论文的锂电池建模仿真 1 模型分解1 1 SOC计算模块1 2 RC参数计算模块1 3 电压计算模块1 4 电流生成器 由Singal Builder模块生成 2 建模细节详解2 1 SOC OCV xff1a L

随机推荐

  • Qt使用记录

    Q amp A 1 错误 qt network ssl QSslSocket cannot call 解决 Qt5 12 4 Tools mingw730 64 opt bin下的libeay32 dll和ssleay32 dll拷贝到Qt
  • Keras的自定义lambda层去reshape tensor张量时model保存出错的解决办法

    背景 分割网络在进行上采样的时候我用的是双线性插值上采样的 xff0c 而Keras里面并没有实现双线性插值的函数 xff0c 所以要自己调用tensorflow里面的tf image resize bilinear 函数来进行resize
  • c++ 中 class 和 struct 的区别是什么

    xfeff xfeff C 43 43 中的struct对C中的struct进行了扩充 xff0c 它已经不再只是一个包含不同数据类型的数据结构了 xff0c 它已经获取了太多的功能 struct能包含成员函数吗 xff1f 能 xff01
  • Linux top命令的了解以及使用

    以root权限运行 top 命令后 xff0c 会以全屏的方式显示 xff0c 并且会处在对话的模式 操作实例 root登录之后 xff0c 在命令行中输入 xff1a top xff0c 回车 xff0c 即会以全屏的显示模式显示所有内容
  • 一键激活office,激活windows

    github地址 xff1a https github com massgravel Microsoft Activation Scripts 正文 xff1a Microsoft Activation Scripts MAS A Wind
  • Jupyter not connection to kernel 的解决方案

    不知道什么原因 xff0c 今天启动Jupyter Notebook发现不对经 xff0c 各种警告如 xff1a 内核没有连接什么的 xff0c 然后我试了试用spyder编写Python xff0c 结果一进去也是告诉我 error x
  • svm核函数的理解和选择

    特征空间的隐式映射 xff1a 核函数 咱们首先给出核函数的来头 xff1a 在上文中 xff0c 我们已经了解到了SVM处理线性可分的情况 xff0c 而对于非线性的情况 xff0c SVM 的处理方法是选择一个核函数 xff0c 通过将
  • list indices must be integers or slices, not tuple 解决方案

    解决方案 xff1a 用numpy里的array转化下 xff0c 转成元组 xff1a dataSet 61 np array dataSet 或者也可以将dataSet转化为矩阵 xff1a mat dataSet 两者都可行
  • 回归模型——树回归(理论方面的知识)

    一 xff1a 模型介绍 1 线性回归的薄弱处 xff1a 1 1 需要拟合所有的样本点 xff08 局部加权线性回归除外 xff09 但是当数据拥有众多特征并且特征之间关系十分复杂时 xff0c 构建全局模型的想法就显得太难了 xff0c
  • 二叉树遍历(图解)

    二叉树的顺序存储结构就是用一维数组存储二叉树中的节点 xff0c 并且节点的存储位置 xff0c 也就是数组的下标要能体现节点之间的逻辑关系 gt 一般只用于完全二叉树 链式存储 gt 二叉链表 定义 xff1a lchild data r
  • (hive) Execution Error, return code -101 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask解决方案

    解决bug思路 xff1a 出现这个问题说明你的mapreduce input fileinputformat split maxsize设置的太小了 解决方案 xff1a hive default gt set mapreduce inp
  • Ubuntu16.04 server配置记录

    1 安装vmtool 因为没有图形界面 xff0c 这里全部使用命令行操作 xff0c 虚拟机菜单点击安装vmtool工具后 xff0c 需要手动挂载 a mkdir tmp cdrom b mount dev cdrom tmp cdro
  • GCC的编译过程

    今天学习了gcc的编译过程 xff0c gcc是一个交叉平台编译器 xff0c 简单的说就是 xff0c 你可以在一个平台上编译出可以在另一个平台运行的代码 gcc的编译过程细分可以分成四个阶段 一 预处理阶段 预处理阶段有三个功能 有文件
  • 图解GPS原理 为什么需要4颗卫星才能定位,而不是3颗

    转载https blog csdn net hugohong article details 43191597 GPS 是英文Global Positioning System xff08 全球定位系统 xff09 的简称 xff0c 而其
  • Intel CPU,各个系列有什么区别

    CPU作为计算机核心组件 xff0c 直接影响计算机的性能和价格 无论在购买或是组装计算机时 xff0c 选择合适的CPU都是需要首先考虑的问题 以目前的CPU品牌来看 xff0c CPU可以分为Intel xff0c AMD和国产CPU三
  • 链表头结点的作用

    1 防止单链表是空的而设的 当链表为空的时候 带头结点的头指针就指向头结点 如果当链表为空的时候 单链表没有带头结点 那么它的头指针就为NULL 2 是为了方便单链表的特殊操作 插入在表头或者删除第一个结点 这样就保持了单链表操作的统一性
  • Shikra的PID调参教程

    在论坛里看到的Shikra的PID调参教程 xff0c 自己感觉非常好就转过来供大家一起交流学习 http www rcgroups com forums showthread php t 61 1375728 还有师兄的调PID的整理的文
  • 四旋翼位置控制之-定高篇

    先mark一下 xff0c 争取两周之内写完 由于快要毕业了 xff0c 所以一直都很忙 xff0c 并没有时间写完 xff0c 所以拖到现在 xff0c 不好意思 现在开始介绍四旋翼定高以及调试过程 首先介绍下四旋翼的模型 图中为 四旋翼
  • 四元数、欧拉角和方向余弦的定义及关系

    目前 xff0c 描述两个坐标系之间关系的常用方法主要有欧拉角法 方向余弦矩阵法和四元数法 因此要弄懂这三种方法的定义及关系 xff0c 我们必须先从坐标系转化开始了解 下面以四旋翼为例 xff0c 定义两个坐标系 导航坐标系 参考坐标系
  • 四旋翼姿态解算常用的两种算法-互补滤波和梯度下降算法

    上一篇讲了四元数 欧拉角和方向余弦的知识 xff0c 不熟悉的请到这篇博客查看点击打开链接 介绍两种算法前 xff0c 先定义两个坐标系 导航坐标系 参考坐标系 n xff0c 选取东北天右手直角坐标系作为导航坐标系n 载体坐标系 机体坐标