From 45d8e5fa701dba108160ae526071bc9747ec4b17 Mon Sep 17 00:00:00 2001 From: armar-user <armar6@kit.edu> Date: Tue, 8 Jun 2021 19:03:19 +0200 Subject: [PATCH] Merge branch 'master' of gitlab.com:ArmarX/RobotAPI; fixed the controller with damping and dealing with limitless joints. --- .../NJointTaskSpaceImpedanceDMPController.cpp | 35 ++++++++++++++++--- .../core/CartesianVelocityController.cpp | 10 ++++++ 2 files changed, 40 insertions(+), 5 deletions(-) diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp index 91f65179c..74c1e94c4 100644 --- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp +++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp @@ -296,13 +296,38 @@ namespace armarx Eigen::MatrixXf I = Eigen::MatrixXf::Identity(targets.size(), targets.size()); - Eigen::VectorXf nullspaceTorque = knull.cwiseProduct(desiredNullSpaceJointValues - qpos) - dnull.cwiseProduct(qvel); - Eigen::MatrixXf jtpinv = ik->computePseudoInverseJacobianMatrix(jacobi.transpose(), 2.0); - Eigen::VectorXf jointDesiredTorques = jacobi.transpose() * jointControlWrench + (I - jacobi.transpose() * jtpinv) * nullspaceTorque; - + Eigen::VectorXf diffJoints = desiredNullSpaceJointValues; + for (size_t i = 0; i < rns->getSize(); i++) + { + VirtualRobot::RobotNodePtr rn = rns->getNode(i); + if (rn->isLimitless() && std::abs(diffJoints(i) - qpos(i)) > M_PI) + { + if (diffJoints(i) > qpos(i)) + { + diffJoints(i) = -(2 * M_PI - std::abs(diffJoints(i) - qpos(i))); + } + else + { + diffJoints(i) = 2 * M_PI - std::abs(diffJoints(i) - qpos(i)); + } + } + else + { + diffJoints(i) -= qpos(i); + } + } + Eigen::VectorXf nullspaceTorque = knull.cwiseProduct(diffJoints) - dnull.cwiseProduct(qvel); + Eigen::MatrixXf jtp = jacobi.transpose(); + auto svd = Eigen::JacobiSVD(jtp, Eigen::ComputeThinU | Eigen::ComputeThinV); + auto sv = svd.singularValues(); + double minSigVal = sv(sv.rows() - 1, sv.cols() - 1); + double damping = minSigVal < 1e-2 ? 1e-2 : 1e-8; + ik->setDampedSvdLambda(damping); + Eigen::MatrixXf jtpinv = ik->computePseudoInverseJacobianMatrix(jtp, 2.0); + Eigen::VectorXf jointDesiredTorques = jacobi.transpose() * jointControlWrench + (I - jacobi.transpose() * jtpinv) * nullspaceTorque; // torque limit ARMARX_CHECK_EXPRESSION(!targets.empty()); @@ -407,8 +432,8 @@ namespace armarx goal.at(i) = traj.rbegin()->getPosition(i); currentJointState.at(i).pos = currentJVS.at(i); currentJointState.at(i).vel = 0; + ARMARX_INFO << goal.at(i); } - trajs.push_back(traj); nullSpaceJointDMPPtr->learnFromTrajectories(trajs); diff --git a/source/RobotAPI/libraries/core/CartesianVelocityController.cpp b/source/RobotAPI/libraries/core/CartesianVelocityController.cpp index f140f9512..9527835a6 100644 --- a/source/RobotAPI/libraries/core/CartesianVelocityController.cpp +++ b/source/RobotAPI/libraries/core/CartesianVelocityController.cpp @@ -57,6 +57,11 @@ void CartesianVelocityController::calculateJacobis(VirtualRobot::IKSolver::Carte _jacobiWithCosts(r, c) = jacobi(r, c) / _jointCosts(c); } } + auto svd = Eigen::JacobiSVD(_jacobiWithCosts, Eigen::ComputeThinU | Eigen::ComputeThinV); + auto sv = svd.singularValues(); + double minSigVal = sv(sv.rows() - 1, sv.cols() - 1); + double damping = minSigVal < 1e-2 ? 1e-2 : 1e-8; + ik->setDampedSvdLambda(damping); _inv = ik->computePseudoInverseJacobianMatrix(_jacobiWithCosts, ik->getJacobiRegularization(mode)); } @@ -267,6 +272,11 @@ bool CartesianVelocityController::clampJacobiAtJointLimits(VirtualRobot::IKSolve } if (modifiedJacobi) { + auto svd = Eigen::JacobiSVD(jacobi, Eigen::ComputeThinU | Eigen::ComputeThinV); + auto sv = svd.singularValues(); + double minSigVal = sv(sv.rows() - 1, sv.cols() - 1); + double damping = minSigVal < 1e-2 ? 1e-2 : 1e-8; + ik->setDampedSvdLambda(damping); inv = ik->computePseudoInverseJacobianMatrix(jacobi, ik->getJacobiRegularization(mode)); } -- GitLab