《視覺SLAM進階:從零開始手寫VIO》第二講作業

1 安裝im_utils

這個工具之前就使用過了,還寫了博客,沒想到在這裏用上了,博客地址:https://blog.csdn.net/learning_tortosie/article/details/89878769 ,現直接搬運到這裏。

imu_utils是一個用於分析IMU性能的ROS工具包。

1.1 安裝

首先,安裝依賴:

sudo apt-get install libdw-dev

作者在README.md中的編譯步驟爲:

  • download required code_utils;
  • put the ROS package imu_utils and code_utils into your workspace, usually named catkin_ws;
  • cd to your workspace, build with catkin_make;

但是,如果這樣操作,會編譯出錯。查了一下,需要先編譯code_utils,然後再編譯imu_utils,不能同時編譯,應該是依賴問題。

正確的編譯步驟:

mkdir -p imu-calibration/src
cd imu-calibration/src
git clone https://github.com/gaowenliang/code_utils.git
cd ..
catkin_make
cd imu-calibration/src
git clone https://github.com/gaowenliang/imu_utils.git
cd ..
catkin_make

1.2 可能出現的Error

當然,還有可能遇到一些錯誤。

錯誤1:找不到Eigen

我們一般通過以下命令安裝Eigen:

sudo apt-get install libeigen3-dev

這樣Eigen就默認安裝在/usr/include/eigen3,需要在/home/jlg/imu-calibration/src/code_utils/CMakeLists.txt中註釋掉find_package(Eigen3 REQUIRED),然後添加:

include_directories(/usr/include/eigen3)

錯誤2:找不到backward.hpp

atal error: backward.hpp: No such file or directory

把文件code_utils/src/sumpixel_test.cpp中的#include "backward.hpp"改成#include "code_utils/backward.hpp"即可。

錯誤3:std::ofstream未定義

/home/***/imu-calibration/src/imu_utils/src/imu_an.cpp:69:19: error: aggregate ‘std::ofstream out_t’ has incomplete type and cannot be defined

打開文件imu_utils/src/imu_an.cpp,添加:

#include <fstream>

1.3 運行

1.採集IMU數據

在 IMU 靜止時收集數據,持續兩小時。

2.播放數據

rosbag play -r 200 imu_A3.bag

作者提供了5個IMU數據集,可以先測試一下。

3.啓動節點

roslaunch imu_utils A3.launch

注意launch文件:

<launch>
    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
        <param name="imu_topic" type="string" value= "/djiros/imu"/>
        <param name="imu_name" type="string" value= "A3"/>
        <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>

要根據自己的IMU,修改imu_topicimu_name

4.樣例

我使用的imu_16448.bag,結果保存在imu_utils/data/16448_imu_param.yaml,對於其他 txt 文件,可以用imu_utils/scripts中的Matlab腳本繪圖。

%YAML:1.0
type: IMU
name: “16448”
Gyr:
unit: rad/s
avg-axis:
gyr_n: 2.5540703819967830e-03
gyr_w: 7.3979547257109791e-05
x-axis:
gyr_n: 2.5732073264841159e-03
gyr_w: 7.9169715719978401e-05
y-axis:
gyr_n: 2.5490825380843534e-03
gyr_w: 6.8388779942953886e-05
z-axis:
gyr_n: 2.5399212814218798e-03
gyr_w: 7.4380146108397072e-05
Acc:
unit: " m/s^2"
avg-axis:
acc_n: 2.7851422418165215e-02
acc_w: 1.2053367145964710e-03
x-axis:
acc_n: 2.6671201438493906e-02
acc_w: 9.3260697511083528e-04
y-axis:
acc_n: 3.2016249942269592e-02
acc_w: 1.8349143250976515e-03
z-axis:
acc_n: 2.4866815873732146e-02
acc_w: 8.4848884358092636e-04

1.4 參考資料

2 編譯vio_data_simulation-master

vio_data_simulation-master是一個Cmake工程,按套路操作就好。

cd vio_data_simulation-master
mkdir build
cd build
camke ..
make
cd ../bin
./data_gen

此時,在vio_data_simulation-master/bin目錄下會生成一些txt文件,我們需要的是imu_pose.txtimu_int_pose.txt,然後用Python的matplotlib繪圖。

