飞行姿态解算(三)

2023-11-11

继之前研究了一些飞行姿态理论方面的问题后,又找到了之前很流行的一段外国大神写的代码,来分析分析。 第二篇文章的最后,讲到了文章中的算法在实际使用中有重大缺陷。

大家都知道,分析算法理论的时候很多情况下我们没有考虑太多外界干扰的情况,原因是很多情况下,传感器的精度以及受到的干扰并不会特别大,而显著的影响到算法。但是在IMU系统中,有点不同。由于地磁场十分微弱,而我们生活中有大量使用电子设备,使得磁场非常的混乱,以至于地磁传感器非常容易受到干扰。

由于以上算法把地磁传感器一同加入到姿态的测定中,并基本给予了地磁传感器与加速度传感器同样的加权,导致地磁传感器一旦被干扰,会对姿态产生地球重力突然被干扰一样的结果。。。对姿态的测量是毁灭性的。

综上,考虑到磁场的不稳定性,必须对地磁传感器进行降权处理,使得他对姿态的影响变小。

于是设计了以下的算法。

将磁场传感器的数据在姿态角度中剔除,更新姿态的俯仰角(PITCH)以及横滚角(ROLL)的时候只使用加速度传感器以及陀螺仪(角速度传感器)。

只在计算偏航角的(YAW)的时候使用磁场传感器。也就是只使用磁场传感器作为一个电子指南针,定位整个姿态在水平面旋转的角度。这样设计,让磁场传感器只影响姿态中的一个数值,减少了磁场的权重,即使磁场收到干扰,也不会导致姿态骤变,使得四轴坠机。

在对YAW进行计算的时候使用了如下函数。

eulerAngleRaw.yaw = 0.9 * (eulerAngleRaw.yaw - gzF*2*halfT) + 0.1 * angleMagYaw;

此处的0.9和0.1是可以变动的但他们相加应该为1,此处为一个最简单的1阶低通滤波器,增加0.1则是增大截止频率。

算法的流程图是这样的:


程序流程图

新的姿态更新算法是这样的

voidAHRSupdate(float gxf, float gyf, float gzf, float axf, float ayf, float azf, float mxf, float myf, float mzf)

