EKF2学习之控制融合模式

2023-05-16

                                                                                By snowpang  2017.8.10

1.存储控制状态值,并开启状态变化检测

_control_status.value
// bitmask containing filter control status
union filter_control_status_u {
    struct {
        uint16_t tilt_align  : 1; // 0 - true if the filter tilt alignment is complete
        uint16_t yaw_align   : 1; // 1 - true if the filter yaw alignment is complete
        uint16_t gps         : 1; // 2 - true if GPS measurements are being fused
        uint16_t opt_flow    : 1; // 3 - true if optical flow measurements are being fused
        uint16_t mag_hdg     : 1; // 4 - true if a simple magnetic yaw heading is being fused
        uint16_t mag_3D      : 1; // 5 - true if 3-axis magnetometer measurement are being fused
        uint16_t mag_dec     : 1; // 6 - true if synthetic magnetic declination measurements are being fused
        uint16_t in_air      : 1; // 7 - true when the vehicle is airborne
        uint16_t wind        : 1; // 8 - true when wind velocity is being estimated
        uint16_t baro_hgt    : 1; // 9 - true when baro height is being fused as a primary height reference
        uint16_t rng_hgt     : 1; // 10 - true when range finder height is being fused as a primary height reference
        uint16_t gps_hgt     : 1; // 11 - true when GPS height is being fused as a primary height reference
        uint16_t ev_pos      : 1; // 12 - true when local position data from external vision is being fused
        uint16_t ev_yaw      : 1; // 13 - true when yaw data from external vision measurements is being fused
        uint16_t ev_hgt      : 1; // 14 - true when height data from external vision measurements is being fused
        uint16_t fuse_beta   : 1; // 15 - true when synthetic sideslip measurements are being fused
    } flags;
    uint16_t value;
};
eg.control_state.value = 0x0001 表示tilt_align filter compelet
   control_state.value = 0x0400 表示距离传感器将被作为基础高度数据源融合

2.获取磁偏角,用来对齐yaw和融合
// Get the magnetic declination
calcMagDeclination();返回_mag_declination

3.监测切斜对齐,如果对齐标志位没有置位,在调整倾斜的同时,监控方差,一旦方差减小到只有3度的不确定性,对齐yaw和更新磁场状态,,并宣布切斜对齐完成,标志位置位。
(angle_err_var_vec(0) + angle_err_var_vec(1)) < sq(0.05235f) //0.05235 /pi * 180 = 3

resetMagHeading(_mag_sample_delayed.mag);
在里面比较了321和312欧拉序列的好坏,采用好的序列进行计算,更新了_state.quat_normial.参考链接http://www.atacolorado.com/eulersequences.doc.接着初始化四元数协方差initialiseQuatCovariances(angle_err_var_vec);
然后更新_state.mag_I,并更新输出状态的四元数_output_new.quat_nominal

4.检查在融合时间内的传感器数据更新,并计算从距离传感器和光流传感器坐标系到地球坐标系的的旋转矩阵,_R_rng_to_earth_2_2 > 0.7071f,z轴倾斜要小于45度

5.检查高度传感器延时时间并如果有必要会重设并改变传感器
controlHeightSensorTimeouts();
这个函数主要是处理没有融合最近高度测量值和超出最大高度测量范围的情况。然后重置,使用能够获得最好的高度测量数据源,如果数据源改变将使用改变后的数据源,并宣布当前数据不可用。

依靠垂直更新是否实时去检查IMU加速度计振动导致数据缺失,数据缺失将导致平均加速度指向零移动,这将使得INS认为它真在下降并产生一个正的垂直更新。判断错误的垂直加速度bad_vert_accel,再检查高度是否连续下降,高度惯性航位预测太久

判断是否重设垂直位置和速度状态,if ((P[9][9] > sq(_params.hgt_reset_lim)) && (hgt_fusion_timeout || continuous_bad_accel_hgt)),根据不同的高度检测方式进行
GPS高度/气压高度/距离传感器高度进行互补,都会用到气压传感器,最后resetHeight(),更新_state.pos(2) _state.vel(2),output_states

