diff --git a/source/RobotAPI/libraries/armem_vision/CMakeLists.txt b/source/RobotAPI/libraries/armem_vision/CMakeLists.txt index 3aa2d0d4f19cea9516bc1c91a504f09cfc27ba63..1767c9cebd878b1d15cad6f8043a2bd7cf932814 100644 --- a/source/RobotAPI/libraries/armem_vision/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_vision/CMakeLists.txt @@ -4,9 +4,9 @@ armarx_component_set_name("${LIB_NAME}") armarx_set_target("Library: ${LIB_NAME}") armarx_add_library( - LIBS + LIBS # ArmarX - ArmarXCore + ArmarXCore # This package RobotAPI::Core RobotAPI::armem @@ -17,17 +17,17 @@ armarx_add_library( ./aron_conversions.h ./client/laser_scans/Reader.h ./client/laser_scans/Writer.h - # ./client/occupancy_grid/Reader.h + ./client/occupancy_grid/Reader.h ./client/occupancy_grid/Writer.h SOURCES ./aron_conversions.cpp ./client/laser_scans/Reader.cpp ./client/laser_scans/Writer.cpp - # ./client/occupancy_grid/Reader.cpp + ./client/occupancy_grid/Reader.cpp ./client/occupancy_grid/Writer.cpp + ./OccupancyGridHelper.cpp ) - armarx_enable_aron_file_generation_for_target( TARGET_NAME "${LIB_NAME}" @@ -36,5 +36,8 @@ armarx_enable_aron_file_generation_for_target( aron/OccupancyGrid.xml ) - -add_library(RobotAPI::armem_vision ALIAS armem_vision) +add_library( + RobotAPI::armem_vision + ALIAS + armem_vision +) diff --git a/source/RobotAPI/libraries/armem_vision/OccupancyGridHelper.cpp b/source/RobotAPI/libraries/armem_vision/OccupancyGridHelper.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f88cc75454fd6f83545c3207c1e58642bedcc225 --- /dev/null +++ b/source/RobotAPI/libraries/armem_vision/OccupancyGridHelper.cpp @@ -0,0 +1,39 @@ +#include "OccupancyGridHelper.h" + +#include "types.h" + +namespace armarx +{ + OccupancyGridHelper::OccupancyGridHelper(const OccupancyGrid& occupancyGrid, + const Params& params) : + occupancyGrid(occupancyGrid), params(params) + { + } + + OccupancyGridHelper::BinaryArray OccupancyGridHelper::knownCells() const + { + return (occupancyGrid.grid > 0.F).cast<bool>(); + } + + OccupancyGridHelper::BinaryArray OccupancyGridHelper::freespace() const + { + // matrix1 = matrix1 .unaryExpr(std::ptr_fun(ReplaceNanWithValue<1>)); + // return (occupancyGrid.grid ).cast<bool>(); + + const auto isFree = [&](OccupancyGrid::CellType p) -> float + { return static_cast<float>(p < params.freespaceThreshold and p > 0.F); }; + + // TODO(fabian.reister): which one to choose? + // return occupancyGrid.grid.unaryExpr(isFree).cast<bool>(); + return occupancyGrid.grid.unaryViewExpr(isFree).cast<bool>(); + } + + OccupancyGridHelper::BinaryArray OccupancyGridHelper::obstacles() const + { + const auto isOccupied = [&](OccupancyGrid::CellType p) -> float + { return static_cast<float>(p > params.occupiedThreshold); }; + + return occupancyGrid.grid.unaryViewExpr(isOccupied).cast<bool>(); + } + +} // namespace armarx diff --git a/source/RobotAPI/libraries/armem_vision/OccupancyGridHelper.h b/source/RobotAPI/libraries/armem_vision/OccupancyGridHelper.h new file mode 100644 index 0000000000000000000000000000000000000000..17628ef34fc4ef30fc2b46dd8f031f2fc46dbda3 --- /dev/null +++ b/source/RobotAPI/libraries/armem_vision/OccupancyGridHelper.h @@ -0,0 +1,40 @@ +#pragma once + +#include <Eigen/Core> + +namespace armarx::armem +{ + struct OccupancyGrid; +} + +namespace armarx +{ + using armarx::armem::OccupancyGrid; + + namespace detail + { + struct OccupancyGridHelperParams + { + float freespaceThreshold = 0.45F; + float occupiedThreshold = 0.55F; + }; + } + + class OccupancyGridHelper + { + public: + using Params = detail::OccupancyGridHelperParams; + + OccupancyGridHelper(const OccupancyGrid& occupancyGrid, const Params& params); + + using BinaryArray = Eigen::Array<bool, Eigen::Dynamic, Eigen::Dynamic>; + + BinaryArray knownCells() const; + BinaryArray freespace() const; + BinaryArray obstacles() const; + + private: + const OccupancyGrid& occupancyGrid; + const Params params; + }; +} // namespace armarx