LookForObjects.cpp
Go to the documentation of this file.
1 #include "LookForObjects.h"
2 
3 #include <Eigen/Core>
4 
7 
11 
13 
14 #include "ScanLocation.h"
15 
17 {
18  LookForObjects::LookForObjects(const Services& srv) : Base(DefaultSkillDescription())
19  {
20  srv_.emplace(srv);
21  }
22 
24  LookForObjects::init(const Base::SpecializedInitInput& in)
25  {
26  return ::armarx::skills::Skill::InitResult{
27  .status = ::armarx::skills::TerminatedSkillStatus::Succeeded};
28  }
29 
31  LookForObjects::main(const Base::SpecializedMainInput& in)
32  {
33  std::set<armarx::ObjectID> requiredObjectClassIDs;
34  for (const auto& objectID : in.parameters.requiredObjectClassIDs)
35  {
36  requiredObjectClassIDs.insert(armarx::aron::fromAron<armarx::ObjectID>(objectID));
37  }
38 
39  const size_t numberOfRequiredObjectClassIDs = requiredObjectClassIDs.size();
40 
41  const std::vector<Eigen::Vector3f> gazePositions =
42  ScanLocation::MakeGazeTargetPositions(in.parameters.scanLocation);
43 
44  const Duration duration =
45  Duration::SecondsDouble(in.parameters.scanLocation.durationPerViewSeconds);
46 
48 
49  Result result;
50 
51  DateTime nextTargetDueTime = DateTime::Now();
52  size_t nextTargetIndex = 0;
53 
54  Metronome metronome(Frequency::HertzDouble(5));
55  while (true)
56  {
57  // Check object positions.
58  {
59  const objpose::ObjectPoseSeq objectPoses =
60  srv_->objectPoseClient.fetchObjectPoses();
61 
62  for (const objpose::ObjectPose& objectPose : objectPoses)
63  {
64  const ObjectID objectPoseClassID = objectPose.objectID.getClassID();
65 
66  if (requiredObjectClassIDs.erase(objectPoseClassID) > 0)
67  {
68  toAron(result.foundObjectInstanceIDs.emplace_back(), objectPose.objectID);
69  }
70  }
71 
72  if (requiredObjectClassIDs.empty())
73  {
74  // All required object classes found - we are done here.
75  break;
76  }
77  }
78 
79  // Control head.
80  const DateTime now = DateTime::Now();
81  if (now > nextTargetDueTime)
82  {
83  if (nextTargetIndex >= gazePositions.size())
84  {
85  // "Timeout" - viewed all positions.
86  break;
87  }
88 
89  // Move to next target.
90  const Eigen::Vector3f& position = gazePositions.at(nextTargetIndex);
91 
92  ARMARX_INFO << "Looking to position #" << (nextTargetIndex + 1) << "/"
93  << gazePositions.size() << " (" << position.transpose() << ")";
94 
95  const gaze_targets::GazeTarget gazeTarget =
96  ScanLocation::MakeGazeTarget(position, in.parameters.scanLocation);
97 
98  srv_->viewSelectionClient.commitGazeTarget(gazeTarget);
99  this->latestGazeTarget_ = gazeTarget;
100 
101  ++nextTargetIndex;
102  nextTargetDueTime = now + duration;
103  }
104  metronome.waitForNextTick();
106  }
107 
108  // Hotfix: Wait some time before proceeding to allow the localization to settle.
109  const Duration waitDuration = Duration::SecondsDouble(2.0);
110  {
111  const DateTime start = DateTime::Now();
112 
113  Metronome metronome(Frequency::HertzDouble(5.0));
114  while ((DateTime::Now() - start) < waitDuration)
115  {
116  metronome.waitForNextTick();
118  }
119  }
120 
122 
123  result.allRequiredObjectClassesFound =
124  result.foundObjectInstanceIDs.size() == numberOfRequiredObjectClassIDs;
125 
126  return MakeSucceededResult(result.toAron());
127  }
128 
129  void
130  LookForObjects::onStopRequested()
131  {
132  if (latestGazeTarget_.has_value())
133  {
134  gaze_targets::GazeTarget deletedTarget = latestGazeTarget_.value();
135  deletedTarget.priority =
136  gaze_targets::TargetPriority(gaze_targets::AttentionType::TaskDriven, 0.0);
137  deletedTarget.keepInQueue = false;
138  deletedTarget.duration = Duration::Seconds(0);
139  deletedTarget.status = gaze_targets::TargetStatus::Aborted;
140  srv_->viewSelectionClient.commitGazeTarget(deletedTarget);
141  }
142  }
143 
146  {
147  Params defaults;
148  toAron(defaults.requiredObjectClassIDs.emplace_back(),
149  armarx::ObjectID("Kitchen", "bio-milk"));
150 
151  defaults.scanLocation = arondto::ScanLocationParams::FromAron(
152  ScanLocation::DefaultSkillDescription().rootProfileDefaults);
153 
156  .description = "",
157  .rootProfileDefaults = defaults.toAron(),
158  .timeout = armarx::Duration::Minutes(10),
159  .parametersType = Params::ToAronType(),
160  .resultType = Result::ToAronType(),
161  };
162  }
163 
164 } // namespace armarx::view_selection::skills
armarx::view_selection::skills::LookForObjects::LookForObjects
LookForObjects(const Services &srv)
Definition: LookForObjects.cpp:18
armarx::view_selection::skills
This file is part of ArmarX.
Definition: constants.cpp:25
armarx::skills::SimpleSpecializedSkill< arondto::LookForObjectsParams >::init
Skill::InitResult init() final
Definition: SimpleSpecializedSkill.h:62
armarx::view_selection::skills::ScanLocation::MakeGazeTargetPositions
static std::vector< Eigen::Vector3f > MakeGazeTargetPositions(const arondto::ScanLocationParams &parameters)
Definition: ScanLocation.cpp:48
armarx::ObjectID
A known object ID of the form "Dataset/ClassName" or "Dataset/ClassName/InstanceName".
Definition: ObjectID.h:10
armarx::view_selection::skills::LookForObjects::Services
Definition: LookForObjects.h:43
armarx::objpose::ObjectPoseSeq
std::vector< ObjectPose > ObjectPoseSeq
Definition: forward_declarations.h:20
armarx::view_selection::skills::ScanLocation::DefaultSkillDescription
static armarx::skills::SkillDescription DefaultSkillDescription()
Definition: ScanLocation.cpp:98
armarx::view_selection::skills::ScanLocation::MakeGazeTarget
static gaze_targets::GazeTarget MakeGazeTarget(const Eigen::Vector3f &position, const arondto::ScanLocationParams &parameters)
Definition: ScanLocation.cpp:20
armarx::armem::attachment::ObjectID
armem::MemoryID ObjectID
Definition: types.h:79
armarx::skills::SkillDescription
Definition: SkillDescription.h:17
armarx::core::time::DateTime::Now
static DateTime Now()
Definition: DateTime.cpp:51
Duration.h
aron_conversions.h
armarx::view_selection::gaze_targets::AttentionType::TaskDriven
@ TaskDriven
Task-Driven attention has highest priority.
armarx::core::time::Duration::Seconds
static Duration Seconds(std::int64_t seconds)
Constructs a duration in seconds.
Definition: Duration.cpp:72
ScanLocation.h
armarx::view_selection::skills::LookForObjects::DefaultSkillDescription
static armarx::skills::SkillDescription DefaultSkillDescription()
Definition: LookForObjects.cpp:145
armarx::view_selection::skills::LookForObjects::Params
arondto::LookForObjectsParams Params
Definition: LookForObjects.h:39
armarx::core::time::Frequency::HertzDouble
static Frequency HertzDouble(double hertz)
Definition: Frequency.cpp:30
armarx::skills::SkillDescription::skillId
SkillID skillId
Definition: SkillDescription.h:19
armarx::skills::SimpleSpecializedSkill
Definition: SimpleSpecializedSkill.h:10
armarx::core::time::Duration::SecondsDouble
static Duration SecondsDouble(double seconds)
Constructs a duration in seconds.
Definition: Duration.cpp:78
Metronome.h
armarx::core::time::Duration::Minutes
static Duration Minutes(std::int64_t minutes)
Constructs a duration in minutes.
Definition: Duration.cpp:96
armarx::skills::Skill::MakeSucceededResult
static MainResult MakeSucceededResult(aron::data::DictPtr data=nullptr)
Definition: Skill.cpp:346
armarx::skills::Skill::MainResult
A result struct for th main method of a skill.
Definition: Skill.h:39
skill_ids.h
forward_declarations.h
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::skills::SimpleSpecializedSkill< arondto::LookForObjectsParams >::main
Skill::MainResult main() final
Definition: SimpleSpecializedSkill.h:71
armarx::skills::Skill::InitResult::status
TerminatedSkillStatus status
Definition: Skill.h:29
LookForObjects.h
armarx::skills::Skill::InitResult
A result struct for skill initialization.
Definition: Skill.h:27
armarx::skills::Skill::throwIfSkillShouldTerminate
void throwIfSkillShouldTerminate(const std::string &abortedMessage="")
Definition: Skill.cpp:322
armarx::toAron
void toAron(arondto::PackagePath &dto, const PackageFileLocation &bo)
armarx::view_selection::skills::skill_ids::LookForObjects
const armarx::skills::SkillID LookForObjects
Definition: skill_ids.cpp:36
aron_conversions.h
armarx::armem::Duration
armarx::core::time::Duration Duration
Definition: forward_declarations.h:14
armarx::view_selection::skills::LookForObjects::Result
arondto::LookForObjectsResult Result
Definition: LookForObjects.h:40
armarx::view_selection::gaze_targets::TargetStatus::Aborted
@ Aborted
target was out of reach and thus deactivated by controller