27 #include <IceUtil/UUID.h>
28 #include <VirtualRobot/RobotNodeSet.h>
30 #include "VisualServoGroupStatechartContextBase.generated.h"
33 using namespace VisualServoGroup;
37 VisualServoTowardsTargetPose::SubClassRegistry
51 if (!in.isTcpTargetPoseSet() && !in.isTcpTargetPositionSet())
53 ARMARX_ERROR <<
"Either TcpTargetPose or TcpTargetPosition has to be set for VisualServo, "
61 VisualServoGroupStatechartContextBase* context =
62 getContext<VisualServoGroupStatechartContextBase>();
64 std::string kinematicChainName = in.getKinematicChainName();
65 if (!in.isTCPNameInRobotModelSet())
68 context->getLocalRobot()->getRobotNodeSet(kinematicChainName)->getTCP()->getName();
69 local.setTcpNameInRobotModel(tcpName);
73 local.setTcpNameInRobotModel(in.getTCPNameInRobotModel());
76 local.setSpeedModificationFactorHandNotLocalized(0.3f);
77 local.setSpeedModificationFactorHandPoseUncertain(0.5f);
79 if (in.isStartTimeRefSet())
81 ARMARX_INFO <<
"Using existing StartTime for Visual Servo.";
82 local.setTimerCreated(
false);
86 ARMARX_INFO <<
"Creating new StartTime for Visual Servo.";
88 getSystemObserver()->startTimer(
"VisualServoTimer_" + IceUtil::generateUUID()));
89 local.setTimerCreated(
true);
92 if (context->getTCPControlUnit()->isRequested())
94 ARMARX_INFO <<
"TCPControlUnit is already requested.";
95 local.setTCPControlUnitRequested(
false);
100 context->getTCPControlUnit()->request();
101 local.setTCPControlUnitRequested(
true);
105 std::string chainName = in.getKinematicChainName();
106 memoryx::PersistentObjectClassSegmentBasePrx classesSegmentPrx =
107 context->getPriorKnowledge()->getObjectClassesSegment();
108 auto tcpObjectClass = classesSegmentPrx->getObjectClassByName(
109 in.getHandMemoryChannel()->getDataField(
"className")->getString());
112 context->getEntityDrawerTopic()->setObjectVisu(
113 "VisualServoHandVisu",
"tcpTarget_" + chainName, tcpObjectClass,
new Pose());
114 context->getEntityDrawerTopic()->updateObjectTransparency(
115 "VisualServoHandVisu",
"tcpTarget_" + chainName, 0.3);
122 if (local.getTimerCreated())
125 getSystemObserver()->removeTimer(in.getStartTimeRef());
127 if (local.getTCPControlUnitRequested())
130 getTcpControlUnit()->release();
133 VisualServoGroupStatechartContextBase* context =
134 getContext<VisualServoGroupStatechartContextBase>();
135 context->getDebugDrawerTopic()->removeLayer(
"VisualServo");
136 context->getEntityDrawerTopic()->removeLayer(
"VisualServoHandVisu");
143 return "VisualServoTowardsTargetPose";