无人机 PX4 飞控 | EKF2简介与使用方法

ops/2024/10/9 15:15:24/

无人机 PX4 飞控 | EKF2简介与使用方法

  • PX4 EKF2简介
  • EKF 的启动
  • ecl EKF 的优缺点
    • 缺点
    • 优点
  • 运行单个EKF实例
  • 运行多个EKF实例

在这里插入图片描述

PX4_EKF2_4">PX4 EKF2简介

PX4是一个流行的开源飞控系统,广泛用于无人机和其他自动驾驶飞行器。EKF2(Extended Kalman Filter 2)是PX4中用于状态估计的一个关键组件,它负责融合来自不同传感器的数据,如GPS、IMU(惯性测量单元)、磁力计、气压计等,以提供精确的飞行器位置、速度、姿态和海拔信息。

ECL (Estimation and Control Library,估计和控制库),其中的状态估计使用扩展卡尔曼滤波算法(EKF)处理传感器的测量信息,是一个很成熟很优秀的状态估计模块。

EKF 提供如下状态量的估计值:

  • 四元数定义从北东地(NED)局部地球坐标系到 X,Y,Z 机体坐标系的旋转
  • IMU 的速度 — 北,东,地 (NED) (m/s)
  • IMU 的位置 — 北,东,地 (NED) (m)
  • IMU 增量角度偏差估计 — X,Y ,Z (rad)
  • IMU 增量速度偏差估计 - X, Y, Z(m/s)
  • 地球磁场分量 — 北,东,地 (NED) (gauss)
  • 飞行器机体坐标系磁场偏差 — X,Y ,Z (gauss)
  • 风速 — 北, 东 (NE) (m/s)

位置及速度状态变量在输出至控制回路之前会根据IMU与机体坐标系之间的偏差量进行修正。 IMU 相对于机体坐标系的位置由 EKF2_IMU_POS_X,Y,Z 参数设置。

EKF__24">EKF 的启动

EKF2 默认是启动的,相关参数为 EKF2_EN,默认为 Enable。

此外PX4还有其他的状态估计器:

  • EKF2 姿态,位置和风状态估计器 (推荐的) - 扩展卡尔曼滤波估计姿态, 3D 位置/速度和风的状态。
  • LPE 位置估计器 (已弃用) - 用于三维位置与速度状态的扩展卡尔曼滤波器。[LPE 已弃用。 (在开发 PX4 v1.14时)它是工作的,但是不再支持或维护。]
  • Q 姿态估计器 - 一个非常简单、基于四元数的互补滤波器。 它不需要 GPS、磁力计或气压计。

如果是希望启动其它状态估计器,那么则需要启用其参数并关闭其它估计器的参数:

  • EKF2_EN - EKF2 (默认/推荐)
  • ATT_EN - Q 估计器 (基于四元数的姿态估计器)
  • LPE_EN - LPE (不支持固定翼)

EKF__38">ecl EKF 的优缺点

缺点

1、ecl EKF 是一种复杂的算法,需要很好地理解扩展卡尔曼滤波器理论及其应用于导航中的问题才能成功调参。 因此,不知道怎么修改,用户就很难得到好结果。

2、ecl EKF 使用更多 RAM 和闪存空间。

3、ecl EKF 使用更多的日志空间。

优点

1、ecl EKF 能够以数学上一致的方式融合来自具有不同时间延迟和数据速率的传感器的数据,一旦正确设置时间延迟参数,就可以提高动态操作期间的准确性。

2、ecl EKF 能够融合各种不同的传感器类型

3、当 ecl EKF 检测并报告传感器数据中统计上显着的不一致性,将帮助诊断传感器错误。

4、对应固定翼而言,ecl EKF 可以在有空速计和没有空速计的情况下,估计风速。如果GPS在飞行中丢失,可以使用估计的风速结合空速测量和侧滑假设来延长可用的航位推算时间。

5、ecl EKF估计3轴加速度计偏差,这提高了尾座式无人机和其它机体在飞行阶段之间经历大的姿态变化时的精度。

EKF_58">运行单个EKF实例

默认的就是运行EKF的单个实例

在这种情况下,EKF收到数据之前执行传感器选择和故障切换。这为防止有限数量的传感器故障,如数据丢失等,提供了保护。但不能防止传感器提供的不准确数据超过EKF和控制循环的补偿能力(传感器的数据不准还是没有办法)。

