手把手教用ROS做机器人控制(二)--加速度计与陀螺仪两种融合算法:mahony 互补滤波器算法与EKF算法

2023-05-16

对于加速计与陀螺仪融合,介绍两种滤波算法:他们的核心思想不太相同,这两种方法现在也已经有了应用,现在你可以发现互补滤波融合在无人机上,EKF我做过在平衡车上面。mathony主要思想是用四元数来更新,最后转化为欧拉角。EKF主要是根据角度与角速度建立陀螺仪的模型,通过加速度算出角度来更新陀螺仪的累积误差。

1.首先介绍一下互补滤波算法:

先定义Kp,Ki,以及halfT 。

Kp,Ki,控制加速度计修正陀螺仪积分姿态的速度

halfT ,姿态解算时间的一半。此处解算姿态速度为500HZ,因此halfT 为0.001

#define Kp 2.0f

#define Ki 0.002f

#define halfT 0.001f

初始化四元数

float q0 = 1, q1 = 0, q2 = 0, q3 = 0;

定义姿态解算误差的积分

float exInt = 0, eyInt = 0, ezInt = 0;

以下为姿态解算函数。

参数gx,gy,gz分别对应三个轴的角速度,单位是弧度/秒;

参数ax,ay,az分别对应三个轴的加速度原始数据

由于加速度的噪声较大,此处应采用滤波后的数据

 

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,其实就是当前的机体坐标参照系上,换算出来的重力单位向量。(用表示机体姿态的四元数进行换算)

vx = 2*(q1*q3 – q0*q2);

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

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

这里说明一点,加速度计由于噪声比较大,而且在飞行过程中,受机体振动影响比陀螺仪明显,短时间内的可靠性不高。陀螺仪噪声小,但是由于积分是离散的,长时间的积分会出现漂移的情况,因此需要将用加速度计求得的姿态来矫正陀螺仪积分姿态的漂移。

在机体坐标参照系上,加速度计测出来的重力向量是ax、ay、az;陀螺积分后的姿态来推算出的重力向量是vx、vy、vz;它们之间的误差向量,就是陀螺积分后的姿态和加速度计测出来的姿态之间的误差。

向量间的误差,可以用向量积(也叫外积、叉乘)来表示,ex、ey、ez就是两个重力向量的叉积。这个叉积向量仍旧是位于机体坐标系上的,而陀螺积分误差也是在机体坐标系,而且叉积的大小与陀螺积分误差成正比,正好拿来纠正陀螺。由于陀螺是对机体直接积分,所以对陀螺的纠正量会直接体现在对机体坐标系的纠正。简单的讲就是说本来陀螺仪转换的出的重力向量应该和加速度计重力向量相等的,但是现在可能由于加速度计积分误差导致不相等,所以需要校正。

叉乘是数学基础,百度百科里有详细解释。

ex = (ay*vz – az*vy);

ey = (az*vx – ax*vz);

ez = (ax*vy – ay*vx);

将叉乘误差进行积分

exInt = exInt + ex*Ki*halfT;

eyInt = eyInt + ey*Ki*halfT;

ezInt = ezInt + ez*Ki*halfT;

用叉乘误差来做PI修正陀螺零偏,通过调节Kp,Ki两个参数,可以控制加速度计修正陀螺仪积分姿态的速度

gx = gx + Kp*ex + exInt;

gy = gy + Kp*ey + eyInt;

gz = gz + Kp*ez + ezInt;

一阶龙格—库塔法解四元数微分方程。

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;

下面给出解释四元数更新:

 

四元数归一化:

norm = sqrt(q0*q0 + q1*q1 + q2*q2 + q3*q3);

q0 = q0 / norm;

q1 = q1 / norm;

q2 = q2 / norm;

q3 = q3 / norm;

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

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

}

2.EKF滤波算法

1.这里,因为用在平衡车上,所以只需要一个倾角模型就可以。根据上一时刻角度值得到了当前角度的预测值 Angle(k+1):

Angle(k)=Angle(k-1)+(Gyro - Q_bias) * dt       (1)

