From 9eeba20f8c1fcb58164b3d605e01a3b5c6293ec9 Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Thu, 10 Jun 2021 08:52:25 +0200
Subject: [PATCH] occupancy grid helper

---
 .../libraries/armem_vision/CMakeLists.txt     | 17 ++++----
 .../armem_vision/OccupancyGridHelper.cpp      | 39 ++++++++++++++++++
 .../armem_vision/OccupancyGridHelper.h        | 40 +++++++++++++++++++
 3 files changed, 89 insertions(+), 7 deletions(-)
 create mode 100644 source/RobotAPI/libraries/armem_vision/OccupancyGridHelper.cpp
 create mode 100644 source/RobotAPI/libraries/armem_vision/OccupancyGridHelper.h

diff --git a/source/RobotAPI/libraries/armem_vision/CMakeLists.txt b/source/RobotAPI/libraries/armem_vision/CMakeLists.txt
index 3aa2d0d4f..1767c9ceb 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 000000000..f88cc7545
--- /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 000000000..17628ef34
--- /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
-- 
GitLab