ubuntu18.04+VINS-MONO+RealsenseD453i 配置教程

VINS-MONO

主要参考链接:
Ubuntu18配置VINS-MONO

初始配置:
ubuntu18.04+cmake+engine

1. ROS配置

ROS官方安装教程

前面的主要参考链接用的是16.04下的kinetic内核,20.04用的是Neotic内核,我用的是18.04下的melodic内核,所以使用官方教程

2. opencv配置

根据mono的建议,cv版本用的是opencv-3.3.1opencv-contrib-3.3.1

location: ~/library/opencv-3.3.1

后续根据参考链接完成编译。

进行opencv的编译环境配置:

1
sudo apt-get install build-essential libgtk2.0-dev libvtk6-dev libjpeg-dev libtiff4-dev libjasper-dev libopenexr-dev libtbb-dev

注意,opencv的依赖包虽然是参考SLAM十四讲,但是由于版本区别,有的包要装升级后的版本,比如书里是libvtk5-dev,而我们需要装6

3. 安装Ceres库

Ceres solver 是谷歌开发的一款用于非线性优化的库,在谷歌的开源激光雷达slam项目cartographer中被大量使用

首先,安装依赖

1
2
3
4
5
sudo apt-get install liblapack-dev 
sudo apt-get install libsuitesparse-dev
sudo apt-get install libcxsparse3.1.2
sudo apt-get install libgflags-dev
sudo apt-get install libgoogle-glog-dev libgtest-dev

如果有的包无法定位,可能是因为更换了版本名,https://packages.ubuntu.com/ Search package directories搜一下keyword,注意与当前ubuntu版本对应;也可以参考无法定位lib3.1.2,我用的第二种方法

然后,下载Ceres

我下的是cere2.0.0,解压后location: ~/library/ceres-solver-2.0.0

进入目录下编译ceres:

1
2
3
4
mkdir build
cd build
cmake ..
sudo make install

4. VINS-MONO编译

VINS-MONO,2017年港科老师开源的一个单目视觉惯导的实时SLAM方案,是视觉与IMU的经典融合,定位精度可以媲美OKVIS,在Linux上运行,并与ROS完全集成。

该算法基于优化和滑动窗口的 VIO ,使用 IMU 预积分构建紧耦合框架,同时还有自动初始化,在线外参标定,重定位,闭环检测,以及全局位姿图优化功能。

  • 准备数据

首先下载EuRoC数据集,该数据集是微型飞行器 (MAV) 上收集的视觉惯性数据集。数据集包含立体图像、同步 IMU 测量以及精确的运动和结构地面实况。

我下的是Machine Hall 01 (ROS bag)用来测试,location: ~/DATA/VINS-MONO/MH_01_easy.bag

此外还要下载VINS-MONO代码

  • 创建ROS工作空间

    1
    2
    3
    mkdir -p ~/catkin_ws/src              
    cd ~/catkin_ws/src
    catkin_init_workspace
  • 编译VINS

将前面下载的Vins-mono的代码移动到~/catkin_ws/src文件夹下。

编译:

1
2
3
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash
  • 修改配置文件内容在VINS-Mono-master主工程目录下的config子目录中找到euroc文件夹,并打开其中的euroc_config.yaml文件,将其中结果输出保存路径修改为本地的绝对路径或相对路径
    1
    2
    output_path: "/home/yj/HZL/VINS-MONO-REALSENSE/output/"
    pose_graph_save_path: "/home/yj/HZL/VINS-MONO-REALSENSE/output/pose_graph/"
  • 修改source如果每次运行前需要都需要用source来指定文件位置未免太麻烦,可以直接在.bashrc中添加source
    1
    sudo  gedit ~/.bashrc
    在.bashrc中加上:
    1
    source ~/catkin_ws/devel/setup.bash
  • 运行
    • 1号终端启动ROS核心:
      1
      roscore
    • 2号终端:
      1
      roslaunch vins_estimator euroc.launch
    • 3号终端启动rviz软件
      1
      roslaunch vins_estimator vins_rviz.launch
    • 4号终端输入数据:注意把数据包地址改成自己的
      1
      rosbag play /home/yj/DATA/VINS-MONO/MH_01_easy.bag 

使用Realsense D453i运行VINS-MONO

参考链接

1. 安装librealsense SDK 2.0

v2.48.0

官方指南

librealsense SDK相当于相机的驱动,D435i是librealsense SDK 2.0;SDK的安装方式有两种,一是从源码编译安装,二是直接命令行安装,官方指南的公钥法用的2。

我装的是librealsense SDK v2.48.0,支持18.04

测试:

1
realsense-viewer

注意:使用3.0的usb口

