【cartographer_ros】七: 主要配置参数说明

人工智能72

上一节介绍了路标Landmark数据的订阅和发布,各类数据的发布和订阅基本阐述完毕。

本节会介绍cartographer的主要配置参数,研究这些参数的使用和对算法的影响。

首先还是得回到Ros运行demo(第二节)的launch脚本上。 launch脚本中可以看到demo所用的配置文件是 【backpack_2d.lua】
而backpack_2d.lua在一开始通过include语句加载了map_builder和trajectory_builder的配置:

    include "map_builder.lua"
    include "trajectory_builder.lua"

因此,从这两个配置文件开始。

[En]

So start with these two configuration files.

从名字可以看出【map_builder.lua】是对于类MapBuilder的参数配置。具体参数如下:

include "pose_graph.lua"

MAP_BUILDER = {
  use_trajectory_builder_2d = false,        --使用2d轨迹
  use_trajectory_builder_3d = false,        --使用3d轨迹
  num_background_threads = 4,               --核心线程数
  pose_graph = POSE_GRAPH,                  --位置图赋值
  collate_by_trajectory = false,            --是否根据轨迹构建修正器
}

【map_builder.lua 】中引入了 【pose_graph.lua】,【pose_graph.lua】是全局位姿优化。具体参数如下:

POSE_GRAPH = {
  optimize_every_n_nodes = 90,              --每次整体优化间隔nodes数
  constraint_builder = {
    sampling_ratio = 0.3,                   --全局约束采样比率(nodes)
    max_constraint_distance = 15.,          --全局约束最大间距(当前node与当前submap之间的距离)
    min_score = 0.55,                       --全局约束当前最小得分(当前node与当前submap的匹配得分)
    global_localization_min_score = 0.6,    --全局约束全局最小得分(当前node与全局submap的匹配得分)
    loop_closure_translation_weight = 1.1e4,--闭环检测平移权重
    loop_closure_rotation_weight = 1e5,     --闭环检测旋转权重
    log_matches = true,                     --是否打开直方图约束
    fast_correlative_scan_matcher = {
      linear_search_window = 7.,            --fast_CSM匹配搜索距离
      angular_search_window = math.rad(30.),--fast_CSM匹配搜索角度
      branch_and_bound_depth = 7,           --fast_CSM分支定界深度
    },
    ceres_scan_matcher = {
      occupied_space_weight = 20.,          --ceres_scan匹配占据空间权重
      translation_weight = 10.,             --ceres_scan匹配平移权重
      rotation_weight = 1.,                 --ceres_scan匹配旋转权重
      ceres_solver_options = {
        use_nonmonotonic_steps = true,      --是否使用梯度下降策略
        max_num_iterations = 10,            --最大迭代次数
        num_threads = 1,                    --使用线程数
      },
    },
    fast_correlative_scan_matcher_3d = {
      branch_and_bound_depth = 8,
      full_resolution_depth = 3,
      min_rotational_score = 0.77,
      min_low_resolution_score = 0.55,
      linear_xy_search_window = 5.,
      linear_z_search_window = 1.,
      angular_search_window = math.rad(15.),
    },
    ceres_scan_matcher_3d = {
      occupied_space_weight_0 = 5.,
      occupied_space_weight_1 = 30.,
      translation_weight = 10.,
      rotation_weight = 1.,
      only_optimize_yaw = false,
      ceres_solver_options = {
        use_nonmonotonic_steps = false,
        max_num_iterations = 10,
        num_threads = 1,
      },
    },
  },
  matcher_translation_weight = 5e2,         --匹配平移约束(当前submap与在当前submap内的某个node)
  matcher_rotation_weight = 1.6e3,          --匹配旋转约束(当前submap与在当前submap内的某个node)
  optimization_problem = {
    huber_scale = 1e1,                      --Huber因子(与离群值(错误的数据)对整体的影响正相关)。
    acceleration_weight = 1e3,              --IMU加速度的权重
    rotation_weight = 3e5,                  --IMU旋转项的权重
    local_slam_pose_translation_weight = 1e5,   --平移约束权重(前后两个node之间的局部观测与全局优化)
    local_slam_pose_rotation_weight = 1e5,  --旋转约束权重(前后两个node之间的局部观测与全局优化)
    odometry_translation_weight = 1e5,      --平移约束权重(前后两个node之阿的局部观测与里程计观测)
    odometry_rotation_weight = 1e5,         --旋转约束权重(前后两个node之阿的局部观测与里程计观测)
    fixed_frame_pose_translation_weight = 1e1,
    fixed_frame_pose_rotation_weight = 1e2,
    fixed_frame_pose_use_tolerant_loss = false,
    fixed_frame_pose_tolerant_loss_param_a = 1,
    fixed_frame_pose_tolerant_loss_param_b = 1,
    log_solver_summary = false,             --是否记录Ceres全局优化的结果
    use_online_imu_extrinsics_in_3d = true, --是否在线标定imu的外参
    fix_z_in_3d = false,
    ceres_solver_options = {
      use_nonmonotonic_steps = false,       --是否使用梯度下降策略
      max_num_iterations = 50,              --最大迭代次数
      num_threads = 7,                      --使用线程数
    },
  },
  max_num_final_iterations = 200,           --建图结束后最终优化迭代次数
  global_sampling_ratio = 0.003,            --全局地图匹配约束采样比率(nodes)
  log_residual_histograms = true,           --是否输出残差直方图
  global_constraint_search_after_n_seconds = 10.,   --全局匹配间隔时长
  --  overlapping_submaps_trimmer_2d = {
  --    fresh_submaps_count = 1,
  --    min_covered_area = 2,
  --    min_added_submaps_count = 5,
  --  },
}

