【項目實戰】自備相機+IMU跑通Vins-Mono記錄

前言

初次接觸SLAM,公司要求用自己的設備來跑通vinsmono這個程序,雖然已經跑通了別人的數據包,但是真正自己上手來運行這個程序,發現真的是困難重重,特意在此記載下來整個過程,以供大家參考。
我這邊使用的設備如下:

  • 相機:公司給的傑銳微通的一款HF890
  • IMU: 公司給的LPMS-IG1
  • 系統:ubuntu18.04
  • 電腦:暗夜精靈5

相機標定

啟動相機、安裝標定軟件

首先我們要對手上的攝像頭進行標定,這個就無關無牌子了,除非你是D345i這樣的大牌子。
首先usb接上電腦,我們使用官方的 uvc_camera 包讀取相機。

rosdep install camera_calibration

為了單目相機通過ROS發佈圖像。讓我們列出主題以檢查圖像是否已發佈:

rostopic list

然後開始注意了,這裡是我踩的第一個坑!一定要看自己的rostopic list對應的話題是什麼,不然後面指令是找不到的
/相機名稱/info
/相機名稱/image_raw
然後運行

###對相機進行標定
rosrun camera_calibration cameracalibrator.py --size 8x6(填你標定布的大小) --square 0.108(填你標定布格子 的長度,以米為單位) image:=/camera/image_raw(注意,這裡要填你的相機話題!) camera(這裡也是!):=/camera

需要注意我這裡使用的標定板為 GP400-12×9 的,所以這裡的 size 為 11×8, (為什麼不是 12×9 參考官網鏈接),square 為 0.03
然後就開始標定了,如果你的參數輸入沒有問題的話,是可以讀到你的標定板每個方格的小點的

具體標定方法就是拿着標定板放在相機視野內,標定板上出現彩色線條則為有效圖像,反之無效,需要調整標定板位置。
分別在左右移動(X),直到標定界面上X下方的精度條為綠色,然後依次在上下(Y),遠近(Size),傾斜(Skew)方向移動,移動過程盡量緩慢,避免大幅度的移動使相機成像產生拖影。持續移動直到所有的進度條都為綠色
當所有進度條都變成綠色後,CALIBRATE按鈕由灰色變成深綠色,點擊CALIBRATE,點擊一下後,界面會卡住,此時不要做任何操作,直到運行標定程序的終端輸出標定的結果,大概是這樣的。
這個時候你可能會卡住,就是程序突然無響應了,我找了好久才找到一個辦法,就是

$ rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 --approximate=0.01 right:=/my_stereo/right/image_raw left:=/my_stereo/left/image_raw right_camera:=/my_stereo/right left_camera:=/my_stereo/left

加入了一行這個–approximate=0.01參數,我也不知道是不是這個東西起的作用,畢竟我還重啟了一遍電腦
至此相機就標定完畢了
點擊標定界面的SAVE按鈕,標定結果保存在/tmp/calibrationdata.tar.gz這個壓縮包中,打開標定結果的壓縮包,裏面大概是這些內容,最後一個yaml文件就是我們需要的標定結果。

IMU標定

安裝imu_utils

這是最讓我裂開的一個地方,因為他所需要的code_utils這個包和我用的傳感器驅動下載都花了好大力氣才搞好
1: 安裝ceres庫

sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3.1.2 libgflags-dev 
sudo apt-get install libgoogle-glog-dev libgtest-dev

下載編譯 ceres-solver

git clone //github.com/ceres-solver/ceres-solver.git
cd ceres-solver
mkdir build
cd build
cmake ..
make 
sudo make install
  1. 安裝 code_utils
mkdir -p ~/kalibr_workspace/src
cd ~/kalibr_workspace
catkin_make

然後

sudo apt-get install libdw-dev
cd src
git clone //github.com/gaowenliang/code_utils.git

這裡有兩個大坑
首先是要把src/code_utils/src/sumpixel_test.cpp中的#include "backward.hpp"改為#include 「code_utils/backward.hpp」
然後我照着這個做了,catkin_make給我報錯

