无人机 PX4 飞控 | EKF 使用传感器汇总与添加传感器方法

news2024/11/13 10:14:27

无人机 PX4 飞控 | EKF 使用传感器汇总与添加传感器方法

  • 前言
  • 飞控自带基本传感器
    • IMU
    • 磁力计
    • 气压计
      • 静态气压位置误差校正
      • 气压计偏压补偿
  • 高度传感器
    • 测距仪
      • 使能测距仪融合有条件
  • 可额外配置的传感器
    • 光流
    • 外部视觉系统
  • 新传感器
    • 确定传感器类型和接口
    • 更新硬件定义
    • 添加驱动
    • 更新EKF

在这里插入图片描述

前言

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 具有不同的操作模式,以允许不同的传感器测量组合。

滤波器在启动时会检查传感器的最小可行组合,并且在完成初始倾斜,偏航和高度对准之后,进入提供旋转,垂直速度,垂直位置,IMU 增量角度偏差和 IMU 增量速度偏差估计的模式。

此模式需要 IMU 数据,一个偏航源(磁力计或外部视觉)和一个高度数据源。 所有EKF操作模式都需要这个最小数据集。

在此基础上可以使用其它传感器数据来估计额外的状态变量。

飞控自带基本传感器

IMU

在这里插入图片描述

与机体固连的三轴惯性测量单元 (IMU),以最小 100Hz 的频率获取增量角度和增量速度数据。

EKF 仅将 IMU 数据用于状态预测

注意:在 EKF 使用它们之前,应该使用圆锥校正算法校正 IMU 增量角度数据。

磁力计

在这里插入图片描述

需要以最小 5Hz 的速率的三轴机体固连磁力计数据(或外部视觉系统姿态数据)。

磁力计数据有两种方式参与融合:

  • 使用倾角估计和磁偏角将磁力计测量值转换为偏航角。然后将该偏航角用作 EKF 的观察值。该方法精度较低并且不允许学习机体坐标系场偏移,但是它对于磁场异常和大的初始陀螺偏差更有鲁棒性。它是启动期间和在地面时的默认方法
  • XY Z 磁力计读数用作单独的观察值。该方法更精确,但需要正确估计磁力计的偏差。
    当无人机旋转时可以观察到偏差,当飞行器加速(线性加速)时可以观察到真实的航向。
    由于偏差可以改变,并且只有在移动时才能观察到,因此在不移动时切换回航向融合更安全。
    它假设地球磁场环境只会缓慢变化,当存在显着的外部磁场异常时表现较差。
    这是飞行器移动时使用的默认方法。

用于选择这些模式的逻辑由 EKF2_MAG_TYPE 参数设置。
这个参数是一个整型变量,用于控制磁力计融合使用的类型,磁航向还是三轴磁力计读数

  • 设置为0(Automatic),在地面使用磁力计偏航,在空中使用lost三轴磁力计读数;
  • 设置为1(Magnetic heading)时,为一直使用磁力计偏航模式
  • 设置为5(None),磁力计将不会在任何情况下使用。
  • 设置为6(Init),磁力计仅用于初始化航向

建议使用默认的“Automatic”模式(EKF2_MAG_TYPE=0),因为它在地面上使用更鲁棒的磁力计偏航,在移动时(参数表中为in-flight)使用更精确的3轴磁力计读数。

一直设置“3-axis”模式(EKF2_MAG_TYPE=2)更容易出错,并且要求所有imu都经过良好校准。[参数列表中没有这个选项,可能取消掉了]

还有有两种方式可在没有磁力计的情况下使用,此时需要将EKF2_MAG_TYPE 设置为 None
1、使用双天线GPS的偏航角替换它,
2、使用IMU测量和GPS速度数据来估计飞行器运动的偏航角。

气压计

在这里插入图片描述

EKF2_BARO_CTRL —— 控制是否使用气压计参与融合

