四旋翼惯导融合之观测传感器滞后问题汇总与巴特沃斯低通滤波器设计(气压计MS5611、GPS模块M8N、超声波、PX4FLOW等)

2023-05-16

前文讲到APM的三阶互补方案,之前附的图是从学长博客里面抠的,感觉还不是很详细,于是自己就画了下,顺便重新理一下思路。

上图中下标为O的表示原始量(Origion),C表示矫正后的量(Correction),a,v,s这些一目了然,表示加速度、速度、位置,其中带下标c的表示融合后的状态量,即在控制中用作实际反馈的量,读者可以结合上图与上文博客后面所贴的相关代码、注释阅读。

链接如下:

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

上文最后提到由于观测传感器滞后性(主要原因:1、支持的最大采样频率小;2、原始数据输出噪声大、大多数时候需要数字低通滤波造成时延),造成的直接把当前惯导估计值与观测传感器做差比较得到状态误差的方式不可取。

在提出解决办法前,首先我们来谈下传感器采样周期造成的观测传感器滞后的问题:

首先以大家熟悉的超声波传感器为例,其中辨识度最高的为HC-SR04

直接给出采集时序图:

超声波传感器工作需要模块发射头向外发射波长约为6mm、频率为40khz的超声波信号,触发模块开始工作需要在模块触发引脚产生一个不少于10us的高电平,取触发时刻为T0,当前方有物体时,声波会反射回来,反射回来的信号被模块上的接收头所接收,并且在模块的输出引脚上产生一个回响应电平信号,取响应时刻回T1,根据声波一来一往的总时间与声音在空气中传播的速度,即可计算距前方物体距离。

此模块为了防止发射信号对回响信号的影响,需要两次发射间隔至少为60ms,模块测量距离范围为2cm~400cm,实际使用过程中,也就发现2.5m以内数据还好,超过2.5m后,稍微有点角度误差就很大,我们就按照最大检测距离为2.5m计算,最大采集时间为60ms+(2.5*2/340)*1000ms=74.7ms

至此我们总结下,常见的HC-SR04模块最小采样周期为60ms,最

大接近75ms。

 

75ms似乎完全可以接受,下面再以常用的M8N GPS为例:

 

直接截取ublox软件设置截图:

 

这里首先可以看到GPS时钟源,一般就选GPS time即可,接着是

测量周期,一般模块初始化为1Hz,对于一般的应用来讲,1Hz刷新

速率完全够了,这也是模块默认的刷新速率。更快的刷新速率意

味着需要占用芯片的更大通讯资源、处理压力,同时模块的功耗

也就越大。

(尚不了解刷新速率加大是否会对数据输出精度有影响。。。)

本文当前采用的不是串口解析Nema标准字符数据帧形式,本文只

对UBX里面PVT语句进行解析,PVT数据帧信息如下图所示:

 

 

PVT语句基本上包含了GPS定点所需的所有常用信息,本文直接

 

GPS测量频率设置成M8N所能允许的最大采样频率10Hz后,此时

 

的GPS采样时间即为100ms。

 

下面接着讨论常用高度观测传感器———气压计MS5611,数据

 

手册截图如下:

 

 

        其中气压计采集过程为气压、温度交替采集,采样频率可设置,采集时,需要先开启ADC(气压、温度)转换,然后采集,这里的Responce Time表示的为开启到采样的所需间隔时间。一般为保证压力数据、温度数据的实时同步性,在采集温度前、开启气压ADC数据转换,同理,采集气压前,亦开启温度ADC转换。这样可以实现采样周期的最小化。

        从MS5611数据手册可以很容易的知道温度+气压采样周期最小为0.5*2=1ms,最大为8.22*2=16.44ms,这里需要注意的是不同采样频率下,传感器的输出精度是不一样的,从0.012mbar到0.065mbar,其中当采样周期为16.44ms时,气压误差为0.012mbar,采样周期为1.0ms时,气压误差为0.065mbar,这里出现的mbar表示气压单位毫帕。单位转换关系如下图:

