6 #include <SimoxUtility/math/compare/is_equal.h>
7 #include <SimoxUtility/math/convert/mat4f_to_pos.h>
8 #include <SimoxUtility/math/convert/mat4f_to_quat.h>
9 #include <VirtualRobot/IK/DifferentialIK.h>
10 #include <VirtualRobot/IK/IKSolver.h>
11 #include <VirtualRobot/MathTools.h>
12 #include <VirtualRobot/Nodes/RobotNode.h>
13 #include <VirtualRobot/Robot.h>
14 #include <VirtualRobot/RobotNodeSet.h>
24 return targetJointTorques.size();
33 ik.reset(
new VirtualRobot::DifferentialIK(
34 rns, rns->getRobot()->getRootNode(), VirtualRobot::JacobiProvider::eSVDDamped));
36 const auto size = rns->getSize();
39 tcptwist.resize(size);
40 nullqerror.resize(size);
41 nullspaceTorque.resize(size);
42 targetJointTorques.resize(size);
47 const Eigen::VectorXf&
50 std::vector<const SensorValue1DoFActuatorTorque*> torqueSensors,
51 std::vector<const SensorValue1DoFActuatorVelocity*> velocitySensors,
52 std::vector<const SensorValue1DoFActuatorPosition*> positionSensors)
64 const Eigen::MatrixXf jacobi = ik->getJacobianMatrix(
65 tcp, VirtualRobot::IKSolver::CartesianSelection::All);
68 const Eigen::MatrixXf jtpinv = ik->computePseudoInverseJacobianMatrix(
69 jacobi.transpose(), lambda);
71 for (
size_t i = 0; i < velocitySensors.size(); ++i)
73 qpos(i) = positionSensors[i]->position;
74 qvel(i) = velocitySensors[i]->velocity;
79 const Eigen::Vector3f currentTCPLinearVelocity{
80 0.001f * tcptwist(0), 0.001f * tcptwist(1), 0.001f * tcptwist(2)};
81 const Eigen::Vector3f currentTCPAngularVelocity{tcptwist(3), tcptwist(4), tcptwist(5)};
83 const Eigen::Vector3f currentTCPPosition = tcp->getPositionInRootFrame();
84 const Eigen::Vector3f tcpForces =
86 const Eigen::Vector3f tcpDesiredForce =
87 tcpForces - cfg.
Dpos.cwiseProduct(currentTCPLinearVelocity);
97 const Eigen::Vector3f rpy = VirtualRobot::MathTools::eigen3f2rpy(diffMat);
98 const Eigen::Vector3f tcpDesiredTorque =
99 cfg.
Kori.cwiseProduct(rpy) - cfg.
Dori.cwiseProduct(currentTCPAngularVelocity);
101 tcpDesiredWrench << 0.001 * tcpDesiredForce, tcpDesiredTorque;
106 for (
int i = 0; i < nullqerror.rows(); ++i)
108 if (fabs(nullqerror(i)) < 0.09)
113 nullspaceTorque = cfg.
Knull.cwiseProduct(nullqerror) - cfg.
Dnull.cwiseProduct(qvel);
116 jacobi.transpose() * tcpDesiredWrench + (I - jacobi.transpose() * jtpinv) * nullspaceTorque;
117 for (
int i = 0; i < targetJointTorques.size(); ++i)
119 targetJointTorques(i) =
131 return targetJointTorques;