{

double norm;

float vx, vy, vz;

float ex, ey, ez;

float halfT; //采样周期的一半

// 辅助变量,以减少重复操作数

float q0q0 = q0*q0;

float q0q1 = q0*q1;

float q0q2 = q0*q2;

float q0q3 = q0*q3;

float q1q1 = q1*q1;

float q1q2 = q1*q2;

float q1q3 = q1*q3;

float q2q2 = q2*q2;

float q2q3 = q2*q3;

float q3q3 = q3*q3;

// 测量归一化

norm = invSqrt(axf*axf + ayf*ayf + azf*azf);

axf = axf * norm; //向量a 为传感器重力 飞行器分量

ayf = ayf * norm;

azf = azf * norm;

//norm = invSqrt(mxf*mxf + myf*myf + mzf*mzf);

// 向量m 为传感器磁场 飞行器分量

//mxf = mxf * norm;

//myf = myf * norm;

//mzf = mzf * norm;

// 计算参考磁通方向

//hx = 2*mxf*(0.5 - q2q2 - q3q3) + 2*myf*(q1q2 - q0q3) + 2*mzf*(q1q3 + q0q2); //向量h 为磁场通过旋转以后 参考系分量

//hy = 2*mxf*(q1q2 + q0q3) + 2*myf*(0.5 - q1q1 - q3q3) + 2*mzf*(q2q3 - q0q1);

//hz = 2*mxf*(q1q3 - q0q2) + 2*myf*(q2q3 + q0q1) + 2*mzf*(0.5 - q1q1 - q2q2);

//bx = 1.0f/invSqrt((hx*hx) + (hy*hy));

//原则上应该只有X向的分量 ex的磁场传感器部分误差就是由此式产生。

//bz = hz;

//估计方向的重力和磁通(V和W)

//反向使用 四元数 及把a用-a替换。

vx = 2*(q1q3 - q0q2);

//v为把重力反向旋转到飞行器参考系时重力的向量

vy = 2*(q0q1 + q2q3);

vz = q0q0 - q1q1 - q2q2 + q3q3;

//wx = 2*bx*(0.5 - q2q2 - q3q3) + 2*bz*(q1q3 - q0q2);

// w为把磁场反向旋转到飞行器参考系时磁场的向量

//wy = 2*bx*(q1q2 - q0q3) + 2*bz*(q0q1 + q2q3);

//wz = 2*bx*(q0q2 + q1q3) + 2*bz*(0.5 - q1q1 - q2q2);

// 错误是跨产品的总和之间的参考方向的领域和方向测量传感器 //建立误差函数 向量的外积

//ex = (ayf*vz - azf*vy) + (myf*wz - mzf*wy);

//ey = (azf*vx - axf*vz) + (mzf*wx - mxf*wz);

//ez = (axf*vy - ayf*vx) + (mxf*wy - myf*wx);

ex = (ayf*vz - azf*vy);

ey = (azf*vx - axf*vz);

ez = (axf*vy - ayf*vx);

halfT=getCurrentTime(timer4);

if (halfT>0.05)halfT=0;

//printf("%f\n\r",halfT);

if(ex != 0.0f && ey != 0.0f && ez != 0.0f)

{

// 积分误差比例积分增益

exInt = exInt + ex*Ki*(halfT);

eyInt = eyInt + ey*Ki*(halfT);

ezInt = ezInt + ez*Ki*(halfT);

// 调整后的陀螺仪测量

gxf = gxf + Kp*ex + exInt;

gyf = gyf + Kp*ey + eyInt;

gzf = gzf + Kp*ez + ezInt;

}

// halfT=getCurrentTime();

// printf("%f \n\r", halfT);

// 整合四元数率和归一化

//龙格-库格法

q0 = q0 + (-q1*gxf - q2*gyf - q3*gzf)*halfT;

q1 = q1 + (q0*gxf + q2*gzf - q3*gyf)*halfT;

q2 = q2 + (q0*gyf - q1*gzf + q3*gxf)*halfT;

q3 = q3 + (q0*gzf + q1*gyf - q2*gxf)*halfT;

// 归一化四元数

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

q0 = q0 * norm;

q1 = q1 * norm;

q2 = q2 * norm;

q3 = q3 * norm;

}

与第二篇相比,算法中注释掉了所有与磁场有关的部分。

姿态更新后,用如下语句与磁场传感器计算出来的YAW(偏航角)进行混合

eulerAngleRaw.yaw = 0.9 * (eulerAngleRaw.yaw - gzF*2*halfT) + 0.1 * angleMagYaw;

经过检验,该算法姿态稳定,准确,变化迅速,YAW的值也能长期保证稳定,能为四轴飞行器提供很好的姿态数据。

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