故0.0012mbar=1.20Pa,有常识可知1Pa误差约等于10cm,将气压误差转换为距离后误差在12cm~65cm。更小采样的采样周期意味着更大的采样误差,不同的噪声误差对应着卡尔曼滤波时观测噪声的选取大小。

        这里我们参考Autoquad飞控里面的采样设置,直接抠图如下:

 

        这里可以看到,传感器ADC转换时,温度与气压均设置成4096,即此时最小采样周期为16.44ms,在AQ飞控CoOS任务调度周期为2.5ms,意味着只能实现最小20ms的气压计采样周期。(其中缘由大家自己算下加法即可)。

        最后在介绍一种位置观测传感器:光流PX4FLOW

 

 

        下面一段话为官网PX4FLOW中文介绍截取部分:

        PX4Flow 是一款智能光学流动传感器。传感器拥有原生752×480像素分辨率,计算光学流的过程中采用了4倍分级和剪裁算法,计算速度达到250Hz(白天,室外),具备非常高的感光度。与其他滑鼠传感器不同,它可以以 120Hz(黑暗,室内)的计算速度在室内或者室外暗光环境下工作,而无需照明LED。你也可以对它重新编程,用于执行其他基础的,高效率的低等级机器视 觉任务。

        PX4FLOW支持USB、串口、I2C两种方式对数据进行解析,为了减小芯片开销

 

作者采用的方式为I2C形式,其中I2C相关数据为如下图:

 

其中包含:光流点数、光流积分量、结合高度转换后的光流速度超声波距离、图像质量、三轴角速度、超声波测量时间、陀螺仪内部温度等数据。

其中:光流速度超声波距离图像质量为定点、定高所需的有用数据,作者在这里只对这三组数据进行了获取。

PX4FLOW主控采用的是STM32F405,芯片主要资源开销为DCMI获取摄像头数据与处理+融合高度、陀螺仪光流算法(其余超声波数据采集、板载陀螺仪SPI数据采集、

Mavlink、USB等基本上可以忽略)。

 

这里PX4FLOW给出了最大处理速度时耗时4ms,尚不清楚这部分指的是处理完一场图像数据加融合的总开销,还是只是针对融合算法。

 

作者主控采用的是STM32F103RCT6,采用模拟I2C采集PX4FLOW数据,为保证陀螺仪、加计采样以及控制周期最小化,在采集I2C时,对PX4FLOW采用的是队列采集模式,即第一个2ms采集X轴流速、第二个2ms采集Y轴流速、第三个2ms采集超声波距离、第四个2ms采集图像质量,光流数据更新一次为8ms。

至此我们列举几种常见传感器采样周期如下:

超声波HC-SR04:75ms

GPS M8N:100ms

气压计MS5611:20ms

PX4FLOW:8ms

上述我们只是讨论了数字传感器采集过程中的传感器采样周期造成的时延。

 

 

这里我们讨论的时延是相对于惯性导航主导传感器——加速度计而言的。MPU6500加速度计当不设置内部数字低通时,陀螺仪最大输出频率为8Khz,加速度计为

4Khz,对于四旋翼而言,最大采样频率为1Khz就完全够用了,足够高的采样周期能减小数据融合时的积分误差(频率混叠可以忽略),同时保证传感器数据数字低通时的群时延也更小。作者由于STM32F103RCT6芯片运算速度限制,MEMS传感器组合为MPU6500、HMC5983、MS5611,这三组传感器数据通过SPI采集进来分别耗时:73us、56us、82us。

姿态解算最大耗时约:320us

GPS串口解析最大耗时约:200us

PX4FLOW单个数据采集最大耗时约:0.5ms

三轴惯导卡尔曼融合最大耗时约:270us

控制器、数字滤波等最大耗时约:150us

系统总时间开销约为1.65ms

作者选取总定时调度周期为2.0ms

上面我们考虑的是一类原始数据采集过程中的滞后,接下来介绍一类因数字低通滤波器造成的传感器时延问题。

 

传感器数字低通的滞后性:

首先以气压计传感器为例子,上文讲到当MS5611气压传感器设置成精度最高时,即开启ADC采集时,温度、气压转换都设置成4096,此时官方给出的传感器误差为12cm,Okay,现在我们先来一组原始气压通过压差法获取的相对高度值波形。

 