从名字可以看出【trajectory_builder.lua】是对于类TrajectoryBuilder的参数配置。具体参数如下:

include "trajectory_builder_2d.lua"
include "trajectory_builder_3d.lua"

TRAJECTORY_BUILDER = {
  trajectory_builder_2d = TRAJECTORY_BUILDER_2D,        --2d轨迹赋值
  trajectory_builder_3d = TRAJECTORY_BUILDER_3D,        --3d轨迹赋值
--  pure_localization_trimmer = {
--    max_submaps_to_keep = 3,
--  },
  collate_fixed_frame = true,                           --是否通过固定帧修正
  collate_landmarks = false,                            --是否通过反光板修正
}

【trajectory_builder_2d.lua 】中引入了 【trajectory_builder_2d.lua】【trajectory_builder_3d.lua】,两个配置内容是大致类似的,但各自有些特有参数。这里主要说明2D轨迹的参数【trajectory_builder_2d.lua】。具体参数如下:

TRAJECTORY_BUILDER_2D = {
  use_imu_data = true,              --是否使用imu数据
  min_range = 0.,                   --激光的最近距离
  max_range = 30.,                  --激光的最远距离
  min_z = -0.8,                     --激光的最小高度
  max_z = 2.,                       --激光的最大高度
  missing_data_ray_length = 5.,     --激光的默认数值
  num_accumulated_range_data = 1,   --单个Node节点累积激光帧数
  voxel_filter_size = 0.025,        --激光的网格滤波大小

  adaptive_voxel_filter = {         --自适应滤波
    max_length = 0.5,               --网格滤波的大小
    min_num_points = 200,           --最小点云数据
    max_range = 50.,                --最远点云距离
  },

  loop_closure_adaptive_voxel_filter = { --闭环检测自适应滤波
    max_length = 0.9,
    min_num_points = 100,
    max_range = 50.,
  },

  use_online_correlative_scan_matching = false,     --是否使用CSM激光匹配
  real_time_correlative_scan_matcher = {            --快速CSN激光匹配
    linear_search_window = 0.1,                     --平移搜索范围
    angular_search_window = math.rad(20.),          --角度搜索范围
    translation_delta_cost_weight = 1e-1,           --平移代价权重
    rotation_delta_cost_weight = 1e-1,              --旋转代价权重
  },

  ceres_scan_matcher = {                            --ceres优化激光匹配
    occupied_space_weight = 1.,                     --占据空间权重
    translation_weight = 10.,                       --平移权重
    rotation_weight = 40.,                          --旋转权重
    ceres_solver_options = {
      use_nonmonotonic_steps = false,               --是否使用梯度下降策略
      max_num_iterations = 20,                      --最大迭代次数
      num_threads = 1,                              --使用线程数
    },
  },

  motion_filter = {                     --移动滤波
    max_time_seconds = 5.,              --2帧激光最小间隔
    max_distance_meters = 0.2,          --2帧激光最小距离
    max_angle_radians = math.rad(1.),   --2帧激光最小角度
  },

  -- TODO(schwoere,wohe): Remove this constant. This is only kept for ROS.

  imu_gravity_time_constant = 10.,      --imu的重力常数
  pose_extrapolator = {
    use_imu_based = false,              --是否使用3d初始化位姿预估器
    constant_velocity = {
      imu_gravity_time_constant = 10.,  --imu的重力常数
      pose_queue_duration = 0.001,      --位姿时间间隔
    },
    imu_based = {
      pose_queue_duration = 5.,         --位姿时间间隔
      gravity_constant = 9.806,         --重力常数
      pose_translation_weight = 1.,     --位姿偏移权重
      pose_rotation_weight = 1.,        --位姿旋转权重
      imu_acceleration_weight = 1.,     --IMU加速度权重
      imu_rotation_weight = 1.,         --IMU旋转权重
      odometry_translation_weight = 1., --里程计平移权重
      odometry_rotation_weight = 1.,    --里程计旋转权重
      solver_options = {
        use_nonmonotonic_steps = false;
        max_num_iterations = 10;
        num_threads = 1;
      },
    },
  },

  submaps = {
    num_range_data = 90,                --子图中Node的数量
    grid_options_2d = {
      grid_type = "PROBABILITY_GRID",   --概率栅格地图
      resolution = 0.05,                --分辨率
    },
    range_data_inserter = {
      range_data_inserter_type = "PROBABILITY_GRID_INSERTER_2D",
      probability_grid_range_data_inserter = {
        insert_free_space = true,       --是否改变改变占用网格中的概率。
        hit_probability = 0.55,         --hit(占用) 时的概率
        miss_probability = 0.49,        --miss(空闲) 时的概率
      },
      tsdf_range_data_inserter = {
        truncation_distance = 0.3,
        maximum_weight = 10.,
        update_free_space = false,
        normal_estimation_options = {
          num_normal_samples = 4,
          sample_radius = 0.5,
        },
        project_sdf_distance_to_scan_normal = true,
        update_weight_range_exponent = 0,
        update_weight_angle_scan_normal_to_ray_kernel_bandwidth = 0.5,
        update_weight_distance_cell_to_hit_kernel_bandwidth = 0.5,
      },
    },
  },
}

