PX4原生固件,position_estimator_inav解读

2023-05-16

INAV-----integrated navigation组合导航。

对于多旋翼的位置姿态估计系统:

PX4原生固件如今已经默认使用EKF2了,另一种情况是 使用local_position_estimator, attitude_estimator_q。

对于INAV则已经弃用。所以如果是基础比较好的同仁,可以直接研究EKF2。

不过博主是新进小白,刚开始研究位置和姿态解算。从互补滤波入手或许是一个快速入门的选择。


INAV干了什么:

    INAV,顾名思义,隶属于导航系统,且是组合导航系统。导航,简而言之,就是对运动物体运动状态的测量。

这个运动状态对于飞行器来讲,主要是三个线位置,三个线速率,三个欧拉角,三个角速度。

    在PX4中,INAV提供了飞行器的三轴线位置和三轴线速率,是对飞行器线运动的测量。


INAV使用什么方法:

    互补滤波。

    既然是组合导航,自然是使用了多种传感器,需要多种传感器数据进行融合。互补滤波是一种融合两种或者多种

不同来源数据的方法。


INAV使用了什么传感器:

    加速度计,GPS,PX4FLOW,气压计,vision,lidar,mocap。

    加速度计,测量飞行器本体系下的三轴加速度;

    GPS ,测量飞行器的经纬高,和北东地坐标系下的速度;

    PX4FLOW, 测量飞行器在当前位置水平方向上的运动;

    气压计,测量飞行器的当前位置的气压值,可转化为北东地坐标系下的海拔高度;

    vision ,视觉定位,博主不具备,一般小型多旋翼也不具备;

    lidar,测量飞行器当前位置的当地高度;

    mocap,运动捕捉系统,一般不具备。


INAV 融合方法:

全部体现在下面两个函数。

inertial_filter_predict 估计函数。

void inertial_filter_predict(float dt, float x[2], float acc)
{
if (PX4_ISFINITE(dt)) {
if (!PX4_ISFINITE(acc)) {
acc = 0.0f;
}


x[0] += x[1] * dt + acc * dt * dt / 2.0f;
x[1] += acc * dt;
}
}

inertial_filter_correct 校正函数。

void inertial_filter_correct(float e, float dt, float x[2], int i, float w)
{
if (PX4_ISFINITE(e) && PX4_ISFINITE(w) && PX4_ISFINITE(dt)) {
float ewdt = e * w * dt;
x[i] += ewdt;


if (i == 0) {
x[1] += w * ewdt;
}
}
}


估计函数:这里虽然叫预估,但是实际就是数值积分。输入是上一时刻的状态X。X[0]是位置,X[1]是速率。

                  X[0] = X[0] +  x[1] * dt + acc * dt * dt / 2.0f   -------> s = v*t + 0.5*a*t*t 位移公式

                  X[1] = X[1] + acc*dt                                     --------> v = a*t                  速率公式

                  显然如果我们能够获得准确的acc,就能够通过上述公式经过积分获得飞行器的位置和速率。

                  那我们如何才能获得准确的acc呢?

                  acc是由加速度计测量得到的,但是acc掺杂了加速度计本身的测量噪声,机体的振动,载体的运动加速度等干扰因素。

                  如果直接使用,势必会影响积分的精度,而且积分本身就会产生累积误差。

                  显然直接使用加速度计测出的acc是不可行的。

                  这就需要用其他传感器对acc进行校正了。

校正函数:校正分为两个部分。

                  一个部分是对位置和速率的直接校正,这也是校正函数做的事情,可以称之为直接校正。

                  另一部分是对acc的校正,这是在程序过程中做的,后面会讲到,可以称之为间接校正。

                  校正函数的形参解释:

                  e 代表由加速度得到的位置和速率,与其他传感器得到的位置和速率分别做差得到的偏差。

                  w 代表权重,或者补偿系数。

                  所以校正函数的意思就是如果由加速度积分得到的位置和速率,与其他传感器得到的位置

                  和速率有偏差的时候,就用这个w乘以e再乘以dt补偿到加速度得到的位置和速率上。

                  这是为什么呢?

                  因为加速度积分得到的结果,随着时间的推移,数值会发散。而其他传感器的结果则是有

                  界的。所以,直接校正可以立即使加速度的积分结果趋近于真实结果,是对其发散的一种限制。

                  但是其他传感器数据的获取频率是比较低的,并不能满足实时性的要求。

                  所以加速度积分仍然是必须的。由此,便引出了间接校正。

                  我们认为加速度积分得到的数值的误差是由于acc不准确引起的,所以每一次直接校正后,都对

                  acc进行补偿,也就是间接校正。这样在其他传感器没有数据的时候,利用校正后的acc积分,

                  短时间内,精度也是可以接受的。


