From 2284f5e712b965c079ca1df1470a403791b51d5f Mon Sep 17 00:00:00 2001 From: Sonja Marahrens <sonja.marahrens> Date: Tue, 3 Jul 2018 13:52:57 +0200 Subject: [PATCH] fixed nullspace calculation --- .../core/CartesianVelocityController.cpp | 18 ++++++++-------- .../CartesianVelocityControllerWithRamp.cpp | 21 ++++++------------- 2 files changed, 15 insertions(+), 24 deletions(-) diff --git a/source/RobotAPI/libraries/core/CartesianVelocityController.cpp b/source/RobotAPI/libraries/core/CartesianVelocityController.cpp index 62e5740e4..5ba9cd5d3 100644 --- a/source/RobotAPI/libraries/core/CartesianVelocityController.cpp +++ b/source/RobotAPI/libraries/core/CartesianVelocityController.cpp @@ -58,21 +58,21 @@ Eigen::VectorXf CartesianVelocityController::calculate(const Eigen::VectorXf& ca inv = ik->computePseudoInverseJacobianMatrix(jacobi, ik->getJacobiRegularization(mode)); // ARMARX_IMPORTANT << "nullspaceVel " << nullspaceVel.transpose(); - // Eigen::FullPivLU<Eigen::MatrixXf> lu_decomp(jacobi); + Eigen::FullPivLU<Eigen::MatrixXf> lu_decomp(jacobi); //ARMARX_IMPORTANT << "The rank of the jacobi is " << lu_decomp.rank(); //ARMARX_IMPORTANT << "Null space: " << lu_decomp.kernel(); - // Eigen::MatrixXf nullspace = lu_decomp.kernel(); + Eigen::MatrixXf nullspace = lu_decomp.kernel(); - Eigen::MatrixXf nullspace = Eigen::MatrixXf::Identity(jacobi.cols(), jacobi.cols()) - inv * jacobi; + // Eigen::MatrixXf nullspace = Eigen::MatrixXf::Identity(jacobi.cols(), jacobi.cols()) - inv * jacobi; - // Eigen::VectorXf nsv = Eigen::VectorXf::Zero(nullspace.rows()); - // for (int i = 0; i < nullspace.cols(); i++) - // { - // nsv += nullspace.col(i) * nullspace.col(i).dot(nullspaceVel) / nullspace.col(i).squaredNorm(); - // } + Eigen::VectorXf nsv = Eigen::VectorXf::Zero(nullspace.rows()); + for (int i = 0; i < nullspace.cols(); i++) + { + nsv += nullspace.col(i) * nullspace.col(i).dot(nullspaceVel) / nullspace.col(i).squaredNorm(); + } - Eigen::VectorXf nsv = nullspace * nullspaceVel; + // Eigen::VectorXf nsv = nullspace * nullspaceVel; //nsv /= kernel.cols(); diff --git a/source/RobotAPI/libraries/core/CartesianVelocityControllerWithRamp.cpp b/source/RobotAPI/libraries/core/CartesianVelocityControllerWithRamp.cpp index 4708d2ac4..e1d5154f4 100644 --- a/source/RobotAPI/libraries/core/CartesianVelocityControllerWithRamp.cpp +++ b/source/RobotAPI/libraries/core/CartesianVelocityControllerWithRamp.cpp @@ -45,22 +45,13 @@ void CartesianVelocityControllerWithRamp::setCurrentJointVelocity(const Eigen::V Eigen::MatrixXf nullspace = lu_decomp.kernel(); Eigen::VectorXf nsv = Eigen::VectorXf::Zero(nullspace.rows()); - - // int r = lu_decomp.rank(); - - // Eigen::MatrixXf nullspace = Eigen::MatrixXf::Zero(r, V.cols()); - // Eigen::VectorXf nsv = Eigen::VectorXf::Zero(nullspace.rows()); - - - // for (int i = 0; i < nullspace.cols(); i++) - // { - // nsv += nullspace.col(i) * nullspace.col(i).dot(currentJointVelocity) / nullspace.col(i).squaredNorm(); - // } - + for (int i = 0; i < nullspace.cols(); i++) + { + nsv += nullspace.col(i) * nullspace.col(i).dot(currentJointVelocity) / nullspace.col(i).squaredNorm(); + } cartesianVelocityRamp.setState(jacobi * currentJointVelocity, mode); - // nullSpaceVelocityRamp.setState(nsv); - nullSpaceVelocityRamp.setState(currentJointVelocity - inv * jacobi * currentJointVelocity); - // ARMARX_IMPORTANT << "nsv " << currentJointVelocity - inv* jacobi* currentJointVelocity; + nullSpaceVelocityRamp.setState(nsv); + } Eigen::VectorXf CartesianVelocityControllerWithRamp::calculate(const Eigen::VectorXf& cartesianVel, float jointLimitAvoidanceScale, float dt) -- GitLab