5 #include <SimoxUtility/json.h>
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/MathTools.h>
25 ik.reset(
new VirtualRobot::DifferentialIK(
26 rns, rns->getRobot()->getRootNode(), VirtualRobot::JacobiProvider::eSVDDamped));
28 numOfJoints = rns->getSize();
36 ARMARX_INFO <<
"preactivate control law TaskspaceImpedanceController";
41 s.qpos = rns->getJointValuesEigen();
42 s.qvel.setZero(numOfJoints);
44 s.currentPose = currentPose;
45 s.currentTwist.setZero();
47 s.desiredPose = currentPose;
48 s.desiredTwist.setZero();
50 s.jacobi.setZero(6, numOfJoints);
51 s.jtpinv.setZero(6, numOfJoints);
60 s.desiredJointTorques.setZero(numOfJoints);
61 s.desiredPose = currentPose;
62 s.forceImpedance.setZero();
72 sRt.desiredPose = sNoneRt.currentPose;
73 sRt.forceImpedance.setZero();
74 sRt.desiredJointTorques.setZero();
100 s.currentPose =
tcp->getPoseInRootFrame();
101 s.jacobi = ik->getJacobianMatrix(
tcp, VirtualRobot::IKSolver::CartesianSelection::All);
102 s.jacobi.block(0, 0, 3, numOfJoints) = 0.001 *
s.jacobi.block(0, 0, 3, numOfJoints);
106 s.jtpinv = ik->computePseudoInverseJacobianMatrix(
s.jacobi.transpose(), lambda);
110 Eigen::VectorXf qvelRaw(numOfJoints);
111 for (
size_t i = 0; i < robotStatus.
jointVelocity.size(); ++i)
119 s.currentTwist =
s.jacobi *
s.qvel;
146 if ((sRt.desiredPose.block<3, 1>(0, 3) -
s.desiredPose.block<3, 1>(0, 3)).norm() > 100.0f)
155 sRt.desiredPose =
s.desiredPose;
165 sRt.desiredPose.block<3, 3>(0, 0) *
s.currentPose.block<3, 3>(0, 0).transpose();
167 poseErrorImp.head(3) = 0.001 * (sRt.desiredPose.block<3, 1>(0, 3) -
s.currentPose.block<3, 1>(0, 3));
168 poseErrorImp.tail(3) = VirtualRobot::MathTools::eigen3f2rpy(diffMat);
170 c.kpImpedance.cwiseProduct(poseErrorImp) -
171 c.kdImpedance.cwiseProduct(
s.currentTwist);
178 Eigen::VectorXf nullspaceTorque =
179 c.kpNullspace.cwiseProduct(
c.desiredNullspaceJointAngles.value() -
s.qpos) -
180 c.kdNullspace.cwiseProduct(
s.qvel);
189 sRt.desiredJointTorques =
190 s.jacobi.transpose() * sRt.forceImpedance +
191 (I -
s.jacobi.transpose() *
s.jtpinv) * nullspaceTorque;
194 for (
size_t i = 0; i < (unsigned)sRt.desiredJointTorques.rows(); ++i)
196 sRt.desiredJointTorques(i) =
std::clamp(sRt.desiredJointTorques(i), -
c.torqueLimit,
c.torqueLimit);
197 targets.
targets.at(i) = sRt.desiredJointTorques(i);