6.开始融合地磁数据
controlMagFusion();先判断航向角是否来自视觉,否则融合地磁,在地面上时,时刻更新地面高度,根据设置不同的融合模式开始计算,一般选择自动融合模式。
if (_params.mag_fusion_type == MAG_FUSE_TYPE_AUTO)
检查是否有个足够的高度去避免地面磁场异常,检查是否有足够的水平速度变化使得航向角可观测,判断_yaw_angle_observable/_mag_bias_observable

判断是否3轴地磁融合被使用use_3D_fusion,如果使用,进行一次地磁对齐,之后进行,更新地磁协方差矩阵控制状态mag_3D置位,否则如果之前进行了use_3D_fuse,那么将之前的协方差矩阵保存,否则控制状态mag_hdg置位

如果使用的是3D地磁融合,但是没有外部辅助传感器,就必须融合磁偏角来防止长时间的航向偏移。在使用hdg融合时,不必融合磁偏角。
在fuseMag()中,获得_mag_innov,更新输出23个状态
在fuseDeclination()中,得到innovation,更新输出状态
在fuseHeading()中,得到_heading_innov,更新输出状态

7.气压融合
controlBaroFusion();
判断高度数据源,如果使用气压高度,更新控制状态值,_fuse_height置位,否则计算高度滤波偏差。

8.GPS融合
controlGpsFusion();如果GPS数据更新
判断是否应该使用GPS辅助计算速度和水平位置,在使用GPS时需要对齐角度。yaw对齐之后,开始GPS辅助,如果没用光流就重设位置和速度,否者只重设位置。
开始处理有GPS但是一段时间没有使用它,如果依靠GPS帮助限制姿态漂移7秒后没有帮助或者位置测量没有融合超过14s,然后重置位置和速度。

之后,_fuse_pos _fuse_vert_vel _fuse_hor_vel置位,并根据IMU的偏差矫正速度 位置 高度。然后检查GPS高度是否作为高度数据源,如果是即更新控制状态标志,并将    _fuse_height = true;

如果GPS数据没有更新,处理没有GPS或者没有使用它一段时间,仍然依赖它的情况,gps 10s未更新,清除速度状态,清除gps控制状态

9.融合空气阻力模型
controlDragFusion();
飞机必须在空中,才会融合。判断控制状态中的风速估计,如果第一次融合,则重置风速状态和风速协方差。否则融合阻力fuseDrag(),得到_drag_innov,更新风速状态。

10.融合光流融合
controlOpticalFlowFusion();
必须倾斜对齐和yaw对齐,然后判断是否使用GPS,如果不,则需要设定速度位置状态和协方差。需要计算对地高度,在高度对光流计算可靠范围之内,然后根据光流数据计算_state.vel否则速度清零。
如果飞机在空中更新位置到上一次知道的位置,然后观测量到卡尔曼滤波状态对齐输出alignOutputFilter(),在这个函数中,先计算输出的四元数和EKF状态四元数的quaternion的差,右乘EKF状态的共轭四元数,让后对齐归一化,计算速度和位置的差,让后将其加入输出状态来更新输出状态。
接下来处理依赖光流定位但是失去光流更新数据,速度状态清零。
最后进行光流数据融合,进行状态更新。

11.融合距离传感器
controlRangeFinderFusion();
判断高度数据源是否设定为距离传感器,如果是,就置位_control_status.flags.rng_hgt,然后根据欧拉角校正高度。如果_control_status.flags.rng_hgt被置位,就将fuse_height置位,告诉估计器要进行高度融合。如果要使用距离传感器,但是飞机在地面上,且高度数据源不可用,则人工合成一个高度给估计器,然后在融合高度。

12.外部视觉信息融合,和GPS差不多
controlExternalVisionFusion();

13.融合空速计数据,在非drag模式下才会使用。
controlAirDataFusion();

