25 const VirtualRobot::RobotNodeSetPtr& rns,
26 const VirtualRobot::RobotNodeSetPtr& rtRns,
27 const std::vector<size_t>& torqueControlledIndex,
28 const std::vector<size_t>& velocityControlledIndex)
31 auto numOfJoints = rns->getSize();
40 rtTCP = rtRns->getTCP();
42 ik.reset(
new VirtualRobot::DifferentialIK(
43 rtRns, rtRns->getRobot()->getRootNode(), VirtualRobot::JacobiProvider::eSVDDamped));
62 const std::vector<std::string>& nameList,
63 const std::map<std::string, std::string>& jointControlModeMap)
65 std::set<std::string> validModes = {
"velocity",
"torque"};
67 for (
const auto& pair : jointControlModeMap)
69 if (std::find(nameList.begin(), nameList.end(), pair.first) == nameList.end())
71 ARMARX_ERROR <<
"TaskspaceMixedImpedanceVelocityController: joint name '"
72 << pair.first <<
"' not found in robot node set.";
76 if (validModes.find(pair.second) == validModes.end())
79 <<
"TaskspaceMixedImpedanceVelocityController: Invalid control mode for joint '"
80 << pair.first <<
"': " << pair.second << std::endl;
96 c.desiredPose.block<3, 3>(0, 0) * rtStatus.
currentPose.block<3, 3>(0, 0).transpose();
104 if (
c.ftConfig.resetToCurrentPoseOnSafeGuardTrigger)
119 if ((
c.desiredPose.block<3, 1>(0, 3) - rtStatus.
currentPose.block<3, 1>(0, 3)).norm() >
120 c.safeDistanceMMToGoal or
123 VirtualRobot::MathTools::deg2rad(
c.safeRotAngleDegreeToGoal))
145 auto nDoF =
static_cast<Eigen::Index
>(rtStatus.
nDoF);
149 ik->updateJacobianMatrix(rtStatus.
jacobi,
rtTCP, VirtualRobot::IKSolver::CartesianSelection::All);
154 rtStatus.
jpinv = ik->computePseudoInverseJacobianMatrix(
156 ik->getJacobiRegularization(VirtualRobot::IKSolver::CartesianSelection::All));
160 rtStatus.
jacobi.block(0, 0, 3, rtStatus.
nDoF) =
161 0.001 * rtStatus.
jacobi.block(0, 0, 3, rtStatus.
nDoF);
164 ik->computePseudoInverseJacobianMatrix(rtStatus.
jacobi.transpose(), rtStatus.
lambda);
183 rtStatus.
currentPose.block<3, 3>(0, 0).transpose();
216 c.kpNullspaceVel.cwiseProduct(
c.desiredNullspaceJointAngles.value() -