4 #include <Eigen/Geometry>
22 fromAron(in.parameters.humanTrackingId, humanTrackingId);
24 handoverTargetProvider = std::make_unique<target_provider::handover::RobotReceiver>(
25 humanTrackingId, srv_->robot);
28 return ::armarx::skills::Skill::InitResult{
29 .status = ::armarx::skills::TerminatedSkillStatus::Succeeded};
39 const auto metronomeTargetPeriod =
50 metronome.waitForNextTick();
55 return ::armarx::skills::Skill::MainResult{
56 .status = ::armarx::skills::TerminatedSkillStatus::Succeeded};
60 LookAtHumanFace::update()
62 std::optional<armem::human::HumanPose> latestPoseOfRequestedHuman =
63 getLatestPoseOfRequestedHuman();
65 if (latestPoseOfRequestedHuman.has_value())
68 std::vector<gaze_targets::GazeTarget> gazeTargets =
69 handoverTargetProvider->updateTargetsAfterHandover(
70 latestPoseOfRequestedHuman.value());
71 for (
const auto& gazeTarget : gazeTargets)
73 ARMARX_INFO <<
"Committing gaze target " << gazeTarget;
75 srv_->viewSelectionClient.commitGazeTargets(gazeTargets);
79 ARMARX_VERBOSE <<
"Did not find any pose for the requested human tracking ID";
83 std::optional<armem::human::HumanPose>
84 LookAtHumanFace::getLatestPoseOfRequestedHuman()
89 .
withName(srv_->humanPoseMemoryID.coreSegmentName)
96 armem::client::QueryResult result =
97 srv_->memoryNameSystem.getReader(srv_->humanPoseMemoryID)
100 std::optional<armem::human::HumanPose> latestPoseOfRequestedHuman = std::nullopt;
103 result.memory.forEachInstance(
106 armem::human::HumanPose humanPose;
107 armarx::human::arondto::HumanPose dto =
108 armarx::human::arondto::HumanPose::FromAron(instance.data());
110 if (humanPose.humanTrackingId == humanTrackingId &&
111 (!latestPoseOfRequestedHuman.has_value() ||
112 humanPose.timestamp > latestPoseOfRequestedHuman->timestamp))
114 latestPoseOfRequestedHuman = humanPose;
120 ARMARX_WARNING <<
"Failed to query the human memory: " << result.errorMessage;
122 return latestPoseOfRequestedHuman;
126 LookAtHumanFace::onStopRequested()
129 stop_requested_ =
true;