From 560f51127a40e84941541c2a693e80430245c998 Mon Sep 17 00:00:00 2001 From: alexanderjyuen <103065090+alexanderjyuen@users.noreply.github.com> Date: Thu, 12 Dec 2024 17:10:25 -0800 Subject: [PATCH] Plugin container layer docs (#615) * added docs for plugin container layer Signed-off-by: alexander * set default plugin list to empty string array Signed-off-by: alexander * added PluginContainerLayer in tuning guide Signed-off-by: alexander * added example image and settings to plugin container layer configuration guide Signed-off-by: alexander * clarified plugin descriptions Signed-off-by: alexander * Update configuration/packages/costmap-plugins/plugin_container.rst Co-authored-by: Steve Macenski Signed-off-by: alexanderjyuen <103065090+alexanderjyuen@users.noreply.github.com> * example image shows different inflations Signed-off-by: alexander * modified yaml to match example image Signed-off-by: alexander * added to Migration guide Signed-off-by: alexander * updated Migration wording Signed-off-by: alexander --------- Signed-off-by: alexander Signed-off-by: alexanderjyuen <103065090+alexanderjyuen@users.noreply.github.com> Co-authored-by: Steve Macenski --- .../packages/configuring-costmaps.rst | 1 + .../costmap-plugins/plugin_container.rst | 95 ++++++++++++++++++ .../plugin_container_layer.png | Bin 0 -> 44687 bytes migration/Jazzy.rst | 7 +- plugins/index.rst | 7 ++ tuning/index.rst | 1 + 6 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 configuration/packages/costmap-plugins/plugin_container.rst create mode 100644 configuration/packages/costmap-plugins/plugin_container_layer.png diff --git a/configuration/packages/configuring-costmaps.rst b/configuration/packages/configuring-costmaps.rst index af5d33907..cd30178e1 100644 --- a/configuration/packages/configuring-costmaps.rst +++ b/configuration/packages/configuring-costmaps.rst @@ -349,6 +349,7 @@ Plugin Parameters costmap-plugins/voxel.rst costmap-plugins/range.rst costmap-plugins/denoise.rst + costmap-plugins/plugin_container.rst Costmap Filters Parameters ************************** diff --git a/configuration/packages/costmap-plugins/plugin_container.rst b/configuration/packages/costmap-plugins/plugin_container.rst new file mode 100644 index 000000000..50fab01c0 --- /dev/null +++ b/configuration/packages/costmap-plugins/plugin_container.rst @@ -0,0 +1,95 @@ +.. plugin_container: + +Plugin Container Layer Parameters +================================= + +This implements a costmap layer which combines costmap layers within a submap, which can then be integrated with other submaps in the same parent costmap. An example would be the use of different inflation layers for different sensors, objects, or static layers + +```` is the corresponding plugin name selected for this type. + +:````.enabled: + + ==== ======= + Type Default + ---- ------- + bool True + ==== ======= + + Description + Whether it is enabled. + +:````.plugins: + + ============== ======= + Type Default + -------------- ------- + vector {} + ============== ======= + + Description + List of mapped costmap layer names for parameter namespaces and names. + + Note + Costmap filters are presently unsupported + +Example +******* +.. code-block:: yaml + + global_costmap: + ros__parameters: + update_frequency: 1.0 + publish_frequency: 1.0 + global_frame: map + robot_base_frame: base_link + robot_radius: 0.22 + resolution: 0.05 + track_unknown_space: true + + plugins: ["plugin_container_static_layer", "plugin_container_obstacle_layer"] + + plugin_container_static_layer: + plugin: "nav2_costmap_2d::PluginContainerLayer" + enabled: True + combination_method: 1 + plugins: ["static_layer", "inflation_layer"] + static_layer: + plugin: "nav2_costmap_2d::StaticLayer" + map_subscribe_transient_local: True + inflation_layer: + plugin: "nav2_costmap_2d::InflationLayer" + cost_scaling_factor: 2.0 + inflation_radius: 0.5 + + plugin_container_obstacle_layer: + plugin: "nav2_costmap_2d::PluginContainerLayer" + enabled: True + combination_method: 1 + plugins: ["obstacle_layer", "inflation_layer"] + obstacle_layer: + plugin: "nav2_costmap_2d::ObstacleLayer" + enabled: True + observation_sources: scan + scan: + topic: /scan + max_obstacle_height: 2.0 + clearing: True + marking: True + data_type: "LaserScan" + raytrace_max_range: 3.0 + raytrace_min_range: 0.0 + obstacle_max_range: 2.5 + obstacle_min_range: 0.0 + inflation_layer: + plugin: "nav2_costmap_2d::InflationLayer" + cost_scaling_factor: 3.0 + inflation_radius: 1.0 + +The above example settings, when applied to the Nav2 turtlebot simulation would give the following costmap on startup + +.. figure:: plugin_container_layer.png + :align: center + :alt: Costmap generated by plugin container layer + + Costmap generated by turtlebot using example plugin container layer settings + diff --git a/configuration/packages/costmap-plugins/plugin_container_layer.png b/configuration/packages/costmap-plugins/plugin_container_layer.png new file mode 100644 index 0000000000000000000000000000000000000000..c5d0a513c45d66ce067bcc7c9b0a7555f33fcded GIT binary patch literal 44687 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 a costmap layer plugin type was added to support the grouping of different costmap layers under a single costmap layer. This would allow for different isolated combinations of costmap layers to be combined under one parent costmap instead of the current implementation which would indiscriminately combine all costmap layers together. diff --git a/plugins/index.rst b/plugins/index.rst index 12772dc02..9235d4efa 100644 --- a/plugins/index.rst +++ b/plugins/index.rst @@ -70,6 +70,12 @@ Costmap Layers | | | standalone obstacles or small | | | | obstacles groups | +--------------------------------+------------------------+----------------------------------+ +| `Plugin Container Layer`_ | Alexander Yuen | Combines the different costmap | +| | | layers specified under this | +| | | layer in order populate the same | +| | | costmap with different isolated | +| | | combinations of costmap layers | ++--------------------------------+------------------------+----------------------------------+ .. _Voxel Layer: https://github.com/ros-navigation/navigation2/tree/main/nav2_costmap_2d/plugins/voxel_layer.cpp .. _Static Layer: https://github.com/ros-navigation/navigation2/tree/main/nav2_costmap_2d/plugins/static_layer.cpp @@ -79,6 +85,7 @@ Costmap Layers .. _Spatio-Temporal Voxel Layer: https://github.com/SteveMacenski/spatio_temporal_voxel_layer/ .. _Non-Persistent Voxel Layer: https://github.com/SteveMacenski/nonpersistent_voxel_layer .. _Denoise Layer: https://github.com/ryzhikovas/navigation2/tree/feature-costmap2d-denoise/nav2_costmap_2d/plugins/denoise_layer.cpp +.. _Plugin Container Layer: https://github.com/ros-navigation/navigation2/tree/main/nav2_costmap_2d/plugins/plugin_container_layer.cpp Costmap Filters =============== diff --git a/tuning/index.rst b/tuning/index.rst index 7e6085750..80375f3d7 100644 --- a/tuning/index.rst +++ b/tuning/index.rst @@ -133,6 +133,7 @@ Costmap2D has a number of plugins that you can use (including the availability f - ``SpatioTemporalVoxelLayer``: 3D costmap layer for 3D lidars, non-planar 2D lidars, or depth camera processing based on temporal decay. Useful for robots with high sensor coverage like 3D lidars or many depth cameras at a reduced computational overhead due to lack of raycasting. - ``RangeLayer``: Models sonars, IR sensors, or other range sensors for costmap inclusion - ``DenoiseLayer``: Removes salt and pepper noise from final costmap in order to remove unfiltered noise. Also has the option to remove clusters of configurable size to remove effects of dynamic obstacles without temporal decay. +- ``PluginContainerLayer``: Combines the costmap layers specified within this plugin, resulting in an internal costmap that is a product of the costmap layers specified under this layer. This would allow different isolated combinations of costmap layers within the same parent costmap, such as applying a different inflation layers to static layers and obstacle layers In addition, costmap filters: - ``KeepoutFilter``: Marks keepout, higher weighted, or lower weighted zones in the costmap