From b027fe6edc73e6dfcba4007e3423b47d7c9580c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tobias=20Gr=C3=B6ger?= <tobias.groeger@student.kit.edu>
Date: Fri, 26 Aug 2022 14:46:42 +0200
Subject: [PATCH] Add draft of human group obstacle implementation

---
 .../local_planning/TebObstacleManager.cpp     | 36 +++++++++++++++++++
 .../local_planning/TebObstacleManager.h       |  1 +
 2 files changed, 37 insertions(+)

diff --git a/source/armarx/navigation/local_planning/TebObstacleManager.cpp b/source/armarx/navigation/local_planning/TebObstacleManager.cpp
index 5e46a901..5f246ace 100644
--- a/source/armarx/navigation/local_planning/TebObstacleManager.cpp
+++ b/source/armarx/navigation/local_planning/TebObstacleManager.cpp
@@ -95,4 +95,40 @@ namespace armarx::navigation::local_planning
         }
     }
 
+    void
+    TebObstacleManager::addHumanGroupObstacle(const human::HumanGroup& group, viz::Layer* visLayer)
+    {
+        auto obst = boost::make_shared<teb_local_planner::PolygonObstacle>();
+
+
+        for (const Eigen::Vector2f& vertex : group.shape.vertices)
+        {
+            const Eigen::Vector2d ver = conv::toRos2D(vertex);
+            obst->pushBackVertex(ver);
+        }
+
+        obst->finalizePolygon();
+        container.push_back(obst);
+
+        if (visLayer != nullptr)
+        {
+            for (const human::Human& human : group.humans)
+            {
+                const auto humanPos = conv::to3D(human.pose).translation();
+                visLayer->add(viz::Cylinder("grouped_human_" + std::to_string(visualizationIndex++))
+                                  .fromTo(humanPos, humanPos + Eigen::Vector3f{0, 0, 10})
+                                  .radius(200)
+                                  .color(simox::Color::red()));
+            }
+
+            viz::Polygon poly{"human_group_" + std::to_string(visualizationIndex++)};
+            for (const Eigen::Vector2f& vertex : group.shape.vertices)
+            {
+                poly.addPoint(conv::to3D(vertex));
+            }
+            poly.color(simox::Color::yellow());
+            visLayer->add(poly);
+        }
+    }
+
 } // namespace armarx::navigation::local_planning
diff --git a/source/armarx/navigation/local_planning/TebObstacleManager.h b/source/armarx/navigation/local_planning/TebObstacleManager.h
index b336b65b..39a861a7 100644
--- a/source/armarx/navigation/local_planning/TebObstacleManager.h
+++ b/source/armarx/navigation/local_planning/TebObstacleManager.h
@@ -45,6 +45,7 @@ namespace armarx::navigation::local_planning
 
         void addBoxObstacle(const VirtualRobot::BoundingBox& bbox, viz::Layer* visLayer = nullptr);
         void addHumanObstacle(const human::Human& human, viz::Layer* visLayer = nullptr);
+        void addHumanGroupObstacle(const human::HumanGroup& group, viz::Layer* visLayer = nullptr);
 
     private:
         teb_local_planner::ObstContainer& container;
-- 
GitLab