cd ../python_tool
python draw_trajctory.py

說明
imu_pose.txt是由給定的軌跡方程和歐拉角,生成IMU的pose,imu_int_pose.txt是由給定的軌跡得到速度和加速度,再根據歐拉法和中值法得到IMU的pose,通過比較兩個pose,可以得到歐拉法和中值法的效果。

2.1 歐拉法

(1)公式
在這裏插入圖片描述
(2)軌跡對比圖
在這裏插入圖片描述

2.2 中值積分法

(1)公式
在這裏插入圖片描述
(2)代碼
在這裏插入圖片描述
(3)軌跡對比圖
在這裏插入圖片描述
對比:目測中值法比歐拉法精度高。

3 編譯vio_data_simulation-ros_version

3.1 編譯

mkdir -p catkin_ws_vio_data_simulation-ros_version/src
cp vio_data_simulation-ros_version catkin_ws_vio_data_simulation-ros_version/src
cd catkin_ws_vio_data_simulation-ros_version
catkin_make

3.2 生成imu.bag

首先,打開catkin_ws_vio_data_simulation/src/vio_data_simulation-ros_version/src/gener_alldata.cpp,設置imu.bag的存儲路徑。

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

然後,啓動節點,生成imu.bag。

source devel/setup.bash
rosrun vio_data_simulation vio_data_simulation_node

3.3 使用imu_utils標定IMU的白噪聲和零偏不穩定性

執行以下命令可知imu.bagtopicimu

rosbag info imu.bag

path: imu.bag
version: 2.0
duration: 3hr 59:59s (14399s)
start: Jun 23 2019 19:46:01.57 (1561290361.57)
end: Jun 23 2019 23:46:01.57 (1561304761.57)
size: 1.0 GB
messages: 2880001
compression: none [1344/1344 chunks]
types: sensor_msgs/Imu\ [6a62c6daae103f4ff57a132d6f95cec2]
topics: imu 2880001 msgs : sensor_msgs/Imu

方便起見,可以直接使用imu_utils/launch/16448.launch,然後將imu_topic改爲imu,將imu_name改爲mems

roslaunch imu_utils mems.launch

播放數據:

rosbag play imu.bag

一段時間後,在imu_utils/data下會生成一些txt文件和yaml文件。

其中,mems_imu_param.yaml爲:

%YAML:1.0
type: IMU
name: mems
Gyr:
unit: rad/s
avg-axis:
gyr_n: 2.0890432536871339e-01
gyr_w: 1.0350659865036070e-03
x-axis:
gyr_n: 2.1267688959379552e-01
gyr_w: 9.9416942028848852e-04
y-axis:
gyr_n: 2.0914260308003346e-01
gyr_w: 1.1582639020507859e-03
z-axis:
gyr_n: 2.0489348343231117e-01
gyr_w: 9.5276463717154658e-04
Acc:
unit: " m/s^2"
avg-axis:
acc_n: 2.6687745286836656e-01
acc_w: 3.5593223039378573e-03
x-axis:
acc_n: 2.6424317346164494e-01
acc_w: 4.2147930911496092e-03
y-axis:
acc_n: 2.7021759937094070e-01
acc_w: 3.1101473189795565e-03
z-axis:
acc_n: 2.6617158577251410e-01
acc_w: 3.3530265016844057e-03

修改imu_utils/scripts/draw_allan.m中txt文件的路徑,然後使用Matlab運行。

(1)陀螺儀的艾倫方差曲線如下:

在這裏插入圖片描述

分析:陀螺儀的高斯白噪聲比較準確,但bias隨機遊走噪聲與設定值相差兩個數量級,不清楚原因,可能是imu_utlis自身的問題。後面會用kalibr_allan工具標定一下。

(2)加速度的艾倫方差曲線如下:

在這裏插入圖片描述

分析:加速度計的高斯白噪聲和bias隨機遊走噪聲比較準確。

PS:剛發現,Sigma單位應爲:m/s^2,這裏先不改了,原諒我偷下懶。

4 總結

由於時間精力有限:

  • 沒有測試kalibr_allan工具(https://github.com/rpng/kalibr_allan)的性能
  • 沒有做提升作業
  • 對艾倫方差的理解還不夠深入
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章