2. 安装测试realsense相机对应的ROS包

官方指南
(用的是指南里的realsense distribution方案)

进入ros空间:

1
2
3
4
cd ~/catkin_ws/src
git clone https://github.com/IntelRealSense/realsense-ros.git
cd realsense-ros/
git checkout `git tag | sort -V | grep -P "^2.\d+\.\d+" | tail -1`

补一些依赖:

1
2
3
mkdir -p ~/catkin_ws/src/realsense
rosdep install --from-paths src --ignore-src -r -y # 这步第二次安装的时候失败
sudo apt purge ros-melodic-librealsense2

继续安装:

1
2
3
4
cd ~/catkin_ws
catkin_make clean
catkin_make -DCATKIN_ENABLE_TESTING=False -DCMAKE_BUILD_TYPE=Release
catkin_make install
  • 出现报错,原因是缺少ddynamic_reconfigure,解决方案是从这里将其下载,克隆到工作区~/catkin_ws/src/

.bashrc

1
2
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

运行rviz:

  • 1号终端启动ROS核心:
    1
    roscore
  • 2号终端:
    1
    rosrun rviz rviz
    运行realsense:
    1
    roslaunch realsense2_camera rs_camera.launch filters:=pointcloud
    这时候应该无图像,需要在rviz中修改一些配置,当然配置有很多选择,对于新手来说有图就行orz,以下只是举个例子:
  • 把fixed frame改成camera_...,不能是map,Global Status由红色变绿
  • Add -> 上方点击 By topic -> /depth_registered 下的 /points 下的/PointCloud2,这是针对上面命令中filters:=pointcloud部分选择的type
  • Add -> 上方点击 By topic -> /color 下的 /image_raw 下的image

3. 在D453i上运行VINS-MONO

这里建议先把catkin_ws备份一下
参考链接0
参考链接1
参考链接2

1)修改rs_camera.launch文件

location:~/catkin_ws/src/realsense-ros/realsense2_camera/launch

  • 修改unite_imu_method如下,这里是让IMU的角速度和加速度作为一个topic输出
    1
    <arg name="unite_imu_method"      default="copy"/>
  • 修改enable_sync参数为true,这里是开启相机和IMU的同步
    1
    <arg name="enable_sync"           default="true"/>
  • 打开陀螺仪和加速度计
    1
    2
    <arg name="enable_gyro"         default="true"/>
    <arg name="enable_accel" default="true"/>

    2)修改realsense_color_config.yaml文件

location:~/catkin_ws/src/VINS-Mono-master/config/realsense/realsense_color_config.yaml

  • 修改订阅的topic
    1
    2
    3
    4
    5
    imu_topic: "/camera/imu"
    image_topic: "/camera/color/image_raw"
    output_path: "/home/yj/HZL/VINS-MONO-REALSENSE/output/" #自己的地址

    pose_graph_save_path: "/home/yj/HZL/VINS-MONO-REALSENSE/output/pose_graph/"
  • 修改相机的内参
    指南
    1
    rostopic echo /camera/color/camera_info #查看内参命令
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    #camera calibration 
    model_type: PINHOLE
    camera_name: camera
    image_width: 1280
    image_height: 720
    distortion_parameters:
    k1: 0 #9.2615504465028850e-02
    k2: 0 #-1.8082438825995681e-01
    p1: 0 #-6.5484100374765971e-04
    p2: 0 #-3.5829351558557421e-04
    projection_parameters:
    fx: 9.194400024414062e+02 #6.0970550296798035e+02
    fy: 9.189413452148438e+02 #6.0909579671294716e+02
    cx: 6.383787841796875e+02 #3.1916667152289227e+02
    cy: 3.5089337158203125e+02 #2.3558360480225772e+02
  • IMU到相机的变换矩阵,这里我根据注释的提示修改成2

初始为0,选0的话,IMU和camera之间的外参矩阵建议使用Kalibr工具进行离线标定,也可以改成1或者2让估计器自己标定和优化。

