From 2f1d4f7cb80e6d02e414bc82d7515b60ca002fe0 Mon Sep 17 00:00:00 2001
From: Christoph Pohl <christoph.pohl@kit.edu>
Date: Fri, 17 Feb 2023 16:58:59 +0100
Subject: [PATCH] Add visualization of collision meshes to CollisionModelHelper

---
 .../CollisionModelHelper.cpp                  | 25 +++++++++++++++++++
 .../obstacle_avoidance/CollisionModelHelper.h |  5 ++++
 2 files changed, 30 insertions(+)

diff --git a/source/RobotAPI/libraries/obstacle_avoidance/CollisionModelHelper.cpp b/source/RobotAPI/libraries/obstacle_avoidance/CollisionModelHelper.cpp
index f8be378fc..d53a8dd6a 100644
--- a/source/RobotAPI/libraries/obstacle_avoidance/CollisionModelHelper.cpp
+++ b/source/RobotAPI/libraries/obstacle_avoidance/CollisionModelHelper.cpp
@@ -25,9 +25,12 @@
 #include <VirtualRobot/ManipulationObject.h>
 #include <VirtualRobot/SceneObjectSet.h>
 #include <VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h>
+#include <VirtualRobot/Visualization/TriMeshModel.h>
 
 #include <ArmarXCore/core/exceptions/local/ExpressionException.h>
 
+#include <RobotAPI/components/ArViz/Client/elements/Mesh.h>
+
 
 namespace armarx::obstacle_avoidance
 {
@@ -151,4 +154,26 @@ namespace armarx::obstacle_avoidance
         return std::make_shared<ManipulationObjectSet>(set);
     }
 
+    void
+    CollisionModelHelper::visualizeCollisionModel(const VirtualRobot::CollisionModelPtr& model,
+                                                  viz::Client& arviz)
+    {
+        armarx::viz::Mesh mesh(model->getName());
+        auto faces = model->getTriMeshModel()->faces;
+        std::vector<armarx::viz::data::Face> viz_faces;
+        std::transform(
+            faces.begin(),
+            faces.end(),
+            std::back_inserter(viz_faces),
+            [](const auto& face)
+            {
+                return armarx::viz::data::Face(
+                    face.id1, face.id2, face.id3, face.idColor1, face.idColor2, face.idColor3);
+            });
+        mesh.vertices(model->getTriMeshModel()->vertices)
+            .faces(viz_faces)
+            .pose(model->getGlobalPose());
+        arviz.commitLayerContaining("CollisionModel", mesh);
+    }
+
 } // namespace armarx::obstacle_avoidance
\ No newline at end of file
diff --git a/source/RobotAPI/libraries/obstacle_avoidance/CollisionModelHelper.h b/source/RobotAPI/libraries/obstacle_avoidance/CollisionModelHelper.h
index ca677b511..d56a2d5bd 100644
--- a/source/RobotAPI/libraries/obstacle_avoidance/CollisionModelHelper.h
+++ b/source/RobotAPI/libraries/obstacle_avoidance/CollisionModelHelper.h
@@ -24,6 +24,7 @@
 
 #include <VirtualRobot/VirtualRobot.h>
 
+#include <RobotAPI/components/ArViz/Client/Client.h>
 #include <RobotAPI/libraries/ArmarXObjects/ObjectPoseClient.h>
 #include <RobotAPI/libraries/ArmarXObjects/forward_declarations.h>
 #include <RobotAPI/libraries/armem_vision/OccupancyGridHelper.h>
@@ -47,10 +48,14 @@ namespace armarx::obstacle_avoidance
         static VirtualRobot::SceneObjectSetPtr
         asSceneObjects(const armem::vision::OccupancyGrid& occupancyGrid,
                        const OccupancyGridHelper::Params& params);
+        static void visualizeCollisionModel(const VirtualRobot::CollisionModelPtr& model,
+                                            viz::Client& arviz);
+
 
         CollisionModelHelper(const objpose::ObjectPoseClient& client);
         VirtualRobot::SceneObjectSetPtr fetchSceneObjects();
         ManipulationObjectSetPtr fetchManipulationObjects();
+
     private:
         objpose::ObjectPoseClient objectPoseClient_;
     };
-- 
GitLab