飞行姿态解算(三) 的相关文章

  • PX4二次开发中查无资料的踩坑总结

    写在前 xff1a 2021年9月下旬开始摸索px4飞控的二次开发 xff0c 从C 43 43 零基础到第一个修改算法后的版本稳定运行 xff0c 大概用了2个月 xff0c 从12月初改用新版本px4源码到现在又过去了约1个月 xff0
  • PX4与TX2通信

    PX4与TX2通信以及相关数据的获取 目录 1 PX4硬件接口 2 TELEM1 2接口线序 3 PX4与TX2通信 PX4 IO口定义 xff1a PX4硬件 xff1a 4 通信测试 5 RTPS 43 ROS Jetson TX2终端
  • PX4通过I2C方式添加自定义传感器(2)

    PX4 I2C通信方式传感器驱动分析 xff08 以ets airspeed为例 xff09 1 说明 这篇文章我们就来看看I2C传感器的驱动过程 xff0c 当然里面也有很多东西我不是很理解 xff0c 所以仅谈我领悟的一些东西 我就以e
  • 飞行机器人(七)仿真平台XTDrone + PX4编译

    0 编译PX4固件 参考仿真平台基础配置教程 xff08 中文详细教程 xff09 仿真平台基础配置 语雀 yuque com https www yuque com xtdrone manual cn basic config 按照教程
  • PX4 GAZEBO无人机添加相机并进行图像识别

    PX4 GAZEBO无人机添加摄像头并进行图像识别 在之前完成了ROS的安装和PX4的安装 xff0c 并可以通过roslaunch启动软件仿真 接下来为无人及添加相机 xff0c 并将图像用python函数读取 xff0c 用于后续操作
  • PX4 Bootloader下载及编译过程中的问题解决

    买来的雷迅的板子都是Bootloader已经烧进去了 xff0c Fireware也已经刷进去了 如果是自制的板子 xff0c 上位机根本没法识别板子 xff0c 必须先烧写下载Bootloader后编译好的bin文件 这篇记一下自己下载及
  • px4源码编译指南

    px4源码编译指南 强烈推荐大家去看官网的英文文档 xff0c 国内的博客杂七杂八 xff0c 官网的中文也很久没有更新 xff0c 这几天自己踩了很多坑 xff0c 写个教程希望能帮助到大家 xff08 本文选用平台是pixhawk1 1
  • px4 avoidance笔记

    最近在用px4官方的avoidance代码跑硬件避障 xff0c 官方介绍了只要生成符合sensor msgs PointCloud2点云信息就能使用 xff0c 因此为了应用长基线双目 xff0c 没有使用realsense的相机 xff
  • PX4进入系统控制台以及运行程序

    这里提供进入控制台两种办法 1 运行 Tools mavlink shell py dev ttyACM0 是我进入Px4系统控制台的命令 xff0c 进入之后应该是这样 Pixhawk src Firmware Tools mavlink
  • 无人机仿真—PX4编译,gazebo仿真及简单off board控制模式下无人机起飞

    无人机仿真 PX4编译 xff0c gazebo仿真及简单off board控制模式下无人机起飞 前言 在上篇记录中 xff0c 已经对整体的PX4仿真环境有了一定的了解 xff0c 现如今就要开始对无人机进行起飞等仿真环境工作 xff0c
  • PX4模块设计之三:自定义uORB消息

    PX4模块设计之三 xff1a 自定义uORB消息 1 新增自定义uORB消息步骤2 应用ext hello world消息示例3 编译执行结果4 参考资料 基于PX4开源软件框架简明简介和PX4模块设计之二 xff1a uORB消息代理
  • PX4模块设计之十七:ModuleBase模块

    PX4模块设计之十七 xff1a ModuleBase模块 1 ModuleBase模块介绍2 ModuleBase类介绍3 ModuleBase类功能介绍3 1 模块入口3 2 模块启动3 3 模块停止3 4 状态查询3 5 任务回调3
  • PX4模块设计之三十一:ManualControl模块

    PX4模块设计之三十一 xff1a ManualControl模块 1 ManualControl模块简介2 模块入口函数2 1 主入口manual control main2 2 自定义子命令custom command 3 Manual
  • PX4模块设计之三十三:Sensors模块

    PX4模块设计之三十三 xff1a Sensors模块 1 Sensors模块简介2 模块入口函数2 1 主入口sensors main2 2 自定义子命令custom command2 3 模块状态print status 重载 3 Se
  • 关于github px4 gps 驱动的开发的总结

    源码编译上边已经写过文章了 遇到的几个问题 1 解决虚拟机不能共享文件夹的问题 一开始虚拟机的更新 vmware tools 是灰色的 xff0c 不能点 xff0c 然后通过关掉虚拟机 xff0c 然后再开启的时候 xff0c 在没有启动
  • PX4-4-任务调度

    PX4所有的功能都封装在独立的模块中 xff0c uORB是任务间数据交互和同步的工具 xff0c 而管理和调度每个任务 xff0c PX4也提供了一套很好的机制 xff0c 这一篇我们分享PX4的任务调度机制 我们以PX4 1 11 3版
  • 【px4】运行mavsdk中的offboard example

    运行MAVSDK中的offboard例子时无人机不执行 想控制无人机前后左右移动 xff0c 在按照官方教程实现offboard 插件的时候 发现用action插件能正常起飞和降落 但是一旦执行到offboard的插件代码的时候就会自动降落
  • Px4源码框架结构图

    此篇blog的目的是对px4工程有一个整体认识 xff0c 对各个信号的流向有个了解 xff0c 以及控制算法采用的控制框架 PX4自动驾驶仪软件 可分为三大部分 xff1a 实时操作系统 中间件和飞行控制栈 1 NuttX实时操作系统 提
  • PX4飞控之自主返航(RTL)控制逻辑

    本文基于PX4飞控1 5 5版本 xff0c 分析导航模块中自护返航模式的控制逻辑和算法 自主返航模式和导航中的其他模式一样 xff0c 在Navigator main函数中一旦触发case vehicle status s NAVIGAT
  • PX4 OffBoard Control

    终于还是走上了这一步 xff0c 对飞控下手 xff0c 可以说是一张白纸了 记录一下学习的过程方便以后的查阅 目录 一 ubuntu18 04配置px4编译环境及mavros环境 二 PX4的OffBoard控制 1 搭建功能包 2 编写

