27 #include <VirtualRobot/IK/DifferentialIK.h>
28 #include <VirtualRobot/LinkedCoordinate.h>
31 using namespace FindAndGraspObjectGroup;
46 ControlMode controlMode = ePositionControl;
60 ChannelRefPtr markerChannel = getInput<ChannelRef>(
"markerChannel");
163 std::string robotNodeSetName = getInput<std::string>(
"kinematicChain");
164 std::string tcpNodeName = getInput<std::string>(
"tcpName");
165 ARMARX_DEBUG <<
"robot node set: " << robotNodeSetName <<
", tcp: " << tcpNodeName;
167 VirtualRobot::RobotNodeSetPtr robotNodeSet = localRobot->getRobotNodeSet(robotNodeSetName);
168 VirtualRobot::RobotNodePtr tcpNode = localRobot->getRobotNode(tcpNodeName);
173 PosePtr rnPose = PosePtr::dynamicCast(
174 context->simulatorProxy->getRobotNodePose(localRobot->getName(), tcpNodeName));
203 FramedPosePtr targetFramedPose = getInput<FramedPose>(
"targetPose");
206 Eigen::Matrix4f targetGlobalPose = localRobot->getRobotNode(targetFramedPose->getFrame())
207 ->toGlobalCoordinateSystem(targetPose);
215 std::string refFrame = targetFramedPose->getFrame();
223 Eigen::VectorXf errorCartVec(6);
224 ARMARX_DEBUG <<
"target: " << targetGlobalPose.block(0, 3, 3, 1).transpose();
225 ARMARX_DEBUG <<
"tcp: " << tcpGlobalPose.block(0, 3, 3, 1).transpose();
226 errorCartVec.block(0, 0, 3, 1) =
227 targetGlobalPose.block(0, 3, 3, 1) - tcpGlobalPose.block(0, 3, 3, 1);
230 Eigen::Matrix4f orientation = targetGlobalPose * tcpGlobalPose.inverse();
231 Eigen::AngleAxis<float> aa(orientation.block<3, 3>(0, 0));
232 errorCartVec.tail(3) = aa.axis() * aa.angle();
234 ARMARX_DEBUG <<
"Cartesian error (RAW)" << errorCartVec.transpose();
237 float distance = errorCartVec.head(3).norm();
248 float stepSize = getInput<float>(
"stepSize");
249 errorCartVec = errorCartVec * stepSize;
251 float IKCutCartErrorMM = getInput<float>(
"IKCutCartErrorMM");
253 if (errorCartVec.head(3).norm() > IKCutCartErrorMM)
255 errorCartVec = errorCartVec / errorCartVec.head(3).norm() * IKCutCartErrorMM;
259 ARMARX_DEBUG <<
"Cartesian error (SCALED, cut:" << IKCutCartErrorMM <<
" mm)"
260 << errorCartVec.transpose();
262 bool useOrientation = getInput<bool>(
"useOrientation");
265 VirtualRobot::DifferentialIK dIK(robotNodeSet);
267 Eigen::VectorXf errorJoint(robotNodeSet->getSize());
276 startTime = IceUtil::Time::now();
279 dIK.getPseudoInverseJacobianMatrix(tcpNode, VirtualRobot::IKSolver::All);
281 endTime = IceUtil::Time::now();
285 errorJoint = Ji * errorCartVec;
289 startTime = IceUtil::Time::now();
296 endTime = IceUtil::Time::now();
301 Eigen::VectorXf errorPosition(3);
302 errorPosition(0) = errorCartVec(0);
303 errorPosition(1) = errorCartVec(1);
304 errorPosition(2) = errorCartVec(2);
308 errorJoint = Ji * errorPosition;
313 if (
interval.toMilliSeconds() > 80.0)
315 float diffClock = (
float)(((
float)(endT - startT) / (
float)CLOCKS_PER_SEC) * 1000.0f);
317 <<
" ms (wall time!). Pure CPU time:" << diffClock <<
"ms";
320 float VEL_GAIN = 1.0f;
321 float VEL_MAX_COEFF = 1.0f;
322 ARMARX_DEBUG <<
"JointVelocities " << errorJoint.transpose();
323 ARMARX_DEBUG <<
"JointVelocities GAIN" << errorJoint.transpose() * VEL_GAIN;
324 float maxV = fabs(errorJoint.maxCoeff());
326 if (maxV > VEL_MAX_COEFF)
328 errorJoint = errorJoint / maxV * VEL_MAX_COEFF;
329 ARMARX_DEBUG <<
"JointVelocities VEL_MAX_COEFF" << errorJoint.transpose() * VEL_GAIN;
336 NameControlModeMap controlModes;
337 const std::vector<VirtualRobot::RobotNodePtr> nodes = robotNodeSet->getAllRobotNodes();
339 for (
size_t i = 0; i < nodes.size(); i++)
341 VirtualRobot::RobotNodePtr n = nodes[i];
342 targetVelocities[n->getName()] = errorJoint(i) * VEL_GAIN;
343 targetAngles[n->getName()] = n->getJointValue() + errorJoint(i);
344 controlModes[n->getName()] = controlMode;
351 case ePositionControl:
357 case eVelocityControl:
362 case ePositionVelocityControl:
378 sendEvent<EvCalcVelocitiesDone>();
389 const std::string& refFrame,
395 VirtualRobot::LinkedCoordinate markerPose =
398 return markerPose.getInFrame(refFrame);
405 return "CalcVelocities";