1
2
3
4
5
6
# Extrinsic parameter between IMU and Camera.
estimate_extrinsic: 2
# 0 Have an accurate extrinsic parameters. We will trust the following imu^R_cam, imu^T_cam, don't change it.
# 1 Have an initial guess about extrinsic parameters. We will optimize around your initial guess.
# 2 Don't know anything about extrinsic parameters. You don't need to give R,T. We will try to calibrate it. Do some rotation movement at beginning.
# If you choose 0 or 1, you should write down the following matrix.
  • IMU参数,这里我全部修改注释给的参数
    1
    2
    3
    4
    5
    6
    #imu parameters       The more accurate parameters you provide, the better performance
    acc_n: 0.2 # accelerometer measurement noise standard deviation. #0.2
    gyr_n: 0.05 # gyroscope measurement noise standard deviation. #0.05
    acc_w: 0.02 # accelerometer bias random work noise standard deviation. #0.02
    gyr_w: 4.0e-5 # gyroscope bias random work noise standard deviation. #4.0e-5
    g_norm: 9.80 # gravity magnitude
  • 是否需要在线估计同步时差,根据上述博主的建议这里选择不需要
    1
    2
    3
    #unsynchronization parameters
    estimate_td: 0 # online estimate time offset between camera and imu
    td: 0.000 # initial value of time offset. unit: s. readed image clock + td = real image clock (IMU clock)
  • 相机曝光改成全局曝光
    1
    2
    3
    #rolling shutter parameters
    rolling_shutter: 0 # 0: global shutter camera, 1: rolling shutter camera
    rolling_shutter_tr: 0 # unit: s. rolling shutter read out time per frame (from data sheet).

    3)运行

    1
    2
    3
    4
    roscore
    roslaunch realsense2_camera rs_camera.launch #启动realsense驱动sdk,输出相应图像和IMU话题
    roslaunch vins_estimator realsense_color.launch #启动vins-mono,数据来源是相机
    roslaunch vins_estimator vins_rviz.launch #启动rviz界面
    在global option里把word改成camera_link

问题:

不显示特征点和轨迹,报错如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[ INFO] [1629687186.636584239]: init begins
[ INFO] [1629687186.672642097]: Loaded config_file: /home/yj/catkin_ws/src/VINS-Mono-master/feature_tracker/../config/realsense/realsense_color_config.yaml
vocabulary_file/home/yj/catkin_ws/src/VINS-Mono-master/pose_graph/../support_files/brief_k10L6.bin
result path /home/yj/HZL/VINS-MONO-REALSENSE/output//vins_result_no_loop.csv
[ INFO] [1629687186.683639120]: ROW: 480.000000 COL: 640.000000
[ WARN] [1629687186.683652444]: have no prior about extrinsic param, calibrate extrinsic param

[ INFO] [1629688187.806394607]: Synchronized sensors, fix time offset: 0
[ WARN] [1629688187.806432117]: waiting for image and imu...
vocabulary_file/home/yj/catkin_ws/src/VINS-Mono-master/pose_graph/../support_files/brief_k10L6.bin
loop start load vocabulary
BRIEF_PATTERN_FILE/home/yj/catkin_ws/src/VINS-Mono-master/pose_graph/../support_files/brief_pattern.yml
no previous pose graph
OpenCV Error: Assertion failed (_mask.empty() || (_mask.type() == CV_8UC1 && _mask.sameSize(_image))) in goodFeaturesToTrack, file /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/imgproc/src/featureselect.cpp, line 366
terminate called after throwing an instance of 'cv::Exception'
what(): /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/imgproc/src/featureselect.cpp:366: error: (-215) _mask.empty() || (_mask.type() == CV_8UC1 && _mask.sameSize(_image)) in function goodFeaturesToTrack

[feature_tracker-1] process has died [pid 1331, exit code -6, cmd /home/yj/catkin_ws/devel/lib/feature_tracker/feature_tracker __name:=feature_tracker __log:=/home/yj/.ros/log/8f26fcba-03bf-11ec-9c16-b07b250c6f90/feature_tracker-1.log].
log file: /home/yj/.ros/log/8f26fcba-03bf-11ec-9c16-b07b250c6f90/feature_tracker-1*.log

解决策略:

  • 第一次跑的时候没配置opencv,现在补充配置opencv,按照《高翔SLAM》p108中的配置安装依赖包(这部分已补充在上文),以下是安装以上依赖时附带安装的依赖,仅作为记录,不作为参考:

    1
    sudo apt-get install build-essential libopenmpi1.6 libvtk5.8 mpi-default-dev
  • 还是不显示,参考链接,发现是相机参数未同步的原因:

    最终解决方案:除了要在上述的realsense_color_config.yaml中修改相机参数,还需要在/home/yj/catkin_ws/src/VINS-Mono-master/config/euroc/euroc_config.yaml文件中修改#camera calibration

    我的problem还有,在realsense_color_config.yaml中只修改了distortion_parametersprojection_parameters,而未修改分辨率(image_width: 1280, image_height: 720)

    • 查看相机内参指令(不同相机内参是不一样的):
    1
    2
    3
    roscore
    roslaunch realsense2_camera rs_camera.launch #打开相机节点
    rostopic echo /camera/color/camera_info #查看相机内参
  • Copyrights © 2021-2022 阿波罗猫

请我喝杯咖啡吧~

支付宝
微信