VIO标定IMU随机误差:Allan方差法

前言

在IMU采集数据时,会产生两种误差:确定性误差和随机性误差,为获得精确的数据,需要对上述两种误差进行标定。

  1. 确定性误差

确定性误差主要包括bias(偏置)、scale(尺度)、misalignment(坐标轴互相不垂直)等多种。常使用六面静置法标定加速度计陀螺仪的确定性误差。

  1. 随机误差

随机误差主要包括:高斯白噪声、bias随机游走。加速度计陀螺仪随机误差的标定通常使用Allan方差法,Allan方差法是20世纪60年代由美国国家标准局的David Allan提出的基于时域的分析方法。

  1. Allan方差图读取误差系数

Allan方差法可用于5种随机误差的标定:
量化噪声(Quantization Noise):误差系数为 Q Q Q,Allan方差双对数曲线上斜率为 − 1 -1 1的直线延长线与 t = 1 0 0 t=10^0 t=100的交点的纵坐标读数为 3 Q \sqrt{3}Q 3 Q
角度随机游走(Angle Random Walk):其误差系数 N N N,Allan方差双对数曲线上斜率为 − 1 / 2 -1/2 1/2的线的延长线与 t = 1 0 0 t=10^0 t=100交点的纵坐标读数即为 N N N
零偏不稳定性(Bias Instability):其误差系数 B B B,Allan方差双对数曲线上斜率为 0 0 0的线的延长线与 t = 1 0 0 t=10^0 t=100交点的纵坐标读数为 2 l n 2 / π B \sqrt{2ln2/\pi}B 2ln2/π B,一般常取底部平坦区的最小值或取 t = 1 0 1 t=10^1 t=101 t = 1 0 2 t=10^2 t=102处的值;
角速率随机游走(Rate Random Walk):其误差系数 K K K,斜率为 + 1 / 2 +1/2 +1/2的线的延长线与 t = 1 0 0 t=10^0 t=100交点的纵坐标读数为 K / 3 K/\sqrt{3} K/3
角速率斜坡(Rate Ramp):其误差系数 R R R,斜率为 + 1 +1 +1的线的延长线与 t = 1 0 0 t=10^0 t=100交点的纵坐标读数为 R / 2 R/\sqrt{2} R/2
VIO标定IMU随机误差:Allan方差法_第1张图片
有关如何读取误差参数,这篇博客讲解的比较详细:陀螺 Allan 方差分析

IMU标定

常用的Allan方差工具,主要有以下两种:

https://github.com/gaowenliang/imu_utils
https://github.com/rpng/kalibr_allan
imu_utils

使用imu_utils进行标定,主要参考:港科大的方法,环境:Ubuntu16.04+ROS-kinetic。

  1. 安装ROS

imu_utils是基于ROS的方法,因此需要先安装ROS,参考这个链接安装:ROS 不能再详细的安装教程

  1. 安装ceres solver

后续安装的code_utils依赖于ceres solver,可参考之前的博客安装:SLAM环境配置:Ubuntu16.04+Clion+Eigen+Ceres+g2o+Sophus+PCL+OpenCV+测试代码

  1. 下载、编译code_utils

imu_utils的使用需要依赖code_utils,因此需要提前安装。

cd ~/catkin_ws/src 
git clone https://github.com/gaowenliang/code_utils 
cd ~/catkin_ws 
catkin_make

在编译之前需要对源码进行修改:

方法一:
	在~/catkin_ws/src/code_utils/CMakeLists.txt中,添加:include_directories("include/code_utils")
方法二:
	修改~/catkin_ws/src/code_utils/src/sumpixel_test.cpp文件中的#include "backward.hpp"为#include "code_utils/backward.hpp"

避免出现如下错误:

catkin_ws/src/code_utils/src/sumpixel_test.cpp:2:24: fatal error: backward.hpp: No such file or directory
  1. 下载、编译imu_utils
cd ~/catkin_ws/srcgit clone https://github.com/gaowenliang/imu_utils
cd ~/catkin_ws
catkin_make

错误及解决方案:

错误:
catkin_ws/src/imu_utils/src/imu_an.cpp:68:19: error: aggregate ‘std::ofstream out_t’ has incomplete type and cannot be defined
     std::ofstream out_t;
解决方案:
	在imu_an.cpp文件中添加头文件:#include <fstream>
  1. 下载仿真代码
cd  ~/catkin_ws/src
git clone https://github.com/HeYijia/vio_data_simulation/tree/ros_version

修改vio_data_simulation/src/gener_alldata.cpp中imu.bag的存储路径为:

bag.open("./imu.bag", rosbag::bagmode::Write);

编译源码:

cd ~/catkin_ws
catkin_make

source  ./devel/setup.bash
  1. 生成包imu.bag

生成的bag包即是仿真得到的IMU数据,后续使用这个包里的数据生成Allan方差。

roscore
cd ~/catkin_ws/devel/lib/vio_data_simulation
rosrun vio_data_simulation vio_data_simulation_node
  1. 写launch文件

进入 catkin_ws/src/imu_utils/launch文件夹,新建imu.launch文件:

<launch>
<node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
<param name="imu_topic" type="string" value= "/imu"/>
<param name="imu_name" type="string" value= "imutest"/>
<param name="data_save_path" type="string" value= "$(find
imu_utils)/data/"/>
<param name="max_time_min" type="int" value= "120"/>
<param name="max_cluster" type="int" value= "100"/>
</node>
</launch>

重新编译:

cd ~/catkin_ws
catkin_make

source  ./devel/setup.bash
  1. 生成Allan方差

rosbag倍速回放imu.bag信息,并运行launch文件:

rosbag play -r 200 imu.bag
roslaunch imu_utils imu.launch

在imu_utils/data文件夹下,会生成16个txt文件:
VIO标定IMU随机误差:Allan方差法_第2张图片
9. 绘制Allan方差图

在catkin_ws/src/imu_utils/scripts文件夹中,有很多使用Matlab写的.m文件,由于Ubuntu下安装Matlab比较麻烦,因此将数据和.m文件拷贝到Windows系统下绘制。
修改 draw_allan.m中文件路径:

VIO标定IMU随机误差:Allan方差法_第3张图片
运行结果:

VIO标定IMU随机误差:Allan方差法_第4张图片
根据Allan方差图即可读出相应的误差。

kalibr_allan

kalibr_allan工具需要先安装Matlab,这里博主没有并没有安装,故如下步骤没有生成最终结果,后续补上。

  1. ROS

kalibr_allan同样依赖于ROS,参考这个链接安装ROS kinetic:ROS 不能再详细的安装教程

  1. 安装Matlab

参考:ubuntu16.04安装MATLAB R2017b步骤详解(附完整破解文件包) 安装。

  1. 下载、编译
cd ~/catkin_ws/src
git clone https://github.com/rpng/kalibr_allan.git

catkin_make
  1. 结果

拷贝上述过程生成的imu.bag拷贝到~/catkin_ws/src/kalibr_allan/data文件夹中,
参考:https://github.com/rpng/kalibr_allan ,使用bagconvert将.bag转换成.mat文件:

rosrun bagconvert bagconvert imu.bag /imu0

修改~/catkin_ws/src/kalibr_allan/matlab文件夹下的SCRIPT_process_results.m中.mat路径,即可画出allan曲线。

参考

  • 随机误差与Allan方差的理解
  • 陀螺仪随机误差的Allan方差分析
  • https://github.com/ethz-asl/kalibr/wiki/installation

你可能感兴趣的:(SLAM)