以上就是cartographer中的主要配置参数,这里只是简单的介绍说明,要更加深入的了解还需要到实际案例中使用或者查看其在代码中的功能作用。

【完】

下一节就结合demo案例一起说明,在Ros中使用这些参数时实际的配置及效果。

Original: https://www.cnblogs.com/CloudFlame/p/16443730.html
Author: CloudFlame
Title: 【cartographer_ros】七: 主要配置参数说明



相关阅读

Title: 【论文翻译】TANDEM: Tracking and Dense Mapping in Real-time using Deep Multi-view Stereo

原文链接:TANDEM: Tracking and Dense Mapping in Real-time using Deep Multi-view Stereo

文章目录

*
- 摘要
-
+
* 关键词:SLAM,稠密建图,多视点立体,深度学习
- 1. 介绍
-
+
* 本文贡献:
- 2. 相关工作
- 3. TANDEM
-
+ 3.1 视觉里程计
+ 3.2 CVA-MVSNet
+ 3.3 实验细节
- 4. 实验结果
-
+ 4.1 数据集
+ 4.2 相机位姿估计
+ 4.3 消融研究
+ 4.4 3D重建
- 5. 结论

摘要

在本文中,我们提出了一种实时单目跟踪和稠密建图框架TANDEM。对于姿态估计,TANDEM基于关键帧的滑动窗口光度BA(bundle adjustment)。为了提高鲁棒性,我们提出了一种新的前端跟踪,该前端使用根据稠密深度预测增量构建的全局模型渲染的深度图来执行稠密的直接图像对齐。为了预测稠密的深度图,提出了级联视图聚合MVSNet(CVA-MVSNet),它利用整个活动关键帧窗口,通过自适应视图聚合分层构建3D成本量来平衡关键帧之间不同的立体基线。最后,将预测的深度图融合为一致的全局图,以截断的带符号距离函数(truncated signed distance function,TSDF)体素网格表示。我们的实验表明,在相机跟踪方面,TANDEM优于其他最先进的传统和基于学习的单目视觉里程计(VO)方法。此外,TANDEM显示了最先进的实时3D重建性能。Code:https://github.com/tum-vision/tandem

关键词:SLAM,稠密建图,多视点立体,深度学习

1. 介绍

实时稠密建图是计算机视觉和机器人领域所面临的主要挑战之一,这个问题称为稠密SLAM,包括估计传感器的6自由度姿态估计和密集重建周围环境。虽然当前也存在许多工作良好且稳健的RGB-D建图方案[1,2,3],但单目相机的实时重建是一个更为困难的挑战,因为深度值不能简单地从传感器读取并融合。然而,这是一个非常重要地事情。因为与仅限于室内环境的RGB-D方案或者价格昂贵且较重型的LiDAR方法相比,单目方法具有显著的优势。
已经提出的几种基于深度神经网络(DNN)的方法,通过利用单目深度估计[5]、变分自动编码器[6,7,8]或端到端神经网络[9,10]来解决单目跟踪和密集建图任务。与上述工作不同,在本文中,我们提出了一种新的单目密集SLAM方法–TANDEM,该方法首次将基于学习的多视点立体(MVS)集成到传统的基于优化的VO中。这种新颖的稠密SLAM方案设计,显示了最先进的跟踪和稠密重建精度,且当该模型仅对合成数据进行训练时,其依然在具有挑战性的真实数据集上显示了强大的泛化能力。图1显示了由TANDEM在unseen序列上进行的3D重建。
【cartographer_ros】七: 主要配置参数说明

