31 #include <VirtualRobot/IK/GenericIKSolver.h>
32 #include <VirtualRobot/LinkedCoordinate.h>
33 #include <VirtualRobot/RobotNodeSet.h>
38 using namespace MotionControlGroup;
41 CalculateJointAngleConfiguration::SubClassRegistry
64 std::string kinChainName = getInput<std::string>(
"kinematicChainName");
65 float maxError = getInput<float>(
"targetPositionDistanceTolerance");
66 float maxErrorRot = getInput<float>(
"targetOrientationDistanceTolerance");
67 bool withOrientation = getInput<bool>(
"ikWithOrientation");
98 if (!robot->hasRobotNodeSet(kinChainName))
100 ARMARX_WARNING <<
"Robot does not know kinematic chain with name " << kinChainName <<
flush;
101 sendEvent<Failure>();
104 ARMARX_INFO <<
"Setting up ik solver for kin chain: " << kinChainName
105 <<
", max position error:" << maxError <<
", max orientation erorr " << maxErrorRot
107 VirtualRobot::GenericIKSolverPtr ikSolver(
new VirtualRobot::GenericIKSolver(
108 robot->getRobotNodeSet(kinChainName), VirtualRobot::JacobiProvider::eSVDDamped));
109 ikSolver->setVerbose(
true);
110 ikSolver->setMaximumError(maxError, maxErrorRot);
111 ikSolver->setupJacobian(0.6f, 10);
113 VirtualRobot::LinkedCoordinate
target =
115 getInput<FramedPosition>(
"targetTCPPosition"),
116 getInput<FramedOrientation>(
"targetTCPOrientation"));
123 Eigen::Matrix4f goalGlobal = robot->getRootNode()->toGlobalCoordinateSystem(goalInRoot);
131 if (!ikSolver->solve(goalGlobal, ikType, 5))
134 sendEvent<Failure>();
141 VirtualRobot::RobotNodeSetPtr kinematicChain = robot->getRobotNodeSet(kinChainName);
143 for (
int i = 0; i < (
signed int)kinematicChain->getSize(); i++)
146 targetJointValues.
addVariant(
Variant(kinematicChain->getNode(i)->getJointValue()));
147 ARMARX_LOG <<
" joint: " << kinematicChain->getNode(i)->getName()
148 <<
" value: " << kinematicChain->getNode(i)->getJointValue() <<
flush;
155 setOutput(
"targetJointValues", targetJointValues);
156 sendEvent<EvCalculationDone>();
164 return "CalculateJointAngleConfiguration";