In file included from /home/lugendary/kalibr_workspace/src/code_utils/src/cv_utils/dlt/dlt.cpp:1:0:
/home/lugendary/kalibr_workspace/src/code_utils/include/code_utils/cv_utils/dlt/dlt.h:15:21: error: 『vector』 in namespace 『std』 does not name a template type
DLT( const std::vector< Eigen::Vector3d >& pts_2, const std::vector< Eigen::Vector3d >& pts_3 );

一大串,我找遍全網也沒有老哥告訴我解決辦法,最後我打開了clion裏面,在哪個文件里用糾錯功能一鍵引用了缺少的庫,解決問題,編譯成功

cd ..
catkin_make

這個時候就可以在src下面安裝imu_utils

cd kalibr_workspace/src
git clone //github.com/gaowenliang/imu_utils.git
cd ..
catkin_make

標定的工具搞完了,現在就要啟動我們的IMU了

啟動IMU

首先建立一個工作空間openzen_ws/src

mkdir -p openzen_ws/src

然後就是坑了,我按照要求進入工作空間,通過git獲取安裝包

cd openzen/src
git clone --recurse-submodules //bitbucket.org/lpresearch/openzenros.git

但是openzenros文件裏面的東西我死活下載不到,不管是zip下載還是克隆都沒辦法
最後我直接在wiki上面

apt install ros-melodic-openzen-sensor

安裝了,然後IMU通過USB 和電腦連接,給串口權限(你的傳感器叫什麼你可以通過dev下面的文件中,插拔一下imu看tty那個文件變換了)

sudo chmod 777 /dev/ttyUSB0

在新的命令行窗口運行roscore後,在工作空間下運行驅動

source devel/setup.bash
rosrun openzen_sensor openzen_sensor_node

發佈的話題節點為/imu/data,通過以下命令查看話題消息

rostopic echo /imu/data

如果一直出數據,就沒問題了

錄製IMU數據集

接著錄制IMU數據集
靜止情況下採集IMU的數據,並錄製為ROS包,我採集的時間為2小時20分鐘。

rosbag record /imu/data -O imu_xsens.bag

標定IMU

修改你之前下載標定工具那個東西的src/imu_utils/launch/文件夾下的A3.launch文件中的話題,改成名為/imu/data
運行標定工具

cd 你的標定工具的工作空間
source devel/setup.bash
roslaunch imu_utils A3.launch

然後倍速回放bag包,我的bag包名字直接搜索.bag定位到文件夾然後找到的

rosbag play -r 200 imu.bag

標定完退出,搜索A3_imu,就找到yaml在哪裡了,這裡我用的是xsens_imu_param.yaml

配置YAML文件

然後接下來就是所使用我們的標定數據了,首先要改vins代碼中的yaml數據,為了防止填寫格式出問題導致bug,我就直接在config下面的realsense裏面修改realsense_color_config.yaml文件了

填寫相機標定參數

啟動相機和IMU節點,用rostopic來查看話題,
先修改這些參數

然後把相機的yaml文件裏面的相機的內參矩陣

按照

填入projection_parameters:這個參數
然後把

填入distortion_parameters。

填寫IMU標定參數

然後打開 IMU的標定yaml,

把所有的avg項目按需填入

其他參數的填寫

至於這個yaml其他的參數填什麼就看你自己的需求了,可以配合這篇文章學習修改
//zhuanlan.zhihu.com/p/533106355
因為大多數內容無需太多修改(注意個別文件輸出位置),這裡就不多加贅述了

運行Vins-mono

至此我們的工作就全部做完了,現在我們來運行我們的vins-mono!
首先在ros要打開你的相機和imu,打開rostopic list確保他們都在運行(方法上面已經給過了)
然後進入工作空間啟動ros

source ./devel/setup.bash
roslaunch vins_estimator realsense_color.launch
roslaunch vins_estimator vins_rviz.launch //打開rviz查看


大功告成!

參考鏈接