在IMU采集数据时,会产生两种误差:确定性误差和随机性误差,为获得精确的数据,需要对上述两种误差进行标定。
确定性误差主要包括bias(偏置)、scale(尺度)、misalignment(坐标轴互相不垂直)等多种。常使用六面静置法标定加速度计和陀螺仪的确定性误差。
随机误差主要包括:高斯白噪声、bias随机游走。加速度计和陀螺仪随机误差的标定通常使用Allan方差法,Allan方差法是20世纪60年代由美国国家标准局的David 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 3Q;
角度随机游走(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;
有关如何读取误差参数,这篇博客讲解的比较详细:陀螺 Allan 方差分析
常用的Allan方差工具,主要有以下两种:
https://github.com/gaowenliang/imu_utils
https://github.com/rpng/kalibr_allan
使用imu_utils进行标定,主要参考:港科大的方法,环境:Ubuntu16.04+ROS-kinetic。
imu_utils是基于ROS的方法,因此需要先安装ROS,参考这个链接安装:ROS 不能再详细的安装教程
后续安装的code_utils依赖于ceres solver,可参考之前的博客安装:SLAM环境配置:Ubuntu16.04+Clion+Eigen+Ceres+g2o+Sophus+PCL+OpenCV+测试代码
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
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>
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
生成的bag包即是仿真得到的IMU数据,后续使用这个包里的数据生成Allan方差。
roscore
cd ~/catkin_ws/devel/lib/vio_data_simulation
rosrun vio_data_simulation vio_data_simulation_node
进入 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
rosbag倍速回放imu.bag信息,并运行launch文件:
rosbag play -r 200 imu.bag
roslaunch imu_utils imu.launch
在imu_utils/data文件夹下,会生成16个txt文件:
9. 绘制Allan方差图
在catkin_ws/src/imu_utils/scripts文件夹中,有很多使用Matlab写的.m文件,由于Ubuntu下安装Matlab比较麻烦,因此将数据和.m文件拷贝到Windows系统下绘制。
修改 draw_allan.m中文件路径:
kalibr_allan工具需要先安装Matlab,这里博主没有并没有安装,故如下步骤没有生成最终结果,后续补上。
kalibr_allan同样依赖于ROS,参考这个链接安装ROS kinetic:ROS 不能再详细的安装教程
参考:ubuntu16.04安装MATLAB R2017b步骤详解(附完整破解文件包) 安装。
cd ~/catkin_ws/src
git clone https://github.com/rpng/kalibr_allan.git
catkin_make
拷贝上述过程生成的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曲线。