AirSim仿真IMU内参分析

2023-05-16

目录

    • IMU简介
      • IMU随机误差
        • a. 高斯白噪声:
        • b. 零偏不稳定性(bias instability):
      • 如何获得IMU随机误差参数
      • 随机误差参数的离散化
    • AirSim中的IMU噪声参数
    • IMU噪声参数在VIO算法中的应用
      • open_vins
      • vins_mono

本文将详细介绍AirSim中的惯性测量单元IMU传感器的噪声参数模型以及如何在VIO算法中应用这些参数。

我们首先从IMU传感器的参数说起。

IMU简介

IMU,即惯性测量单元,是一种常见的传感器。应用于移动机器人的IMU一般输出两类测量值:

  • 绕空间坐标轴x、y、z旋转的角速度
  • 沿空间坐标轴x、y、z方向的加速度

因此,IMU有时可以看作是“加速度计”和“陀螺仪”的结合体。

在这里插入图片描述

加速度计和陀螺仪的误差可以分为:确定性误差(系统误差),随机误差。

确定性误差可以事先标定确定,包括:bias,scale等;随机误差通常假设噪声服从高斯分布,包括:高斯白噪声,bias随机游走等

下面我们重点讨论无法方便地事先确定的随机误差:

IMU随机误差

a. 高斯白噪声:

这一项随机误差的名字可能有很多,例如“高斯白噪声”、“随机行走误差(random walk)”、“Noise density”等,表达的都是这项内容。以陀螺仪为例,单位为dps/rt(Hz),或者deg/rt(h)。

陀螺仪测量的角速度,加速度计测量的加速度的噪声是高斯白噪声。因此这一项误差表示的物理意义就是单位时间内角度不确定性(标准差)、速度不确定性(标准差)的增量。

例如,如果陀螺仪的的随机行走误差是20deg/rt(h),那意味着在一个小时后,积分得到的角度的误差的标准差是20deg。

以下表格为IMU随机误差的单位:

ParameterYAML elementSymbolUnits
Gyroscope “white noise”gyr_n
Accelerometer “white noise”acc_n
Gyroscope “bias Instability”gyr_w
Accelerometer “bias Instability”acc_w

b. 零偏不稳定性(bias instability):

理论上讲,当IMU完全不受激励时,输出应该为零,但现实往往不是这样。一般我们将传感器所受激励为零时的输出读数成为传感器的“零偏(bias)”。IMU的零偏属于系统误差,可以通过某些操作在事先进行标定。但IMU在使用过程中,会出现零偏慢慢变化的情况。直观上理解,零偏不稳定性误差会使陀螺仪和加速度计的零偏随时间慢慢变化,逐渐偏离开机时校准的零偏误差;同时还会造成一部分随机行走误差的效果。可以简要理解为在一段时间内零偏的变化量,其他名称可能还有“零偏随机游走(bias random walk)”、“零偏稳定性(bias stability)”等。

如何获得IMU随机误差参数

根据瑞士苏黎世理工学院的kalibr标定工具库中的介绍:IMU-Noise-Model,IMU随机误差参数可以由以下方式获得:

    1. 厂家提供的参数表
    1. Allan分析法:

Allan标准差分析法是通过对一段时间内的已采集IMU数据估计IMU随机误差参数的一种数值计算方法。简要介绍

网上有很多根据这一方法编写的程序,可以用来处理IMU数据从而得到随机误差参数,例如香港科技大学研究人员提供的工具imu_utils:按照README介绍的流程,即可得到输出的acc_n acc_w gyr_n gyr_w等;再例如open_vins团队提供的kalibr_allan,也能够得到以上参数。

随机误差参数的离散化

根据IMU-Noise-Model和讨论中的内容,参数表和Allan标准差分析法得出的都是连续噪声模型的误差参数,在具体应用时,需要使用离散化噪声模型的误差参数,也就是根据所使用IMU的输出频率进行修正。如以上两个链接所示。

IMU随机误差参数的具体应用场景例如:

  • kalibr
  • VINS

但就如IMU-Noise-Model最后所说,噪声模型推导出的随机误差参数都是在传感器静止和恒定温度下得出的,在IMU运动过程中,随机误差会更大,因此具体使用这些随机误差参数时,建议将参数扩大10倍以上使用

AirSim中的IMU噪声参数

具体到AirSim中,IMU的噪声是怎么设定的呢?

