3 #include <SimoxUtility/math/convert/mat3f_to_rpy.h>
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/hemisphere/aron/ControllerConfig.aron.generated.h>
30 const NJointControllerConfigPtr& config,
35 ConfigPtrT cfg = ConfigPtrT::dynamicCast(config);
41 const armarx::view_selection::gaze_controller::hemisphere::arondto::Config configData =
42 arondto::Config::FromAron(cfg->config);
48 _rtRobot->setThreadsafe(
false);
51 _rtGazeNodeName = configData.params.gazeRootNodeName;
52 _rtGazeNode = _rtRobot->getRobotNode(_rtGazeNodeName);
53 _rtCameraNode = _rtRobot->getRobotNode(configData.params.cameraNodeName);
54 _rtHemiANode = _rtRobot->getRobotNode(configData.params.hemiANodeName);
55 _rtHemiBNode = _rtRobot->getRobotNode(configData.params.hemiBNodeName);
56 _rtYawNode = _rtRobot->getRobotNode(configData.params.yawNodeName);
64 _rtHemiACtrlTarget = useControlTarget<armarx::ControlTarget1DoFActuatorPosition>(
65 configData.params.hemiANodeName, ControlModes::Position1DoF);
68 _rtHemiBCtrlTarget = useControlTarget<armarx::ControlTarget1DoFActuatorPosition>(
69 configData.params.hemiBNodeName, ControlModes::Position1DoF);
73 _rtYawCtrlTarget = useControlTarget<armarx::ControlTarget1DoFActuatorPosition>(
74 configData.params.yawNodeName, ControlModes::Position1DoF);
89 auto updateConfigDto = arondto::Config::FromAron(dto);
120 const float currentYawAngle = _rtYawNode->getJointValue();
125 _publishCurrentYawAngle = currentYawAngle;
132 _publishTargetYawAngle = 0;
136 _rtYawCtrlTarget->position = 0;
137 _rtHemiACtrlTarget->position = 0;
138 _rtHemiBCtrlTarget->position = 0;
148 target.changeFrame(_rtRobot, _rtGazeNodeName);
149 Eigen::Vector3f targetPoint =
target.toEigen();
152 float targetYawAngle = -std::atan2(targetPoint.x(), targetPoint.y());
158 targetPoint = Eigen::AngleAxisf(-targetYawAngle, Eigen::Vector3f::UnitZ()) * targetPoint;
161 const bool yawTargetReachable = _rtYawNode->checkJointLimits(targetYawAngle);
162 if (not yawTargetReachable)
165 targetYawAngle, _rtYawNode->getJointLimitLow(), _rtYawNode->getJointLimitHigh());
169 float targetPitchAngle = -std::atan2(targetPoint.z(), targetPoint.y());
172 targetPitchAngle = (
rtGetControlStruct().params.yawToHemiFactorLinear * targetPitchAngle) +
174 targetPitchAngle * targetPitchAngle);
177 const bool pitchTargetReachable = _rtHemiANode->checkJointLimits(targetPitchAngle) and
178 _rtHemiBNode->checkJointLimits(targetPitchAngle);
179 if (not pitchTargetReachable)
181 targetPitchAngle =
std::clamp(targetPitchAngle,
182 _rtHemiANode->getJointLimitLow(),
183 _rtHemiANode->getJointLimitHigh());
185 targetPitchAngle =
std::clamp(targetPitchAngle,
186 _rtHemiBNode->getJointLimitLow(),
187 _rtHemiBNode->getJointLimitHigh());
191 _publishTargetYawAngle = targetYawAngle;
195 _publishPlatformOrientation =
196 simox::math::mat3f_to_rpy(_rtRobot->getGlobalOrientation()).z();
199 _rtYawCtrlTarget->position = targetYawAngle;
200 _rtHemiACtrlTarget->position = targetPitchAngle;
201 _rtHemiBCtrlTarget->position = targetPitchAngle;
223 const float currentYawAngle = _publishCurrentYawAngle.load();
225 const float targetYawAngle = _publishTargetYawAngle.load();
229 datafields[
"currentYawAngle"] =
new Variant(currentYawAngle);
231 datafields[
"targetYawAngle"] =
new Variant(targetYawAngle);
232 datafields[
"platformYaw"] =
new Variant(_publishPlatformOrientation.load());