SVO pro 编译运行

编译

安装ROS

小鱼一键安装ROS

安装依赖

Install catkin tools and vcstools

# For Ubuntu 18.04 + Melodic
sudo apt-get install python-catkin-tools python-vcstool
# For Ubuntu 20.04 + Noetic
sudo apt-get install python3-catkin-tools python3-vcstool python3-osrf-pycommon

Install system dependencies and dependencies for Ceres Solver

# system dep.
sudo apt-get install libglew-dev libopencv-dev libyaml-cpp-dev 
# Ceres dep.
sudo apt-get install libblas-dev liblapack-dev libsuitesparse-dev

下载和编译

mkdir svo_ws && cd svo_ws
# see below for the reason for specifying the eigen path
catkin config --init --mkdirs --extend /opt/ros/<ROS-DISTRO> --cmake-args -DCMAKE_BUILD_TYPE=Release -DEIGEN3_INCLUDE_DIR=/usr/include/eigen3
cd src
git clone https://github.com/uzh-rpg/rpg_svo_pro_open.git
vcs-import < ./rpg_svo_pro_open/dependencies.yaml
touch minkindr/minkindr_python/CATKIN_IGNORE
# vocabulary for place recognition
cd rpg_svo_pro_open/svo_online_loopclosing/vocabularies && ./download_voc.sh
cd ../../..
  • –extend /opt/ros/:将ROS系统的安装路径作为catkin工作空间的基础路径,以便使用ROS中已经安装的软件包和依赖项。ROS-DISTRO=melodic(18.04)/noetic(20.04)
  • -DEIGEN3_INCLUDE_DIR=/usr/include/eigen3:指定Eigen库的安装路径,以便CMake可以正确地找到和链接该库
  • vcs-import:使用vcs-import工具,根据指定的YAML文件(./rpg_svo_pro_open/dependencies.yaml),下载和导入所有依赖项。
  • CATKIN_IGNORE文件:是ROS中的一种特殊文件,用于告诉catkin构建系统忽略该目录中的软件包,不要将其包含在构建中。
  • download_voc.sh:下载并解压词袋
wget http://rpg.ifi.uzh.ch/svo2/vocabularies.tar.gz -O - | tar -xz

这里有两种构建类型可供选择

  • 不使用全局地图的构建(前端 + 滑动窗口后端 + 回环检测 / 位姿图优化):
    catkin build
    
  • 使用iSAM2构建带有全局地图的版本(包括所有功能)。
    1. 首先,启用全局地图功能:
    rm rpg_svo_pro_open/svo_global_map/CATKIN_IGNORE
    
    1. 然后在svo_cmake/cmake/Modules/SvoSetup.cmake添加
    SET(USE_GLOBAL_MAP TRUE)
    
    1. 下载GTSAM
    git clone --branch 4.0.3 git@github.com:borglab/gtsam.git
    
    1. 同时修改一下GTSAM的编译标志
    # 1. gtsam/CMakelists.txt: use system Eigen
    -option(GTSAM_USE_SYSTEM_EIGEN "Find and use system-installed Eigen. If 'off', use the one bundled with GTSAM" OFF)
    +option(GTSAM_USE_SYSTEM_EIGEN "Find and use system-installed Eigen. If 'off', use the one bundled with GTSAM" ON)
    # 2. gtsam/cmake/GtsamBuildTypes: disable avx instruction set(禁用avx指令)
    # below the line `list_append_cache(GTSAM_COMPILE_OPTIONS_PUBLIC "-march=native")`
    list_append_cache(GTSAM_COMPILE_OPTIONS_PUBLIC "-mno-avx")
    
    使用相同版本的Eigen有助于避免内存问题。根据我们的经验,禁用avx指令集也有助于解决一些段错误(这可能取决于操作系统和硬件)。
    5. 最后catkin build

运行代码

1、运行视觉前端

source ~/svo_ws/devel/setup.bash
roslaunch svo_ros run_from_bag.launch cam_name:=svo_test_pinhole
rosbag play airground_rig_s3_2013-03-18_21-38-48.bag    #在bag目录下

airground_rig_s3_2013-03-18_21-38-48.bag下载链接

如果跑鱼眼相机模型的数据,需要修改run_from_bag.launch配置文件中:

<!-- <rosparam file="$(find svo_ros)/param/pinhole.yaml" /> -->
<rosparam file="$(find svo_ros)/param/fisheye.yaml" />

然后运行

roslaunch svo_ros run_from_bag.launch cam_name:=bluefox_25000826_fisheye

2、运行前端VIO模式

roslaunch svo_ros euroc_mono_frontend_imu.launch
roslaunch svo_ros euroc_stereo_frontend_imu.launch

