4 #include <VirtualRobot/Nodes/RobotNode.h>
5 #include <VirtualRobot/Robot.h>
6 #include <VirtualRobot/RobotNodeSet.h>
9 #include <ArmarXCore/interface/observers/VariantBase.h>
20 #include <armarx/view_selection/gaze_controller/atan2/aron/ControllerConfig.aron.generated.h>
30 const NJointControllerConfigPtr& config,
35 ConfigPtrT cfg = ConfigPtrT::dynamicCast(config);
41 const armarx::view_selection::gaze_controller::atan2::arondto::Config configData =
42 arondto::Config::FromAron(cfg->config);
48 _rtRobot->setThreadsafe(
false);
51 _rtCameraNode = _rtRobot->getRobotNode(configData.params.cameraNodeName);
52 _rtPitchNode = _rtRobot->getRobotNode(configData.params.pitchNodeName);
53 _rtYawNode = _rtRobot->getRobotNode(configData.params.yawNodeName);
60 _rtPitchCtrlTarget = useControlTarget<armarx::ControlTarget1DoFActuatorPosition>(
61 configData.params.pitchNodeName, ControlModes::Position1DoF);
64 _rtYawCtrlTarget = useControlTarget<armarx::ControlTarget1DoFActuatorPosition>(
65 configData.params.yawNodeName, ControlModes::Position1DoF);
81 auto updateConfigDto = arondto::Config::FromAron(dto);
109 const float currentYawAngle = _rtYawNode->getJointValue();
110 const float currentPitchAngle = _rtPitchNode->getJointValue();
111 const float h = _rtCameraNode->getPositionInRootFrame().z();
114 _publishCurrentYawAngle = currentYawAngle;
115 _publishCurrentPitchAngle = currentPitchAngle;
121 _publishTargetYawAngle = 0;
122 _publishTargetPitchAngle = 0;
125 _rtYawCtrlTarget->position = 0;
126 _rtPitchCtrlTarget->position = 0;
137 const Eigen::Vector3f targetPoint =
target.toRootEigen(_rtRobot);
139 float targetYawAngle = -std::atan2(targetPoint.x(), targetPoint.y());
140 float targetPitchAngle = std::atan2(h - targetPoint.z(), targetPoint.y());
143 const bool targetReachable = _rtYawNode->checkJointLimits(targetYawAngle) &&
144 _rtPitchNode->checkJointLimits(targetPitchAngle);
145 if (not targetReachable)
149 targetYawAngle, _rtYawNode->getJointLimitLow(), _rtYawNode->getJointLimitHigh());
150 targetPitchAngle =
std::clamp(targetPitchAngle,
151 _rtPitchNode->getJointLimitLow(),
152 _rtPitchNode->getJointLimitHigh());
156 _publishTargetYawAngle = targetYawAngle;
157 _publishTargetPitchAngle = targetPitchAngle;
160 _rtYawCtrlTarget->position = targetYawAngle;
161 _rtPitchCtrlTarget->position = targetPitchAngle;
180 const float currentPitchAngle = _publishCurrentPitchAngle;
181 const float currentYawAngle = _publishCurrentYawAngle;
182 const float targetPitchAngle = _publishTargetPitchAngle;
183 const float targetYawAngle = _publishTargetYawAngle;
186 datafields[
"currentPitchAngle"] =
new Variant(currentPitchAngle);
187 datafields[
"currentYawAngle"] =
new Variant(currentYawAngle);
188 datafields[
"targetPitchAngle"] =
new Variant(targetPitchAngle);
189 datafields[
"targetYawAngle"] =
new Variant(targetYawAngle);