86 for (VirtualRobot::RobotNodePtr rn : rns->getAllRobotNodes())
88 if (rn->isLimitless())
94 rn->setJointValue((rn->getJointLimitHi() + rn->getJointLimitLo()) / 2);
103 s.cols = rns->getSize();
110 s.jointRegularization = Eigen::VectorXf::Zero(s.cols);
111 for (
size_t i = 0; i < rns->getSize(); i++)
113 s.jointRegularization(i) = rns->getNode(i)->isTranslationalJoint()
118 s.cartesianRegularization = Eigen::VectorXf::Zero(s.rows);
125 target->jacobi = Eigen::MatrixXf::Zero(h, s.cols);
126 s.cartesianRegularization.block(row, 0, h, 1) =
134 s.jointValues = rns->getJointValuesEigen();
136 for (
size_t i = 0; i <= params.
steps; i++)
141 bool allReached =
true;
144 allReached = allReached &&
145 target->pCtrl.reached(
146 target->target, target->mode, target->maxPosError, target->maxOriError);
159 for (
size_t i = 0; i < rns->getSize(); i++)
161 VirtualRobot::RobotNodePtr rn = rns->getNode(i);
162 if (rn->isLimitless())
168 result.
jointLimitMargins(i) = std::min(rn->getJointValue() - rn->getJointLimitLo(),
169 rn->getJointLimitHi() - rn->getJointValue());
208 s.jacobi = Eigen::MatrixXf::Zero(s.rows, s.cols);
209 s.invJac = Eigen::MatrixXf::Zero(s.cols, s.rows);
211 Eigen::VectorXf cartesianVel = Eigen::VectorXf::Zero(s.rows);
216 ik->updateJacobianMatrix(target->jacobi, target->tcp, target->mode);
218 s.jacobi.block(row, 0, h, s.cols) = target->jacobi;
219 Eigen::VectorXf
cv = target->pCtrl.calculate(target->target, target->mode);
221 cartesianVel.block(row, 0, h, 1) =
cv;
226 step.tcpPose = target->tcp->getPoseInRootFrame();
228 step.posDiff = target->pCtrl.getPositionDiff(target->target);
229 step.oriDiff = target->pCtrl.getOrientationDiff(target->target);
230 target->ikSteps.emplace_back(
step);
240 for (
int row = 0; row < s.rows; row++)
242 s.jacobi.block(row, 0, 1, s.cols) =
243 s.jacobi.block(row, 0, 1, s.cols).cwiseProduct(s.jointRegularization.transpose());
250 ik->updatePseudoInverseJacobianMatrix(s.invJac, s.jacobi, 0, s.cartesianRegularization);
252 Eigen::VectorXf nullspaceVel = Eigen::VectorXf::Zero(s.cols);
256 Eigen::VectorXf nsgrad = nsGradient->kP * nsGradient->getGradient(params);
258 nullspaceVel += nsgrad;
267 Eigen::JacobiSVD<Eigen::MatrixXf> svd(s.jacobi, Eigen::ComputeFullU | Eigen::ComputeFullV);
268 Eigen::MatrixXf V = svd.matrixV();
269 Eigen::MatrixXf nullspaceSVD = V.block(0, s.rows, s.cols, s.cols - s.rows);
271 s.nullspace = nullspaceSVD;
273 Eigen::VectorXf nsv = Eigen::VectorXf::Zero(s.cols);
274 for (
int i = 0; i < s.nullspace.cols(); i++)
276 float squaredNorm = s.nullspace.col(i).squaredNorm();
278 if (squaredNorm > 1.0e-32f)
280 nsv += s.nullspace.col(i) * s.nullspace.col(i).dot(nullspaceVel) /
281 s.nullspace.col(i).squaredNorm();
285 Eigen::VectorXf jv = s.invJac * cartesianVel;
291 jv = jv.cwiseProduct(s.jointRegularization);
295 Eigen::VectorXf newJointValues = s.jointValues + jv;
304 rns->setJointValues(newJointValues);
305 s.jointValues = newJointValues;