; 本文贡献:

  1. 一种新的单目实时稠密SLAM框架,无缝耦合经典的直接法VO和基于学习的MVS重建;
  2. 据我们所知,这是第一个利用全局TSDF模型渲染的深度来进行单目稠密前端跟踪;
  3. 一个新颖的MVS网络 – CVA-MVSNet,它能够利用视图聚合和多级深度预测来利用整个关键帧窗口;
  4. 在合成数据和真实数据上,均达到了最先进的跟踪和重建结果。

2. 相关工作

有两个不同的工作流与所提出的方法相关。一方面,有基于带位姿的图像的纯3D重建,另一方面,有完整的SLAM或VO框架,可以同时估计相机姿态和重建3D环境。
3D重建:大多数密集3D重建方法将图像及对应的位姿信息作为输入,并重建稠密的或半稠密的环境。在过去的十年内,已经提出了几种经典的方法[1,15,16,17]。最近,基于深度学习的方法显示出优于经典方法的性能。这些方法使用DNN回归环境中的3D模型。该3D模型可以是体素表示[9,18,19,20]、3D点云[21]或者一组深度图[22,23,23]的形式。如今,最流行的是从3D成本量预测最终模型的方法。黄等人[22]第一个提出了基于成本体积的方法。周等人[24]将多个图像的体积聚合到单个成本体积,并使用3D CNN进行深度预测。Yao等人[23]提出了基于从输入图像所预测的2D深度特征图直接计算单个体积。在后续的工作中,Yao等人[25]用循环网络替换了深度预测CNN。为了改善运行时间和内存消耗,Gu等人[26]提出了级联成本量。Yi等人[27]引入了一种自适应视图聚合来衡量每个输入图像的体素贡献。本文所提出的CVA-MVSNet建立在上述两个工作[26,27]之上,并在很大程度上受到了它们的启发。然而,只有通过它们的组合和适用SLAM的设置,我们才能获得更好的性能和实时能力。
以往的方法都是基于一组选定的帧,Murez等人[9]则直接从单个全局3D成本量来预测TSDF模型。Weder等人[18]提出了一种基于学习的方法替代深度图经典的TSDF融合。基于体素的表示一般来说都是密集型的,Niessner等人[28]提出体素散列来克服这一限制,Steinbrucker 等人[29]则使用八叉树在CPU上执行深度图融合。
RGB-D SLAM:在视觉SLAM领域,RGB-D方法本质上提供了密集的深度图以及相机轨迹,因此旨在解决与我们的方法类似的问题。Bylow 等人[30]和Kerl 等人[2,31]主要关注RGB-D图像的准确的轨迹估计。除了相机跟踪,Newcombe 等人[1]将深度图集成到全局TSDF表示中。Whelan 等人[3]则执行基于面元的融合和非刚体表面形变,以实现全局一致性重建。Kahler 等人[32]使用TSDF图表示,该图被拆分为多个子图以便模拟闭环。大多数之前的方法仅针对帧的位姿进行优化,Schops 等人[33]提出了一种基于RGB-D SLAM的全量BA方法,它可以同时优化相机的位姿和3D结构。Sucar 等人[34]将基于DNN的隐式场景表达集成到TGB-D SLAM系统中。
单目SLAM:与RGB-D方法相比,基于单目的方法其跟踪和建图都变得更具挑战性。Newcombe 等人[35]使用单目相机基于光度成本量进行优化,以在GPU上实时联合估计相机位姿和稠密深度图。Engel 等人[36]提出了第一个大规模光度SLAM公式,包括回环检测和位姿图优化。通过使用稀疏表示,Engel 等人[37]构建了第一个全光度VO框架,该框架可以实时联合估计位姿和深度。为了能够获得更稠密的重建结果,Mur-Artal等人[38]在基于特征的SLAM[39]基础之上执行半稠密的概率深度估计。Schops 等人[40]使用从移动跟踪设备上获得的位姿和图像,执行基于时间、平面扫描的深度估计。Tateno 等人[5]和Yang [41,42]等人在传统的直接法SLAM框架中利用DNN来提高跟踪性能并克服尺度模糊问题。虽然传统的几何和混合方法仍然可以实现出色的跟踪性能,但有几个完全学习的SLAM框架[43,44,45,24],它们在重建的完整性方面更胜一筹。Jatavallabhula 等人[46]提出了一种差分优化器,它可能用于弥补传统和基于学习的SLAM之间的差距。Bloesch 等人[6]提出了一种基于深度学习的SLAM新方案,作者建议学习场景深度的逐帧代码表达,它与相机位姿联合进行优化。Czarnowski 等人[7]是对[6]的扩展,其中代码表达被集成到一个完整的SLAM系统中。Zuo 等人[8]在视觉-惯性步骤中使用了类似的代码表达,并将稀疏的、跟踪的特征馈送到DNN中。