这些启动文件从param/euroc_mono_imu.yamlparam/euroc_stereo_imu.yaml读取参数。这些参数不一定对每个序列都是最优的,但足以作为一个良好的起点。
许多EuRoC序列的前几个图像对于初始化SVO来说并不理想,特别是对于单目情况。因此,最好从较晚的时间开始播放数据包,例如:

rosbag play MH_01_easy.bag -s 50
rosbag play MH_02_easy.bag -s 45
rosbag play V1_01_easy.bag
rosbag play V1_02_medium.bag -s 13
rosbag play V2_01_easy.bag
rosbag play V2_02_medium.bag -s 13

这是为了避免在单目初始化时出现强烈的旋转等情况。

3、SVO与stereo设置和IMU设置

从http://rpg.ifi.uzh.ch/datasets/fla_stereo_imu.bag下载数据集。这个包文件包含同步stereo图像和IMU测量。你可以在这个包上运行SVO

roslaunch svo_ros fla_stereo_imu.launch
rosbag play fl_stereo_imu .bag

用于stereo相机的校准文件,指定IMU噪声特性和初始值,(例如param/calib/fla_stereo_imu.yaml)如下所示:

cameras:
    - camera:
        <distortion and intrinsics>
      T_B_C:
        cols: 4
        rows: 4
        data: [0.99984983, -0.00373198,  0.01692284,  -0.074783895,
               0.00403133,  0.9998354 , -0.01768969,  -0.0005     ,
              -0.01685403,  0.01775525,  0.9997003 ,  -0.0041,
               0.        ,  0.        ,  0.        ,  1.        ]
        <......>
    - camera:
        distortion:
          <distortion and intrinsics>
      T_B_C:
        cols: 4
        rows: 4
        data: [0.99746136, -0.00394329, -0.07110054, 0.074783895,
               0.00236645,  0.99974967, -0.02224833, 0.0005,
               0.07117047,  0.02202359,  0.997221  , 0.0041,
               0.        ,  0.        ,  0.        ,  1.       ]
      <......>
    label: fla_forward_stereo

imu_params:
      delay_imu_cam: 0.0
      max_imu_delta_t: 0.01
      acc_max: 176.0
      omega_max: 7.8
      sigma_omega_c: 0.005     					#角速度噪声
      sigma_acc_c: 0.01							#加速度噪声
      sigma_omega_bias_c: 4.0e-6				#角速度偏置
      sigma_acc_bias_c: 0.0002					#加速度偏置
      sigma_integration: 0.0
      g: 9.81007
      imu_rate: 200.0
    
    imu_initialization:
      velocity: [0, 0, 0]
      omega_bias: [0, 0, 0]
      acc_bias: [0, 0, 0]
      velocity_sigma: 0.5
      omega_bias_sigma: 0.005
      acc_bias_sigma: 0.05

提供了一个脚本(scripts/kalibr_to_svo.py),用于将Kalibr的输出转换为svo格式
需要在启动文件(例如launch/fla_stereo_imu.launch)中指定相机和IMU的话题,如下所示:

    <param name="cam0_topic" value="/sync/cam0/image_raw" type="str" />
    <param name="cam1_topic" value="/sync/cam1/image_raw" type="str" />
    <param name="imu_topic" value="/sync/imu/imu" type="str" />

要使用立体视觉(stereo),您需要在参数文件中指定以下内容:

    pipeline_is_stereo: True
    automatic_reinitialization: True # When lost, stereo can recover immediately
    
    max_depth_inv: 0.05   #这些参数会影响三角测量的极线搜索范围。
    min_depth_inv: 2.0
    mean_depth_inv: 0.3
    
    use_async_reprojectors: True   #使用多线程来进行特征的重新投影。
    
    use_imu: True
    #prior lambdas的值越高,IMU先验的权重就越大。如果您的IMU性能良好,可以将它们设置得更高
    #在不使用IMU时,请将prior lambdas的值设置为零
	img_align_prior_lambda_rot: 5.0 # 稀疏图像对齐中的陀螺仪先验
	poseoptim_prior_lambda: 2.0 # 姿态优化中的陀螺仪先验
	
	img_align_max_level: 5 # 粗精优化过程中的金字塔最大级别
	n_pyr_levels: 4 # 对于大尺寸图像,创建更多的金字塔级别,通常为图像对齐最大级别减一

	grid_size: 50 # 对于较大的图像,使用更大的网格进行特征分桶
	poseoptim_thresh: 3.0 # 像素级别的异常值阈值,对于较大的图像应设置更高的阈值

	init_min_disparity: 30 # 单目初始化的最小视差,对于较大的图像应设置更高的值

遇到的问题

1、运行catkin build时

CMake Error at /opt/ros/melodic/share/catkin/cmake/empy.cmake:29 (message):
  Unable to find either executable 'empy' or Python module 'em'...  try
  installing the package 'python-empy'

解决方法:catkin build -DPYTHON_EXECUTABLE=/usr/bin/python3

2、dbow2_catkin