运行单个EKF实例的参数设置为:

  • EKF2_MULTI_IMU = 0 | Multi-EKF使用的最大imu数。设置0为禁用(即运行单个EKF)。
  • EKF2_MULTI_MAG = 0 | Multi-EKF使用的最大磁力计数。设置0为禁用(即运行单个EKF)。
  • SENS_IMU_MODE = 1 | 传感器hub IMU 的模式。0为发布所以imu数据 (即有几个imu发布几个imu数据);1为发布主IMU选择(即仅发布1个imu数据)
  • SENS_MAG_MODE = 1 | 传感器hub 磁力计 的模式。0为发布所以磁力计 数据 (即有几个磁力计 发布几个imu磁力计 );1为发布主磁力计 选择(即仅发布1个磁力计 数据)

EKF_71">运行多个EKF实例

为了冗余,飞行器上一般不会仅有一个IMU,如果传感器出现故障,那么则无法恢复。一般会有两个IMU,一个磁力计,甚至两个磁力计。

例如 CUAV 的 X7+ 飞控 , 有三组IMU ,和一个磁力计 ,两个气压计
在这里插入图片描述
其中ICM-42688-P 的 性能要比后两个ICM-20689的性能要好,与传统的消费类IMU相比,噪声系数降低了40%,且温度稳定性提高了2倍。

在之前的PX4版本中,是一个工作,另一个作为备份,这个实际上是一种浪费。

通过运行多个EKF实例的方法,可以根据 IMU 和磁力计的数量以及自动驾驶仪的 CPU 能力,运行多个 EKF 实例,将 IMU 和磁力计的数据交叉输入以计算估计值。通过每个 EKF 实例使用不同的传感器组合,提供了一系列更广泛的传感器错误的保护。

过比较每个 EKF 实例的内部一致性,EKF 选择器能够确定具有最佳数据一致性的 EKF 和传感器组合。

这样可以检测和隔离IMU偏差、饱和或数据卡住等故障。

EKF实例总数是由 EKF2_MULTI_IMU 和 EKF2_MULTI_MAG 所选择的IMU数量和磁强计数量的乘积,由以下公式给出:
N_instances = MAX(EKF2_MULTI_IMU , 1) x MAX(EKF2_MULTI_MAG , 1)

例如,一个带有 2 个IMU和 2 个磁强计的自动化驾驶仪可以在 EKF2_MULTI_IMU = 2 和 EKF2_MULTI_MAG = 2 的情况下运行,总共 4 个EKF实例,其中每个实例使用以下传感器组合:

  • EKF instance 1 : IMU 1, magnetometer 1
  • EKF instance 2 : IMU 1, magnetometer 2
  • EKF instance 3 : IMU 2, magnetometer 1
  • EKF instance 4 : IMU 2, magnetometer 2

可处理的IMU或磁强计传感器的最大数量为每种传感器有4个,因此理论上最大有 4 x 4 = 16 个EKF实例。
实际上,这种做法受到现有计算资源的限制。 实测,使用基于STM32F7的硬件的CPU进行测试,结果显示 4 个EKF实例具有可接受的处理负载和内存利用率裕度。

那么根据上面举的cuav x7+ 的例子,使用多EKF实例,需要进行如下配置:

  • EKF2_MULTI_IMU =3
  • EKF2_MULTI_MAG = 1 (SENS_MAG_MODE 需要被设置为0,才会有这个参数,如果SENS_MAG_MODE为1 ,则搜不到EKF2_MULTI_MAG,其值也就是ECL (Estimation and Control Library,估计和控制库),其中的状态估计使用扩展卡尔曼滤波算法(EKF)处理传感器的测量信息,是一个很成熟很优秀的状态估计模块。

EKF 提供如下状态量的估计值:

  • 四元数定义从北东地(NED)局部地球坐标系到 X,Y,Z 机体坐标系的旋转
  • IMU 的速度 — 北,东,地 (NED) (m/s)
  • IMU 的位置 — 北,东,地 (NED) (m)
  • IMU 增量角度偏差估计 — X,Y ,Z (rad)
  • IMU 增量速度偏差估计 - X, Y, Z(m/s)
  • 地球磁场分量 — 北,东,地 (NED) (gauss)
  • 飞行器机体坐标系磁场偏差 — X,Y ,Z (gauss)
  • 风速 — 北, 东 (NE) (m/s)

位置及速度状态变量在输出至控制回路之前会根据IMU与机体坐标系之间的偏差量进行修正。 IMU 相对于机体坐标系的位置由 EKF2_IMU_POS_X,Y,Z 参数设置。1)

  • SENS_IMU_MODE = 0
  • SENS_MAG_MODE = 1