目前来讲,AirSim中的IMU噪声是在代码中写定的,尚不支持用户自己配置。IMU噪声设置的代码在AirSim/AirLib/include/sensors/imu/文件夹下:

ImuSimpleParams文件中设置了噪声参数值(参考的数据来源在源文件注释中有提到):

    struct Gyroscope {
        //angule random walk (ARW)
        real_T arw = 0.30f / sqrt(3600.0f) * M_PIf / 180; //deg/sqrt(hour) converted to rad/sqrt(sec) 这项是gyr_n
        //Bias Stability (tau = 500s)
        real_T tau = 500;
        real_T bias_stability = 4.6f / 3600 * M_PIf / 180; //deg/hr converted to rad/sec //这项是gyr_w
        Vector3r turn_on_bias = Vector3r::Zero(); //assume calibration is done
    } gyro;

    struct Accelerometer {
        //velocity random walk (ARW)
        real_T vrw = 0.24f * EarthUtils::Gravity / 1.0E3f; //mg converted to m/s^2 //这项是acc_n 
        //Bias Stability (tau = 800s)
        real_T tau = 800;
        real_T bias_stability = 36.0f * 1E-6f * 9.80665f; //ug converted to m/s^2 //这项是acc_w
        Vector3r turn_on_bias = Vector3r::Zero(); //assume calibration is done
    } accel;

但是请注意,以上的acc_w和gyr_w的数值不是发布的传感器仿真信号的最终噪声参数值,因为我们还需要参考IMU传感器实现的另一个头文件:

ImuSimple中的23\24行写到:

gyro_bias_stability_norm = params_.gyro.bias_stability / sqrt(params_.gyro.tau);
accel_bias_stability_norm = params_.accel.bias_stability / sqrt(params_.accel.tau);

也就是说gyro.bias_stability和accel.bias_stability在传递给噪声信号生成函数

void addNoise(Vector3r& linear_acceleration, Vector3r& angular_velocity)

之前还要除以常数 τ \tau τ的平方根。

所以最终,AirSim中的IMU传感器的噪声参数为:

gyro.arw is the gyroscope_noise_density, and is equal to 8.7266462e-5
gyro_bias_stability_norm is the gyroscope_random_walk, and is equal to 9.9735023e-7
accel.vrw is the accelerometer_noise_density, and is equal to 0.002353596
accel_bias_stability_norm is the accelerometer_noise_density, and is equal to 1.2481827e-5

在github上,有博主使用kalibr_allan工具对这组参数进行了验证:comment

IMU噪声参数在VIO算法中的应用

以上AirSim中的IMU噪声参数,都是连续时间噪声模型的参数,我们需要根据实际需要,来决定是否将这些参数进行离散化后再送给视觉slam算法。

以下用open_vins和vins_mono举例。

open_vins

open_vins需要的是连续噪声模型的参数

因为在ov_msckf的imu积分代码中,噪声会经过乘以或除以dt来进行离散化后才会作用在协方差矩阵的prediction上:

// Construct our discrete noise covariance matrix
// Note that we need to convert our continuous time noises to discrete
// Equations (129) amd (130) of Trawny tech report
Eigen::Matrix<double,12,12> Qc = Eigen::Matrix<double,12,12>::Zero();
Qc.block(0,0,3,3) = _noises.sigma_w_2/dt*Eigen::Matrix<double,3,3>::Identity();
Qc.block(3,3,3,3) = _noises.sigma_a_2/dt*Eigen::Matrix<double,3,3>::Identity();
Qc.block(6,6,3,3) = _noises.sigma_wb_2*dt*Eigen::Matrix<double,3,3>::Identity();
Qc.block(9,9,3,3) = _noises.sigma_ab_2*dt*Eigen::Matrix<double,3,3>::Identity();

// Compute the noise injected into the state over the interval
Qd = G*Qc*G.transpose();
Qd = 0.5*(Qd+Qd.transpose());

其中sigma_w_2/sigma_a_2/sigma_wb_2/sigma_ab_2都是配置文件输入的IMU相应参数的平方值: from ros

vins_mono

vins_mono需要的是离散噪声模型的参数。