需要注意的是,即使飞控中有多个气压计,也只会有一个气压计的数据进行融合。
通过 CAL_BAROx_PRIO 这个参数来设置各个气压计的优先级。
优先级高的首先被选择,如果出现故障,则会切换为下一个优先级的气压计。
如果气压计的优先级设置的相同,那么先收到数据那个被使用。

如果设置CAL_BAROx_PRIO 为0 ,那么x这个气压计就完成被禁止使用。

还是以cuav X7+ 为例,该飞控有两个气压计 MS5611*2

静态气压位置误差校正

气压表示的海拔高度因机体风的相对速度和方向造成的空气动力扰动而发生误差。这就是所谓的静态气压位置误差. 使用ECL/EKF2估计器库的EKF2模块提供了补偿这些误差的方法,只要风速状态估计是激活的。

对应固定翼,风速估计需要空速计或者 Synthetic Sideslip

对于多旋翼飞行器,风速估计可以启用并调整 Drag Specific Forces 的融合,以提供所需风速状态估计。后面有Drag Specific Forces 的详细介绍

EKF2模块将误差建模为与机体固连的椭球体,在将其转换为高度估计之前,它指定了从大气气压中加/减的动态气压的分量。

气压计偏压补偿

气压计在恒定高度时,由于环境压力环境的变化或传感器温度的变化,其测量结果会发生漂移。为了补偿这种测量误差,EKF2使用GNSS高度(如果可用)作为“非漂移”参考来估计偏差。不需要调优。

高度传感器

高度数据源 ,来自 GPS、气压计、测距仪或外部视觉设备,需要最小频率为 5Hz。

如果不存在这些测量值,EKF 将无法启动。

当检测到这些测量值时,EKF 将初始化状态并完成倾角和偏航对准。 当倾角和偏航对齐完成后,EKF 可以转换到其它操作模式,从而可以使用其它传感器数据:

每个高度源可以使用其专用控制参数启用/禁用:

  • GNSS: EKF2_GPS_CTRL —— 这个参数是一个通过来进行功能选择的参数,0: Lon/lat;1: Altitude;2: 3D velocity;3: Dual antenna heading 。 默认为7
  • 气压计:EKF2_BARO_CTRL —— 控制是否使用气压计参与融合
  • 测距仪:EKF2_RNG_CTRL —— 0:禁止测距仪融合;1使能测距仪融合有条件(在小于设定速度EKF2_RNG_A_VMAX与小于设定高度时EKF2_RNG_A_HMAX);2使能融合
  • 外部视觉设备: EKF2_HGT_REF 这个参数设置为Vision的时候使能,这个参数可以设置0:气压计;1:GPS;2:测距仪;3:视觉设备。存在多个高度源时,高度估计将始终收敛于该参数选择的参考高度源

测距仪

在这里插入图片描述

测距仪到地面的距离由一个单状态滤波器来估计地形相对于高度基准面的垂直位置。

控制测距仪是否参与融合由 EKF2_RNG_CTRL 这个参数来决定
EKF2_RNG_CTRL —— 0:禁止测距仪融合;1使能测距仪融合有条件(在小于设定速度EKF2_RNG_A_VMAX与小于设定高度时EKF2_RNG_A_HMAX);2使能融合

使能测距仪融合有条件

条件测距仪融合(又称条件测距辅助)在低速/低空操作时(除了其他主动高度源之外)激活测距仪融合进行高度估计。

如果将测距仪设置为参考高度源(使用EKF2_HGT_REF),则其他有效高度源(如气压和GNSS高度)将随着时间的推移调整其测量值以匹配测距仪的读数。

当不满足启动距离辅助的条件时,将自动选择辅助参考。

注意:参考高度之间切换会导致绝对高度估计值随时间漂移。在位置模式下飞行时,这不是问题,但如果需要无人机在特定的GNSS高度飞行任务,则可能会出现问题。如果不想要绝对高度漂移,需要设置GNSS高度作为高度参考,即使使用条件距离辅助。