上图中,中间蓝色线表示速度波形、灰色表示加速度波形、上面总共有三条线,放大后如下:噪声比较大的为原始气压通过压差换算高度值、平滑点的红色线表示惯导估计高度,较为滞后的绿色线表示,巴特沃斯2Hz截止频率后的滤波滞后的高度值。

 

这里注意到,气压计原始高度波动比较大,高度噪声基本上在50cm以内,数字低通后的气压高度即波动比较小,不考虑传感器静止漂移情况下,短时间内波动在15cm以内,但是运动起来后,发现滞后性很明显。(曲线从一定高度至另一高度的跟踪出现明显先后)如果觉得还不够明显,当速度快一点后,就立马一目了然了。

 

注意速度峰值大的地方,惯导位置估计高度与低通后的气压观测高度,明显都是红色线先起来、观测传感器后起来,中间来回上下拖动飞机一段更为明显。后面最后一个速度峰值较小时,两曲线基本重合,看不出明显差异。

下面给出利用MATLAB设计巴特沃斯低通滤波器过程(Tip:作者信号与系统很渣,只会依葫芦画瓢):

首先本文巴特沃斯滤波器为2阶,阶数越高,虽然保证了阻带更快衰减,但是系统相延亦增长。

1、调用MATLAB滤波器设计工具箱,命令行输入fdatool即可,界面如下。

2、左下方分别勾选Lowpass、IIR、滤波器阶数、采样频率、截止频率即可。

3、点击Design Filter滤波器设计完成,得到系统幅频响应如下。

4、点击Analysis,选Phase Delay即可看到系统相延特性。

上面两个图的差异在于设置的滤波器阶次不一样,对比可知,阶次越高系统相延越大。

二阶巴特沃斯数字低通滤波器参数如上图所示。

通过fdatool滤波器工具箱导出的滤波器参数,由巴特沃斯数字滤波器了离散方程:

数字控制器设计时,根据实时采样的加速度计数据,递推更新即可。

/*************************************************

函数名: LPButterworth(float curr_input,Butter_BufferData *Buffer,Butter_Parameter *Parameter)

说明: 二阶巴特沃斯数字低通滤波器

入口: float curr_input 当前输入

出口: 滤波器输出值

备注: 2阶Butterworth低通滤波器

*************************************************/

float LPButterworth(float curr_input,Butter_BufferData *Buffer,Butter_Parameter *Parameter)

{

static int LPB_Cnt=0;

/*加速度计Butterworth滤波*/

/*获取最新x(n) */

Buffer->Input_Butter[2]=curr_input;

if(LPB_Cnt>=500)

{

/* Butterworth滤波*/

Buffer->Output_Butter[2]=

Parameter->b[0] * Buffer->Input_Butter[2]

+Parameter->b[1] * Buffer->Input_Butter[1]

+Parameter->b[2] * Buffer->Input_Butter[0]

-Parameter->a[1] * Buffer->Output_Butter[1]

-Parameter->a[2] * Buffer->Output_Butter[0];

}

else

{

Buffer->Output_Butter[2]=Buffer->Input_Butter[2];

LPB_Cnt++;

}

/* x(n)序列保存*/

Buffer->Input_Butter[0]=Buffer->Input_Butter[1];

Buffer->Input_Butter[1]=Buffer->Input_Butter[2];

/* y(n)序列保存*/

Buffer->Output_Butter[0]=Buffer->Output_Butter[1];

Buffer->Output_Butter[1]=Buffer->Output_Butter[2];

return (Buffer->Output_Butter[2]);

}

相关结构体定义如下。

typedef struct

{

//volatile

float Input_Butter[3];

//volatile

float Output_Butter[3];

}Butter_BufferData;

typedef struct

{

float a[3];

float b[3];

}Butter_Parameter;

自研飞控视频,链接如下:

四旋翼GPS户外定点篇(F330机架)

四旋翼GPS定点F450青山江边

