29 #include <VirtualRobot/IK/DifferentialIK.h>
30 #include <VirtualRobot/Nodes/RobotNode.h>
31 #include <VirtualRobot/RobotNodeSet.h>
41 float infNorm = vec.lpNorm<Eigen::Infinity>();
42 if (infNorm > maxValue)
44 vec = vec / infNorm * maxValue;
51 const Eigen::Vector3f& elbowTarget,
52 VirtualRobot::RobotNodeSetPtr rns,
53 VirtualRobot::RobotNodePtr tcp,
54 VirtualRobot::RobotNodePtr elbow,
67 for (VirtualRobot::RobotNodePtr rn : rns->getAllRobotNodes())
69 if (rn->isLimitless())
75 rn->setJointValue((rn->getJointLimitHi() + rn->getJointLimitLo()) / 2);
88 std::vector<IKStep> ikSteps;
89 Eigen::VectorXf currentJointValues = rns->getJointValuesEigen();
96 Eigen::Vector3f pdTcp =
98 Eigen::Vector3f odTcp =
100 Eigen::VectorXf cartesianVel(posLen + oriLen);
103 cartesianVel.block<3, 1>(0, 0) = pdTcp;
107 cartesianVel.block<3, 1>(posLen, 0) = odTcp;
111 Eigen::VectorXf cartesianVelElb(3);
112 cartesianVelElb.block<3, 1>(0, 0) = pdElb;
113 Eigen::VectorXf jvElb =
115 Eigen::VectorXf jvLA =
117 Eigen::VectorXf jv = vcTcp.
calculate(cartesianVel, jvElb + jvLA, mode);
122 Eigen::VectorXf jvClamped = jv * stepLength;
131 s.tcpPose = tcp->getPoseInRootFrame();
132 s.elbPose = elbow->getPoseInRootFrame();
133 s.cartesianVel = cartesianVel;
134 s.cartesianVelElb = cartesianVelElb;
138 s.jvClamped = jvClamped;
139 ikSteps.emplace_back(
s);
143 Eigen::VectorXf newJointValues = currentJointValues + jvClamped;
144 rns->setJointValues(newJointValues);
145 currentJointValues = newJointValues;
165 if (posMet > 2 && oriMet > 2)
187 for (
size_t i = 0; i < rns->getSize(); i++)
189 VirtualRobot::RobotNodePtr rn = rns->getNode(i);
190 if (rn->isLimitless())
197 rn->getJointLimitHi() - rn->getJointValue());