EKF2学习笔记之运行流程2

2023-05-16

                                                                                                    2017.8.4  by snow

2cd

read mag data and set it
这里有个细节,对于多个magnetometer同时工作时,在处理时需要
// Check if the magnetometer ID has changed and reset learned bias parameters if it has
//Do not do this when armed to prevent potential time slips casued by parameter set and notification events

if (vehicle_status.arming_state != vehicle_status_s::ARMING_STATE_ARMED) { //飞机处于未绑定状态才会做传感器选择

orb_copy(ORB_ID(sensor_selection), sensor_selection_sub, &sensor_selection);//在src/moudule/sensors 中发布
_ekf.setMagData(1000 * (uint64_t)mag_time_ms, mag_data_avg_ga);//进行EKF数据输入
函数原型为:
void EstimatorInterface::setMagData(uint64_t time_usec, float (&data)[3])//在lib/ecl/estimator_interface中
// limit data rate to prevent data being lost
if (time_usec - _time_last_mag > _min_obs_interval_us) //必须满足这个条件,才会更新ekf2中的mag数据
_mag_buffer.push(mag_sample_new);
在这个函数里对时间做了如下处理
mag_sample_new.time_us = time_usec - _params.mag_delay_ms * 1000; //这个延时参数是可以调节的

mag_sample_new.time_us -= FILTER_UPDATE_PERIOD_MS * 1000 / 2; //这个时间在ekf更新里面会和imu更新时间比较计算出更新延时

3rd
read baro data and set it
超时检测,数据正常,进行EKF设置_ekf.set_air_density(rho);
// set air density used by the multi-rotor specific drag force fusion
函数原型:
void set_air_density(float air_density) {_air_density = air_density;}
其中:
const float pressure_to_density = 100.0f / (CONSTANTS_AIR_GAS_CONST * (20.0f - CONSTANTS_ABSOLUTE_NULL_CELSIUS));// estimate air density assuming typical 20degC ambient temperature
float rho = pressure_to_density * sensor_baro.pressure; //得到空气密度

4th
// calculate static pressure error = Pmeas - Ptruth
// model position error sensitivity as a body fixed ellipse with different scale in the positive and negtive X direction
const float max_airspeed_sq = MAX_AIRSPEED * MAX_AIRSPEED;
float K_pstatic_coef_x;

if (_vel_body_wind(0) >= 0.0f) {
    K_pstatic_coef_x = _K_pstatic_coef_xp.get();

} else {
    K_pstatic_coef_x = _K_pstatic_coef_xn.get();

}

    float pstatic_err = 0.5f * rho * (K_pstatic_coef_x * fminf(_vel_body_wind(0) * _vel_body_wind(0), max_airspeed_sq)
                + _K_pstatic_coef_y.get() * fminf(_vel_body_wind(1) * _vel_body_wind(1), max_airspeed_sq)
                + _K_pstatic_coef_z.get() * fminf(_vel_body_wind(2) * _vel_body_wind(2), max_airspeed_sq));

// correct baro measurement using pressure error estimate and assuming sea level gravity
    balt_data_avg += pstatic_err / (rho * 9.80665f);
这里做了气压高度模型,在机体在不同角度时,产生的气压不同,得到模型输出高度
// push to estimator
_ekf.setBaroData(1000 * (uint64_t)balt_time_ms, balt_data_avg);
函数原型:
void EstimatorInterface::setBaroData(uint64_t time_usec, float data)//data为高度
// limit data rate to prevent data being lost
if (time_usec - _time_last_baro > _min_obs_interval_us)//对更新时间做判断
_baro_buffer.push(baro_sample_new);
这里同样会对时间做处理
baro_sample_new.time_us = time_usec - _params.baro_delay_ms * 1000;//这个延时参数可调节

baro_sample_new.time_us -= FILTER_UPDATE_PERIOD_MS * 1000 / 2;


5th
//如果gps数据更新,将其推送到估计器
_ekf.setGpsData(gps.timestamp, &gps_msg);
函数原型:
void EstimatorInterface::setGpsData(uint64_t time_usec, struct gps_message *gps)
在此需要判断是否融合gps
// limit data rate to prevent data being lost
    bool need_gps = (_params.fusion_mode & MASK_USE_GPS) || (_params.vdist_sensor_type == VDIST_SENSOR_GPS);
与其他传感器一样,也会判断更新时间,并计算更新时间

在此还要对GPS数据进行处理,通过函数collect_gps(time_usec, gps)
函数原型:
bool Ekf::collect_gps(uint64_t time_usec, struct gps_message *gps)
其中,先对控制模式进行判断
// Run GPS checks whenever the WGS-84 origin is not set or the vehicle is not using GPS
// Also run checks if the vehicle is on-ground as the check data can be used by vehicle pre-flight checks
if (!_control_status.flags.in_air || !_NED_origin_initialised || !_control_status.flags.gps)//_NED_origin_initialised这flag会在init中被复位
并检查GPS是否可用gps_is_good(gps);每次都会更新
然后对GPS数据进行处理,之后更新buffer
_gps_buffer.push(gps_sample_new);


6th
光流更新
_ekf.setOpticalFlowData(optical_flow.timestamp, &flow);
距离传感器更新
_ekf.setRangeData(range_finder.timestamp, range_finder.current_distance);
如果有视觉传感器
_ekf.setExtVisionData(ev.timestamp, &ev_data);


6.进行ekf更新
_ekf.update()在这里完成整个ekf算法
1st
滤波初始化initialiseFilter()
在这里面读取imu_buffer.get_newest();
读取地磁_mag_buffer.pop_first_older_than(_imu_sample_delayed.time_us, &_mag_sample_delayed)
读取视觉_ext_vision_buffer.pop_first_older_than(_imu_sample_delayed.time_us, &_ev_sample_delayed)//如果有的话
读取距离_range_buffer.pop_first_older_than(_imu_sample_delayed.time_us, &_range_sample_delayed)

更新四元数
// calculate initial tilt alignment
matrix::Euler<float> euler_init(roll, pitch, 0.0f);
_state.quat_nominal = Quaternion(euler_init);
_output_new.quat_nominal = _state.quat_nominal;
坐标系转换(统一到NED坐标系)
// update transformation matrix from body to world frame
        _R_to_earth = quat_to_invrotmat(_state.quat_nominal);

对齐yaw
// calculate the averaged magnetometer reading
    Vector3f mag_init = _mag_filt_state;

// calculate the initial magnetic field and yaw alignment
    _control_status.flags.yaw_align = resetMagHeading(mag_init);

根据融合参数,计算位置信息

初始化协方差矩阵
// initialise the state covariance matrix
initialiseCovariance();

如果条件满足可以进行地形估计,需要距离传感器
// try to initialise the terrain estimator
_terrain_initialised = initHagl();

// reset the output predictor state history to match the EKF initial values
alignOutputFilter();

2rd
// perform state and covariance prediction for the main filter
predictState();
predictCovariance();
这两步为卡尔曼滤波的预测
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EKF2学习笔记之运行流程2 的相关文章

  • 单片机串口分析起始位停止位奇偶校验位

    串口解析 串口配置 1 波特率 2 停止位 3 数据位 4 奇偶校验位 比特率 xff1a 通讯的频率停止位 xff1a 可以选择1 1 5 2三个选择数据位 xff1a 可以选择5 6 7 8四个选择奇偶校验位 xff1a 可以选择奇校验
  • 在算法研究过程中如何进行算法创新

    FPGA教程目录 MATLAB教程目录 创新一直是一个令人纠结的话题 xff0c 研究生毕业设计多数需要算法的创新 xff0c 而博士生毕业更需要大量的创新才行 另外一方面 xff0c 一些前沿的课题 xff0c 更是对算法的创新有着较高的
  • GPIO口相关配置寄存器

    STM32的每个Px端口都有四种7个寄存器来控制 xff0c 分别是 xff1a 2个32位的端口输入输出模式寄存器CRL CRH 2个32位的数据寄存器IDR ODR 1个32位的置位 复位寄存器BSRR 1个16位的复位寄存器BRR 1
  • STM32串口接收以及发送大全

    串口接收 xff1a 一 一帧数据以 r n结束 协议理解 xff1a 协议嘛 xff0c 就是我们人为创造一条规则 xff0c 按这条规则规规矩矩地来章程执行能够减少错误 xff0c 效率更高 xff0c 都执行一个规则也能大一统 下面我
  • 51单片机串口奇偶校验

    有的单片机串口奇偶校验都是硬件自动完成的 xff0c 但是就我目前用到的很多51核的单片机 xff0c 需要软件做一些简单的处理来完成奇偶校验 可以自己写一个简单的小程序来实现 xff1a 一位一位的判断1的个数 xff0c 这个当然好实现
  • C语言printf()输出格式大全

    这里写自定义目录标题 1 xff0e 转换说明符 a A 浮点数 十六进制数字和p P 记数法 C99 c 字符 d 有符号十进制整数 f 浮点数 包括float和doulbe e E 浮点数指数输出 e E 记数法 g G 浮点数不显无意
  • 2019年 电赛C题 全国大学生电子设计竞赛试题解析与总结

    2019年全国大学生电子设计竞赛试题 电赛C题 分析与总结 线路负载及故障检测装置 本科组 一 题目任务 设计并制作线路负载及故障检测装置 xff0c 示意图如图1所示 检测装置只通过两个连接端子与两根导线连接 导线上A B两点距离各自连接
  • 用moment获取一年内指定周的起始时间和结束时间、用户所选时间和前端传参时间不一致问题

    问题1 xff1a 原代码 xff1a 所选周 selectedWeek handler let selectedWeek 61 parseInt this selectedWeek substring 1 计算所选周的周开始时间和周结束时
  • HTML知识(一)

    1 HTML元素 HTML元素指的是从开始标签 start tag 到结束标签 xff08 end tag xff09 的所有代码 元素内容是开始标签与结束标签之间的内容 某些HTML元素具有空内容 xff0c 空元素在开始标签中进行关闭
  • CSS隐藏元素、BFC、元素居中、布局

    1 css中有哪些方式可以隐藏页面元素 xff1f 区别是什么 xff1f 1 1 display none 元素在页面上将彻底消失 xff0c 元素本身占有的空间会被其他元素占有 xff0c 导致浏览器的重排和重绘 特点 xff1a 元素
  • 响应式设计和CSS提高性能的方法

    一 响应式设计 1 是什么 xff1f 是一种网络页面设计布局 xff0c 页面的设计与开发应当根据用户行为以及设备环境 xff08 系统平台 屏幕尺寸 屏幕定向等 xff09 进行相应的响应和调整 2 常见特点 xff08 1 xff09
  • js事件循环机制

    一 同步任务与异步任务 JavaScript是一门单线程 语言 xff0c 但是单线程并不意味着阻塞 实现单线程非阻塞的方式就是事件循环机制 在JavaScript中 xff0c 所有的事件都可以分为同步任务和异步任务 同步任务 xff1a
  • 简易MIMO-OFDM系统的设计

    0 完整源码获得方式 订阅MATLAB FPGA教程 xff0c 免得获得教程案例以及任意2份完整源码 MIMO OFDM系统的接收信号是多个发射天线发送信号的衰落与加性噪声的线性叠加 xff0c 若采用通常SISO OFDM系统或MIMO
  • 栈的定义和操作

    一 栈的定义 栈是一种操作受限制的线性表 xff0c 将允许进行插入 删除的一端称为栈顶 xff0c 另一端称为栈底 二 栈的分类 栈主要分为静态栈和动态栈 xff0c 静态栈类似于数组 xff0c 而动态栈类似于链表 xff0c 但只能对
  • 用C语言和前序遍历创建一棵二叉树

    一 二叉树的介绍 二叉树的特点是二叉树的每个结点的度都不大于2 xff0c 可以视为每个结点都有左孩子和右孩子 故二叉树结点的数据结构为 typedef int BDataType typedef struct BTNode BDataTy
  • 超市购物程序设计

    一 任务介绍 1 任务描述 去超市购物说人们日常生活的重要事情之一 在超市中有很多日常生活的用法 xff0c 如水果 蔬菜 洗衣机 电冰箱等 人们只能买到超市中的已有商品 xff0c 如果所需要的商品在超市中没有或已经卖完了 xff0c 那
  • 如何在IDEA中配置XML、添加XML文件样板以及设置项目编码方式

    一 如何在IDEA中配置XML 1 首先保证本地电脑上有apache maven包 xff0c 打开IDEA 2 点击File下拉菜单中的Settings xff0c 弹出Settings菜单框 3 在弹出的菜单框中选择Build Exec
  • Java之String类与StringBuffer类

    一 String类 1 实例化方式 1 xff09 直接赋值法 String str 61 34 abc 34 String类的设计采用了共享设计模式 在JVM底层实际上会自动维护一个对象池 xff08 字符串对象池 xff09 xff0c
  • 人脸识别项目的测试用例

  • 球机和枪机的区别

    球机 和 枪机 的区别最明显的应该就是外形的区别 xff0c 那么 xff0c 球机和枪机还有什么深层次的区别呢 xff1f 枪机即 枪式摄像机 xff0c 其监控位置固定 xff0c 只能正对某监控位置 xff0c 所以监控方位有限 枪机

随机推荐

  • STM32的USART注意

    在USART的发送端有2个寄存器 xff0c 一个是程序可以看到的USART DR寄存器 另一个是程序看不到的移位寄存器 对应USART数据发送有两个标志 xff0c 一个是TXE 61 发送数据寄存器空 xff0c 另一个是TC 61 发
  • 数据传输中断和查询的区别

    中断方式就是在接受数据时 xff0c 微控制器转入中断服务程序对接受到的数据进行处理 xff0c 而查询方式就是通过查询状态寄存器中接受状态位对接收到的数据进行处理 xff0c 两者在工作上的区别主要在于 xff0c 中断方式微控制器可以执
  • C语言 HTTP发送post和get请求

    安装curl环境 xff1a apt install curl apt get install libcurl4 openssl dev 使用C语言来做HTTP协议 xff0c 然后发送post和get请求 xff0c 这里为post请求的
  • Verilog中输入数据范围的判断

    0 完整源码获得方式 订阅MATLAB FPGA教程 xff0c 免得获得教程案例以及任意2份完整源码 在系统设计的过程中 xff0c 经常需要根据输入数据的值 xff0c 对相关信号的值进行改变 如果输入数据的边界值数量比较少 xff0c
  • xp无法识别u盘exFAT。插入提示格式化

    xp无法识别u盘exFAT 插入提示格式化 肯定不能格式化 xff0c u盘装的都是数据 xff0c 一搜 xff0c 原来是xp太老了 不识别exFAT格式 下了个补丁 WindowsXP KB955704 x86 CHS exfat补丁
  • 迅雷x导入未完成任务失败的解决办法。

    最近用x雷下东西 xff0c 卸载时不小心点了删除下载任务 再打开时任务已经没了 怎么办 文件还没下完呢 重装x雷 导入未完成任务 结果失败 我dnnm 十几年的软件 xff0c 这么重要的功能都没做好 xff1f xff1f 故意的吧 经
  • LSP编程之64位实现的一些经验。

    以前32位时 xff0c lsp代码正常运行 xff0c 但安装在win7后也能运行 xff0c 但逐渐发现32位的lsp dll只能过滤32位的进程 64位的进程似乎没有影响 查看dll模块也没有我的lsp dll身影 百度了下资料 发现
  • 判断字符串是否有中文

    hasch cpp 定义控制台应用程序的入口点 include 34 stdafx h 34 include lt windows h gt bool hasChinese const std wstring amp src for int
  • 修复机械硬盘那些事

    关于降速 就是硬盘出现许多错误后 xff0c 比如坏道 xff0c 硬盘传输模式会不断降级 xff0c 慢到只有1 5M s 读取速度 解决办法是格式化 xff0c 删除 xff0c 重启 重新分区 然后速度测试恢复了90M s 正常了 关
  • 关于避免qq迅雷流氓驱动的问题

    qq作为聊天软件 xff0c 装机必备 迅雷当年也是必备 但是 随着企业膨胀 43 流氓 都开发出驱动 43 服务来常驻系统底层了 作为一个关注隐私的人 非常不喜欢第三方载入驱动 xff0c 而且还是聊天软件和下载软件 你要那么大权限作甚
  • 【原】记一次加密网页html的研究

    某次web编程 思考着辛辛苦苦编写的web别人 右键查看源码不就一目了然了 xff1f 当然有些人会把script写入外部js引入 xff0c 但也只是增加了查看源码的步骤 我就想把整个页面html都加密下 xff0c 只是右键查看时 xf
  • cn_windows_7_ultimate_with_sp1_x64_dvd_u_677408.iso

    ed2k file cn windows 7 ultimate with sp1 x64 dvd u 677408 iso 3420557312 B58548681854236C7939003B583A8078 文件 D 迅雷下载 cn w
  • rtmpsrv.c 支持publish的方法

    rtmpsvr c是rtmpdump里的代码 实现了简单的rtmpserver 可以连接但客户端publish就卡住了 分析代码 xff0c 发现是没有实现对应的消息处理 增加代码如下即可publish了 else if AVMATCH a
  • Chrome提示“您的连接不是私密连接”& 删除所有证书 解决办法

    访问经常上的站 xff0c 结果提示 您的连接不是私密连接 xff0c 怀疑是证书有错误 就把chrome 设置 高级设置 HTTPS SSL 把里面证书全部删除了 结果导致所有https网站都提示 您的连接不是私密连接 下载了个 http
  • 217维特比译码器的FPGA设计

    0 完整源码获得方式 订阅MATLAB FPGA教程 免得获得教程案例以及任意2份完整源码 二 viterbi译码器 nbsp nbsp nbsp 2 1 7 卷积码译码过程的总体结构可分为4个子模块 分别是分支度量模块 加比选蝶形运算单元
  • rtmp2flv rtmp直播转httpflv工具

    下载 https download csdn net download smwhotjay 10696519 注意 由于用到了openssl xff0c 所以需要安装VC2008sp1 exe 不然运行会失败 软件用途 给rtmp服务器增加
  • Linux TCP/UDP调试助手下载安装(转载备忘)

    Linux TCP UDP调试助手下载安装 xff08 转载 备忘 xff09 本文主要转载 https blog csdn net have fun article details 88229426 作为备忘文档使用 因为本人要简单调试一
  • [转载]boost库的简单介绍

    boost库的简单介绍 boost是一个准标准库 xff0c 相当于STL的延续和扩充 xff0c 它的设计理念和STL比较接近 xff0c 都是利用泛型让复用达到最大化 不过对比STL xff0c boost更加实用 STL集中在算法部分
  • Linux上Qt程序闪退的BUG

    问题现象 输出信息 xcb Unknown request in queue while dequeuing xcb Most likely this is a multi threaded client and XInitThreads
  • EKF2学习笔记之运行流程2

    2017 8 4 by snow 2cd read mag data and set it 这里有个细节 xff0c 对于多个magnetometer同时工作时 xff0c 在处理时需要 Check if the magnetometer