3. TANDEM

本文提出的TANDEM由三部分组成:单目视觉里程计(第3.1节)、基于CVA-MVSNet进行密集深度估计(第3.2节)和体积建图(补充)。图2a显示了系统的概述,视觉里程计利用单目视频流和从3D TSDF模型渲染的稠密深度以滑窗的方式估计相机位姿。给定关键帧及其估计的位姿,利用所提出的CVA-MVSNet预测参考关键帧的稠密深度图。为了重建一个完整且全局一致的3D模型,将深度图利用体素散列[28]融合到TSDF体素网格[47]中。通过无缝集成这些组件,生成的系统TANDEM能够从单目相机实现实时跟踪和高质量的稠密重建。补充材料中提供了更多的详细信息,包括有关TSDF体素初始化的信息。
【cartographer_ros】七: 主要配置参数说明

; 3.1 视觉里程计

通过跟踪多个帧上的一组稀疏点来估计相机位姿在最近的VO系统中显示出很好的性能[37,39]。然而,使用更多的特征点进行联合优化并不一定会进一步提高估计位姿的准确性,同时还会显著增加运行时间[37]。因此,在所提出的VO系统中,我们使用直接稀疏窗口优化后端,如直接稀疏里程计(DSO)[37]中所述。然而,我们在直接图像对齐的前端使用从全局TSDF模型渲染的稠密深度图,该模型是增量式构建的。在众多的实验中,我们确认了稠密跟踪前端和稀疏的后端优化的组合可以显著提高跟踪性能(参见表1),同时保持了快速的运行时间。
稠密前端跟踪:前端跟踪提供相机的速率姿态估计,并作为窗口优化后端的初始化。在原始的DSO中,通过使用从优化窗口中所有点生成的稀疏深度图来进行图像对齐,以此实现关键帧的跟踪。然而,由于深度图的稀疏性,这种方法缺少鲁棒性(表1)。我们通过合并TSDF模型渲染的稠密深度图来缓解这个问题。对于当前关键帧中的每个像素点p,我们根据稀疏VO DSO(如果可用)分配一个深度值,否则基于渲染的稠密深度TSDF来分配深度值。基于增量构建的TSDF模型,虽然无法包含所有像素的有效的深度值,但是与稀疏深度值相比,还是要稠密很多。其中,近稠密组合深度图被用于两帧的直接图像对齐。

3.2 CVA-MVSNet

