72 getContext<MotionControlGroupStatechartContext>();
74 std::string kinChainName = in.getKinematicChainName();
75 float positionTolerance = in.getTcpPositionTolerance();
76 float orientationTolerance = in.getTcpOrientationTolerance();
107 if (!robot->hasRobotNodeSet(kinChainName))
113 auto nodeSet = localrobot->getRobotNodeSet(kinChainName);
116 VirtualRobot::IKSolver::CartesianSelection ikType = VirtualRobot::IKSolver::All;
117 if (isInputParameterSet(
"TcpTargetPosition") && isInputParameterSet(
"TcpTargetOrientation"))
119 ikType = VirtualRobot::IKSolver::All;
123 ARMARX_INFO <<
"Target position (Frame = " << targetPosition->getFrame()
124 <<
"): " << targetPosition->toEigen();
125 ARMARX_INFO <<
"Target orientation (Frame = " << targetOrientation->getFrame()
126 <<
"): " << targetOrientation->toEigen();
128 Eigen::Matrix4f mat = Eigen::Matrix4f::Identity();
129 mat.block<3, 3>(0, 0) = targetOrientation->toEigen();
130 VirtualRobot::MathTools::eigen4f2rpy(mat, rpy);
133 targetPosition->changeToGlobal(robot);
134 targetOrientation->changeToGlobal(robot);
139 else if (isInputParameterSet(
"TcpTargetPosition"))
141 ikType = VirtualRobot::IKSolver::Position;
145 targetPosition->changeToGlobal(robot);
147 ARMARX_INFO <<
"Target position (Frame = " << targetPosition->getFrame() <<
": "
148 << targetPosition->toEigen();
153 else if (isInputParameterSet(
"TcpTargetOrientation"))
155 ikType = VirtualRobot::IKSolver::Orientation;
159 targetOrientation->changeToGlobal(robot);
161 ARMARX_INFO <<
"Target orientation (Frame = " << targetOrientation->getFrame() <<
": "
162 << targetOrientation->toEigen();
170 new Pose(robot->getGlobalPose()));
174 Eigen::Matrix4f globalTargetPose = target->toEigen();
175 VirtualRobot::ConstraintPtr positionConstraint(
176 new VirtualRobot::PositionConstraint(localrobot,
179 globalTargetPose.block<3, 1>(0, 3),
182 positionConstraint->setOptimizationFunctionFactor(1);
184 VirtualRobot::ConstraintPtr orientationConstraint(
185 new VirtualRobot::OrientationConstraint(localrobot,
188 globalTargetPose.block<3, 3>(0, 0),
190 orientationTolerance));
191 orientationConstraint->setOptimizationFunctionFactor(1000);
198 IceUtil::Time start = IceUtil::Time::now();
199 VirtualRobot::ConstrainedOptimizationIK ikSolver(localrobot, nodeSet);
201 ikSolver.addConstraint(positionConstraint);
202 ikSolver.addConstraint(orientationConstraint);
203 ikSolver.initialize();
205 bool ikSuccess = ikSolver.solve();
206 ARMARX_INFO <<
"Solving IK took: " << (IceUtil::Time::now() - start).toMilliSecondsDouble()
207 <<
" ms " <<
VAROUT(ikSuccess);
209 float remainingErrorPos =
210 (globalTargetPose.block<3, 1>(0, 3) - nodeSet->getTCP()->getGlobalPose().block<3, 1>(0, 3))
212 Eigen::Matrix4f deltaMat = globalTargetPose * nodeSet->getTCP()->getGlobalPose().inverse();
213 Eigen::AngleAxisf aa(deltaMat.block<3, 3>(0, 0));
214 float remaingErrorOri = fabs(aa.angle());
221 ARMARX_INFO <<
"Found IK solution: remaining position error " << remainingErrorPos
222 <<
" mm, orientation error: " << remaingErrorOri <<
" rad ("
223 << (remaingErrorOri * 180 /
M_PI) <<
" deg)";
227 ARMARX_WARNING <<
"IK Solver failed: remaining position error " << remainingErrorPos
228 <<
" mm, orientation error: " << remaingErrorOri <<
" rad ("
229 << (remaingErrorOri * 180 /
M_PI) <<
" deg)";
230 ARMARX_DEBUG <<
"Reached Pose: " << nodeSet->getTCP()->getGlobalPose();
232 "UnreachedIKPose",
new Pose(target->toGlobalEigen(robot)));
233 robot->setGlobalPose(robot->getGlobalPose());
235 "BestFoundIKPose",
new Pose(nodeSet->getTCP()->getGlobalPose()));
236 if (in.getAlwaysExecuteBestFoundIkSolution())
239 <<
"Using failed IK anyway due to AlwaysExecuteBestFoundIkSolution == true";
243 if (!ikSuccess && !in.getAlwaysExecuteBestFoundIkSolution())
250 std::map<std::string, float> jointTargetValues;
251 std::map<std::string, float> jointVelocities;
253 VirtualRobot::RobotNodeSetPtr kinematicChain = localrobot->getRobotNodeSet(kinChainName);
255 for (
unsigned int i = 0; i < kinematicChain->getSize(); i++)
257 VirtualRobot::RobotNodePtr node = kinematicChain->getNode(i);
259 jointTargetValues[node->getName()] = node->getJointValue();
260 jointVelocities[node->getName()] = 1.0f;
263 out.setJointTargetValues(jointTargetValues);
264 out.setJointVelocities(jointVelocities);
265 out.setJointTargetTolerance(0.1f);