14.合成侧滑,在非drag模式下才会使用。主要用于固定翼.
controlBetaFusion();

15.最重要的部分来了,这里会做详细的代码分析。融合速度位置从以上多个数据源。controlVelPosFusion();
在这里先判断有没有辅助传感器,如果没有,则判断有没有imu数据更新是否大于200ms或者有高度融合信息,则将位置融合置位。
然后判断可以融合的数据,_fuse_height || _fuse_pos || _fuse_hor_vel || _fuse_vert_vel,然后进入fuseVelPosHeight(),之后_fuse_hor_vel = _fuse_vert_vel = _fuse_pos = _fuse_height = false。
下面进入fuseVelPosHeight()函数,在里面先定义了6个变量为融合做准备,
bool fuse_map[6] = {}; // 映射关系[VN,VE,VD,PN,PE,PD] 为真表示观测量可用
bool innov_check_pass_map[6] = {}; // 观测量的更新平滑度检查
float R[6] = {}; // 观测协方差
float gate_size[6] = {}; // 观测量的更新平滑度检查门槛值
float Kfusion[24] = {}; // 用来存放卡尔曼单个观测增益值
先判断_fuse_hor_vel,如果为真,fuse_map[0] = fuse_map[1] = true,更新_vel_pos_innov[0],_vel_pos_innov[1],R[0],R[1],gate_size[0],gate_size[1]
在判断_fuse_vert_vel,如果为真,fuse_map[2] = true,更新_vel_pos_innov[2],R[2],gate_size[2]
判断_fuse_pos,为真,fuse_map[3] = fuse_map[4] = true,再判断位置数据源来自哪里(GPS/EV/fake GPS),然后更新R[3],R[4],_vel_pos_innov[3],_vel_pos_innov[4],gate_size[3],gate_size[4]
判断_fuse_height,为真,fuse_map[5] = true,在判断高度数据来源(气压计/gps高度/距离传感器/EV高度),更新_vel_pos_innov[5],R[5],gate_size[5]

接下来计算更新测试比率,计算更新协防差(SK = HPH + R),_vel_pos_innov_var[],计算更新比率—_vel_pos_test_ratio[]。

然后检查位置 速度 高度更新innov_check_pass_map[],中位置高度 位置在切斜对齐后,就让其融合。开始计算卡尔曼增益,再更新协方差矩阵。检查协方差是否正常,如果不正常则矫正,并发布哪个状态不正常,否者,应用更新的协方差矩阵做校正,得到矫正后的P矩阵,然后做协防差矩阵错误修复fixCovarianceErrors(),之后进入融合,再次更新状态State.