其中等号左边Angle(k)为此时的角度,等号右边Angle(k-1)为上一时刻的角度,Gyro 为陀螺仪测的角速度的值,dt是两次滤波之间的时间间隔,float  dt=0.005;    这是程序中的定同时 Q_bias也是一个变化的量,即使漂移误差。

通过上面(1)式即可得到下面矩阵形式:

2.

3

.

4.

代码如下:

void Kalman_Filter(float Gyro,float Accel)

{

Angle+=(Gyro - Q_bias) * dt;           

 

Pdot[0]=Q_angle - PP[0][1] - PP[1][0]; /

Pdot[1]= - PP[1][1];

Pdot[2]= - PP[1][1];/

Pdot[3]=Q_gyro;

 

PP[0][0] += Pdot[0] * dt;   

PP[0][1] += Pdot[1] * dt;

PP[1][0] += Pdot[2] * dt;

PP[1][1] += Pdot[3] * dt;  

 

Angle_err = Accel - Angle;

 

PCt_0 = C_0 * PP[0][0];

PCt_1 = C_0 * PP[1][0];

 

E = R_angle + C_0 * PCt_0;

 

K_0 = PCt_0 / E;

K_1 = PCt_1 / E;

 

t_0 = PCt_0;

t_1 = C_0 * PP[0][1];

 

PP[0][0] -= K_0 * t_0;

PP[0][1] -= K_0 * t_1;

PP[1][0] -= K_1 * t_0;

PP[1][1] -= K_1 * t_1;

 

Angle += K_0 * Angle_err;

Q_bias += K_1 * Angle_err;

Gyro_x   = Gyro - Q_bias;

}

 

 

 

参考文章地址:

1.http://bbs.eeworld.com.cn/home.php?do=blog&id=517775&mod=space&uid=779081

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

手把手教用ROS做机器人控制(二)--加速度计与陀螺仪两种融合算法:mahony 互补滤波器算法与EKF算法 的相关文章