( I i , T i ) i − 1 n { (I_i, T_i) }^n_{i-1}(I i ​,T i ​)i −1 n ​是一系列活动关键帧的集合,其中I i I_i I i ​是体积为( H , W ) (H,W)(H ,W )的图像,T i T_i T i ​是对应的通过VO计算的全局位姿信息。CVA-MVSNet是基于多视图立体的原理,并进一步利用深度神经网络来估计参考帧I i − 1 I_{i-1}I i −1 ​的深度图。CVA-MVSNet通过使用级联代价量分层估计深度,并使用自适应视图聚合模块有效地聚合所有关键帧地深度特征,从而克服了深度MVS网络令人望而却步地内存需求。
如图2b所示,关键帧的多尺度特征F i s F^s_i F i s ​首先由共享权重的2D U-Net网络提取,其中i ∈ [ 1 , n ] i\in[1,n]i ∈[1 ,n ]是帧索引,而s ∈ [ 1 , 3 ] s\in[1,3]s ∈[1 ,3 ]是尺度索引。作为结果,F i s F^s_i F i s ​表示为( F s , H s , W s ) (F^s,H^s,W^s)(F s ,H s ,W s ),其中F s F^s F s是尺度s s s下的特征维度,H s = H / 2 3 − s H^s=H/2^{3-s}H s =H /2 3 −s,W s = W / 2 3 − s W^s=W/2^{3-s}W s =W /2 3 −s。参考帧的深度图通过三阶段分层进行估计,每个阶段将特征集{ F i s } i − 1 n {F^s_i}^n_{i-1}{F i s ​}i −1 n ​作为输入并预测( D s , H s , W s ) (D^s,H^s,W^s)(D s ,H s ,W s )的深度图D s D^s D s。为了清晰起见,我们首先解释了单个阶段是如何估计深度,然后再描述多层之间是如何进行聚合的。
单阶段深度估计。对于每个阶段,成本量C s C^s C s需要通过深度特征{ F i s } i = 1 n {F^s_i}^n_{i=1}{F i s ​}i =1 n ​进行构造。对于参考帧的每个像素,我们定义深度假设D s D^s D s,获取张量( D s , H s , W s ) (D^s,H^s,W^s)(D s ,H s ,W s )。每一帧的深度特征F i s F^s_i F i s ​通过可微翘曲进行几何变换,通过深度假设,相对位姿T j i = T i − 1 T j T^i_j=T^{-1}iT_j T j i ​=T i −1 ​T j ​和相机内参。作为结果,每一帧的特征量V i s V^s_i V i s ​可表示为( F s , D s , H s , W s ) (F^s,D^s,H^s,W^s)(F s ,D s ,H s ,W s )。
为了将多视图特征量聚合到一个成本量C s C^s C s中,大多数以前的深度MVS方法平等地对待不同的视图,并使用基于差异的成本度量:
【cartographer_ros】七: 主要配置参数说明
但是,在滑窗SLAM系统中,关键帧在优化窗口的分布并不是均匀的,通常新关键帧之间的距离要比旧关键帧之间的距离小很多。这会导致相当大的遮挡和不重叠的图像,因此,基于差异的成本度量是不合适,因为它对不同视点的权重是平等的。为了缓解这个问题,我们采用自适应视图聚合来构建成本量。
【cartographer_ros】七: 主要配置参数说明
其中视图聚合权重W i s W^s_i W i s ​表示为( 1 , D s , H s , W s ) (1,D^s,H^s,W^s)(1 ,D s ,H s ,W s )。将( V i s − V j s ) 2 (V^s_i-V^s_j)^2 (V i s ​−V j s ​)2作为输入,通过浅层3D卷积网络分别为每个V i s V^s_i V i s ​估计其聚合权重W i s W^s_i W i s ​,该聚合模块允许网络自适应降低错误信息的权重。
成本量C s C^s C s通过3D U-Net进行正则化,并通过softmax进行非线性化处理以获取概率量P s P^s P s表示为( D s , H s , W s ) (D^s,H^s,W^s)(D s ,H s ,W s )。给定每个像素的深度假设D h y p s D^s
{hyp}D h y p s ​ ( D s , H s , W s ) (D^s,H^s,W^s)(D s ,H s ,W s ),估计的深度作为预期值给出:
【cartographer_ros】七: 主要配置参数说明
分层深度估计。该网络利用前一阶段D s − 1 ( s > 1 ) D^{s-1}(s>1)D s −1 (s >1 )估计的深度定义一个具有小的D s D^s D s的细粒度深度假设张量D h y p s D^s_{hyp}D h y p s ​。由于第一阶段不存在前一阶段,因此D h 1 y p D^1_hyp D h 1 ​y p的每个像素都有相同的深度范围[ d m i n , d m a x ] [d_min,d_max][d m ​i n ,d m ​a x ],D 1 = 48 D^1=48 D 1 =4 8深度值。对于后面的阶段( s > 1 ) (s>1)(s >1 ),其深度D s − 1 D^{s-1}D s −1被上采样并用于作为D h y p s D^s_{hyp}D h y p s ​的先验。具体的,对于像素( h , w ) (h,w)(h ,w ),D h y p s ( . , h , w ) D^s_{hyp}(.,h,w)D h y p s ​(.,h ,w )被定义为使用D s − 1 ( h , w ) D^{s-1}(h,w)D s −1 (h ,w )作为中心,然后使用预定义的偏移量对周围的D s D^s D s进行采样。这样,更高分辨率的阶段需要更少的深度平面,例如D 1 > D 2 > D 3 D^1>D^2>D^3 D 1 >D 2 >D 3。我们使用适用于所有三阶段的L1损失来训练网络,并使用总和作为最终损失函数。

; 3.3 实验细节

为了保证实时执行,TANDEM在多个级别上利用了并行性。密集跟踪和BA在CPU上的并行线程中执行,而TSDF融合和DNN推理则在GPU上异步并行运行。我们在Pytorh中训练CVA-MVSNet,并使用TorchScript在c++中执行推理。
TANDEM可以在配备8GB VRAM和Intel i7-9700K CPU的Nvidia RTX 2080 super台式机上运行时为20 FPS。这包括跟踪和密集TSDF建图,但没有可视化或网格生成。关于更多细节,包括如何潜在地扩展网络以在嵌入式平台上部署,我们参考补充文件。

4. 实验结果

由于TANDEM是一个完整地稠密SLAM系统,我们对它进行单目相机跟踪和稠密3D重建评估。具体而言,对于相机跟踪,我们与当前最先进的传统稀疏单目里程计,DSO和ORB-SLAM基于基于学习的稠密SLAM方法、DeepFactors和CodeVIO进行比较。对于3D重建,我们与最先进的深度多视图立体方法Cas-MVSNet、端到端重建方法Atlas、基于学习的稠密SLAM方法,如CNN-SLAM、DeepFactors,和CodeVIO,以及iMAP,一种最近提出的基于深度隐式地图表达的RGB-D稠密SLAM方法。
在下文中,我们将首先介绍我们用于训练和评估的数据集。请注意,只有CVA-MVSNet需要训练,而TANDEM的稠密跟踪部分纯粹基于优化,不需要针对特定数据集进行训练。然后,TANDEM的消融实验展示了不同的设计选择。最后,我们展示了与其他最先进方法的定量和定性比较。由于篇幅有限,我们只展示了部分已进行的评估,并在参考补充材料中进行额外的实验。

