AirSim仿真IMU内参分析
目录
- 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随机误差的单位:
Parameter | YAML element | Symbol | Units |
---|---|---|---|
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随机误差参数可以由以下方式获得:
- 厂家提供的参数表
- 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_wVector3r 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_wVector3r 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的噪声参数离散化。
AirSim仿真IMU内参分析相关推荐
- Airsim仿真平台介绍
Airsim是一款基于Unreal Engine构建的无人机.汽车等模拟器的开源平台,并且可以跨平台的通过PX4飞行控制器进行仿真控制,在物理和视觉上逼真的模拟环境使得它成为一款很好的平台.不仅模拟了 ...
- IMU内参标定以及初始化(9轴IMU,比6轴多三个姿态角信息)
IMU内参标定以及初始化(绕8字) 一.IMU内参标定 1.6轴(角速度+线加速度)信息初始化(标定噪声和bias) 2.三轴姿态信息初始化(绕8子) 二.IMU模块ROS配置 注意事项: 因为三个方 ...
- 【学习记录】IMU内参标定:Allan方差与代码
本文仅用于记录自己学习IMU内参标定过程中的一些总结. 参考 关于IMU参数: 死磕陀螺仪之(一)陀螺仪参数意义以及工程转换 关于Allan方差: 多传感器融合定位理论基础(三):惯性器件误差分析 I ...
- msk误码率 matlab仿真,GMSK调制解调的MATLAB仿真与误码率分析.pdf
GMSK调制解调的MATLAB仿真与误码率分析 67 第34卷 第2期 <新疆师范大学学报>(自然科学版) Vol.34,No.2 2015年6月 Journal of Xinjiang ...
- 基于ADS的c语言程序设计实验,实验一:基于ADS软件传输线理论仿真设计与分析.docx...
龙 lerrnl'' 龙 lerrnl'' $ Num=l 1Z=50 Ohm h|」M -- TL1 Z=50 0.0hm E=50 F=5GHz ggj I SrPARAM ETERS . | Z ...
- recurdyn和matlab联合仿真,基于RecurDyn与Simulink的液压破碎锤联合仿真与试验分析
机 械 第41卷2013年第1l期 液压破碎锤联合仿真与试验分析 方 建,杨国平,王 聪 ,徐小剑 上海工程技术大学汽车工程学院 上海 201620 圈 摘要 :以某型号液压破碎锤为研究对象,分析其工 ...
- 基于端到端深度学习的自动驾驶:AirSim教程(包含Ubuntu18.04下配置AIrsim仿真环境解决方案)
这是微软自动驾驶食谱的第一个教程(目前共两个).之前看到过,这里记录一下. https://github.com/microsoft/AutonomousDrivingCookbook 前言 在本教程 ...
- 链传动运动仿真(motion分析)制作包含源文件
链传动运动仿真(motion分析)制作包含源文件 基于SolidWorks2020版本制作. 制作过程参考: 链传动运动仿真(motion分析)SolidWorks制作过程 制作后的仿真效果 制作难点 ...
- AirSim仿真学习记录(1)
一.AirSim概述 1.1什么是AirSim AirSim是一款基于虚幻引擎构建的无人机.汽车等模拟器(我们现在还有一个实验性的Unity版本).它是开源的,跨平台的,并支持使用流行的飞行控制器(如 ...
最新文章
- SPL--Serializable
- Vim文件管理器NERD tree
- 【ElementUI】 table表格尾部的合计行,固定表头却不显示合计行
- MySQL / 各种锁
- opengl加载显示3D模型md5mesh类型文件
- C语言求数组中的最大值
- 表格序号_如何让表格序号自动更新,四个函数让表格实现自动化、高效操作
- 11选5下期算法_本周六周日【高二直播】辅导网课预告:通用技术电控二三极管、多用电表测量、数字逻辑电路、解析枚举递归算法,2022浙江选考技术...
- 使用Vivado保存ILA数据并读取
- threallocal详解
- java中注解操作redis_spring boot —— redis 缓存注解使用教程
- 《TensorFlow 2.0深度学习算法实战教材》学习笔记(四、TensorFlow 进阶)
- 焊接工时简便计算工具_2020年新版机械加工工时费用计算(17页)-原创力文档...
- 虚拟机专用win xp 系统 ios
- java spy_Java Spy - 代码跟踪神器
- 300字美文摘抄加赏析
- 我们为什么选择NEXTCHIP?为什么要选择ISP?为什么要选择AHD?为什么选择北京冠宇铭通?
- esx 主机cli命令行简单介绍
- 产业区块链发展周报(10.11—10.16)| 陀螺研究院
- 对话哈希未来贾英昊:资产上链的第一性原理 |链捕手