此篇博客废话太多,疏于整理,难免有不正之处,欢迎交流指正!!!

下节讨论传感器延时修正的简单处理方法与惯性导航数据融合的细节部分。。。

 

2人点赞

 

个人四旋翼(飞控)开源技术博客

 



作者:无名小哥
链接:https://www.jianshu.com/p/d9d037aff72d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

四旋翼惯导融合之观测传感器滞后问题汇总与巴特沃斯低通滤波器设计(气压计MS5611、GPS模块M8N、超声波、PX4FLOW等) - 简书 (jianshu.com)

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

四旋翼惯导融合之观测传感器滞后问题汇总与巴特沃斯低通滤波器设计(气压计MS5611、GPS模块M8N、超声波、PX4FLOW等) 的相关文章

  • 使用css选择器获取元素

  • udp如何实现可靠性传输?

    1udp与tcp的区别 TCP xff08 TransmissionControl Protocol 传输控制协议 xff09 是一种面向连接的 可靠的 基于字节流的传输层通信协议 UDP是User Datagram Protocol xf
  • SpringMVC项目中的常用配置

    在SpringMVC项目环境中 xff0c 经常需要配置一些信息 xff0c 包括 xff1a 前端控制器 xff08 DispatcherServlet xff09 处理器映射器 xff08 HandlerMapping xff09 处理
  • PHP 常见错误及其解决方法

    PHP是一种广泛应用于Web开发的编程语言 xff0c 由于其易学易用的特点 xff0c 越来越多的开发者开始使用PHP进行开发工作 然而 xff0c 在PHP开发过程中 xff0c 可能会出现各种错误 xff0c 导致程序无法正常运行 本
  • ubuntu22.04设置开启自启动命令脚本

    前言 xff1a 是这样的 xff0c 新的机器要挂在nfs存储 xff0c 报错 xff1a root 64 85 document mount t nfs o nolock 192 168 1 xx disk xiao home xia
  • 思考练习题

    1 循环求和 xff1a 利用循环语句计算从100加到500的整数的总和 public static void main String args int sum 61 0 for int i 61 100 i lt 61 500 i 43
  • 七步搞定CentOS6.8内核升级和Docker的安装

    博主秋招提前批已拿百度 字节跳动 拼多多 顺丰等公司的offer xff0c 可加微信 xff1a pcwl Java 一起交流秋招面试经验 xff0c 可获得博主的秋招简历和复习笔记 一 内核的升级 最近安装需要在虚拟机Linux系统上安
  • 天干地支算法

    天干地支算法 首先我们需要知道什么是天干什么是地支 xff0c 有多少个天干多少个地支 xff1f 天干 Celestial Stem 中国古代的一种文字计序符号 xff0c 共10个字 甲 乙 丙 丁 戊 己 庚 辛 壬 癸 xff0c
  • 面对突发流量,保证服务可用的4个手段

    前言 不知道你有没有这样的经历 xff0c 线上的系统突然来了很大的流量 xff0c 有可能是黑客的攻击 xff0c 也有可能是业务量远远大于你的预估 xff0c 如果你的系统没有做任何的防护措施 xff0c 这时候系统负载过高 xff0c
  • 【MongoDB】二、MongoDB数据库的基本操作

    MongoDB 二 MongoDB数据库的基本操作 实验目的实验内容任务一 xff1a xff08 1 xff09 创建数据库newdb xff08 2 xff09 在数据库newdb中创建集合mycollection xff08 3 xf
  • OC中的MRC内存管理方式

    MRC内存管理 xff1a Manual Reference Counting 一 人工引用计数 xff1a 内存的开辟和释放都由程序代码进 行控制 相对垃圾回收来说 对内存的控制更加灵活 可以在需要释放的时候及时释放 对程序员的要求较 高
  • 在C++中使用conio.h 实现实时键盘输入读取 (即不需要回车)

    在需要用的地方 调用函数 char singleKey 61 getche lt pre gt lt pre name 61 34 code 34 class 61 34 cpp 34 gt include lt termios h gt
  • 在华为taishan 200服务器鲲鹏920处理器私有云里面部署kettle依赖的方法

    背景说明 nbsp nbsp 公司服务器为华为ARM v8指令集centos系统 未连接互联网 现在需要部署kettle etl程序 但是发现启动程序依赖libwebkitgtk 1 0 因为未联网无法在线直接安装缺少的组件包 用过linu
  • Android 根据网络分析运营商信息

    我们想获取手机的运营商信息 通常都会去调用系统的TelephonyManager类的取数据 但是很多时候可能取不到卡的信息 xff08 例如双卡手机和一些特殊卡 xff09 xff0c 这样就区别不了运营商了 但是有时候我们的需求要进行不通
  • 简单又好看的按钮,扁平化按钮。

    今天分享一下流行的扁平化按钮 完全不需要用到图片哦 效果图如下 xff1a 里面有2个按钮都是一样的模式 只要修改的色值就可以 下面跟我来更新你的UI吧 首先编写 button xml 代码如下 lt xml version 61 34 1
  • Android 获取运营商信息(完整版)-解决高通,MTK等双卡问题

    由于国内的运营商问题 xff0c 双卡手机获取IMSI号问题要根据厂商API 来实现 下面我们就来做一套完整的分析运营商获取IMSI号逻辑 1 xff0c 首先我们要判断手机的平台 1 1 xff0c 判断手机是否MTK平台 public
  • Android中抓取手机视频流数据。

    目前实时抓取手机视频数据有2种方法 xff0c 一种是通过camera的回调获取源数据 xff0c 这里获取的源数据是没有编码的数据 有的人发送yuv数据然后在那绘制图片 xff0c 也说视频聊天 xff0c 真是可笑 这种方式是可是实现视
  • Android 使用AudioRecord录音相关和音频文件的封装

    在Android中录音可以用MediaRecord录音 xff0c 操作比较简单 但是不够专业 xff0c 就是不能对音频进行处理 如果要进行音频的实时的处理或者音频的一些封装 就可以用AudioRecord来进行录音了 这里给出一段代码
  • Android 中使用MediaRecorder进行录像详解(视频录制)

    在这里给出自己的一个测试DEMO xff0c 里面注释很详细 简单的视频录制功能 package com video import java io IOException import android app Activity import
  • 卸载zsh后无法登陆root账户的解决方案

    在终端中输入 sudo vim etc passwd 将第一行 root x 0 0 root root bin zsh 改为 root x 0 0 root root bin bash 将最后一行 username x 1000 1000

