From 341ac45b151ff3c8d0e7e52796efe1fea3855600 Mon Sep 17 00:00:00 2001
From: ARMAR-7a User <armar7a@h2t>
Date: Fri, 3 Nov 2023 18:06:07 +0100
Subject: [PATCH] Improved visualization of the force torque sensor

---
 .../armem_robot_state/server/common/Visu.cpp  | 28 ++++++++++++-------
 .../armem_robot_state/server/common/Visu.h    | 11 ++++++--
 2 files changed, 27 insertions(+), 12 deletions(-)

diff --git a/source/RobotAPI/libraries/armem_robot_state/server/common/Visu.cpp b/source/RobotAPI/libraries/armem_robot_state/server/common/Visu.cpp
index e0e1721cd..be19db635 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/common/Visu.cpp
+++ b/source/RobotAPI/libraries/armem_robot_state/server/common/Visu.cpp
@@ -8,6 +8,7 @@
 
 #include <SimoxUtility/algorithm/get_map_keys_values.h>
 #include <SimoxUtility/math/pose.h>
+#include <SimoxUtility/math/rescale.h>
 
 #include <VirtualRobot/XML/RobotIO.h>
 
@@ -46,10 +47,12 @@ namespace armarx::armem::server::robot_state
     void Visu::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
     {
         defs->optional(p.enabled, prefix + "enabled", "Enable or disable visualization of objects.");
-        defs->optional(p.framesEnabled, prefix + "famesEnabled", "Enable or disable visualization of frames.");
         defs->optional(p.frequencyHz, prefix + "frequenzyHz", "Frequency of visualization.");
-        defs->optional(p.visualizeForceTorqueSensor, prefix + "visualizeForceTorqueSensor",
+        defs->optional(p.framesEnabled, prefix + "framesEnabled", "Enable or disable visualization of frames.");
+        defs->optional(p.forceTorque.enabled, prefix + "forceTorque.enabled",
                        "Enable or disable visualization of force torque sensors.");
+        defs->optional(p.forceTorque.forceScale, prefix + "forceTorque.forceScale",
+                       "Scaling of force arrows.");
     }
 
 
@@ -242,7 +245,7 @@ namespace armarx::armem::server::robot_state
             layers.push_back(layerFrames);
         }
 
-        if (p.visualizeForceTorqueSensor)
+        if (p.forceTorque.enabled)
         {
             viz::Layer layerFrames = arviz.layer("ForceTorque");
             for (const robot::Robot& robot : robots)
@@ -263,9 +266,6 @@ namespace armarx::armem::server::robot_state
                 const proprioception::ForceTorqueValuesMap& forceTorques
                     = sensorValues.at(name).forceTorqueValuesMap;
 
-                // TODO: Make parameterizable.
-                const float scaling = 1;
-
                 for (const auto& [side, ft] : forceTorques)
                 {
                     ARMARX_CHECK(side == RobotNameHelper::LocationLeft or side == RobotNameHelper::LocationRight) << side;
@@ -284,11 +284,19 @@ namespace armarx::armem::server::robot_state
                         simox::Color color = simox::Color((255 * Eigen::Matrix3i::Identity().col(i)).eval());
                         color.a = 128;
 
-                        Eigen::Vector3f to = from + scaling * ft.force(i) *
-                                                        simox::math::orientation(forceTorqueSensorPose).col(i);
+                        // Force arrows.
+                        const float length = p.forceTorque.forceScale * ft.force(i);                        
+                        const float width = std::min(
+                            simox::math::rescale(std::abs(length), 0.F, 100.F, 1.F, 10.F),
+                            10.F);
+
+                        const Eigen::Vector3f to = from + length * simox::math::orientation(forceTorqueSensorPose).col(i);
+
+                        std::stringstream key;
+                        key << side << " Force " << xyz.at(i);
+                        layerFrames.add(viz::Arrow(key.str()).fromTo(from, to).color(color).width(width));
 
-                        layerFrames.add(viz::Arrow(side + " Force " + std::to_string(xyz.at(i)))
-                                            .fromTo(from, to).color(color).width(100));
+                        // Torque circle arrows.
                     }
                 }
 
diff --git a/source/RobotAPI/libraries/armem_robot_state/server/common/Visu.h b/source/RobotAPI/libraries/armem_robot_state/server/common/Visu.h
index 39f0af9eb..265f08e2a 100644
--- a/source/RobotAPI/libraries/armem_robot_state/server/common/Visu.h
+++ b/source/RobotAPI/libraries/armem_robot_state/server/common/Visu.h
@@ -95,9 +95,16 @@ namespace armarx::armem::server::robot_state
         struct Properties
         {
             bool enabled = true;
+            float frequencyHz = 25.f;
+
             bool framesEnabled = false;
-            bool visualizeForceTorqueSensor = false;
-            float frequencyHz = 25;
+            
+            struct ForceTorque
+            {
+                bool enabled = true;
+                float forceScale = 1.F;
+            };
+            ForceTorque forceTorque;
         } p;
 
 
-- 
GitLab