27 #include <VirtualRobot/RobotNodeSet.h>
29 #include "VisualServoGroupStatechartContext.generated.h"
33 using namespace VisualServoGroup;
37 CalculateTcpTarget::SubClassRegistry
50 VisualServoGroupStatechartContext* context = getContext<VisualServoGroupStatechartContext>();
52 PosePtr desiredTcpOffsetToObject = in.getDesiredTcpOffsetToObject();
55 objectPose->toEigen() * desiredTcpOffsetToObject->toEigen();
56 FramedPose tcpTargetPose(tcpTargetPoseEigen, objectPose->frame, objectPose->agent);
57 auto nodeset = context->getRobotStateComponent()->getSynchronizedRobot()->getRobotNodeSet(
58 in.getKinematicChainName());
59 auto tcpTargetPoseChainRoot =
61 tcpTargetPoseChainRoot.changeFrame(context->getRobot(), nodeset->names.at(0));
62 float distance = tcpTargetPoseChainRoot.toEigen().block<3, 1>(0, 3).
norm();
66 out.setTcpTargetPose(tcpTargetPose);
68 if (in.getUseReachabilityMaps() &&
69 context->getRobotIK()->hasReachabilitySpace(in.getKinematicChainName()))
71 if (!context->getRobotIK()->hasReachabilitySpace(in.getKinematicChainName()))
73 ARMARX_ERROR <<
"No loaded reachability space available for kinematic chain '"
74 << in.getKinematicChainName()
75 <<
"'. Falling back to distance-based reachability check";
79 FramedPoseBasePtr p(
new FramedPose(tcpTargetPose));
81 if (context->getRobotIK()->isFramedPoseReachable(in.getKinematicChainName(), p))
83 ARMARX_INFO <<
"Reachability check for target pose: Succeeded";
84 emitTcpTargetCalculated();
95 if (
distance > in.getMaxTCPExtension())
98 <<
", max: " << in.getMaxTCPExtension();
103 emitTcpTargetCalculated();
126 return "CalculateTcpTarget";