四旋翼定高篇之惯导加速度+速度+位置三阶互补融合方案

2023-05-16

笔者最近正在做四旋翼惯性导航的部分,利用加速度计进行速度估计、位置估计,从而实现四旋翼的垂直方向上的定高、水平方向上的定点控制。

首先在这里引用学长之前参考APM飞控里面互补滤波惯导融合方案:原文见四旋翼位置控制之-定高篇

原文将四轴在悬停油门附近的高度控制,等效为对光滑地面上滑块的位置、速度、加速度模型的控制。

下图为王龙学长博客里面的融合框图:




首先将载体坐标系下的加速度(记作A(b)=(ax,ay,az)^T)旋转到导航坐标系上下,导航坐标系下的加速度记为A(n)=(AX,AY,AZ)^T,这里A(b),A(n)均为列向量,其中T表示转置。

有:A(n)=A(b)*R(b2n)

其中R(b2n)表示载体坐标系到导航系的旋转矩阵,下面是方向余弦矩阵的推导

/*Z-Y-X顺规欧拉角转方向余弦矩阵
  //Pitch Roll  Yaw 分别对应Φ θ Ψ 
       X轴旋转矩阵      
       R(Φ)
  {1      0        0    }
  {0      cosΦ    sinΦ}
  {0    -sinΦ    cosΦ }


       Y轴旋转矩阵
       R(θ)
  {cosθ     0        -sinθ}
  {0         1        0     }
  {sinθ     0        cosθ}
  
       Z轴旋转矩阵
       R(θ)
  {cosΨ      sinΨ       0}
  {-sinΨ     cosΨ       0}
  {0          0           1 }
  
  由Z-Y-X顺规有:
载体坐标系到导航坐标系下旋转矩阵R(b2n)  
R(b2n) =R(Ψ)^T*R(θ)^T*R(Φ)^T

  
R(b2n)=
  {cosΨ*cosθ     -cosΦ*sinΨ+sinΦ*sinθ*cosΨ        sinΨ*sinΦ+cosΦ*sinθ*cosΨ}
  {cosθ*sinΨ     cosΦ*cosΨ +sinΦ*sinθ*sinΨ        -cosΨ*sinΦ+cosΦ*sinθ*sinΨ}
  {-sinθ             cosθsin Φ                                        cosθcosΦ                   }

在计算R(b2n)的过程中也可以采用四元数旋转矩阵来实现,避免进行大量的三角函数运算,这里直接截取论文里面的图片如下。


根据上述公式可得导航坐标系下加速度A(n)为:

A(n)_X=Cos_Yaw* Cos_Roll * A(b)_X
                        +(Sin_Pitch*Sin_Roll*Cos_Yaw-Cos_Pitch * Sin_Yaw) * A(b)_Y 
                          +(Sin_Pitch * Sin_Yaw+Cos_Pitch * Sin_Roll * Cos_Yaw) * A(b)_Z; 

 
A(n)_Y=Sin_Yaw* Cos_Roll * A(b)_X
                        +(Sin_Pitch * Sin_Roll * Sin_Yaw +Cos_Pitch * Cos_Yaw) * A(b)_Y
                          + (Cos_Pitch * Sin_Roll * Sin_Yaw - Sin_Pitch * Cos_Yaw) * A(b)_Z;


A(n)_Z=-Sin_Roll* A(b)_X 
                        + Sin_Pitch *Cos_Roll * A(b)_Y 
                           + Cos_Pitch * Cos_Roll *A(b)_Z;

由此我们得到了导航系下的加速度量,这里需要注意的是此时我们得到的加速度量并不全是用于惯性导航的运动加速度,因为加速度计为比力模型,所有作用在加速度计上的惯性力都将对其产生比力加速度。在载体坐标系中,重力(0,0,1)g始终作用在加速度计上。


对于时间非常短的导航 ,当忽略地球自转和哥氏项所引起的 误差的情况下有:


所以为得到到用于导航的运动加速度Acce(x,y,z)转化为cm/s^2有:

Acce(x)*=9.8/AcceMax;
Acce(x)*=100;//加速度cm/s^2

Acce(y)*=9.8/AcceMax;
Acce(y)*=100;//加速度cm/s^2


Acce(z)*=9.8/AcceMax;
Acce(z)-=9.8;
Acce(z)*=100;//加速度cm/s^2


至此我们得到了三组用于导航的运动加速度量,这里注意一点的是,水平运动加速度Acce(x),Acce(y)在这里表示的是四旋翼沿着正北(纬度)、正东(经度)运动的加速度。AcceMax为加度素计1G量程下的值。


下面贴出本文参考APM三阶互补位置融合的代码:

#define TIME_CONTANST_Z5.0f
#define K_ACC_Z (5.0f / (TIME_CONTANST_Z * TIME_CONTANST_Z * TIME_CONTANST_Z))
#define K_VEL_Z (3.0f / (TIME_CONTANST_Z * TIME_CONTANST_Z))
#define K_POS_Z (3.0f / TIME_CONTANST_Z)

float  High_Filter[3]={
0.03,//0.015
0.05,//0.05
0.02//0.03
};


float Altitude_Dealt=0;
void Strapdown_INS_High()
{
//Altitude_Dealt=HC_SR04_Distance-NamelessQuad.Position[_YAW];//气压计(超声波)与SINS估计量的差,单位cm
Altitude_Dealt=Altitude_Estimate-NamelessQuad.Position[_YAW];//气压计(超声波)与SINS估计量的差,单位cm

acc_correction[_YAW] += High_Filter[0]*Altitude_Dealt* K_ACC_Z ;//加速度校正量
vel_correction[_YAW] += High_Filter[1]*Altitude_Dealt* K_VEL_Z ;//速度校正量
pos_correction[_YAW] += High_Filter[2]*Altitude_Dealt* K_POS_Z ;//位置校正量

//原始加速度+加速度校正量=融合后的加速度
NamelessQuad.Acceleration[_YAW]=Origion_NamelessQuad.Acceleration[_YAW]+acc_correction[_YAW];

//融合后的加速度积分得到速度增量
SpeedDealt[_YAW]=NamelessQuad.Acceleration[_YAW]*CNTLCYCLE;

//得到速度增量后,更新原始位置
Origion_NamelessQuad.Position[_YAW]+=(NamelessQuad.Speed[_YAW]+0.5*SpeedDealt[_YAW])*CNTLCYCLE;


//原始位置+位置校正量=融合后位置
NamelessQuad.Position[_YAW]=Origion_NamelessQuad.Position[_YAW]+pos_correction[_YAW];


//原始速度+速度校正量=融合后的速度
Origion_NamelessQuad.Speed[_YAW]+=SpeedDealt[_YAW];
NamelessQuad.Speed[_YAW]=Origion_NamelessQuad.Speed[_YAW]+vel_correction[_YAW];
}


作者在去年寒假的之前基本上都是用的上述方案进行气压计定高融合,效果还比较好,实际融合调试过程中,只需要调整三个积分系数即可,如果你之前的位置观测量是采用气压计,当你直接把高度位置观测量换成超声波时,参数基本不用调整,融合就挺好的。


下面给出之前测试时候融合波形:


三阶互补融合方案,在飞机中、低速的上升或者下降的时候,不


处理延时修正时,由于观测传感器带来的滞后感不明显,但是当


你快速拖动飞机,你会发现位置融合波形在后半段会出现跟踪缓


慢,强行被观测传感器拉至稳定值的情况,这里截取一小段融合


波形给大家,大家对比一下速度快和慢的时候位置融合就一目了


然了。


问题先留在这里,如何处理这样一类因观测传感器滞后的造成的惯导融合滞后的问题?

贴上处理后的融合波形,大家仔细对比下:


附上之前寒假的三阶互补室外定高视频:

视频1:室外定高F330机架

视频2:QAV250穿越机



以上内容,均为作者学习四轴的个人总结与


感悟,难免有错误之处,欢迎批评指出,谢


谢!!!



作者将在下一节阐述观测传感器延时修正的


处理,以及基于GPS速度+位置两个观测量


的水平位置卡尔曼融合过程。



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

四旋翼定高篇之惯导加速度+速度+位置三阶互补融合方案 的相关文章

  • 基于布谷鸟优化的BP神经网络(预测应用) - 附代码

    基于布谷鸟优化的BP神经网络 xff08 预测应用 xff09 附代码 文章目录 基于布谷鸟优化的BP神经网络 xff08 预测应用 xff09 附代码1 数据介绍3 CS优化BP神经网络3 1 BP神经网络参数设置3 2 布谷鸟算法应用
  • 基于粒子群优化的BP神经网络(分类应用) - 附代码

    基于粒子群优化的BP神经网络 xff08 分类应用 xff09 附代码 文章目录 基于粒子群优化的BP神经网络 xff08 分类应用 xff09 附代码1 鸢尾花iris数据介绍2 数据集整理3 粒子群优化BP神经网络3 1 BP神经网络参
  • Arm Keil MDK v5.30版本官宣,快来下载!

    近日 xff0c Arm很高兴地宣布发布Arm Keil MDK v5 30 此版本新增了对Cortex M55处理器和CMSIS Build的支持 xff0c 更新包括Arm Compiler 6 14 xff0c CMSIS 5 7 0
  • ubuntu下访问串口

    前言 最近准备将windows上自动瞄准的程序移植到linux xff0c 第一步准备调试一下ubuntu下的串口 在网上搜到一个串口库 xff0c 于是就拿来调用 xff0c 最后调试成功 过程如下 xff1a 过程 1 下载Serial
  • 热备笔记实验

    早上突然断电 本来笔记本的插头就忘记插了 xff0c 电池没用多久就熄火 最纳闷的是接入电源后本机数据库竟然挂掉了 xff0c 嘿嘿 xff0c 正好试一试前几天应用的热备回复 以下是我的全程 C Documents and Setting
  • Android学习之AIDL添加Service权限

    参考 Android开发艺术探索 xff0c 书中提供了两种方法 第一种方法 xff1a 在onBind中验证 在服务端的AndroidManifest添加自定义权限 lt permission android name 61 span c
  • ADRC(自抗扰控制器)技术附Matlab代码框架

    自抗扰控制器 Auto Active Disturbances Rejec ion Controller ADRC 是韩京清学者提出的 xff0c 是一种继PID控制器后的一种新型的实用的控制技术 它不是一种独立的技术 xff0c 可以理解
  • git视频及对初学者的学习建议

    http herry2013git blog 163 com blog static 21956801120144810133569 http herry2013git blog 163 com blog static 2195680112
  • 迷你光流使用说明

    为了让你有兴趣往下学习 xff0c 先上个定点悬停效果视频给你欣赏一下吧 xff01 点击打开视频链接 首先 xff0c 简单介绍一下我使用的这款光流传感器 长宽高 xff1a 14x11x5mm xff0c 重量约0 6克 xff0c 工
  • Handler的使用方法(一)

    想花点时间谈谈Handler的使用方法 xff0c 是应为Handler的使用涉及到了线程类的使用 xff0c 也是在程序中用到了线程 xff0c 关于线程 xff0c 是个很重要的概念 xff0c 因为以后的嵌入式系统的应用开发往往在程序
  • STM32控制APM飞控(二)MAVLINK源码集成到stm32工程中

    MAVLINK协议源码集成到32工程中 一 MAVLINK代码转化为C语言源码文件 主要根据 http www cnblogs com lovechen p 5801679 html 作者 恒久力行 的方式 xff0c 我进行归纳简要说明
  • STM32控制APM飞控(三)MAVLINK整合并适配stm32串口的收发

    目录 stm32底层串口代码更改能收发MAVLINK协议包 一 在上一次移植好的工程基础上进行如下改动
  • STM32控制APM飞控(五)MAVLINK的C源码的解释及MAVLINK心跳包

    MAVLINK的C源码的解释及MAVLINK心跳包 一 MAVLINK转化成C源码后的文件及文件夹解释 用pathon2 7将从github官网下载下来的MAVLINK源码转换成c语言源码的文件夹如图 xff1a 解释 xff1a a xf
  • (一) 概述(概念、组件、架构、适用场景) | 普罗米修斯(Prometheus)

    什么是普罗米修斯 xff1f Prometheus是一个开源系统监控和警报工具包 xff0c 最初在 SoundCloud构建 自 2012 年成立以来 xff0c 许多公司和组织都采用了 Prometheus xff0c 该项目拥有非常活
  • 多值依赖

    多值依赖 xff1a 比如 xff1a 学校中某一门课程由多个教员讲授 xff0c 他们使用相同的一套参考书 每个教员可以讲授多门课程 xff0c 每种参考书可以供多门课程使用 我们可以用一个非规范化的关系来表示教员T 课程C 和参考书B
  • Docker启动Mysql问题汇总

    最近在学习Docker技术 xff0c 遇到了不少问题 xff0c 记录分享一下 xff0c 感觉有用的可以参考一下 xff1b 1 Docker使用Mysql docker run d v opt data mysql02 var lib
  • 静态库和动态库/文件描述符与文件指针/文件操作/重定向

    c语言阶段学习文件操作复习 1 打开文件 FILE fopen const char path const char mode path xff1a 需要打开的文件路径 xff0c 可以是绝对路径 xff0c 也可以是相对路径 mode x
  • 一种可行的STM32F103外设RTC使用方法

    前言 最近做的项目需要用RTC功能 xff0c 记录掉上电时间 然后就开始琢磨STM32的RTC 在使用的过程中出现各种问题 搞的很是头痛 几经折腾 xff0c 终于弄出一种稳定的使用方法 刚开始最大的问题就是掉电后时钟不走 xff0c 代
  • 路径规划算法初探

    前言 xff1a 真实世界中人类的路径规划是对记忆信息和实时感知信息综合分析的过程 xff0c 在虚拟技术中属于行为控制层级的技术 一 xff0c 机器人路径规划分类 xff1a 1 全局路径规划 xff08 环境完全已知 xff09 2
  • docker容器的备份和恢复

    将容器保存为镜像 root 64 1 0001 docker ps a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a40d46499c3a gitlab gitlab ce

随机推荐