以上介绍了INAV模块的整体思路,整个程序就是估计和校正的循环往复的过程。

///

下面我们一起看看INAV的具体代码实现吧:


首先,介绍一下params.c中的参数。这些参数在程序中反复出现,从命名可以区分它们的含义和作用。

INAV+权重+方向+传感器+含义           默认值                最大              最小                 简单描述

INAV_W_Z_BARO                              0.5                      10                 0                      气压计高度方向 位置补偿系数

INAV_W_Z_GPS_P                            0.005                  10                 0                      GPS高度方向 位置补偿系数,只用来校正气压计的零偏

INAV_W_Z_GPS_V                            0                         10                 0                      GPS高度方向 速率补偿系数

INAV_W_Z_VIS_P                              5                         10                 0                      视觉高度方向 位置补偿系数,只用来校正气压计的零偏

INAV_W_Z_LIDAR                             3                          10                 0                      雷达高度方向 位置补偿系数

INAV_W_XY_GPS_P                         1                          10                 0                      GPS水平方向 位置补偿系数

INAV_W_XY_GPS_V                         2                          10                 0                      GPS水平方向 速率补偿系数

INAV_W_XY_VIS_P                           7                          10                 0                      视觉水平方向 位置补偿系数

INAV_W_XY_VIS_V                           0                           10                0                      视觉水平方向 速率补偿系数

INAV_W_MOC_P                               10                         10                0                      运动捕捉系统 位置补偿系数

INAV_W_XY_FLOW                           0.8                       10                 0                      光流水平方向 位置补偿系数

***************************************************************************************************************************************

INAV_W_XY_RES_V                         0.5                        10                0                      速度源丢失时,缓慢的降低估计的水平速度时,使用的权重

INAV_W_GPS_FLOW                        0.1                        1                  0                      光流有效时,用这个系数,降低GPS的位置和速率的补偿系数

INAV_W_ACC_BIAS                          0.05                      0.1               0                      加速度计零偏估计 补偿系数

INAV_FLOW_K                                  1.35                       10                0                      光流线性度的系数

INAV_FLOW_Q_MIN                          0.3                        1                  0                      最小可以接受的光流质量

INAV_LIDAR_ERR                              0.2                        1                  0                      雷达最大误差,用于判断是否到达了新的表面

INAV_LAND_T                                     3                          10                0                      落地检测时间,没有高度改变,在低油门的时候,单位s

INAV_LAND_DISP                               0.7                       10                0                      落地检测高度,进入该高度,触发落地检测

INAV_LAND_THR                               0.2                        1                  0                      落地检测油门,进入该油门,触发落地检测,最好为悬停油门的一半

INAV_DELAY_GPS                             0.2                        1                  0                      GPS延时,单位s

INAV_FLOW_DIST_X                         0                           1                  -1                     光流模块在X方向偏离质心的距离,单位m

INAV_FLOW_DIST_Y                         0                           1                  -1                     光流模块在Y方向偏离质心的距离,单位m

INAV_DISAB_MOCAP                        0                           1                   0                     0使能运动捕捉,1禁用运动捕捉,如果使用虚拟GPS,设为0

INAV_LIDAR_EST                              0                                                                       布尔量,雷达用于高度估计

INAV_LIDAR_OFF                              0                           20                -20                   雷达零偏,单位m

CBRK_NO_VISION                            0                         328754            0                     禁用视觉输入,设为328754可以禁用视觉输入


这些参数主要是补偿用的系数,有一些判定条件的阈值,还有几个开关量。


下面开始介绍程序实现。

INAV的程序结构非常简单,并不是本文的重点,在这里就不进行介绍了。

