4 #include <boost/algorithm/clamp.hpp>
6 #include <SimoxUtility/json.h>
7 #include <SimoxUtility/math/compare/is_equal.h>
8 #include <SimoxUtility/math/convert/rpy_to_mat3f.h>
9 #include <SimoxUtility/math/convert/mat4f_to_pos.h>
10 #include <SimoxUtility/math/convert/mat4f_to_quat.h>
11 #include <VirtualRobot/MathTools.h>
26 ik.reset(
new VirtualRobot::DifferentialIK(
27 rns, rns->getRobot()->getRootNode(), VirtualRobot::JacobiProvider::eSVDDamped));
29 numOfJoints = rns->getSize();
125 ARMARX_INFO <<
"preactivate control law TaskspaceImpedanceController";
130 s.qpos = rns->getJointValuesEigen();
131 s.qvel.setZero(numOfJoints);
133 s.currentPose = currentPose;
134 s.currentTwist.setZero();
136 s.jacobi.setZero(6, numOfJoints);
137 s.jtpinv.setZero(6, numOfJoints);
145 s.desiredJointTorques.setZero(numOfJoints);
146 s.nullspaceTorque.setZero(numOfJoints);
148 s.virtualPose = currentPose;
149 s.virtualVel.setZero();
150 s.virtualAcc.setZero();
152 s.desiredPose = currentPose;
153 s.desiredTwist.setZero();
154 s.kmAdmittance.setZero();
156 s.currentForceTorque.setZero();
158 s.forceImpedance.setZero();
168 sRt.currentForceTorque.setZero();
204 s.currentPose =
tcp->getPoseInRootFrame();
205 s.jacobi = ik->getJacobianMatrix(
tcp, VirtualRobot::IKSolver::CartesianSelection::All);
206 s.jacobi.block(0, 0, 3, numOfJoints) = 0.001 *
s.jacobi.block(0, 0, 3, numOfJoints);
210 s.jtpinv = ik->computePseudoInverseJacobianMatrix(
s.jacobi.transpose(), lambda);
214 Eigen::VectorXf qvelRaw(numOfJoints);
215 for (
size_t i = 0; i < robotStatus.
jointVelocity.size(); ++i)
223 s.currentTwist =
s.jacobi *
s.qvel;
274 sRt.desiredTwist.setZero();
275 sRt.kmAdmittance.setZero();
276 sRt.currentForceTorque.setZero();
280 if ((sRt.desiredPose.block<3, 1>(0, 3) -
c.desiredPose.block<3, 1>(0, 3)).norm() > 100.0f)
282 sRt.currentForceTorque.setZero();
287 sRt.desiredPose =
c.desiredPose;
289 sRt.desiredTwist =
c.desiredTwist;
290 sRt.kmAdmittance =
c.kmAdmittance;
294 Eigen::Matrix3f objDiffMat = sRt.virtualPose.block<3, 3>(0, 0) * sRt.desiredPose.block<3, 3>(0, 0).transpose();
296 poseError.head(3) = sRt.virtualPose.block<3, 1>(0, 3) - sRt.desiredPose.block<3, 1>(0, 3);
297 poseError.tail(3) = VirtualRobot::MathTools::eigen3f2rpy(objDiffMat);
301 sRt.kmAdmittance.cwiseProduct(sRt.currentForceTorque) -
302 c.kpAdmittance.cwiseProduct(poseError) -
303 c.kdAdmittance.cwiseProduct(sRt.virtualVel);
305 Eigen::Vector6f vel = sRt.virtualVel + 0.5 * deltaT * (acc + sRt.virtualAcc);
307 sRt.virtualAcc = acc;
308 sRt.virtualVel = vel;
310 Eigen::Matrix3f deltaPoseMat = VirtualRobot::MathTools::rpy2eigen3f(deltaPose(3), deltaPose(4), deltaPose(5));
311 sRt.virtualPose.block<3, 1>(0, 3) += deltaPose.head(3);
312 sRt.virtualPose.block<3, 3>(0, 0) = deltaPoseMat * sRt.virtualPose.block<3, 3>(0, 0);
320 sRt.virtualPose.block<3, 3>(0, 0) *
s.currentPose.block<3, 3>(0, 0).transpose();
322 poseErrorImp.head(3) = 0.001 * (sRt.virtualPose.block<3, 1>(0, 3) -
s.currentPose.block<3, 1>(0, 3));
323 poseErrorImp.tail(3) = VirtualRobot::MathTools::eigen3f2rpy(diffMat);
325 c.kpImpedance.cwiseProduct(poseErrorImp) -
326 c.kdImpedance.cwiseProduct(
s.currentTwist);
333 Eigen::VectorXf nullspaceTorque =
334 c.kpNullspace.cwiseProduct(
c.desiredNullspaceJointAngles.value() -
s.qpos) -
335 c.kdNullspace.cwiseProduct(
s.qvel);
344 sRt.desiredJointTorques =
345 s.jacobi.transpose() * sRt.forceImpedance +
346 (I -
s.jacobi.transpose() *
s.jtpinv) * nullspaceTorque;
349 for (
size_t i = 0; i < (unsigned)sRt.desiredJointTorques.rows(); ++i)
351 sRt.desiredJointTorques(i) =
std::clamp(sRt.desiredJointTorques(i), -
c.torqueLimit,
c.torqueLimit);
352 targets.
targets.at(i) = sRt.desiredJointTorques(i);