4.1 数据集

训练集。我们为CVA-MVSNet训练两个模型:一个是在真实世界ScanNet数据集,另一个是在合成数据集Replica。ScanNet 数据集由 1513 个室内场景组成,我们使用官方训练和测试拆分来训练 CVA-MVSNet,以便与 DeepFactors 和 Atlas 进行公平比较。然而,ScanNet 中的几何和纹理显示出明显的伪影和不完整性,这限制了其训练高质量密集重建方法的潜力。为了补充 ScanNet 数据集,我们建立在最近提出的 Replica 数据集的基础上,该数据集由 18 个逼真的场景组成。这些场景是使用最先进的 3D 重建管道从现实世界的房间中捕获的,并显示出非常高质量的纹理和几何形状。因为作者没有发布任何序列,我们通过手动创建产生 55000 个姿势和图像的真实相机轨迹来扩展数据集。
测试集。我们使用 ICL-NUIM数据集和 EuRoC 数据集的 Vicon Room 序列来评估跟踪和密集 3D 重建。请注意,TANDEM 没有在任何一个数据集上进行训练。 ICL-NUIM 是具有姿态和密集深度地面实况的合成室内数据集。它包含对单目视觉里程计和密集深度估计具有挑战性的低纹理场景。 EuRoC 是由微型飞行器 (MAV) 记录的真实世界数据集。

4.2 相机位姿估计

我们在 EuRoC 和 ICL-NUIM 上针对其他最先进的单目 SLAM 方法评估 TANDEM 的姿态估计。在 EuRoC 上,我们针对 DSO、ORB-SLAM2、Deep Factors 和 CodeVIO使用相机和 IMU 传感器进行评估。请注意,为了公平比较,我们关闭了 ORB-SLAM2 的全局优化和重新定位。我们还实现了 DSO (DSO + Dense Depth) 的变体,它使用 CVA-MVSNet 估计的密集深度图的所有像素进行前端直接图像对齐。请注意,TANDEM 和 DSO + Dense Depth 之间的区别在于,TANDEM 通过渲染来自 TSDF 网格的深度图来跟踪全局 3D 模型。 TANDEM 在 ICL-NUIM 和 EurRoC 上实现了比其他单目方法更好的跟踪精度和鲁棒性。由于篇幅有限,我们在主论文的表 1 中展示了 EuRoC 的结果,并请参考 ICL-NUIM 结果的补充材料,其中我们还展示了与 DeepTAM的比较。
除 CodeVIO之外的所有方法对每个序列运行五次,并在 Sim(3) 与地面实况对齐后报告绝对姿态估计的平均 RMSE 误差和标准偏差。对于 CodeVIO,我们直接采用他们论文中报告的数字。与 DSO 和 DSO + Dense Depth 的比较表明,针对全局 3D 模型提出的密集跟踪改进了相机位姿估计,尤其是在更具挑战性的序列(V102 和 V202)上。然而,我们应该承认,TANDEM 仍然无法与使用 IMU 传感器进行姿态估计的 CodeVIO 竞争。
【cartographer_ros】七: 主要配置参数说明

; 4.3 消融研究

我们在Replica的测试分割上进行了CVA-MVSNet的消融研究,结果如表2所示,具体而言,我们评估了使用具有7个关键帧的完整VO窗口,视图聚合模块(VA),( D 1 , D 2 , D 3 ) (D^1,D^2,D^3)(D 1 ,D 2 ,D 3 )深度平面设置为( 48 , 4 , 4 ) (48,4,4)(4 8 ,4 ,4 )。基线方法是原始的Cas-MVSNet,使用3个多视图图像作为输入,没有视图聚合模块,且具有更多的深度平面( 48 , 32 , 8 ) (48,32,8)(4 8 ,3 2 ,8 )。我们使用绝对差异(Abs)和具有不同阈值( a 1 , a 2 , a 3 ) (a_1,a_2,a_3)(a 1 ​,a 2 ​,a 3 ​)的内点百分比作为深度图评估的指标。有关指标的公式,请参阅补充材料。此外,我们还展示了不同模型的推理时间和内存使用情况。从表中我们可以看出,使用更多帧的整个关键帧窗口并没有提高基线模型的准确性,同时增加了运行时间和内存使用量。使用视图聚合模块,准确率显着提高,但运行时间进一步增加。使用更少的深度平面并不会显着降低准确性,但会大大提高运行时间和内存使用率。因此,为了保证 TANDEM 的实时性,我们使用少平面模型作为最终的 CVA-MVSNet,并且本文中的所有其他实验都是使用该模型进行的。
【cartographer_ros】七: 主要配置参数说明

