27 #include <VirtualRobot/IK/ConstrainedOptimizationIK.h>
28 #include <VirtualRobot/IK/GenericIKSolver.h>
29 #include <VirtualRobot/IK/constraints/OrientationConstraint.h>
30 #include <VirtualRobot/IK/constraints/PositionConstraint.h>
31 #include <VirtualRobot/LinkedCoordinate.h>
32 #include <VirtualRobot/MathTools.h>
33 #include <VirtualRobot/RobotNodeSet.h>
34 #include <VirtualRobot/XML/RobotIO.h>
42 #include "../MotionControlGroupStatechartContext.h"
45 using namespace MotionControlGroup;
48 CartesianPositionControlIK::SubClassRegistry
62 if (in.getTimeout() > 0)
64 setTimeoutEvent(in.getTimeout(), createEventTimeout());
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);
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();
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"))
145 targetPosition->changeToGlobal(robot);
147 ARMARX_INFO <<
"Target position (Frame = " << targetPosition->getFrame() <<
": "
148 << targetPosition->toEigen();
153 else if (isInputParameterSet(
"TcpTargetOrientation"))
159 targetOrientation->changeToGlobal(robot);
161 ARMARX_INFO <<
"Target orientation (Frame = " << targetOrientation->getFrame() <<
": "
162 << targetOrientation->toEigen();
170 new Pose(robot->getGlobalPose()));
176 new VirtualRobot::PositionConstraint(localrobot,
179 globalTargetPose.block<3, 1>(0, 3),
182 positionConstraint->setOptimizationFunctionFactor(1);
185 new VirtualRobot::OrientationConstraint(localrobot,
188 globalTargetPose.block<3, 3>(0, 0),
190 orientationTolerance));
191 orientationConstraint->setOptimizationFunctionFactor(1000);
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;
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();
263 out.setJointTargetValues(jointTargetValues);
265 out.setJointTargetTolerance(0.1f);