测距仪主要用于起飞和降落,以防止离地面较近时,过度的螺旋桨下洗气流,造成气压改变,气压计的读数破坏EKF的状态。

测距仪还可以提供飞行器在悬停时的高度保持

地形保持建议在测距仪参与融合的情况下进行地形保持。这是因为地形保持器使用普通的ECL/EKF估计器来确定高度,在大多数情况下,这通常比距离传感器更可靠。

开启条件测距仪融合的参数设置:

  • 设置 EKF2_RNG_CTRL 为 Enabled (conditional mode)
  • EKF2_RNG_A_VMAX 根据情况设置这个参数,该参数为水平速度阈值,超过该阈值测距仪不参与融合
  • EKF2_RNG_A_HMAX 根据情况设置这个参数,该参数为高度阈值,超过该阈值测距仪不参与融合
  • EKF2_RNG_A_IGATE 测距辅助EKF 更新一致性 检查阈值(在测距辅助被禁用之前的误差测量)。较低的值意味着HAGL(Height above ground limit)需要更稳定,以便在测距辅助模式下使用测距仪进行高度估计

可额外配置的传感器

光流

在这里插入图片描述

如果满足以下条件,将使用Optical flow数据:

  • 有效的测距仪数据可用。
  • EKF2_OF_CTRL is set.
  • 光流传感器返回的质量度量值大于 EKF2_OF_QMIN 参数设置的最低要求。

外部视觉系统

在这里插入图片描述

可以使用外部视觉系统测量位置、速度或方向。

通过将EKF2_EV_CTRL的适当位设置为true来配置融合的测量:

EKF2_EV_CTRL (外部视觉系统辅助)通过设置位来选择融合视觉系统的什么数据 :

  • 0: Horizontal position
  • 1: Vertical position
  • 2: 3D velocity
  • 3: Yaw

注意,如果使用偏航数据(位3),则航向相对于外部视觉框架;否则,航向相对于北方。

EKF 要考虑视觉姿态估计的不确定性。 此不确定性信息可以通过 MAVLink,在 ODOMETRY 消息中的协方差字段发送,也可以通过 EKF2_EVP_NOISE ,EKF2_EVV_NOISE 和 EKF2_EVA_NOISE 参数设置。 你可以通过 EKF2_EV_NOISE_MD 选择不确定性数据源。

新传感器

上述各传感器为PX4 已完成驱动、融合等代码功能的,可配置参数即可将传感器数据融合于EKF2中

在PX4中添加一个新的传感器到EKF(Extended Kalman Filter)会复杂写,涉及以下几个步骤

确定传感器类型和接口

首先,你需要确定你想要添加的传感器类型,输出什么信息数据,并了解该传感器与飞控板的接口(例如,I2C, SPI, UART)。

更新硬件定义

在PX4的代码库中,需要在飞控板的硬件定义文件中添加传感器。这些文件通常位于/boards/your_board_name/hwdef.dat或/boards/your_board_name/board.h。

对于新的I2C设备,需要添加如下行:
I2C_DEV(1, GPIO_SPI_CS_GYRO, I2C_ADDRESS, 100000)
其中I2C_ADDRESS是传感器的I2C地址。
对于新的SPI设备,你可能需要在board.h中定义SPI总线以及相关的GPIO引脚。

添加驱动

如果PX4的代码库中没有你传感器的驱动,需要编写一个新的驱动。驱动通常位于/src/drivers/your_sensor_name。

创建一个新的驱动通常涉及以下步骤:
实现传感器的初始化和配置。
实现读取传感器数据的功能。
将数据发布到PX4的UORB消息系统中。

更新EKF

在添加了传感器驱动后,需要更新EKF以使用新的传感器数据。

修改EKF配置:更新EKF配置参数,以启用新传感器。在/src/modules/ekf2/params目录下的参数定义文件中完成。