4.4 3D重建

我们评估了 ICL-NUIM 和 EuRoC 的重建精度。在 ICL-NUIM 上,我们与 DeepFactors [7]、CNN-SLAM [5]、Atlas [9] 和 Cas-MVSNet [26] 进行了比较。表3显示了评估结果。由于 Atlas 是一种纯 3D 重建方法,不估计姿势,我们提供地面真实姿势作为输入。请注意,Atlas 直接从 3D CNN 估计 TSDF 体积,因此我们渲染深度图以针对其他方法进行评估。 CNN-SLAM、Deep Factors 和 Atlas 在 ScanNet 上进行训练。对于 Cas-MVSNet,我们在 Replica 数据集上重新训练它,并使用与 CVA-MVSNet 相同的姿势。我们展示了我们的 ScanNet 训练模型和我们的 Replica 训练模型的评估结果,以促进公平比较。单目方法的深度图根据轨迹按比例对齐,补充中给出了进一步的细节。我们使用 a1 指标作为准确度的主要衡量标准。从表 3 中,我们可以看到,与其他方法相比,我们的方法显示出显着的改进,并且平均提供了最好的结果。请注意,CVA-MVSNet 在合成 Replica 上训练的模型比在 ScanNet 上训练的模型取得了更好的结果。
【cartographer_ros】七: 主要配置参数说明
在 EuRoC 上,我们无法与 CNN-SLAM 进行比较,因为论文上没有提供 EuRoC 上的数字,而且代码也没有公开。我们进一步将 CodeVIO [8] 添加到对 EuRoC 的评估中,因为它是最近的密集 SLAM 系统,并且也在 EuRoC 上进行了评估。请注意,CodeVIO 使用单目摄像头和惯性传感器进行跟踪,而 TANDEM 和其他 SLAM 方法仅依赖单目摄像头。表4显示了评估结果。
【cartographer_ros】七: 主要配置参数说明
我们进一步针对 iMAP [34] 评估 TANDEM,iMAP [34] 是一种利用深度隐式地图表示的 RGB-D 密集 SLAM 系统。请注意 iMAP 和 TANDEM 之间的两个主要区别:一方面,iMAP 使用 RGB-D 传感器,而 TANDEM 只需要单目摄像头;另一方面,iMAP 的 DNN 不需要任何预训练,它是使用 RGB-D 输入纯在线训练的,而 TANDEM 的深度估计网络需要离线训练。由于 iMAP 也在 Replica 上进行了评估,因此,我们在其数据集的两个序列上将 TANDEM 与 iMAP 进行比较,这两个序列未包含在我们的 Replica 拆分的训练集中。我们使用来自 iMAP 的评估指标并将结果显示在表 5 中。一般而言,TANDEM 在使用单目相机时取得了与 iMAP 相似的结果。
【cartographer_ros】七: 主要配置参数说明
在图 3 中,我们展示了由 DeepFactors、Atlas 和 TANDEM 估计的定性深度图。 DeepFactors 和 Atlas 都可以很好地恢复底层场景的几何形状,但我们的方法通常能够捕捉到更精细的细节。我们在图 4 中进一步将完整的场景重建显示为网格。由于 DeepFactors 本身不会生成完整的 3D 模型,因此我们仅在本实验中将 TANDEM 与 Atlas 进行比较。从图中我们可以看出,与深度图类似,TANDEM 能够重建比 Atlas 更精细的细节。
【cartographer_ros】七: 主要配置参数说明
【cartographer_ros】七: 主要配置参数说明

; 5. 结论

我们展示了 TANDEM,一种实时密集单目 SLAM 系统,其新颖的设计结合了直接光度视觉里程计和深度多视图立体。特别是,我们提出了 CVA-MVSNet,它有效地利用了整个关键帧窗口并预测了高质量的深度图。此外,所提出的密集跟踪方案通过跟踪使用 TSDF 融合创建的全局 3D 模型来连接相机姿态估计和密集 3D 重建。定量和定性实验表明,TANDEM 在合成和真实数据的 3D 重建和视觉里程计方面比其他最先进的方法取得了更好的结果。我们相信 TANDEM 进一步弥合了 RGB-D 映射和单目映射之间的差距。

---------------------------本文仅用于学习交流,如有侵权,请联系删文-------------------------

Original: https://blog.csdn.net/csjiangxiaoqi/article/details/124363464
Author: Andy_Xiaoqi
Title: 【论文翻译】TANDEM: Tracking and Dense Mapping in Real-time using Deep Multi-view Stereo