随机推荐

  • 美团人的写作基本功是如何练成的

    在美团 xff0c 王兴非常重视写作 他曾经说过 xff1a 写作是我要带头苦练的基本功 xff0c 是非常基本的能力 因为一个事情要积累的话 xff0c 就得书面化 写作看起来和业务没什么关系 xff0c 但这是一个非常共通的 极其基础的
  • 【LeetCode刷题日记】382. 链表随机节点

    题目 给你一个单链表 xff0c 随机选择链表的一个节点 xff0c 并返回相应的节点值 每个节点 被选中的概率一样 实现 Solution 类 xff1a Solution ListNode head 使用整数数组初始化对象 int ge
  • Python Matplotlib教程

    Python Matplotlib教程 文章目录 Python Matplotlib教程教程特点阅读条件 数据可视化是什么数据可视化数据可视化应用场景 Matplotlib是什么Matplotlib架构组成1 脚本层2 美工层3 后端层 M
  • 【Python学习笔记】认识anaconda

    可以参考下面几篇文章 xff1a Anaconda完全入门指南 Anaconda介绍 安装及使用教程 Anaconda使用教程一 xff08 新手友好 xff09 另外下面总结一下conda的常用命令 xff1a span class to
  • 【Python学习笔记】 if __name__ == ‘__main__‘ 如何正确理解?

    引言 学过Java C C 43 43 的程序员应该都知道 xff0c 每次开启一个程序 xff0c 都必须写一个主函数作为程序的入口 xff0c 也就是我们常说的main函数 如下所示 xff0c main 就是Java中的一个main函
  • 聊聊我常用的5款动态数据可视化工具

    转自 Python大数据分析 xff08 ID xff1a pydatas xff09 视频当道的时代 xff0c 数据可视化自然也要动起来 我常用的动态可视化工具主要有 Tableau Echarts Flourish Python 这几
  • 物联网十年简史

    分享一篇好文 xff1a 万字长文 xff1a 物联网十年简史
  • 【LeetCode刷题日记】539. 最小时间差

    题目 给定一个 24 小时制 xff08 小时 分钟 34 HH MM 34 xff09 的时间列表 xff0c 找出列表中任意两个时间的最小时间差并以分钟数表示 示例 1 xff1a 输入 xff1a timePoints 61 34 2
  • LQR、LQR-MPC、GP-MPC控制倒立摆

    LQR控制倒立摆 xff1a 倒立摆状态方程 xff1a 目标任务 xff1a 模型参数 xff1a LQR for the cart pole system load 39 cp params mat 39 syms phi phid x
  • 事件驱动和消息驱动

    之前简单写过一些关于事件驱动的文章 xff1a C C 43 43 服务器开发 事件驱动 事件驱动架构 事件驱动编程及设计模式 最近看到一篇不错的文章 xff0c 在此转载一下 xff1a 事件驱动和消息驱动 事件驱动和消息驱动 消息驱动和
  • 如何写好一个数据分析报告,需要注意哪些?

    写一份好的数据分析报告的重要性不言而喻 xff08 只要我写的好 xff0c 升职加薪 年终奖就少不了我 xff09 大家都知道 xff0c 数据分析报告的输出是整个业务分析过程的成果 xff0c 是评定一条业务线的参考依据 xff0c 既
  • 任正非:全面提升软件工程能力与实践,打造可信的高质量产品

    最近看了点软件工程相关的东西 xff0c 转一下这篇文章 全面提升软件工程能力与实践 xff0c 打造可信的高质量产品 致全体员工的一封信 我今天写信 xff0c 是要和大家沟通公司如何全面提升软件工程能力和实践 二十年前的IPD变革 xf
  • 你真的会画时序图吗?

    文章目录 一 WaveDrom功能二 WaveDrom的使用三 绘制时序图四 时序图教程五 逻辑电路图教程六 Github主页七 VScode中使用Waveform 摘要 xff1a WaveDrom是一个免费开源的在线数字时序图渲染引擎
  • 【LeetCode刷题日记】1332. 删除回文子序列

    题目 给你一个字符串 s xff0c 它仅由字母 39 a 39 和 39 b 39 组成 每一次删除操作都可以从 s 中删除一个回文 子序列 返回删除给定字符串中所有字符 xff08 字符串为空 xff09 的最小删除次数 子序列 定义
  • PicGo图床与Typora(PicGo+Typora+GitHub的完整设置)以及常见错误的解决方法

    首先介绍下怎么使用PicGo 43 Typora 43 GitHub来搭建属于自己的图床 xff0c 后面介绍一下使用过程中可能产生的错误 本文主要参考下面两篇文章 xff1a PicGo图床与Typora xff08 PicGo 43 T
  • 【Python学习教程】Python编程基础

    文章目录 编程语言是什么编译型语言和解释型语言的区别编译型语言1 可执行程序不能跨平台2 源代码不能跨平台 解释型语言关于 Python总结 Python是什么 xff0c Python简介Python的特点 xff08 优点和缺点 xff
  • 【Python学习教程】Python编程环境搭建

    文章目录 Windows安装Python xff08 图解 xff09 关于 IDLE Linux xff08 Ubuntu xff09 系统安装Python更新 Python 版本重新安装 Python1 下载源代码2 编译 小技巧 Ma
  • 【Python学习教程】Python变量类型和运算符

    文章目录 Python变量的定义和使用Python 变量的赋值Python 变量的使用Python 是弱类型的语言 Python整数类型 xff08 int xff09 详解关于 Python 2 x整数的不同进制1 十进制形式2 二进制形
  • 【Python学习教程】Python列表(list)、元组(tuple)、字典(dict)和集合(set)详解

    文章目录 什么是序列 xff0c Python序列详解 xff08 包括序列类型和常用操作 xff09 序列索引序列切片序列相加序列相乘检查元素是否包含在序列中和序列相关的内置函数 Python list列表详解Python创建列表1 使用
  • 手把手教用ROS做机器人控制(二)--加速度计与陀螺仪两种融合算法:mahony 互补滤波器算法与EKF算法

    对于加速计与陀螺仪融合 xff0c 介绍两种滤波算法 xff1a 他们的核心思想不太相同 xff0c 这两种方法现在也已经有了应用 xff0c 现在你可以发现互补滤波融合在无人机上 xff0c EKF我做过在平衡车上面 mathony主要思