随机推荐

  • 20220129学习记录- 北交opencv基础 第二章

    目录 图像增强的几种方式 空间域增强 1 代数运算 2 灰度变换 3 空间域滤波 频域增强 4 频域滤波 图像增强的几种方式 空间域增强 1 代数运算 s 255 r 反色 很好理解 懒得放图了 加法运算 通过多张照片求平均去噪 照片越多去
  • 毫无基础的人如何入门Python?从入门到进阶三份教程,拿走不谢

    毫无基础的人如何入门Python 这可能是很多人的疑问 因为大部分在学Python的人 都可能是毫无编程基础的人 这一点很无奈 谁让Python现在和以后的应用太广泛呢 那么 对于毫无基础的人来说 如何入门Python才是最好的选择呢 有这
  • 7、基于51单片机智能热水器温度水温水位检测 (proteus仿真+原理图+PCB图+程序+开题报告+参考论文)

    一 设计简介 本设计是基于51单片机智能热水器温度水温水位检测系统 主要实现以下功能 按键说明 从左边第一个起 减键 加键 设置键 输出方式 继电器输出 1 单片机型号 STC89C52 51 AT89C52 51 AT89S52 51 可
  • 深入理解C11/C++11内存模型,值得大家观看

    现代计算机体系结构上 CPU执行指令的速度远远大于CPU访问内存的速度 于是引入Cache机制来加速内存访问速度 除了Cache以外 分支预测和指令预取也在很大程度上提升了CPU的执行速度 随着SMP的出现 多线程编程模型被广泛应用 在多线
  • 程序员职业发展的绊脚石-思想的枷锁

    开篇 首先 我是一个程序员 从大学毕业到现在 已经工作了近5年的时间 看着现在越来越多的朋友进入IT行业 并且年轻才干的做软件开发的朋友们 个个都是生龙活虎 精兵强将 年纪轻轻的就学习了很多知识 我感觉我们做这个已经有点力不从心了 程序员
  • 三、账户安全

    目录 1 幽灵账户 影子账户 01 什么是影子账户 administrator账户的影子 02 实现思路 2 密码破解 系统漏洞利用破解 1 幽灵账户 影子账户 01 什么是影子账户 administrator账户的影子 02 实现思路 1
  • 巴法络的ts系列服务器,BUFFALO TS5400D NAS 巴法络 4BAY 网络存储服务器 塔式 企业级...

    TS 5400D BUFFALO 巴法络 terastation 网络存储器 NAS 肆盘位 产品简介 1 CPU采用 Intel Atom 1 86GHz双核处理器 搭载DDR3内存2GB 是考虑到多台电脑或服务器同时连接 适合中小型办公
  • java分批同步数据oom_案例实战 (八) 一个数据同步系统频繁OOM内存溢出的排查实践...

    案例背景 首先说一下案例背景 线上有一个数据同步系统 是专门负责从另外一个系统去同步数据的 简单来说 另外一个系统会不停的发布自己的数据到Kafka中去 然后我们有一个数据同步系统就专门从Kafka里消费数据 接着保存到自己的数据库中去 大
  • Powerlevel10k 主题安装

    在安装了 oh my zsh 的情况下 git clone depth 1 https gitee com romkatv powerlevel10k git ZSH CUSTOM HOME oh my zsh custom themes
  • 解决无法获取到B站点赞数和播放量的解决办法

    起因 因为前几天突然想到自己也想试试看用ESP8266搭配OLED来将B站的粉丝和点赞数显示出来看看 就趁星期天放假在家 找了一个以前买的ESP8266开发板搭配一个OLED 再从网上找了一个代码改了一下后烧录进去 然后就发现点赞数和播放量
  • 动画设计基础(第一节)-3d max2014 自制小球下落轨迹(气球-铁球-弹球-篮球-乒乓球)

    动画设计基础 第一节 3d max2014 自制小球下落轨迹 气球 铁球 弹球 篮球 乒乓球 各种球运动轨迹比较视频 各种自制小球下落 气球 铁球
  • eruda/vconsole 手机端调试利器

    0 对比 edura 相比 vconsole 可以看css样式 1 edura 1 1 function var script document createElement script script src cdn jsdelivr ne
  • 判断OBject对象为空(包括null ,““)的方法

    这篇文章主要介绍了Java判断对象是否为空 包括null 的方法 文中通过示例代码介绍的非常详细 对大家的学习或者工作具有一定的参考学习价值 需要的朋友们下面随着小编来一起学习学习吧 目录标题 对象之间判断需要了解的 代码示例 问题原因 注
  • Python爬虫从入门到精通:(25)scrapy框架02_scrapy框架的基本使用_Python涛哥

    scrapy的基本使用 创建一个工程 命令 scrapy startproject ProName 比如这里我创建一个工程 名字叫demoPro 打开终端 输入 scrapy startprojiect demoPro 目录结构 这里先介绍
  • 等保2.0.2021版综合测评得分计算实例

    文章目录 公式回顾 单个测评对象的计算 多个测评对象的计算 小结 未经许可 严禁转载 公式输入请参考 在线Latex公式 接上篇的 等保2 0 2021版等级测评报告模板修订总结 这次根据一个实际案例来看看2021版综合测评得分如何计算 2
  • 搭建学校oj平台-后端设置JWT与用户操作

    后端设置JWT与用户操作 gitee仓库代码在文章尾部 Mysql新建user表 create table user id int auto increment username varchar 100 null password varc
  • 【unity3D】TimeLine(详细图解)

    未来的游戏开发程序媛 现在的努力学习菜鸡 本专栏是我关于游戏开发的学习笔记 本篇关于unity的TimeLine TimeLine 介绍 打开TimeLine面板的方式 创建TimeLine 创建Track的两种方式 Track的详解 Ti
  • win10使用技巧02--系统端口被占用怎么查看

    1 打开命令提示符 管理员模式 2 输入netstat ano命令 回车后 能看到所有端口的情况 3 如果我们知道具体的端口号的话 输入netstat aon findstr 8080 其中8080加英文双引号 按回车键就可以找到占用808
  • Spark环境搭建(保姆级教程)

    文章目录 一 环境准备 二 Spark环境搭建 1 Spark部署方式 2 安装spark 1 下载Spark 关于版本的选择 2 安装Spark 上传安装包 解压并创建软链接 Spark的目录结构 配置环境变量 配置Hadoop信息 修改
  • 飞行姿态解算(三)

    继之前研究了一些飞行姿态理论方面的问题后 又找到了之前很流行的一段外国大神写的代码 来分析分析 第二篇文章的最后 讲到了文章中的算法在实际使用中有重大缺陷 大家都知道 分析算法理论的时候很多情况下我们没有考虑太多外界干扰的情况 原因是很多情