From c26ac5d65b8963861273308b415f580482a4befa 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 22:00:51 +0200
Subject: [PATCH] Test

---
 ...micPlatformVelocityControllerInterface.cpp |  2 +-
 ...omicPlatformVelocityControllerWithRamp.cpp | 82 +++++++++++++++----
 ...onomicPlatformVelocityControllerWithRamp.h | 20 ++++-
 3 files changed, 87 insertions(+), 17 deletions(-)

diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.cpp b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.cpp
index 8ca4311f4..0db22289e 100644
--- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.cpp
+++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerInterface.cpp
@@ -30,7 +30,7 @@ namespace armarx
 {
     NJointHolonomicPlatformVelocityControllerInterface::
         NJointHolonomicPlatformVelocityControllerInterface() :
-        maxCommandDelay(IceUtil::Time::milliSeconds(800))
+        maxCommandDelay(IceUtil::Time::milliSeconds(500))
     {
     }
 
diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.cpp
index 3a31f21bb..29d3f9991 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>();
@@ -45,8 +46,8 @@ namespace armarx
         ARMARX_CHECK_EXPRESSION(velocitySensor)
             << "Sensor value for " << cfg->platformName << " has invalid type";
 
-        ramp.setMaxPositionAcceleration(cfg->maxPositionAcceleration);
-        ramp.setMaxOrientationAcceleration(cfg->maxOrientationAcceleration);
+        //        ramp.setMaxPositionAcceleration(cfg->maxPositionAcceleration);
+        //        ramp.setMaxOrientationAcceleration(cfg->maxOrientationAcceleration);
     }
 
     void
@@ -57,14 +58,15 @@ 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));
+
+        NJointHolonomicPlatformVelocityControllerControlData data;
+        data.velocityX = velX;
+        data.velocityY = velY;
+        data.velocityRotation = velRot;
+        data.commandTimestamp = IceUtil::Time::now();
+        setControlStruct(data);
+        //        reinitTripleBuffer(data);
     }
 
     void
@@ -86,14 +88,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 +111,54 @@ namespace armarx
     NJointControllerRegistration<NJointHolonomicPlatformVelocityControllerWithRamp>
         registrationNJointHolonomicPlatformVelocityControllerWithRamp(
             "NJointHolonomicPlatformVelocityControllerWithRamp");
+
+    RtRamp::RtRamp(float maxPos, float maxRot) :
+        maxPositionAcceleration(maxPos), maxOrientationAcceleration(maxRot)
+    {
+    }
+
+    void
+    RtRamp::init(const Eigen::Vector3f& state)
+    {
+        this->state = state;
+    }
+
+    Eigen::Vector3f
+    RtRamp::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);
+
+        if (factor < 1)
+        {
+            throw LocalException("Error factor negative!");
+        }
+
+        state += delta / factor;
+        return state;
+    }
+
+    void
+    RtRamp::setMaxPositionAcceleration(float maxPositionAcceleration)
+    {
+        this->maxPositionAcceleration = maxPositionAcceleration;
+    }
+
+    void
+    RtRamp::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..5b32fab17 100644
--- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h
+++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformVelocityControllerWithRamp.h
@@ -33,6 +33,24 @@
 namespace armarx
 {
 
+    class RtRamp
+    {
+    public:
+        RtRamp(float maxPos, float maxRot);
+        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;
+    };
+
     TYPEDEF_PTRS_HANDLE(NJointHolonomicPlatformVelocityControllerWithRampConfig);
 
     class NJointHolonomicPlatformVelocityControllerWithRampConfig :
@@ -74,7 +92,7 @@ namespace armarx
         void rtPreActivateController() override;
 
     protected:
-        CartesianVelocityRamp ramp;
+        RtRamp ramp;
 
         ControlTargetHolonomicPlatformVelocity* target;
         const SensorValueHolonomicPlatformVelocity* velocitySensor;
-- 
GitLab