Skip to content

Commit

Permalink
Merge pull request naturerobots#74 from JustusBraun/pr/free-space-layer
Browse files Browse the repository at this point in the history
Feature: Add layer which checks if a robot can fit through a space
  • Loading branch information
Cakem1x authored Jan 20, 2025
2 parents ea54926 + 0c7999f commit d0471a2
Show file tree
Hide file tree
Showing 7 changed files with 404 additions and 3 deletions.
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ The package structure is as follows:
- RoughnessLayer - `mesh_layers/RoughnessLayer`
- SteepnessLayer - `mesh_layers/SteepnessLayer`
- RidgeLayer - `mesh_layer/RidgeLayer`
- ClearanceLayer - `mesh_layers/ClearanceLayer`
- InflationLayer - `mesh_layers/InflationLayer`

- `dijkstra_mesh_planner` contains a mesh planner plugin providing a path planning method based on Dijkstra's algorithm.
Expand Down Expand Up @@ -170,6 +171,7 @@ below.
| **RoughnessLayer** | `mesh_layers/RoughnessLayer` | local radius based normal fluctuation | ![RoughnessLayer](docs/images/costlayers/roughness.jpg?raw=true "Roughness Layer") |
| **SteepnessLayer** | `mesh_layers/SteepnessLayer` | arccos of the normal's z coordinate | ![SteepnessLayer](docs/images/costlayers/steepness.jpg?raw=true "Steepness Layer") |
| **RidgeLayer** | `mesh_layer/RidgeLayer` | local radius based distance along normal | ![RidgeLayer](docs/images/costlayers/ridge.jpg?raw=true "RidgeLayer") |
| **ClearanceLayer** | `mesh_layers/ClearanceLayer` | comparison of robot height and clearance along each vertex normal | ![ClearanceLayer](docs/images/costlayers/clearance.jpg?raw=true "Clearance Layer") |
| **InflationLayer** | `mesh_layers/InflationLayer` | by distance to a lethal vertex | ![InflationLayer](docs/images/costlayers/inflation.jpg?raw=true "Inflation Layer") |

# Planners
Expand Down
Binary file added docs/images/costlayers/clearance.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 2 additions & 1 deletion mesh_layers/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ add_library(${PROJECT_NAME}
src/inflation_layer.cpp
src/steepness_layer.cpp
src/ridge_layer.cpp
src/clearance_layer.cpp
)
include_directories(
include
Expand Down Expand Up @@ -53,4 +54,4 @@ install(TARGETS
ament_export_include_directories(include)
ament_export_libraries(${PROJECT_NAME})
ament_export_dependencies(mesh_map)
ament_package()
ament_package()
151 changes: 151 additions & 0 deletions mesh_layers/include/mesh_layers/clearance_layer.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
/*
* Copyright 2024, Justus Braun
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials provided
* with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* authors:
* Justus Braun <jubraun@uos.de>
*
*/

#ifndef MESH_MAP__FREESPACE_LAYER_H
#define MESH_MAP__FREESPACE_LAYER_H

#include <mesh_map/abstract_layer.h>
#include <rclcpp/rclcpp.hpp>

namespace mesh_layers
{
/**
* @brief Costmap layer which calculates the free space in the direction of the vertex normals
*/
class ClearanceLayer : public mesh_map::AbstractLayer
{
/**
* @brief try read layer from map file
*
* @return true if successul; else false
*/
virtual bool readLayer() override;

/**
* @brief try to write layer to map file
*
* @return true if successfull; else false
*/
virtual bool writeLayer() override;

/**
* @brief delivers the default layer value
*
* @return default value used for this layer
*/
virtual float defaultValue() override
{
return std::numeric_limits<float>::infinity();
}

/**
* @brief delivers the threshold above which vertices are marked lethal
*
* @return lethal threshold
*/
virtual float threshold() override;

/**
* @brief calculate the values of this layer
*
* @return true if successfull; else false
*/
virtual bool computeLayer() override;

/**
* @brief deliver the current costmap
*
* @return calculated costmap
*/
virtual lvr2::VertexMap<float>& costs() override;

/**
* @brief deliver set containing all vertices marked as lethal
*
* @return lethal vertices
*/
virtual std::set<lvr2::VertexHandle>& lethals() override
{
return lethal_vertices_;
}

/**
* @brief update set of lethal vertices by adding and removing vertices
*
* @param added_lethal vertices to be marked as lethal
* @param removed_lethal vertices to be removed from the set of lethal vertices
*/
virtual void updateLethal(std::set<lvr2::VertexHandle>& added_lethal, std::set<lvr2::VertexHandle>& removed_lethal) override {};

/**
* @brief initializes this layer plugin
*
* @return true if initialization was successfull; else false
*/
virtual bool initialize() override;

/**
* @brief callback for incoming param changes
*/
rcl_interfaces::msg::SetParametersResult reconfigureCallback(std::vector<rclcpp::Parameter> parameters);

private:
/**
* @brief mark vertices without enough clearance as lethal and compute the costs
*
* @return true if successfull; else false
*/
bool computeLethalsAndCosts();

// distance along vertex normal until the next face
lvr2::DenseVertexMap<float> clearance_;
// Actual costs values
lvr2::DenseVertexMap<float> costs_;
// set of all current lethal vertices
std::set<lvr2::VertexHandle> lethal_vertices_;

rclcpp::node_interfaces::OnSetParametersCallbackHandle::SharedPtr dyn_params_handler_;
struct {
double robot_height = 0.5;
double height_inflation = 0.3;
double factor = 1.0;
} config_;
};

} /* namespace mesh_layers */

#endif // MESH_MAP__FREESPACE_LAYER_H
9 changes: 8 additions & 1 deletion mesh_layers/mesh_layers.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,11 @@
Calculates an indicator whether or not a vertex is part of a ridge.
</description>
</class>
</library>
<class name="mesh_layers/ClearanceLayer"
type="mesh_layers::ClearanceLayer"
base_class_type="mesh_map::AbstractLayer">
<description>
Calculates the free space along the vertex normals and uses it to check if the robot fits through a space. Useful for doors, holes etc.
</description>
</class>
</library>
Loading

0 comments on commit d0471a2

Please sign in to comment.