随机推荐

  • Android手机中获取手机号码和运营商信息

    代码如下 xff1a package com pei activity import android app Activity import android os Bundle import android view View import
  • RTL8812AU双频无线网卡在ubuntu19和20上的驱动安装

    1 现象 xff1a 网卡插入电脑USB接口没反应 xff0c 信号灯不亮 xff0c 说明不识别 xff0c 需要安装驱动 2 驱动安装方法 xff1a 1 查看linux内核版本 xff1a uname a 本次使用的操作系统为ubun
  • IDEA 使用 Gralde 报错: Cause: zip END header not found

    开开心心的打开之前的 Gradle 微服务项目 xff0c 然后点击IDEA 右侧小图标大象图标开始刷新项目 xff0c 然后就报错了 xff1a 这个错误报的是真好 xff0c 我竟然没看出什么意思 xff0c 然后直接上百度和 Goog
  • 小知识 - 访问 http,防止浏览器自动跳转到 https

    目录 Chrome 浏览器Edge 浏览器 xff08 Chrome 内核 xff09 Safari 浏览器Opera 浏览器 xff08 Chrome 内核 xff09 Firefox 浏览器 如果 Nginx 端配置了重定向 xff08
  • 手写生产者—消费者模式

    生产者 消费者模式是一个很好的并发的问题 先说几个基础的点 xff1a wait notify notifyAll 都是Object的函数notify 仅仅通知一个线程 xff0c 并且不知道通知哪一个线程 xff0c 而notifyAll
  • ubuntu下date的用法

    方法一 xff1a sudo date 031421302011 月日时分年 方法二 xff1a sudo date s 20110314 先修改年月日 sudo date s 21 30 在修改时分 如果还需要修改BIOSS时间 xff0
  • Win Server版本去掉登陆密码

    单击 开始 运行 输入 34 netplwiz 34 rundll32 netplwiz dll UsersRunDll 可查看System32文件夹有没有该文件 或control userpasswords2 按回车键后弹出 用户帐户 窗
  • Python提取文本EOS符号

    提取整个文本中全部或结尾的标识符 除英文 xff0c 字母和汉字 提取整个文本中全部或结尾的标识符 除英文 xff0c 字母和汉字 import numpy as np import re path 61 r 39 D NMT Code n
  • 操作系统总结

    from http www cnblogs com yinluhui0229 archive 2011 05 30 2063607 html http my oschina net pangyangyang blog 188507 第一章
  • ubuntu打不开浏览器问题解决

    文 MESeraph 00 现象 在ubuntu下 xff0c 使用应用商店下载任何浏览器都打不开 以FireFox为例 xff1a 在cmd执行firefox命令显示如下 xff1a mkdir cannot create directo
  • Java Lambda表达式 常用工具类

    Runnable public static void main String args ExecutorService executorService 61 Executors newSingleThreadExecutor execut
  • ViewBinding 与 Kotlin 委托双剑合璧

    请点赞关注 xff0c 你的支持对我意义重大 x1f525 Hi xff0c 我是小彭 本文已收录到 GitHub Android NoteBook 中 这里有 Android 进阶成长知识体系 xff0c 有志同道合的朋友 xff0c 关
  • AndroidStudio安装kotlin插件及其配置过程

    AndroidStudio安装kotlin插件及其配置过程 1 打开androidstudio软件 xff0c 点击左上角的file gt setting进入设置向导界面 xff1b 如下图所示 xff1a 2 在弹出的设置向导中 xff0
  • SQL修改列名,增加列,删除列语句的写法

    1 修改数据表名 ALTER TABLE 表名 OLD TABLE NAME RENAME TO NEW TABLE NAME 2 修改列名 ALTER TABLE 表名 TABLE NAME RENAME COLUMN OLD COLUM
  • C语言实现阶乘的相加

    上一篇 xff0c 我总结了如何使用c语言实现阶乘的计算 xff0c 这里算是对以上的补充 xff1a 将阶乘累加 即1 xff01 43 2 xff01 43 3 xff01 43 43 10 好废话不多说 xff0c 直接上代码 xff
  • PTA 7-52 输出字符画:HAUT

    haut是一个你要上四年的大学 请你用字符画的形式输出haut 输入格式 无 输出格式 参考样例 输入样例 在这里给出一组输入 例如 xff1a 无 代码 include lt stdio h gt int main printf 34 h
  • Mysql 查询json字段(json_extract())

    假设我们在user表的extra字段中存储了一条json数据 xff1a 34 name 34 34 abab 34 34 tel 34 34 123456789 34 可以通过select json extract extra 39 na
  • layui图标显示不正常,显示成方块

    这两天打算写个uTools插件的 UI需求较低 所有就用了layui 使用习惯的毛病坑了自己 使用习惯的锅 使用其他UI框架的时候基本都是class后边跟上样式即可 在layui这边就也这样做了 但是layui文档写的也很清楚 他还需要在目
  • win10开启多用户同时远程登录-很详细

    背景 xff1a Win10 正常情况下不允许多用户同时远程 xff0c 即一个用户远程进来会把另一个用户踢掉 xff0c 因此需要破解才能使得多个用户同时登陆远程桌面 Win10多用户同时登陆远程桌面 允许多个RDP会话 本文亲测win1
  • 四旋翼惯导融合之观测传感器滞后问题汇总与巴特沃斯低通滤波器设计(气压计MS5611、GPS模块M8N、超声波、PX4FLOW等)

    前文讲到APM的三阶互补方案 xff0c 之前附的图是从学长博客里面抠的 xff0c 感觉还不是很详细 xff0c 于是自己就画了下 xff0c 顺便重新理一下思路 上图中下标为O的表示原始量 xff08 Origion xff09 C表示