在开始编译之前,可以发现src/dbow2_catkin/CmakeList.txt中这样写道(修改git地址):

ExternalProject_Add(dbow2_src
  # GIT_REPOSITORY git@github.com:dorian3d/DBoW2.git
  GIT_REPOSITORY https://github.com/dorian3d/DBoW2.git
  CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CATKIN_DEVEL_PREFIX}
  BUILD_COMMAND CXXFLAGS=-i${CATKIN_DEVEL_PREFIX}/include make
  INSTALL_COMMAND make install
)

如果改了链接还是下载失败,自己去github上下载然后解压到svo_ws/build/dbow2_catkin/dbow2_src-prefix/src路径下,就实现了对上面这个指令的人工替换。放进去后,注释掉GIT_REPOSITORY这一行就可以编译了

3、YAML-cpp 冲突问题

catkin build 遇到:对‘yaml::detail::node_data::empty_scalar[abi:cxx11]’未定义的引用

发现是因为ros本身自带一个yaml-cpp,自己本地离线编译了一个,导致出现的错误,把离线编译的删除掉即可。

4、与OpenCV相关的编译/链接错误

在每个软件包的CMakeLists.txt文件中(在rpg_commonsvo_rossvo_directvikit/vikit_commonsvo_online_loopclosing中)查找find_package(OpenCV REQUIRED),并将其替换为:

# Ubuntu 18.04 + Melodic
find_package(OpenCV 3 REQUIRED)
# Ubuntu 20.04 + Noetic
find_package(OpenCV 4 REQUIRED)

5、Eigen版本不一致的问题

整个项目应使用相同的Eigen版本(应为系统Eigen,因为我们还使用了ROS)。检查eigen_catkingtsam是否找到相同版本的Eigen

#对于eigen_catkin
catkin build eigen_catkin --force-cmake --verbose
#对于gtsam
catkin build gtsam --force-cmake --verbose

在项目中使用Eigen的一个常见陷阱是不同的库使用不同版本的Eigen进行编译。对于SVO,使用eigen_catkin(https://github.com/ethz-asl/eigen_catkin)来保持Eigen版本的一致性,应该是系统版本(位于/ usr / include)在18.04和20.04上。对于GTSAM,通过自定义的cmake文件(https://github.com/borglab/gtsam/blob/develop/cmake/FindEigen3.cmake#L66)找到系统Eigen。它首先搜索/usr/local/include,其中可能包含手动安装的Eigen版本。因此,在配置工作区时,我们明确指定了EIGEN_INCLUDE_PATH以强制GTSAM找到系统Eigen。如果仍然遇到不一致的Eigen版本,请首先检查是否仍在使用不同版本的Eigen。

代码框架

1、特征跟踪部分

1.1、特征点检测

processFirstFrame()-->addFrameBundle()-->trackFeaturesAndCheckDisparity()-->FeatureTracker::initializeNewTracks()
第一帧需要提取新的特征点以提供后续特征跟踪计算,提取新Feature时使用了svo_tracker中的initializeNewTracks(),其使用了svo_direct中的feature_detection.h的检测功能函数detect(),有如下几种提取算法可选:

  • FastDetector
  • GradientDetector
  • GradientDetectorGrid
  • FastGradDetector
  • ShiTomasiGradDetector
  • ShiTomasiDetector
  • AllPixelsDetector
  • GradientHuangMumfordDetecto
  • CannyDetector
  • SobelDetector

对于该Frame新提取的Feature会创建对应的FeatureTrack

1.2、特征跟踪点组织与管理

在代码中我们主要分析trackFrameBundle()这个函数,涉及到跟踪点的组织与管理相关的变量如:FeatureTrack、FeatureTracks 、activetracks 。在SVO pro中是支持多目模式的,如图1,在每个FrameBundle 中可能存储有单目、双目或者多目的frame数据,每一目都有存储当前跟踪的多条FeatureTrack即n个特征点id、n个new_score、n个new_keypoint.
在这里插入图片描述
在跟踪过程中使用的是feature_alignment::alignPyr2d()方法遍历一个FeatureTracks中的每一条FeatureTrack,该方法有两种结果返回:

  • 跟踪成功,当前Frame中的FeatureTracks会给特征点ids、new_scoresnew_keypoints对应的索引下赋值
  • 跟踪失败,会将FeatureTrack该放入待删除特征的容器里,并存入终止跟踪的特征容器里,在之后会删除掉从而保留有效的跟踪FeatureTrack

在每一目处理过程中,还会使用computeNormalizedBearingVectors(),通过该目内参来将像素坐标转为单位球上(归一化平面上的点)的坐标来进行后续的计算。另外注意在initializeNewTracks()中使用Detector工具新提取的特征也会转为单位球面上的坐标存储到FrameBearings对象中。

2、双目初始化流程及极线搜索匹配

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值