主要介绍INAV估计和校正的实现函数:int position_estimator_inav_thread_main(int argc, char *argv[])。

所有的数据处理都在这个函数中。

先介绍下大致的工作流程:

                                      

主要分三大部分:

第一部分,是变量定义和初始化。还有就是对uorb的主题规定订购那些主题,发布那些主题。

第二部分,是计算气压高的零偏。我们知道气压计是能够测出海拔高度的,但是用海拔高度

                  表示,没有直观性。我们都利用当地高度来衡量飞机的高度。因此,在起飞之前

                  测出飞机起飞点的海拔就很有必要。这里是按多次取平均的方法计算原点高度的。

第三部分,是位置估计和校正。


下面着重介绍第三部分的程序:

通过上面的介绍,我们可以将位置估计和校正的过程分成三个环节。

1 计算合适的e

    e就是估计值和测量值的差值。测量值是通过传感器直接测得的位置和速率的数值。通过消除这个e,使估计值始终不会发散。

2 计算合适的w

    我们使用了很多种传感器。每个传感器能够提供的信息是有限的,并且精度也不一样。

    所以,由每个传感器得出的e,需要乘以一个系数,表示它们在估计过程中的权重。    

    例如气压计只能提供高度位置信息,不能提供高度速率信息。gps既能提供xyz三个方向的位置信息,也能提供速率信息。

    但是气压计高度方向的位置精度高,能够达到20~30cm。gps的高度方向的位置精度则只能达到10m。

    这就决定了它们在融合过程中的权重会依据自身的特点而各有侧重。

    另一方面,有些传感器会受到环境的影响,而导致其测量精度是时变的。其发送回来的数据包里面经常包含quality的数据。

    这是用来衡量传感器的工作状态的值,根据这个值得大小,也许进行权重的调整。

3 合理的补偿acc

    有了e和w就可以利用上面介绍的估计和校正函数进行数据融合了。但是这样实际上并没有发挥出加速度计本身的特点。

    对于结果而言,只是把所有量测数据进行了加权。对于量测噪声也没有很好抑制作用。

    而对于估计值,仍然使用acc的测量值进行积分的话,就失去了利用量测值进行补偿的作用。

    这个地方说的比较模糊,后面会严格推倒公式,就一目了然了。








                  

                  











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

PX4原生固件,position_estimator_inav解读 的相关文章

