From 0a66185debc31a91614abde35edfc58941bd13ac Mon Sep 17 00:00:00 2001
From: Fabian Reister <fabian.reister@kit.edu>
Date: Sun, 21 Jan 2024 19:49:23 +0100
Subject: [PATCH] Exteroception: disabled dynamic-sized array

---
 .../converters/ArmarDEConverter.cpp           | 108 ++++++++++--------
 .../converters/ArmarDEConverter.h             |  17 ++-
 .../converters/ConverterRegistry.cpp          |   2 +-
 3 files changed, 72 insertions(+), 55 deletions(-)

diff --git a/source/RobotAPI/libraries/armem_robot_state/server/exteroception/converters/ArmarDEConverter.cpp b/source/RobotAPI/libraries/armem_robot_state/server/exteroception/converters/ArmarDEConverter.cpp
index d71bb045b..cd810a935 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/exteroception/converters/ArmarDEConverter.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/exteroception/converters/ArmarDEConverter.cpp
@@ -1,68 +1,78 @@
 #include "ArmarDEConverter.h"
+
 #include <cmath>
 #include <string>
 
-#include <SimoxUtility/algorithm/get_map_keys_values.h>
 #include <SimoxUtility/algorithm/advanced.h>
+#include <SimoxUtility/algorithm/get_map_keys_values.h>
+
 #include "ArmarXCore/core/exceptions/local/ExpressionException.h"
 
 #include <RobotAPI/libraries/RobotUnitDataStreamingReceiver/RobotUnitDataStreamingReceiver.h>
 #include <RobotAPI/libraries/armem_robot_state/aron/Exteroception.aron.generated.h>
-#include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h>
-
 #include <RobotAPI/libraries/armem_robot_state/server/proprioception/aron_conversions.h>
+#include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h>
 
 #include "ConverterTools.h"
 
-
 namespace armarx::armem::server::robot_state::exteroception
 {
 
-    ArmarDEConverter::ArmarDEConverter() = default;
-    ArmarDEConverter::~ArmarDEConverter() = default;
+    ArmarDEConverter::ArmarDEConverter(const Properties& properties) : properties_(properties)
+    {
+    }
 
+    ArmarDEConverter::~ArmarDEConverter() = default;
 
     aron::data::DictPtr
-    ArmarDEConverter::convert(
-        const RobotUnitDataStreaming::TimeStep& data,
-        const RobotUnitDataStreaming::DataStreamingDescription& description)
+    ArmarDEConverter::convert(const RobotUnitDataStreaming::TimeStep& data,
+                              const RobotUnitDataStreaming::DataStreamingDescription& description)
     {
         arondto::Exteroception dto;
         dto.iterationID = data.iterationId;
 
+        // initialize fields
+        const std::size_t singleDimSize = static_cast<std::size_t>(std::sqrt(properties_.tofSize));
+        ARMARX_CHECK_EQUAL(singleDimSize * singleDimSize, properties_.tofSize);
+
+        dto.tof["Left"].array.resize(singleDimSize, singleDimSize);
+        dto.tof["Left"].array.setConstant(-1); // in order to unset fields faults
+
+        dto.tof["Right"].array.resize(singleDimSize, singleDimSize);
+        dto.tof["Right"].array.setConstant(-1); // in order to unset fields faults
+
         for (const auto& [dataEntryName, dataEntry] : description.entries)
         {
             process(dto, dataEntryName, {data, dataEntry});
         }
 
-        // resize to square 
-        for(auto& [_, tof] : dto.tof)
-        {
-            const int sr = std::sqrt(tof.array.size());
-            const bool isSquare = (sr * sr == tof.array.size());
+        // resize to square
+        // for (auto& [_, tof] : dto.tof)
+        // {
+        //     const int sr = std::sqrt(tof.array.size());
+        //     const bool isSquare = (sr * sr == tof.array.size());
+
+        //     if (tof.array.size() > 0 and isSquare)
+        //     {
+        //         tof.array.resize(sr, sr);
+        //     }
+        // }
 
-            if(tof.array.size() > 0 and isSquare)
-            {
-                tof.array.resize(sr, sr);
-            }
-        }
-        
 
         return dto.toAron();
     }
 
-
-    void ArmarDEConverter::process(
-        arondto::Exteroception& dto,
-        const std::string& entryName,
-        const ConverterValue& value)
+    void
+    ArmarDEConverter::process(arondto::Exteroception& dto,
+                              const std::string& entryName,
+                              const ConverterValue& value)
     {
         const std::vector<std::string> split = simox::alg::split(entryName, ".", false, false);
         ARMARX_CHECK_GREATER_EQUAL(split.size(), 3);
         const std::set<size_t> acceptedSizes{3, 4, 5};
         ARMARX_CHECK_GREATER(acceptedSizes.count(split.size()), 0)
-                << "Data entry name could not be parsed (exected 3 or 4 or 5 components between '.'): "
-                << "\n- split: '" << split << "'";
+            << "Data entry name could not be parsed (exected 3 or 4 or 5 components between '.'): "
+            << "\n- split: '" << split << "'";
 
         const std::string& category = split.at(0);
         // const std::string& name = split.at(1);
@@ -74,19 +84,16 @@ namespace armarx::armem::server::robot_state::exteroception
             // ARMARX_DEBUG << "Processing ToF sensor data";
             processToFEntry(dto.tof, split, value);
         }
-        
     }
 