如果使用的是上面这个型号飞控,则建议进行如下设置
在这里插入图片描述
在这里插入图片描述

判断和选择当前工作的 EKF 实例的方法:
为每一个实例维护两个信息测试率

  • 组合测试率(combined_test_ratio) , 是速度和位置平均测试率和高度测试率的最大值,通过这个可以知道各个EKF实例的质量情况
  • 相对测试率 (relative_test_ratio) ,是在多实例 EKF 中与当前实例的组合测试率有最大差值的测试率,通过这个可以知道最佳候选实例

最佳候选实例超过 10 s 稳定好于当前工作实例,则将其切换为当前工作实例。
这样,外部用户就可以得到连续且稳定的最佳估计值。


http://www.ppmy.cn/ops/112337.html

相关文章

王者荣耀改重复名(java源码)

王者荣耀改重复名 项目简介 “王者荣耀改重复名”是一个基于 Spring Boot 的应用程序,用于生成王者荣耀游戏中的唯一名称。通过简单的接口和前端页面,用户可以输入旧名称并获得一个新的、不重复的名称。 功能特点 生成新名称:提供一个接口…

如何用MATLAB计算多边形的几何中心

在MATLAB中,计算多边形的几何中心(又称质心或重心)可以通过以下步骤实现。假设你有一个多边形,其顶点按照顺时针或逆时针顺序排列在一个矩阵中。具体步骤如下: 定义多边形顶点:首先,你需要将多边…

算式填符号c++

算式填符号c 题目递归算法分析算法递归函数构建出口子问题回溯 代码 题目 警察叔叔正在进行智力训练: 1 2 3 4 5 6 7 8 9 110; 数字间填入加号或者减号(能够不填。但不能填入其他符号)。比如:1234567-89 就是一种合格的填法&…

Spring Boot-WebSocket相关问题

Spring Boot 中的 WebSocket 相关问题及解决方案 WebSocket 是一种双向的实时通信协议,它允许客户端和服务器之间建立持久连接,并在此连接上双向传输数据。与传统的 HTTP 请求-响应模型不同,WebSocket 能够显著减少网络开销和延迟&#xff0…

2022高教社杯全国大学生数学建模竞赛C题 问题一(1) Python代码

目录 问题 11.1 对这些玻璃文物的表面风化与其玻璃类型、纹饰和颜色的关系进行分析数据探索 -- 单个分类变量的绘图树形图条形图扇形图雷达图 Cramer’s V 相关分析统计检验列联表分析卡方检验Fisher检验 绘图堆积条形图分组条形图 分类模型Logistic回归随机森林 import matplo…

SpringBoot接口开发总结

遇到的陌生函数 xxxMapper.selectList(): 使用mybatis获取数据库某几行数据。 new QueryWrapper<>().lambda(): 创建sql查询对象isNull(实体类::getXXX): 判断某个字段是否为空or() / and()&#xff1a; 链式连接多个查询条件 ifPresent() 和 Optional<实体类>的配…

Flutter Spacer引发的The ParentDataWidget Expanded(flex: 1) 惨案

问题描述 在flutter控制台中遇到如下报错&#xff1a; The following assertion was thrown while applying parent data.: Incorrect use of ParentDataWidget.The ParentDataWidget Expanded(flex: 1) wants to apply ParentData of type FlexParentData to a RenderObject,…

Vue(10)——自定义指令

自定义指令 自定义指令&#xff1a;可以封装一些dom操作&#xff0c;扩展额外功能。 全局注册-语法&#xff1a; Vue.directive(指令名,{ "inserted"(el){ inserted指指令所绑定的元素被添加到页面时自动调用 //可以对el标签扩展额外功能 el.focus() } }) 局部…