From 076545257e37ac7de7ba5a5c9973b6c878cfe221 Mon Sep 17 00:00:00 2001 From: Simon Ottenhaus <simon.ottenhaus@kit.edu> Date: Fri, 10 May 2019 14:49:56 +0200 Subject: [PATCH] split update of PositionControllerHelper into read and write parts --- .../PositionControllerHelper.cpp | 19 +++++++++++++++++++ .../PositionControllerHelper.h | 7 +++++++ .../core/CartesianPositionController.cpp | 5 +++++ .../core/CartesianPositionController.h | 1 + 4 files changed, 32 insertions(+) diff --git a/source/RobotAPI/libraries/RobotStatechartHelpers/PositionControllerHelper.cpp b/source/RobotAPI/libraries/RobotStatechartHelpers/PositionControllerHelper.cpp index a54cf2fe8..9b9d1e5f9 100644 --- a/source/RobotAPI/libraries/RobotStatechartHelpers/PositionControllerHelper.cpp +++ b/source/RobotAPI/libraries/RobotStatechartHelpers/PositionControllerHelper.cpp @@ -52,11 +52,21 @@ PositionControllerHelper::PositionControllerHelper(const VirtualRobot::RobotNode } void PositionControllerHelper::update() +{ + updateRead(); + updateWrite(); +} + +void PositionControllerHelper::updateRead() { if (!isLastWaypoint() && isCurrentTargetNear()) { currentWaypointIndex++; } +} + +void PositionControllerHelper::updateWrite() +{ Eigen::VectorXf cv = posController.calculate(getCurrentTarget(), VirtualRobot::IKSolver::All); velocityControllerHelper->setTargetVelocity(cv + feedForwardVelocity); if (autoClearFeedForward) @@ -109,6 +119,15 @@ void PositionControllerHelper::clearFeedForwardVelocity() feedForwardVelocity = Eigen::Vector6f::Zero(); } +void PositionControllerHelper::immediateHardStop(bool clearTargets) +{ + velocityControllerHelper->controller->immediateHardStop(); + if(clearTargets) + { + setTarget(posController.getTcp()->getPoseInRootFrame()); + } +} + float PositionControllerHelper::getPositionError() const { return posController.getPositionError(getCurrentTarget()); diff --git a/source/RobotAPI/libraries/RobotStatechartHelpers/PositionControllerHelper.h b/source/RobotAPI/libraries/RobotStatechartHelpers/PositionControllerHelper.h index e4012fbb5..afda18b69 100644 --- a/source/RobotAPI/libraries/RobotStatechartHelpers/PositionControllerHelper.h +++ b/source/RobotAPI/libraries/RobotStatechartHelpers/PositionControllerHelper.h @@ -53,7 +53,13 @@ namespace armarx PositionControllerHelper(const VirtualRobot::RobotNodePtr& tcp, const VelocityControllerHelperPtr& velocityControllerHelper, const std::vector<Eigen::Matrix4f>& waypoints); PositionControllerHelper(const VirtualRobot::RobotNodePtr& tcp, const VelocityControllerHelperPtr& velocityControllerHelper, const std::vector<PosePtr>& waypoints); + // read data and write targets, call this if you are unsure, anywhere in your control loop. + // use updateRead and updateWrite for better performance void update(); + // read data, call this after robot sync + void updateRead(); + // write targets, call this at the end of your control loop, before the sleep + void updateWrite(); void setNewWaypoints(const std::vector<Eigen::Matrix4f>& waypoints); void setNewWaypoints(const std::vector<PosePtr>& waypoints); @@ -62,6 +68,7 @@ namespace armarx void setFeedForwardVelocity(const Eigen::Vector6f& feedForwardVelocity); void setFeedForwardVelocity(const Eigen::Vector3f& feedForwardVelocityPos, const Eigen::Vector3f& feedForwardVelocityOri); void clearFeedForwardVelocity(); + void immediateHardStop(bool clearTargets = true); float getPositionError() const; diff --git a/source/RobotAPI/libraries/core/CartesianPositionController.cpp b/source/RobotAPI/libraries/core/CartesianPositionController.cpp index 4559e139c..f6f9dc70a 100644 --- a/source/RobotAPI/libraries/core/CartesianPositionController.cpp +++ b/source/RobotAPI/libraries/core/CartesianPositionController.cpp @@ -100,3 +100,8 @@ Eigen::Vector3f CartesianPositionController::getOrientationDiff(const Eigen::Mat Eigen::AngleAxisf aa(oriDir); return aa.axis() * aa.angle(); } + +VirtualRobot::RobotNodePtr CartesianPositionController::getTcp() const +{ + return tcp; +} diff --git a/source/RobotAPI/libraries/core/CartesianPositionController.h b/source/RobotAPI/libraries/core/CartesianPositionController.h index 2c4b46c5c..d4921c62a 100644 --- a/source/RobotAPI/libraries/core/CartesianPositionController.h +++ b/source/RobotAPI/libraries/core/CartesianPositionController.h @@ -47,6 +47,7 @@ namespace armarx float getOrientationError(const Eigen::Matrix4f& targetPose) const; Eigen::Vector3f getPositionDiff(const Eigen::Matrix4f& targetPose) const; Eigen::Vector3f getOrientationDiff(const Eigen::Matrix4f& targetPose) const; + VirtualRobot::RobotNodePtr getTcp() const; float KpPos = 1; float KpOri = 1; -- GitLab