From 256e8b1200be8e478091b88ce70d1abfc4ea4210 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Tobias=20Gr=C3=B6ger?= <tobias.groeger@student.kit.edu>
Date: Mon, 29 Apr 2024 23:14:34 +0200
Subject: [PATCH] Implement separate 2dim CartesianVelocityRamp

---
 ...omicPlatformVelocityControllerWithRamp.cpp | 72 ++++++++++++++-----
 ...onomicPlatformVelocityControllerWithRamp.h | 21 +++++-
 .../RobotUnitModules/RobotUnitModuleUnits.cpp |  6 +-
 3 files changed, 79 insertions(+), 20 deletions(-)

diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp
index 3a31f21bb..4e9d7fefe 100644
--- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp
@@ -31,7 +31,8 @@ namespace armarx
     NJointHolonomicPlatformVelocityControllerWithRamp::
         NJointHolonomicPlatformVelocityControllerWithRamp(RobotUnit* prov,
                                                           ConfigPtrT cfg,
-                                                          const VirtualRobot::RobotPtr&)
+                                                          const VirtualRobot::RobotPtr&) :
+        ramp(cfg->maxPositionAcceleration, cfg->maxOrientationAcceleration)
     {
         target = useControlTarget(cfg->platformName, ControlModes::HolonomicPlatformVelocity)
                      ->asA<ControlTargetHolonomicPlatformVelocity>();
@@ -44,9 +45,6 @@ namespace armarx
         velocitySensor = sensor->asA<SensorValueHolonomicPlatformVelocity>();
         ARMARX_CHECK_EXPRESSION(velocitySensor)
             << "Sensor value for " << cfg->platformName << " has invalid type";
-
-        ramp.setMaxPositionAcceleration(cfg->maxPositionAcceleration);
-        ramp.setMaxOrientationAcceleration(cfg->maxOrientationAcceleration);
     }
 
     void
@@ -57,14 +55,9 @@ namespace armarx
         const float velRot = velocitySensor->velocityRotation;
 
         // init velocity ramp
-        Eigen::VectorXf state(6);
-        state << velX, velY, 0, 0, 0, velRot;
-        ramp.setState(state, VirtualRobot::IKSolver::CartesianSelection::All);
-
-        getWriterControlStruct().velocityX = velX;
-        getWriterControlStruct().velocityY = velY;
-        getWriterControlStruct().velocityRotation = velRot;
-        writeControlStruct();
+        ramp.init(Eigen::Vector3f(velX, velY, velRot));
+
+        setVelocites(velX, velY, velRot);
     }
 
     void
@@ -86,14 +79,14 @@ namespace armarx
         }
         else
         {
-            Eigen::VectorXf x(6);
-            x << rtGetControlStruct().velocityX, rtGetControlStruct().velocityY, 0, 0, 0,
-                rtGetControlStruct().velocityRotation;
+            Eigen::Vector3f x(rtGetControlStruct().velocityX,
+                              rtGetControlStruct().velocityY,
+                              rtGetControlStruct().velocityRotation);
 
             Eigen::VectorXf result = ramp.update(x, timeSinceLastIteration.toSecondsDouble());
             target->velocityX = result(0);
             target->velocityY = result(1);
-            target->velocityRotation = result(5);
+            target->velocityRotation = result(2);
         }
     }
 
@@ -109,4 +102,51 @@ namespace armarx
     NJointControllerRegistration<NJointHolonomicPlatformVelocityControllerWithRamp>
         registrationNJointHolonomicPlatformVelocityControllerWithRamp(
             "NJointHolonomicPlatformVelocityControllerWithRamp");
+
+    Cartesian2DimVelocityRamp ::Cartesian2DimVelocityRamp(float maxPositionAcceleration,
+                                                          float maxOrientationAcceleration) :
+        maxPositionAcceleration(maxPositionAcceleration),
+        maxOrientationAcceleration(maxOrientationAcceleration)
+    {
+    }
+
+    void
+    Cartesian2DimVelocityRamp::init(const Eigen::Vector3f& state)
+    {
+        this->state = state;
+    }
+
+    Eigen::Vector3f
+    Cartesian2DimVelocityRamp::update(const Eigen::Vector3f& target, float dt)
+    {
+        if (dt <= 0)
+        {
+            return state;
+        }
+        Eigen::Vector3f delta = target - state;
+        float factor = 1;
+
+        Eigen::Vector2f posDelta = delta.block<2, 1>(0, 0);
+        float posFactor = posDelta.norm() / maxPositionAcceleration / dt;
+        factor = std::max(factor, posFactor);
+
+        float oriFactor = std::abs(delta(2)) / maxOrientationAcceleration / dt;
+        factor = std::max(factor, oriFactor);
+
+        state += delta / factor;
+        return state;
+    }
+
+    void
+    Cartesian2DimVelocityRamp::setMaxPositionAcceleration(float maxPositionAcceleration)
+    {
+        this->maxPositionAcceleration = maxPositionAcceleration;
+    }
+
+    void
+    Cartesian2DimVelocityRamp::setMaxOrientationAcceleration(float maxOrientationAcceleration)
+    {
+        this->maxOrientationAcceleration = maxOrientationAcceleration;
+    }
+
 } // namespace armarx
diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h
index e5110624a..9d2adec8f 100644
--- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h
+++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h
@@ -25,7 +25,6 @@
 #include <VirtualRobot/Robot.h>
 
 #include <RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.h>
-#include <RobotAPI/libraries/core/CartesianVelocityRamp.h>
 
 #include "../ControlTargets/ControlTargetHolonomicPlatformVelocity.h"
 #include "NJointControllerWithTripleBuffer.h"
@@ -33,6 +32,24 @@
 namespace armarx
 {
 
+    class Cartesian2DimVelocityRamp
+    {
+    public:
+        Cartesian2DimVelocityRamp(float maxPositionAcceleration, float maxOrientationAcceleration);
+        void init(const Eigen::Vector3f& state);
+
+        Eigen::Vector3f update(const Eigen::Vector3f& target, float dt);
+
+        void setMaxPositionAcceleration(float maxPositionAcceleration);
+        void setMaxOrientationAcceleration(float maxOrientationAcceleration);
+
+    private:
+        float maxPositionAcceleration = 0;
+        float maxOrientationAcceleration = 0;
+
+        Eigen::Vector3f state; // [velX,velY,velRotation]
+    };
+
     TYPEDEF_PTRS_HANDLE(NJointHolonomicPlatformVelocityControllerWithRampConfig);
 
     class NJointHolonomicPlatformVelocityControllerWithRampConfig :
@@ -74,7 +91,7 @@ namespace armarx
         void rtPreActivateController() override;
 
     protected:
-        CartesianVelocityRamp ramp;
+        Cartesian2DimVelocityRamp ramp;
 
         ControlTargetHolonomicPlatformVelocity* target;
         const SensorValueHolonomicPlatformVelocity* velocitySensor;
diff --git a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp
index 80c426cc9..34168e9a2 100644
--- a/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/RobotUnitModules/RobotUnitModuleUnits.cpp
@@ -502,8 +502,10 @@ namespace armarx::RobotUnitModule
         }
         else
         {
-            ARMARX_ERROR << "Invalid Platform velocity controller specified "
-                         << ""; //platformControllerType;
+            ARMARX_ERROR << "Invalid Platform velocity controller specified '"
+                         << NJointHolonomicPlatformVelocityControllerTypesNames.to_name(
+                                platformControllerType)
+                         << "'";
         }
 
         NJointHolonomicPlatformRelativePositionControllerConfigPtr configRelativePositionCtrlCfg =
-- 
GitLab