diff --git a/VirtualRobot/Manipulability/AbstractManipulability.cpp b/VirtualRobot/Manipulability/AbstractManipulability.cpp index 80773025b6d029e3523f8ffa5e965ac190beec7b..fd130f3de6370a24db6f760a6bb405e571e60449 100644 --- a/VirtualRobot/Manipulability/AbstractManipulability.cpp +++ b/VirtualRobot/Manipulability/AbstractManipulability.cpp @@ -32,10 +32,11 @@ namespace VirtualRobot { -AbstractManipulability::AbstractManipulability(AbstractManipulability::Mode mode, AbstractManipulability::Type type) : +AbstractManipulability::AbstractManipulability(AbstractManipulability::Mode mode, AbstractManipulability::Type type, Eigen::MatrixXd weightMatrixInit) : mode(mode), type(type) { + weightMatrix = weightMatrixInit; } Eigen::MatrixXd AbstractManipulability::computeJacobian() { diff --git a/VirtualRobot/Manipulability/AbstractManipulability.h b/VirtualRobot/Manipulability/AbstractManipulability.h index 5603f989688759b5dac176fc4049701b66374521..27e336aa91a402df6ab3728d5e74f75c45a06d91 100644 --- a/VirtualRobot/Manipulability/AbstractManipulability.h +++ b/VirtualRobot/Manipulability/AbstractManipulability.h @@ -42,7 +42,7 @@ public: Whole = 1, Position = 2, Orientation = 3 }; - AbstractManipulability(Mode mode, Type type); + AbstractManipulability(Mode mode, Type type, Eigen::MatrixXd weightMatrixInit = Eigen::MatrixXd()); Eigen::MatrixXd computeJacobian(); @@ -96,6 +96,8 @@ public: static IKSolver::CartesianSelection GetCartesianSelection(Mode mode); + Eigen::MatrixXd weightMatrix; + protected: virtual Eigen::MatrixXd computeJacobian(IKSolver::CartesianSelection mode) = 0; diff --git a/VirtualRobot/Manipulability/SingleChainManipulability.cpp b/VirtualRobot/Manipulability/SingleChainManipulability.cpp index adefea6d02d186a36d5fc6da40f958968c65a378..56e34e5b69201d3634b2ce8a8040a8c2a51b7a5d 100644 --- a/VirtualRobot/Manipulability/SingleChainManipulability.cpp +++ b/VirtualRobot/Manipulability/SingleChainManipulability.cpp @@ -37,7 +37,12 @@ namespace VirtualRobot { Eigen::MatrixXd AbstractSingleChainManipulability::computeManipulability(const Eigen::MatrixXd &jacobian, AbstractManipulability::Type type) { - Eigen::MatrixXd velocityManipulability = jacobian * jacobian.transpose(); + if (weightMatrix.rows() == 0){ + int nbJoints = jacobian.cols(); + weightMatrix.setIdentity(nbJoints, nbJoints); + } + std::cout << weightMatrix << std::endl; + Eigen::MatrixXd velocityManipulability = jacobian * weightMatrix * weightMatrix.transpose() * jacobian.transpose(); switch (type) { case Velocity: @@ -52,13 +57,14 @@ Eigen::MatrixXd AbstractSingleChainManipulability::computeManipulability(const E -SingleRobotNodeSetManipulability::SingleRobotNodeSetManipulability(const RobotNodeSetPtr &rns, Mode mode, Type type, bool convertMMtoM) - : SingleRobotNodeSetManipulability(rns, rns->getTCP(), mode, type, RobotNodePtr(), convertMMtoM) + +SingleRobotNodeSetManipulability::SingleRobotNodeSetManipulability(const RobotNodeSetPtr &rns, Mode mode, Type type, Eigen::MatrixXd weightMatrixInit, bool convertMMtoM) + : SingleRobotNodeSetManipulability(rns, rns->getTCP(), mode, type, RobotNodePtr(), weightMatrixInit, convertMMtoM) { } -SingleRobotNodeSetManipulability::SingleRobotNodeSetManipulability(const RobotNodeSetPtr &rns, const RobotNodePtr &node, Mode mode, Type type, const RobotNodePtr &coordSystem, bool convertMMtoM) - : AbstractSingleChainManipulability(mode, type), rns(rns), node(node), coordSystem(coordSystem) +SingleRobotNodeSetManipulability::SingleRobotNodeSetManipulability(const RobotNodeSetPtr &rns, const RobotNodePtr &node, Mode mode, Type type, const RobotNodePtr &coordSystem, Eigen::MatrixXd weightMatrixInit, bool convertMMtoM) + : AbstractSingleChainManipulability(mode, type, weightMatrixInit), rns(rns), node(node), coordSystem(coordSystem) { ik.reset(new DifferentialIK(rns, coordSystem, JacobiProvider::eSVDDamped)); ik->convertModelScalingtoM(convertMMtoM); diff --git a/VirtualRobot/Manipulability/SingleChainManipulability.h b/VirtualRobot/Manipulability/SingleChainManipulability.h index b96a658c86599af19c5adecb8420b4e4c25ca968..0113e0a51aab1fd14d179da7e87dbf194cfd75bf 100644 --- a/VirtualRobot/Manipulability/SingleChainManipulability.h +++ b/VirtualRobot/Manipulability/SingleChainManipulability.h @@ -46,14 +46,14 @@ typedef std::shared_ptr<AbstractSingleChainManipulability> AbstractSingleChainMa class SingleRobotNodeSetManipulability : public AbstractSingleChainManipulability { public: - SingleRobotNodeSetManipulability(const RobotNodeSetPtr& rns, Mode mode, Type type, bool convertMMtoM = true); + SingleRobotNodeSetManipulability(const RobotNodeSetPtr& rns, Mode mode, Type type, Eigen::MatrixXd weightMatrixInit = Eigen::MatrixXd(), bool convertMMtoM = true); /** * @param rns The robotNodes (i.e., joints) for which the Jacobians should be calculated. * @param node * @param coordSystem The coordinate system in which the Jacobians are defined. By default the global coordinate system is used. */ - SingleRobotNodeSetManipulability(const RobotNodeSetPtr& rns, const RobotNodePtr& node, Mode mode, Type type, const RobotNodePtr& coordSystem = RobotNodePtr(), bool convertMMtoM = true); + SingleRobotNodeSetManipulability(const RobotNodeSetPtr& rns, const RobotNodePtr& node, Mode mode, Type type, const RobotNodePtr& coordSystem = RobotNodePtr(), Eigen::MatrixXd weightMatrixInit = Eigen::MatrixXd(), bool convertMMtoM = true); RobotNodeSetPtr getRobotNodeSet(); diff --git a/VirtualRobot/Manipulability/SingleChainManipulabilityTracking.cpp b/VirtualRobot/Manipulability/SingleChainManipulabilityTracking.cpp index 6fc9b3118ee3047436c6a55165fa33644675448e..12f4b64ccc03cc6ded480763a06df14e0e2efa82 100644 --- a/VirtualRobot/Manipulability/SingleChainManipulabilityTracking.cpp +++ b/VirtualRobot/Manipulability/SingleChainManipulabilityTracking.cpp @@ -39,17 +39,23 @@ SingleChainManipulabilityTracking::SingleChainManipulabilityTracking(AbstractSin } Eigen::Tensor<double, 3> SingleChainManipulabilityTracking::computeManipulabilityJacobian(const Eigen::MatrixXd &jacobian) { + int rows = jacobian.rows(); // task space dim + int columns = jacobian.cols(); // joint space dim + Eigen::Tensor<double, 3> derivJ = computeJacobianDerivative(jacobian); Eigen::array<int, 3> shuffling({1, 0, 2}); // Permutation of first two dimensions Eigen::Tensor<double, 3> permDerivJ = derivJ.shuffle(shuffling); + // Define default weight matrix + if (manipulability->weightMatrix.rows() == 0) { + manipulability->weightMatrix.setIdentity(columns, columns); + } + // Compute dJ/dq x_2 J - Eigen::Tensor<double, 3> dJtdq_J = tensorMatrixProduct(permDerivJ, jacobian); + Eigen::Tensor<double, 3> dJtdq_J = tensorMatrixProduct(permDerivJ, jacobian * manipulability->weightMatrix * manipulability->weightMatrix.transpose()); // Compute dJ'/dq x_1 J + dJ/dq x_2 J - int rows = jacobian.rows(); // task space dim - int columns = jacobian.cols(); // joint space dim Eigen::array<int, 2> shufflingTranpose({1, 0}); // for transposing Eigen::Tensor<double, 3> manipJ(rows,rows,columns); for(int s = 0; s < columns; ++s) {