修改EKF源码:如果新传感器需要特殊的处理,需要在EKF的源码中进行修改。源码位于/src/modules/ekf2/目录下。
在ekf2_main.cpp中添加对新传感器UORB消息的订阅。
在ekf2.cpp或相应的传感器处理文件中添加新的传感器数据融合逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2148706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL:事务的ACID特性隔离级别脏读、不可重复读、幻读、Next-Key锁——场景复现

目录 1、什么是事务 2、 事务的ACID特性 2.1 事务的隔离性 3、为什么要使用事务? 4、查看支持事务的存储引擎 5、使用事务 5.1 控制事务 5.1.1 开启事务 5.1.2 关闭事务 5.2 开始一个事务,执行修改后回滚 5.3 开始一个事务,执行修…

观后感:《中国数据库前世今生》——时代变迁中的数据库崛起

最近观看了《中国数据库前世今生》纪录片,这部影片详细梳理了从1980年代至今,中国数据库技术发展的跌宕历程。作为一名程序员,这部纪录片让我不禁感慨数据库技术的飞速进步,也让我更深入地理解了数据库技术在我们日常生活中的重要…

如何借助项目管理系统实现审批流程的自动化与标准化?

在快节奏的项目申报领域中,繁琐的审批流程往往成为制约项目推进速度的瓶颈。传统的人工审批方式不仅耗时耗力,还容易因人为因素导致审批效率低下、结果不一致等问题。为此,一款能够支持在线审批流程、实现审批自动化与标准化的项目管理系统显…

Canal+RabbitMQ数据同步环境配置

Canal 是阿里巴巴开发的开源工具,主要用于解析 MySQL 的 binlog 日志,从而实现数据同步。Canal 会模拟 MySQL 从库的协议,订阅主库的 binlog,从而获取数据库的变更信息。 将 Canal 解析到的 MySQL 数据库变更消息通过 RabbitMQ 分…

算法打卡 Day34(贪心算法)-分发饼干 + 摆动序列 + 最大子序和

文章目录 理论基础Leetcode 455-分发饼干题目描述解题思路类似题目2410-运动员和训练师的最大匹配数 Leetcode 376-摆动序列题目描述解题思路 Leetcode 53-最大子序和题目描述解题思路 理论基础 贪心算法的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心算…

力扣718-最长重复子数组(Java详细题解)

题目链接:718. 最长重复子数组 - 力扣(LeetCode) 前情提要: 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5…

【CMake】使用CMake在Visual Studio内构建多文件夹工程

一、配置准备 打开VIsual Studio,载入写好的 C M a k e l i s t s . t x t CMakelists.txt CMakelists.txt,在项目中添加以下文件: 创建一个文件夹 f u n c s funcs funcs,里面放入 f u n c . h func.h func.h、 f u n c . c p …

fmql之驱动程序编写(首次)

看了正点原子的zynq系列的Linux开发指南(pdf和视频均有),因此从最简单的程序开始。 驱动程序开发:(第四期视频) 第3.1讲 我的第一个Linux驱动-字符设备驱动框架_哔哩哔哩_bilibili 学习驱动程序编写之前&am…

【论文串烧】多媒体推荐中的模态平衡学习 | 音视频语音识别中丢失导致的模态偏差对丢失视频帧鲁棒性的影响

文章目录 一、多媒体推荐中的模态平衡学习1.1 研究背景1.2 解决问题1.3 实施方案1.4 文章摘要1.5 文章重点1.6 文章图示图 1:不同模型变体在 AmazonClothing 数据集上的初步研究图 2:CKD模型架构的说明图 3:在 Amazon-Clothing 数据集上训练过…

【Linux:共享内存】

共享内存的概念: 操作系统通过页表将共享内存的起始虚拟地址映射到当前进程的地址空间中共享内存是由需要通信的双方进程之一来创建但该资源并不属于创建它的进程,而属于操作系统 共享内存可以在系统中存在多份,供不同个数,不同进…