最后报告航迹推算_is_dead_reckoning,如果我们不再融合测量限制速度漂移。
融合的状态索引如下:
查看estimator_status中的states[32]。状态的索引如下:
    [0 ... 3] 四元数
    [4 ... 6] 速度 NED (m/s)
    [7 ... 9] 位置 NED (m)
    [10 ... 12] IMU 角度增量偏差 XYZ (rad)
    [13 ... 15] IMU 速度增量偏差 XYZ (m/s)
    [16 ... 18] 地球磁场 NED (gauss)
    [19 ... 21] 机体磁场 XYZ (gauss)
    [22 ... 23] 风速 NE (m/s)
    [24 ... 32] 未使用
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EKF2学习之控制融合模式 的相关文章

  • 百问网物联网实战-FREERTOS

    一 移植步骤 先添加源码到MDK工程中还是先创建FreeRTOSConfig h xff0c 在FreeRTOSConfig h里面 xff0c 每一项的配置代表的什么 xff0c 值的范围是多少 xff0c 可以查看官网说明 config
  • 组合导航原理剖析(二):惯性导航方法与应用综述

    资料下载 PSINS 枯荣有常 知乎 半闲居士 知乎 书灌木 知乎 任乾 知乎 武汉大学多源智能导航实验室 传统导航采用单点导航的方式 xff0c 定位精度为几米 xff0c 显然不符合自动驾驶的需求 现有在自动驾驶中常用的三种导航方案 x
  • 英伟达 Jetson TX2介绍

    Jetson TX2介绍 Jetson nbsp TX2是NIVDIA瞄准人工智能在Jetson TK1和TX1推出后的升级 TX2的GPU和CPU都进行了升级 内存增加到了8GB 存储增加到了32GB 支持Wifi和蓝牙 编解码支持H 2
  • 基于SPWM的逆变器程序应用及自制电路

    自制逆变器的电路及程序应用 设计并制作 一个简易逆变器 xff0c 其结构如图所示 逆变器进行负载试验时 xff0c 需在其输出端接负载 通常情况下 xff0c 输出电能消耗在该负载上 2 基本要求 逆变器输出端仅连接电阻性负载 xff0c
  • configure,make,make install的作用以及configure参数解释说明

    文章源自 xff1a http feinibuke blog 51cto com 1724260 367376 http www chinaz com server 2007 0620 10489 shtml 一 configure mak
  • 关于大疆御2行业进阶版(M2EA)热红外照片温度信息提取问题

    xff08 1 xff09 大疆dji thermal sdk只支持导出RAW格式的数据信息而非TIFF xff0c RAW格式无法直接导入Pix4d Mapper等软件用于拼接 xff0c 需要自己转换转换成TIFF xff08 2 xf
  • 网络之应用层与HTTP协议

    一 应用层 1 含义 应用层负责程序间沟通 我们的网络编程主要是针对应用层 2 序列化与反序列化 序列化 xff1a 发送数据时按照某个规则将数据转换为字符串 反序列化 xff1a 接收数据时按照相同的规则将字符串转换为数据 二 HTTP协
  • vs code 下载安装,git 配置,插件安装

    window 10 系统下载安装 1 打开官网地址 xff1a Visual Studio Code Code Editing Redefined 2 进入下载入口 xff1a 3 下载 zip 文件 4 解压到非系统盘 xff0c 运行
  • cmake 常用变量和常用环境变量

    一 cmake 变量引用的方式 前面我们已经提到了 使用 进行变量的引用 在 IF 等语句中 是直接使用变量名而不通过 取值 二 cmake 自定义变量的方式 主要有隐式定义和显式定义两种 前面举了一个隐式定义的例子 就是 PROJECT
  • 变量名尽量不要使用__或者_打头

    以两个下划线或下划线和大写字母打头的名称被保留给实现 xff08 编译器及其使用的资源 xff09 使用 以一个下划线开头的名称被保留给实现 xff0c 用作全局标识符
  • Kendryte K210 在freertos上的uart的使用

    首先修改project cfg h文件 xff0c 将硬件定义好的i2c引脚定义好 xff0c 其中40和41表示IO40和IO41 xff0c 如下 xff1a const fpioa cfg t g fpioa cfg 61 versi
  • Kendryte K210 在freertos上的lcd屏幕的使用

    K210上的lcd的屏幕为8位的spi并行接口 使用的屏幕开发板的型号为JLT32009A 某宝应该是可以买到的 需要注意的是若在某宝买的这种屏幕 一般会有8位和16位的区别 商家会告诉你这是两个不一样的屏 但是通过我们查看屏幕的规格书会发
  • Gamma分布、Beta分布、Dirichlet分布

    函数 函数是阶乘在实数上的推广 xff0c 定义为 xff1a x 61 43 0 t x 1 e t d t 函数的性质 xff1a x 43 1 61 x x
  • 消息队列OSQCreate失败:Assertion "OSQCreate" failed at line 71 in ..\LWIP\arch\sys_arch.c错误解决方法

    在STM32F407的上移植正点原子例程中的ucosII和LWIP功能时 xff0c 发现其他任务中创建其他消息邮箱后 xff0c 出现了如下的错误 xff1a Assertion OSQCreate failed at line 67 i
  • 学习Linux 编程的几本好书

    这次涉及到了具体的平台 GNU Linux Linux下开发与明显不同于Windows平台的特点 xff0c 从开发工具到项目组织 xff0c 都有较大的差距 首先声明 xff0c 在做Linux平台开发之前 xff0c 首先要熟练使用Li
  • http parser库的使用方法

    include 34 http parser h 34 include lt stdio h gt include lt stdlib h gt include lt string h gt include lt assert h gt i
  • PIXhawk4飞控学习笔记(一)开发环境

    PIXhawk4飞控学习笔记 xff08 一 xff09 开发环境 PIX4简介开发环境准备PIX4控制板MDK Keil5STM32CUBEMAXQGroundControl地面站 总结 PIX4简介 PX4是Dronecode平台的一部
  • Git常用命令

    1 Git全局设置 当安装Git后首先要做的事情是设置用户名称和email地址 这是非常重要的 xff0c 因为每次Git提交都会使用该用户信息 在Git 命令行中执行下面命令 xff1a 设置用户信息 git config global
  • 在PX4下更换pixhawk的IMU

    写在前面 出于一些原因 xff0c 这篇文章不给出具体的源码 xff0c 因此博主试着将这篇写成了一篇科普性质的文章 xff0c 如果你认真读的话 xff0c 应该会有收获的 为什么要更换pixhawk的传感器 xff1f 大多数的玩家拿到
  • 存储卡插上电脑时显示文件名变乱码请问怎样才能修复???

    存储卡在使用的过程中会出现各种奇怪的错误 xff0c 比如小编今天碰到的一个 xff0c 打开分区提示文件名变乱码 xff01 存储卡插上电脑时显示文件名变乱码请问怎样才能修复 存储卡在使用的过程中会出现各种奇怪的错误 xff0c 比如小编