这是因为在代码中:
构建噪声矩阵:

    noise = Eigen::Matrix<double, 18, 18>::Zero();
    noise.block<3, 3>(0, 0) =  (ACC_N * ACC_N) * Eigen::Matrix3d::Identity();
    noise.block<3, 3>(3, 3) =  (GYR_N * GYR_N) * Eigen::Matrix3d::Identity();
    noise.block<3, 3>(6, 6) =  (ACC_N * ACC_N) * Eigen::Matrix3d::Identity();
    noise.block<3, 3>(9, 9) =  (GYR_N * GYR_N) * Eigen::Matrix3d::Identity();
    noise.block<3, 3>(12, 12) =  (ACC_W * ACC_W) * Eigen::Matrix3d::Identity();
    noise.block<3, 3>(15, 15) =  (GYR_W * GYR_W) * Eigen::Matrix3d::Identity();

把噪声作用在协方差矩阵的prediction上:

    covariance = F * covariance * F.transpose() + V * noise * V.transpose();

这其中ACC_N/GYR_N/ACC_W/GYR_W都是从配置文件读入的IMU参数值: read settings

我们可以看到在vins_mono中,噪声参数并没有用 dt 进行离散化,所以说明,在写vins_mono的配置文件时,需要我们自己提前对IMU的噪声参数离散化。

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

AirSim仿真IMU内参分析 的相关文章

  • DataTables 详细设置(1)

    转自http blog csdn net arsiya jerry article details 50505294 并不是所有的后台开发都有美工和前端工程师来配合做页面 xff0c 为了显示数据并有一定的美感 xff0c jQuery的D
  • dataTables-使用详细说明整理

    转自 http blog csdn net mickey miki article details 8240477 本文共四部分 xff1a 官网 基本使用 遇到的问题 属性表 一 xff1a 官方网站 xff1a http www dat
  • 关于Xshell过期,需要采购问题

    1 卸载电脑中过期的xshell 2 http www netsarang com download free license html 去官网下载免费版 Home amp School 家庭和学校版本 注意邮箱要填写正确 填写完提交后会收
  • genromfs的使用及nuttx下romfs制作

    61 61 61 61 61 gt 我的博客目录导航 前言 这篇文章仅仅是为了记录如何使用genromfs制作romfs然后在nuttx上直接应用 xff0c 不会去详细介绍romfs的一系列特性 genromfs 首先去下载genromf
  • STM32智能小车系列教程(一)小车介绍及基本搭建

    大家收到小车包裹后 xff0c 想必都已经跃跃欲试了 xff0c 接下来关注我们的系列教程 xff0c 教你从零搭建一辆STM32F103智能小车 xff0c 本教程面向零基础 xff08 当然基本的单片机知识和C语言知识还是需要具备的 x
  • PHP上传图片 (从html到JS再到php onclick方式提交)

    1 首先form表单必须是post方式提交 xff0c 并且含有enctype 61 34 multipart form data 34 属性 如图 2 JS代码 利用formdata接收html中form表单的数据 利用append将其他
  • MongoDB Windows系统各个64位版本下载地址: http://dl.mongodb.org/dl/win32/x86_64

    MongoDB Windows系统各个64位版本下载地址 xff1a http dl mongodb org dl win32 x86 64
  • PostgreSQL表空间、数据库、模式、表、用户/角色之间的关系

    看PostgreSQL9的官方文档 xff0c 我越看越迷糊 xff0c 这表空间 xff0c 数据库 xff0c 模式 xff0c 表 xff0c 用户 xff0c 角色之间的关系怎么在PostgreSQL里这么混乱呢 xff1f 经过中
  • 关于phpExcel的使用

    execl数据导出 应用场景 xff1a 订单导出 64 param string title 模型名 xff08 如Member xff09 xff0c 用于导出生成文件名的前缀 64 param array cellName 表头及字段
  • phpExcel的使用方法以及导入导出实例【转载】

    一 下载PHPExcel 下载地址 xff1a https github com PHPOffice PHPExcel 二 读取Excel文件内容插入数据库 lt php require once 39 Classes PHPExcel p
  • 关于git 、初识git (fatal: Not a valid object name: 'master'.)

    主要错误原因是因为没有master分支 必须要commit一次 才可以有master分支 才可以创建别的分支 具体步骤 1 打开命令行 git add index html 2 git commit m 34 this is a test
  • 关于git的使用

    查看https blog csdn net qq 42072311 article details 80696886 https blog csdn net kevindgk article details 51606925 查看这两个博客
  • php使用upload封装类上传文件

    原文https blog csdn net navioo article details 51777799
  • phpStorm2018安装与破解(免安装打包版)

    首先将我为大家事先准备好的打包文件拷贝至软件安装盘 xff0c 本人安装于D盘 xff0c 所以这里已本人安装破解的过程进行讲述 1 gt phpStorm2018 2 2下载请转至链接 https pan baidu com s 1Kno
  • 最简洁的麦克纳姆轮原理与控制方法

    最简洁的麦克纳姆轮控制原理与控制方法 0 写在前面 对于第一次接触麦轮的小伙伴们肯定是没办法十分清晰地想象出麦轮底盘的各种运动该如何控制的 而在实际使用中 xff0c 麦轮的运动灵活性与控制难度之比又非常高 xff0c 可以说是在比较平整的
  • Nuttx下移植uorb笔记

    Nuttx下移植uorb笔记 之前接触过ros下的消息机制 xff08 生产者 消费者 xff09 模型 xff0c 第一感觉是灵活好用 xff0c 但是在资源有限的嵌入式环境里面 xff0c 邮箱 消息 显得就有点不那么灵活 xff0c
  • 关于ADRC算法以及参数整定(调参)的一些心得体会

    关于ADRC算法以及参数整定 xff08 调参 xff09 的一些心得体会 ADRC xff0c 全称叫做Active Disturbance Rejection Control xff0c 中文名是自抗扰控制技术 这项控制算法是由中科院的
  • boa-0.94.13:CGI中文问题

    为什么中文乱码 用win7 自带的浏览器ie 打开服务器的cgi form html xff0c 在Name 输入框输入 汉字 两个字 xff0c 提交服务器 如图1 图1 返回的是结果为 xff1a Server Got you para
  • 跑通VINS-Fusion全流程

    跑通VINS Fusion全流程 常规安装步骤详见官方1 ROS安装2 ceres solver安装3 VINS Fusion安装4 KITTI数据集下载5 跑通KITTI数据集 常规安装步骤详见官方 https github com HK
  • 带GPS的SLAM数据集汇总

    1 带GPS的相关SLAM数据集 Kitti 部分带部分不带 xff0c 看网站写的很详细 xff0c 数据集很常用 http www cvlibs net datasets kitti eval odometry php CMU Visu