随机推荐

  • 算法:海量日志数据,提取出某日访问百度次数最多的那个IP

    首先是这一天 xff0c 并且是访问百度的日志中的IP取出来 xff0c 逐个写入到一个大文件中 注意到IP是32位的 xff0c 最多有个2 32个IP 同样可以采用映射的方法 xff0c 比如模1000 xff0c 把整个大文件映射为1
  • 使用JUnit测试预期异常

    开发人员常常使用单元测试来验证的一段儿代码的操作 xff0c 很多时候单元测试可以检查抛出预期异常 expected exceptions 的代码 在Java语言中 xff0c JUnit是一套标准的单元测试方案 xff0c 它提供了很多验
  • BlockingQueue深入分析

    1 BlockingQueue 定义的常用方法如下 抛出异常特殊值阻塞超时插入add e offer e put e offer e time unit 移除remove poll take poll time unit 检查element
  • Qt对directshow的封装

    在源码路径中 xff1a qt everywhere opensource src 5 1 1 qtmultimedia src plugins directshow xff0c 有两个文件夹player 和 camera xff0c 1
  • 聚合类新闻客户端产品功能点详情分析

    产品功能点 功能 今日头条 百度新闻 鲜果 ZAKER 媒体订阅 个性化内容推荐 个性化订阅 RSS 视频新闻 评论盖楼 搜索新闻 离线下载 地方新闻 一键分享 收藏 推送 天气 夜间模式 线上活动 主题设置 感兴趣 语音读文章 字体设置
  • 聚合类新闻客户端初体验

    初体验的产品 xff1a 今日头条 ios3 6 百度新闻 ios4 4 0 ZAKER ios4 4 5 鲜果 ios3 8 7 中搜搜悦 ios4 0 1 Flipboard ios2 3 9 1 Flipboard 一款国外很火的ap
  • 聚合类新闻客户端的改进

    zaker和鲜果是最早的聚合类新闻产品 xff0c 前几年发展很快 xff0c 迅速占领了市场 xff0c 但近两年发展变得缓慢 xff0c 而今日头条自发布以来才两年 xff0c 用户量就迅速超过了zaker和鲜果 xff0c 使用起来非
  • 单例模式优缺点

    主要优点 xff1a 1 提供了对唯一实例的受控访问 2 由于在系统内存中只存在一个对象 xff0c 因此可以节约系统资源 xff0c 对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能 3 允许可变数目的实例 主要缺点 xff
  • 适配器模式优缺点

    优点 xff1a 1 将目标类和适配者类解耦 2 增加了类的透明性和复用性 xff0c 将具体的实现封装在适配者类中 xff0c 对于客户端类来说是透明的 xff0c 而且提高了适配者的复用性 3 灵活性和扩展性都非常好 xff0c 符合开
  • Oracle 的 Round函数

    Round函数用法 xff1a 截取数字 格式如下 xff1a ROUND xff08 number decimals xff09 其中 xff1a number 待做截取处理的数值 decimals 指明需保留小数点后面的位数 可选项 x
  • eclipse报错:Failed to load the JNI shared library

    电脑自装系统以来 xff0c 好久没有写java代码了 xff0c 所以一直也没用 eclipse IDE xff0c 今天将eclipse打开 xff0c 报了个问题 xff0c Failed to load the JNI shared
  • 10串口通信

    51单片机学习记录10 通信通信的的基本概念串口参数及时序图常用通信接口比较 51单片机串口介绍串口通信简介串口内部结构串口通信相关寄存器 串口通信实验串口向计算机发送数据计算机通过串口控制LED 通信 通信的的基本概念 通信的方式 通信方
  • 【已解决】zookeeper配置出现问题合集

    已解决 zookeeper配置出现问题合集 1 问题诊断 日志2 问题解决合集2 1zookeeper集群搭建报错 拒绝连接 2 2zookeeper集群搭建报错 没有找到主机路由 1 问题诊断 日志 1 进入文件查看日志 xff1a zo
  • noVNC 安装、配置与使用

    最近项目中使用到了远程终端操控 xff0c 从各方找到了noVNC这个神奇的家伙 xff0c 废话不多说 xff0c 开始介绍它的安装配置与使用 1 下载noNVC 好多渠道可以下载到noVNC xff0c 可以直接访问noVNC的官方网页
  • 360极速浏览器网页保护色

    方法一 xff1a 360浏览器的 扩展中心 有一个 绿色眼睛 的插件 xff1b 但是感觉一般 xff0c 不够彻底 xff1b 方法二 xff1a 360急速浏览器是基于开源Chrome浏览器修改的 xff0c 所以可以直接用Chrom
  • STM32基于FreeRTOS的多任务程序案例

    STM32基于FreeRTOS的多任务程序案例 一 初步了解FreeRTOS二 实验要求三 基于FreeRTOS的多任务程序案例四 参考链接 使用工具 野火stm32mini开发板 Keil uVision5 野火多功能调试助手 一 初步了
  • 【TcaplusDB知识库】TcaplusDB刷新tbus通道介绍

    命令 xff1a RefreshBusCfg 其中 xff0c 指进程的进程id xff0c 比如1 2 2 2 1 2 1 2等 xff0c 也支持简单的正则表达式 xff0c 比如RefreshBusCfg 1 2 2 那么只要匹配到1
  • Python中下划线的5种含义

    作者 xff1a 地球的外星人君 链接 xff1a https zhuanlan zhihu com p 36173202 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非商业转载请注明出处 分享一篇文章
  • ubuntu下 安装PX4编译环境

    最近博主的ubuntu虚拟机再次崩溃 xff0c 狠下决心将4G内存升级为12G 这样就可以给虚拟机多分配些内存了 鉴于前两次安装PX4环境出现了很多错误 xff0c 走了很多弯路 xff0c 没有一一记录下来 xff0c 所获甚少 故而借
  • PX4原生固件,position_estimator_inav解读

    INAV integrated navigation组合导航 对于多旋翼的位置姿态估计系统 xff1a PX4原生固件如今已经默认使用EKF2了 xff0c 另一种情况是 使用local position estimator attitud