26 #include <VirtualRobot/MathTools.h>
27 #include <VirtualRobot/RobotNodeSet.h>
34 using namespace MotionControlGroup;
59 auto robot =
c->getLocalRobot();
60 auto sharedRobot =
c->getRobotStateComponent()->getSynchronizedRobot();
62 c->getTCPControlUnit()->request();
64 if (in.isTCPNameSet())
66 tcpName = in.getTCPName();
70 tcpName = robot->getRobotNodeSet(in.getKinematicChainName())->getTCP()->getName();
72 auto tcp = robot->getRobotNode(tcpName);
73 std::string kinematicChainName = in.getKinematicChainName();
76 c->getRobot()->getRootNode()->getName(),
77 c->getRobot()->getName());
78 Eigen::Vector3f startPositionInRootFrame = startPose->toEigen().block<3, 1>(0, 3);
79 out.setStartPose(FramedPosePtr::dynamicCast(startPose->clone()));
81 float tcpVelocity = in.getTCPVelocity();
82 Eigen::Vector3f tcpDirectionInRootFrame =
83 in.getMoveDirection()->toRootEigen(robot).normalized();
84 int sleepTimeMilliSec = int(1.0f / in.getControlFrequency() * 1000.0f);
85 bool keepOrientation = in.getKeepStartOrientation();
86 ARMARX_INFO <<
"Keeping orientation: " << keepOrientation;
88 while (!isRunningTaskStopped())
95 Eigen::Vector3f orientationDelta;
96 FramedPosePtr TCPDeltaToGoal = FramedPosePtr::dynamicCast(startPose->clone());
97 TCPDeltaToGoal->changeFrame(robot, tcpName);
98 VirtualRobot::MathTools::eigen4f2rpy(TCPDeltaToGoal->toEigen(), orientationDelta);
99 orientationVel =
new FramedDirection(orientationDelta * 10, tcpName, robot->getName());
100 Eigen::Vector3f axis;
101 float angleError = 0;
102 VirtualRobot::MathTools::eigen4f2axisangle(TCPDeltaToGoal->toEigen(), axis, angleError);
110 Eigen::Vector3f currentTargetPosition =
111 startPositionInRootFrame + timePassed * tcpVelocity * tcpDirectionInRootFrame;
112 positionVel =
new FramedDirection(currentTargetPosition - tcp->getPositionInRootFrame(),
113 robot->getRootNode()->getName(),
116 float distanceTravelled = (tcp->getPositionInRootFrame() - startPositionInRootFrame).
norm();
121 if (distanceTravelled >= in.getMaxDistance())
125 c->getTCPControlUnit()->release();
128 c->getTCPControlUnit()->setTCPVelocity(
129 kinematicChainName, tcpName, positionVel, orientationVel);
134 c->getTCPControlUnit()->setTCPVelocity(kinematicChainName, tcpName, zeroVelocity, zeroVelocity);
136 c->getTCPControlUnit()->release();
141 float distanceTravelled = (tcp->getPositionInRootFrame() - startPositionInRootFrame).
norm();
143 out.setDistanceTravelled(distanceTravelled);
145 FramedPosePtr TCPDeltaToGoal = FramedPosePtr::dynamicCast(startPose->clone());
146 TCPDeltaToGoal->changeFrame(robot, tcpName);
147 Eigen::Vector3f axis;
148 float angleError = 0;
149 VirtualRobot::MathTools::eigen4f2axisangle(TCPDeltaToGoal->toEigen(), axis, angleError);
159 waitForRunningTaskToFinish();