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();
94 int posLen = mode & VirtualRobot::IKSolver::Position ? 3 : 0;
95 int oriLen = mode & VirtualRobot::IKSolver::Orientation ? 3 : 0;
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 =
114 params.
elbowKp * vcElb.
calculate(cartesianVelElb, VirtualRobot::IKSolver::Position);
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())
196 result.
jointLimitMargins(i) = std::min(rn->getJointValue() - rn->getJointLimitLo(),
197 rn->getJointLimitHi() - rn->getJointValue());
static Result CalculateDiffIK(const Eigen::Matrix4f &targetPose, const Eigen::Vector3f &elbowTarget, VirtualRobot::RobotNodeSetPtr rns, VirtualRobot::RobotNodePtr tcp, VirtualRobot::RobotNodePtr elbow, Mode setOri, Parameters params=Parameters())