-
-
-
-    void ArmarDEConverter::processToFEntry(
-            std::map<std::string, armarx::armem::exteroception::arondto::ToF>& tofs,
-            const std::vector<std::string>& split,
-            const ConverterValue& value)
+    void
+    ArmarDEConverter::processToFEntry(
+        std::map<std::string, armarx::armem::exteroception::arondto::ToF>& tofs,
+        const std::vector<std::string>& split,
+        const ConverterValue& value)
     {
         // split e.g. "sens.LeftHand.tofDepth.element_15" (split at dot)
-        
+
         ARMARX_CHECK_EQUAL(split.size(), 4);
         ARMARX_CHECK_EQUAL(split.at(2), "tofDepth");
 
@@ -95,11 +102,8 @@ namespace armarx::armem::server::robot_state::exteroception
         // element 0 sens
         // element 1 is either LeftHand or RightHand
 
-        const std::map<std::string, std::string> sidePrefixMap
-        {
-            {"LeftHand", "Left"},
-            {"RightHand", "Right"}
-        };
+        const std::map<std::string, std::string> sidePrefixMap{{"LeftHand", "Left"},
+                                                               {"RightHand", "Right"}};
 
         auto it = sidePrefixMap.find(name);
         ARMARX_CHECK(it != sidePrefixMap.end()) << name;
@@ -107,10 +111,11 @@ namespace armarx::armem::server::robot_state::exteroception
         const std::string& side = it->second;
         processToFEntry(tofs[side], split, value);
     }
-    
-    void ArmarDEConverter::processToFEntry(armarx::armem::exteroception::arondto::ToF& tof,
-                const std::vector<std::string>& split,
-                const ConverterValue& value)
+
+    void
+    ArmarDEConverter::processToFEntry(armarx::armem::exteroception::arondto::ToF& tof,
+                                      const std::vector<std::string>& split,
+                                      const ConverterValue& value)
     {
         // split, e.g., element_12
         const std::vector<std::string> elements = simox::alg::split(split.back(), "_");
@@ -118,13 +123,16 @@ namespace armarx::armem::server::robot_state::exteroception
 
         const int idx = std::stoi(elements.at(1));
 
-        if(tof.array.size() < (idx +1))
-        {
-            tof.array.resize(idx+1, 1);
-        }
+        ARMARX_CHECK_LESS(idx, tof.array.size());
+
+        // we don't allow dynamic ToF size atm
+        // if (tof.array.size() < (idx + 1))
+        // {
+        //     tof.array.resize(idx + 1, 1);
+        // }
 
         tof.array(idx) = getValueAs<float>(value);
     }
 
 
-}
+} // namespace armarx::armem::server::robot_state::exteroception
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/exteroception/converters/ArmarDEConverter.h b/source/RobotAPI/libraries/armem_robot_state/server/exteroception/converters/ArmarDEConverter.h
index bf6c482a0..2f77e88a8 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/exteroception/converters/ArmarDEConverter.h
+++ b/source/RobotAPI/libraries/armem_robot_state/server/exteroception/converters/ArmarDEConverter.h
@@ -9,17 +9,26 @@
 
 #include "ConverterInterface.h"
 
-
 namespace armarx::armem::server::robot_state::exteroception
 {
     struct ConverterValue;
+
     // class ConverterTools;
 
+    namespace detail
+    {
+        struct Properties
+        {
+            std::size_t tofSize = 16; // 4x4 grid
+        };
+    } // namespace detail
 
     class ArmarDEConverter : public ConverterInterface
     {
     public:
-        ArmarDEConverter();
+        using Properties = detail::Properties;
+
+        ArmarDEConverter(const Properties& properties = Properties());
         ~ArmarDEConverter() override;
 
 
@@ -35,8 +44,6 @@ namespace armarx::armem::server::robot_state::exteroception
 
 
     private:
-        
-
         void processToFEntry(std::map<std::string, armarx::armem::exteroception::arondto::ToF>& fts,
                              const std::vector<std::string>& split,
                              const ConverterValue& value);
@@ -47,5 +54,7 @@ namespace armarx::armem::server::robot_state::exteroception
 
 
         // std::unique_ptr<ConverterTools> tools;
+
+        Properties properties_;
     };
 } // namespace armarx::armem::server::robot_state::exteroception
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/exteroception/converters/ConverterRegistry.cpp b/source/RobotAPI/libraries/armem_robot_state/server/exteroception/converters/ConverterRegistry.cpp
index ef7296b66..235c5efd9 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/exteroception/converters/ConverterRegistry.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/exteroception/converters/ConverterRegistry.cpp
@@ -11,7 +11,7 @@ namespace armarx::armem::server::robot_state::exteroception
     ConverterRegistry::ConverterRegistry()
     {
         add<ArmarDEConverter>("ArmarDE");
-        // add<Armar7Converter>("Armar7");
+        add<ArmarDEConverter>("Armar7");
     }
 
 
-- 
GitLab