随机推荐

  • 跑通GVINS——港科大新作

    跑通GVINS 港科大新作 0 简介1 环境2 跑通GVINS3 数据集4 相关资料打包下载 xff08 不包括数据集 xff09 6 泡泡机器人解读 港科大又一力作 xff01 vins mono以及vins fusion升级版GVINS
  • GVINS文章暴力翻译(仅供自学)

    GVINS文章暴力翻译 xff08 仅供自学 xff09 摘要1 介绍2 相关工作3 符号和定义A 框架b 状态 4 GNSS基本介绍A GNSS 概述B 伪距测量C 多普勒测量D SPP算法 5 系统概述6 概率公式A 地图估计B 惯性因
  • Vins-fusion用到的kitti数据集轨迹对不齐,使用evo -a转换

    kitti数据集基准问题 下面两个图一个是转换前 xff0c 一个是evo a 转换后的 问题描述 xff1a 现在遇到的问题是groundtruth和估计的位姿没有在一个坐标系中 xff0c 生成的轨迹对不齐 xff0c 需要首先根据位姿
  • 怎样用美图秀秀制作一寸照片

    有些时候 xff0c 老是会埋怨自己的http jingyan baidu com article 73c3ce28c852b7e50243d945 html证件照很难看 xff0c 自己拍的照片又不合格 xff0c 该怎么办呢 这里和大家
  • Realsense D435i关闭IR结构光

    Realsense D435i 关闭IR光 前言环境一次性关闭IR光从源码修改 前言 由于要做Realsense D435i的双目结构光相机标定 xff0c 其中用到了ROS来录制数据包 xff0c 但是结构光会影响标定 xff0c 所以得
  • vins-mono保存、重载地图、evo工具测试

    vins mono保存 重载地图 evo工具测试 地图保存与加载先跑起来修改地图保存的路径保存地图重载地图 evo测评evo工具修改数据格式使用evo绘制轨迹与双目ORB SLAM2进行对比 下面咱们来对vins mono地图进行简单测试
  • C++11新特性简介

    目录 功能扩展与增强 右值概念 类中右值扩展 标准库中右值扩展 内联命名空间 初始化 initialzier list 原始字符串 自定义字面值 类型自动推导 auto decltype 常量表达式函数constexpr 变长模板 空指针n
  • Realsense D435i单目跑ORB_SLAM2(无ROS版)

    主要参考mono euroc这个文件修改 xff0c 把数据源改成realsense的就可以了 如何获取realsense数据 xff0c 在之前的博客也阐述过 Realsense D435i 43 Opencv 获取彩色 深度 IMU数据
  • QGC开发 显示双GPS/RTK信息以及自定义页面(ubuntu)

    一 QGC开发 显示双GPS RTK信息 1 在sitl中进行仿真 xff0c 虚拟出第二个GPS mavlink发送到地面站 如下图中 xff0c 在mavlink msg gps2 raw h中找到发送第二组gps rtk数据函数mav
  • 03_FreeRTOS 二进制信号量

    03 FreeRTOS 二进制信号量 本文介绍 xff1a 二进制信号量的使用方法 简介信号量 信号量基本上用于将任务与系统中的其他事件同步 在FreeRTOS中 xff0c 信号量是基于队列机制实现的 FreeRTOS中有4种信号量 xf
  • 【首发】 ubuntu20.04安装matlab2021b/matlab2020b

    文章目录 一 下载地址1 1 2021b下载链接 BT 1 2 2021a下载链接1 3 2020b CSDN下载链接 二 MATLAB2021b安装方法2 1 Mount iso文件2 2 通过 install 启动安装程序2 3 输入正
  • 无人机右手定则以及角度大小方向粗判断

    无人机右手定则 xff1a 左力右场 xff0c 知道z轴方向 xff0c 然后就知道了xy轴方向 xff0c 其中x轴为大拇指指向的方向 四旋翼无人机欧拉角角度大小与其状态的关系 xff1a 设大地坐标系为 xff1a E xff08 O
  • NuttX RTOS

    目录 综述 NuttX是什么 看看这些文件和功能 它怎么会是一个小小的操作系统呢 xff1f NuttX讨论组 你想谈谈NuttX的特性吗 xff1f 你需要帮助吗 xff1f 问题吗 错误吗 下载 我在哪里可以买到NuttX xff1f
  • Arducopter Yaw角分析

    Arducopter Yaw 现梳理一遍Poshold模式下的yaw的情况 xff1a 首先从 Copter fast loop gt update flight mode gt Copter ModePosHold run span cl
  • TortoiseGit

    TortoiseGit用法 ubuntu16 04 18 04部署gitlab服务器 xff1a https blog csdn net qq 28263253 article details 80469203 一 如何安装 xff1a 下
  • 如何生成gazebo仿真环境的二维地图真值

    在移动机器人仿真中 xff0c 二维地图真值可以用来评价slam建图结果 xff0c 也可以直接给路径规划算法提供输入 利用gazebo进行仿真时 xff0c 有很多方法都可以获取静态仿真环境的二维地图真值 xff0c 本文将对以下链接 x
  • gazebo仿真环境加载模型方式

    我们都知道 xff0c gazebo可以在自带的gui中创建模型 导入模型 xff0c 然后将一批模型组成的仿真环境保存为一个world文件 xff1a 例如上图所示的场景 xff0c 我们可以从模型库中导入一些模型 xff0c 然后或直接
  • libCurl实现HTTP请求

    目录 接口说明使用步骤setopt函数部分选项说明 示例写数据回调GET请求POST请求 libCurl是一个多协议 跨平台的客户端URL传输库 xff1b 使用libCurl可方便地进行HTTP请求 接口说明 libCurl提供easy
  • EKF SLAM学习笔记03

    3 EKF SLAM 在上一节中我们看到的是扩展卡尔曼滤波在定位中的应用 xff0c EKF同样可以应用于SLAM问题中 在定位问题中 xff0c 机器人接收到的观测值是其在二维空间中的x y位置 如果机器人接收到的是跟周围环境有关的信息
  • AirSim仿真IMU内参分析

    目录 IMU简介IMU随机误差a 高斯白噪声 xff1a b 零偏不稳定性 xff08 bias instability xff09 xff1a 如何获得IMU随机误差参数随机误差参数的离散化 AirSim中的IMU噪声参数IMU噪声参数在