Qt窗口——QStatusBar

文章目录 状态栏状态栏创建状态栏显示临时消息状态栏添加子控件 状态栏 QStatusBar状态栏是应用程序中输出简要信息的区域,例如画图板下面的区域 我们也可以给程序设置状态栏,表示一些状态。 状态栏创建 使用Qt Creator创建项目的时候,如果…

实现一种可插拔的参数校验

1、概述 仿照mybatis的二级缓存的实现方式,使用“策略模式配置” 的方式实现一个可动态插拔的 参数校验,便于后期扩展。 实现方式也很简单,首先定义一个校验接口,并提供一个校验方法;每种参数校验都是实现 了该校验接口…

前端vue-实现富文本组件

1.使用wangeditor富文本编辑器 工具网站&#xff1a;https://www.wangeditor.com/v4/ 下载安装命令&#xff1a;npm i wangeditor --save 成品如下图&#xff1a; 组件实现代码 <template><div><!-- 富文本编辑器 --><div id"wangeditor">…

Recbole安装指南:步骤详解与常见问题解决方案

1.两种方式&#xff1a; 从Conda安装 如果你还没有安装Conda&#xff0c;可以安装Miniconda或完整的Anaconda。 如果你在中国大陆&#xff0c;我们推荐你使用清华镜像安装Conda。 当你完成Conda的安装后&#xff0c;你可以将RecBole安装在python 3.7的Conda环境中&#xff0…

数据结构之树(下),你真的懂吗?

数据结构入门学习&#xff08;全是干货&#xff09;——树&#xff08;下&#xff09; 1 堆 (Heap) 1.1 什么是堆 堆 (Heap) 是一种特殊的完全二叉树&#xff0c;分为最大堆和最小堆。 最大堆&#xff1a;每个节点的值都大于或等于其子节点的值&#xff0c;根节点是整个堆的…

YOLOv9改进策略【注意力机制篇】| MCAttention 多尺度交叉轴注意力

一、本文介绍 本文记录的是基于MCA注意力模块的YOLOv9目标检测改进方法研究。普通的轴向注意力难以实现长距离交互&#xff0c;不利于捕获分割任务中所需的空间结构或形状&#xff0c;而MCA注意力模块通过构建了两个并行轴向注意力之间的交互&#xff0c;更有效地利用多尺度特…

2.4 卷积2

2.4.2 复正弦波与整体方案 在2.3节中&#xff0c;我们提出了关于复正弦输入的频域输出及其意义的两个问题。为了研究这些问题&#xff0c;我们让一个具有真实脉冲响应 h [ n ] h[n] h[n]&#xff08;即 h Q [ n ] 0 h_Q[n] 0 hQ​[n]0&#xff09;的LTI系统通过输入复正弦…

数据结构(Day16)

一、学习内容 1、有关顺序表的操作&#xff08;功能函数&#xff09; 1、创建顺序表 Plist create_list(){Plist L malloc(sizeof(list)); // 为顺序表分配内存空间if(NULL L){printf("申请空间失败\n");return NULL; // 如果内存分配失败&#xff0c;返回 NU…

RTMP协议在无人机巡检中的应用场景

为什么要用无人机巡检 好多开发者对无人机巡检技术方案&#xff0c;相对陌生&#xff0c;实际上&#xff0c;无人机巡检就是利用无人机对特定区域或设施进行定期或不定期的检查。这种巡检方式相比传统的人工巡检具有显著的优势&#xff0c;包括速度快、覆盖广、风险低、准确性…

Tornado 是一个 Python 异步网络库和 web 框架

Tornado 是一个 Python 异步网络库和 web 框架&#xff0c;它最初由 FriendFeed 开发&#xff0c;后来被 Facebook 收购并开源。Tornado 因其非阻塞的 I/O 操作和优秀的性能而广受欢迎&#xff0c;特别是在需要处理大量并发连接的应用中。Tornado 的底层实现主要依赖于 Python …