随机推荐

  • putty使用python模块tkinter显示对话框出现_tkinter.TclError: no display name and no $DISPLAY environment variable

    问题描述 xff1a putty不能显示对话框 出现错误提示 xff1a tkinter TclError no display name and no DISPLAY environment variable 解决办法 xff1a 下载安
  • 有关于ValueError: Variable rnn/basic_lstm_cell/kernel already exists, disallowed.的问题

    很简单 xff0c 重新跑一篇程序 xff0c 我理解为重启核 xff1f xff1f xff1f jupyter中有kernel选项 xff0c 点击选择 Restart amp RunAll xff0c 即可解决问题 Mark
  • 从尾到头打印链表

    题目描述 xff1a 输入一个链表 xff0c 按链表值从尾到头的顺序返回一个ArrayList 分析 xff1a 1 xff0c 新建两个arraylist xff0c 2 xff0c 遍历链表 xff0c 存入第一个arraylist
  • Win10的Linux子系统Ubuntu安装图形界面

    Win10 的 Linux 子系统 Ubuntu 安装图形界面 陈拓 2021 07 25 2021 07 26 1 概述 Win10的linux子系统Windows Subsystem for Linux xff08 简称 WSL xff
  • 得到斐波那契数列的第n个数

    题目 xff1a 现在要求输入一个整数n xff0c 请你输出斐波那契数列的第n项 xff08 从0开始 xff0c 第0项为0 xff09 n lt 61 39 分析 xff1a 1 xff0c 1 xff0c 2 xff0c 3 xff
  • ModuleNotFoundError: No module named 'scipy._lib.decorator'问题解决

    问题来源 xff1a 在导入sklearn库时 xff0c 出现 usr lib python3 dist packages scipy sparse linalg isolve iterative py in 8 9 from scipy
  • 二叉搜索树的后序遍历序列

    题目 输入一个整数数组 xff0c 判断该数组是不是某二叉搜索树的后序遍历的结果 如果是则输出Yes 否则输出No 假设输入的数组的任意两个数字都互不相同 分析 碰到二叉树 xff0c 优先想递归 这里 xff0c 后序数组 xff0c 最
  • 二叉树中和为某一值的路径

    题目 输入一颗二叉树的跟节点和一个整数 xff0c 打印出二叉树中结点值的和为输入整数的所有路径 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 注意 在返回值的list中 xff0c 数组长度大的数组靠前 分析 二叉树
  • 复杂链表的复制(java)

    题目 输入一个复杂链表 xff08 每个节点中有节点值 xff0c 以及两个指针 xff0c 一个指向下一个节点 xff0c 另一个特殊指针指向任意一个节点 xff09 xff0c 返回结果为复制后复杂链表的head xff08 注意 xf
  • CMake学习-添加头文件路径,库路径,库

    CMake中 xff0c 添加头文件路径 xff0c 对应的函数叫include directories 然后在参数中 xff0c 把所有需要添加的路径 xff0c 加进去就可以了 添加库路径 xff0c 对应的函数叫LINK DIRECT
  • Docker Run 命令

    docker run 参数 xff1a e xff1a 向容器内传递环境变量 xff0c 启动容器时用户可以动态传参 v 挂载文件 xff0c 把该容器的数据保存到挂载文件上 p 端口映射 xff08 p 8888 3306 8888宿主机
  • 如何复现论文?什么是论文复现?

    参考资料 xff1a 学习篇 顶会Paper复现方法 知乎 如何读论文 xff1f 复现代码 xff1f 复现代码是什么意思 CSDN 我是如何复现我人生的第一篇论文的 知乎 在我看来 xff0c 论文复现应该有一个大前提和分为两个层次 大
  • Kinect 获取深度图计算距离,并进行彩色图和深度图之间的映射

    Kinect 获取深度图计算距离 xff0c 并进行彩色图和深度图之间的映射 最近所进行的项目需要利用KINECT获取深度距离 xff0c 需要得到彩色图中某一点的位置 xff0c 在网上找了很多资料 xff0c 都不是很好 xff0c 碰
  • 十一个顶级的Git 客户端,绝对很实用!

    导读Git是一种免费开源的分布式版本控制系统 xff0c 可用于处理软件开发及另外几种版本控制任务 它旨在处理大大小小的各种项目 xff0c 并确保速度 效率和数据完整性 Linux用户主要可以通过命令行来管理Git xff0c 不过外面有
  • Windows USB串口接收GPS北斗模块数据和数据说明

    陈拓 2022 05 07 2022 05 09 1 简介 本文以GPS 43 北斗卫星定位授时导航模块HT1818Z3G5L为例 xff0c 在Win10下读数据 产品参数 引脚定义 2 连接PC机和HT1818Z3G5L模块 如图 xf
  • Linux也有全功能杀毒软件啦!

    导读近日 xff0c 瑞星公司推出瑞星杀毒软件Linux全功能版 xff0c 它是一款功能齐全 高性能的企业级安全产品软件 xff0c 并且新增国内首家 文件监控 与 网络监控 功能 xff0c 对Linux系统进行系统和网络双层防护 xf
  • 虚拟现实的起源、发展、爆发与沉淀

    虚拟现实的三生三世 闲来无事翻篇外文 xff0c 本博主并非故意蹭热点 xff08 奸笑 xff09 xff0c 结尾我会细说为何是三生三世 xff0c 不是五生五世 xff1a 虚拟现实远早于这个概念被创造和形式化之前 在这篇描写虚拟现实
  • UCOS消息队列的使用【转】

    UCOS消息队列的使用 转 收藏 消息队列的使用 1 需在以下文件中配置如下内容 OS CFG H OS MAX QS N 你需要的值 根据需要自己配置 define OS Q EN 1 Enable 1 or Disable 0 code
  • to_string函数的用法

    to string 函数 xff1a 将数字常量转换为字符串 xff0c 返回值为转换完毕的字符串 头文件 xff1a include lt string gt string s 61 to string i 将整数i转换为字符串表示形式
  • EKF2学习之控制融合模式

    By snowpang 2017 8 10 1 存储控制状态值 xff0c 并开启状态变化检测 control status value bitmask containing filter control status union filt