(STVL) 使用外部代价图插件

概述

本教程演示了如何加载和使用外部插件。该示例使用了`Spatio Temporal Voxel Layer <https://github.com/SteveMacenski/spatio_temporal_voxel_layer/>`_ (STVL)代价图`pluginlib <http://wiki.ros.org/pluginlib/>`_插件作为示例。STVL是一个演示性的pluginlib插件,同样的过程也适用于其他代价图插件以及插件规划器、控制器和行为。

在完成本教程之前,请查看之前的两个关于在仿真和实际硬件中导航的教程(如果有的话)。本教程假设您已经了解导航和基本的代价地图理解。

注解

对于2021年12月之前的Ubuntu 20.04用户,OpenVDB及其二进制文件存在与``libjmalloc``的已知问题。如果您看到类似于``Could not load library LoadLibrary error: /usr/lib/x86_64-linux-gnu/libjemalloc.so.2: cannot allocate memory in static TLS block``的错误,可以通过``export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2``解决,直到发布OpenVDB的新二进制文件为止。

Costmap2D 和 STVL

Costmap 2D是我们用于将传感器信息缓冲到机器人将用于创建计划和控制工作的全局视图中的数据对象。在Costmap2D

然而,这些只是基本实现提供的示例插件。Navigation2 中 Costmap2D 的另一个可用的 pluginlib 插件是 STVL。

STVL是另一个类似于体素层(Voxel Layer)的3D感知插件。关于其工作原理的更详细概述可以在 该存储库中 找到。然而,它从深度相机、声纳、激光雷达等设备中缓冲3D数据,并将其存储为稀疏体素化的世界模型,通过传感器模型和基于时间的过期机制逐渐移除体素。这对于在高度动态环境中的机器人尤其有用,并且可以将3D传感器处理的资源利用率减少高达2倍。STVL还将3D激光雷达和雷达视为一等公民提供支持。有关STVL的ROSCon演讲可以在 该视频中 找到。

教程步骤

0- 设置

根据需要,安装和设置机器人进行硬件测试或仿真的过程与 开始使用 中的相同。确保安装了ROS 2、Navigation2和Gazebo。

1- 安装 STVL

可以通过ROS Build Farm在ROS 2中安装STVL:

  • sudo apt install ros-<ros2-distro>-spatio-temporal-voxel-layer

也可以通过将存储库克隆到Navigation2工作空间并进行源代码编译来安装STVL:

  • git clone -b <ros2-distro>-devel git@github.com:stevemacenski/spatio_temporal_voxel_layer

1- 修改Navigation2参数

STVL 是 Costmap2D 中的可选插件,就像所有插件一样。Navigation2 中的 Costmap 插件被加载到各自的 costmap 内的 plugin_namesplugin_types 变量中。例如,以下代码将分别将静态层和障碍层插件加载到名为 static_layerobstacle_layer 的名称中:

global_costmap:
  global_costmap:
    ros__parameters:
      use_sim_time: True
      plugins: ["static_layer", "obstacle_layer"]

注解

对于Galactic或更新版本,plugin_names``和``plugin_types``已经被单个``plugins``字符串向量替代,用于插件名称。现在,类型在``plugin_name``命名空间中的``plugin:``字段中定义(例如:``plugin: MyPlugin::Plugin)。代码块中的内联注释将帮助指导您完成此操作。

为了加载STVL插件,必须添加一个新的插件名称和类型。例如,如果应用程序需要一个STVL层而不需要障碍物层,我们的文件将如下所示:

global_costmap:
  global_costmap:
    ros__parameters:
      use_sim_time: True
      plugins: ["static_layer", "stvl_layer"]

与 Voxal Layer 类似,在注册插件后,我们可以在命名空间 stvl_layer 下添加 STVL Layer 的配置。以下是 STVL 配置的一个完整描述参数的示例:

stvl_layer:
  plugin: "spatio_temporal_voxel_layer/SpatioTemporalVoxelLayer"
  enabled: true
  voxel_decay: 15.
  decay_model: 0
  voxel_size: 0.05
  track_unknown_space: true
  unknown_threshold: 15
  mark_threshold: 0
  update_footprint_enabled: true
  combination_method: 1
  origin_z: 0.0
  publish_voxel_map: true
  transform_tolerance: 0.2
  mapping_mode: false
  map_save_duration: 60.0
  observation_sources: pointcloud
  pointcloud:
    data_type: PointCloud2
    topic: /intel_realsense_r200_depth/points
    marking: true
    clearing: true
    obstacle_range: 3.0
    min_obstacle_height: 0.0
    max_obstacle_height: 2.0
    expected_update_rate: 0.0
    observation_persistence: 0.0
    inf_is_valid: false
    filter: "voxel"
    voxel_min_points: 0
    clear_after_reading: true
    max_z: 7.0
    min_z: 0.1
    vertical_fov_angle: 0.8745
    horizontal_fov_angle: 1.048
    decay_acceleration: 15.0
    model_type: 0

请将上述文本中的 plugin_namesplugin_types 注册内容复制粘贴到你的 nav2_params.yaml 中,以启用STVL在你的应用程序中。请确保同时更改本地和全局代价地图。

注意:可以以同样的方式设置用于其他 Navigation2 服务器(如规划、行为和控制)的 Pluginlib 插件。

2- 启动Navigation2

按照 开始使用 中的相同过程,在 gazebo 中启动一个模拟机器人,并使用 STVL 作为 3D 感知代价地图层。

3- RVIZ

在打开 RViz 并设置 publish_voxel_map: true 后,可以使用 {local, global}_costmap/voxel_grid 主题可视化底层数据结构的 3D 网格。注意:建议在 RViz 中将 PointCloud2 的大小设置为你的体素大小,并将样式设置为 Boxes,使用中性颜色进行最佳可视化。