29 #include <Eigen/Eigen>
31 #include <VirtualRobot/IK/GazeIK.h>
32 #include <VirtualRobot/LinkedCoordinate.h>
33 #include <VirtualRobot/Robot.h>
34 #include <VirtualRobot/RobotNodeSet.h>
35 #include <VirtualRobot/XML/RobotIO.h>
42 using namespace MotionControlGroup;
68 getContext<MotionControlGroupStatechartContext>();
72 while (!isRunningTaskStopped())
83 VirtualRobot::RobotNodeSetPtr kinematicChain =
84 robot->getRobotNodeSet(in.getKinematicChainName());
88 ARMARX_WARNING <<
"No kinematicChain with name " << in.getKinematicChainName();
94 if (in.isVirtualPrismaticJointNameSet())
96 tcpName = in.getVirtualPrismaticJointName();
100 tcpName = kinematicChain->getTCP()->getName();
103 VirtualRobot::RobotNodePrismaticPtr virtualJoint =
104 std::dynamic_pointer_cast<VirtualRobot::RobotNodePrismatic>(
105 robot->getRobotNode(tcpName));
109 ARMARX_WARNING <<
"No virtualJoint with name '" << tcpName <<
"'";
113 VirtualRobot::GazeIK ikSolver(kinematicChain, virtualJoint);
114 ikSolver.setup(30, 50, 30);
115 ikSolver.enableJointLimitAvoidance(
true);
122 targetPosition, targetOrientation, targetPosition->frame, targetPosition->agent);
125 Eigen::Vector3f targetPosRootFrame = goalInRoot.block<3, 1>(0, 3);
132 ARMARX_INFO <<
"Calculating IK for target position in root frame " << targetPosRootFrame;
134 if (!ikSolver.solve(globalPose.block<3, 1>(0, 3)))
142 std::map<std::string, float> targetJointValues;
144 for (
int i = 0; i < (
signed int)kinematicChain->getSize(); i++)
146 if (kinematicChain->getNode(i)->getName().compare(tcpName) != 0)
148 targetJointValues[kinematicChain->getNode(i)->getName()] =
149 kinematicChain->getNode(i)->getJointValue();
150 ARMARX_INFO <<
" joint: " << kinematicChain->getNode(i)->getName()
151 <<
" value: " << kinematicChain->getNode(i)->getJointValue();
155 ARMARX_INFO <<
"number of joints to be set: " << targetJointValues.size();
156 ARMARX_INFO <<
"setting output: targetJointValues";
157 out.setTargetJointValues(targetJointValues);
158 emitCalculationDone();