ScanLocationsForObject.cpp
Go to the documentation of this file.
2 
3 #include <chrono>
4 
6 
10 
11 #include <armarx/view_selection/skills/aron/LookAtArticulatedObjectFrame.aron.generated.h>
14 
16 {
17 
20  {
21  ParamType defaults;
22 
23  defaults.objectToSearch.dataset = "Kitchen-interior";
24  defaults.objectToSearch.className = "fridge";
25  defaults.objectToSearch.instanceName = "0";
26 
27  defaults.locationsToScan = {"FridgeDoorShelf_node"};
28 
29  defaults.durationPerLocationSeconds = 10;
30 
31  defaults.objectToSearchFor.dataset = "Kitchen-interior";
32  defaults.objectToSearchFor.className = "bio-milk";
33  defaults.objectToSearchFor.instanceName = "0";
34 
35  defaults.matchInstanceName = false;
36 
37  return ::armarx::skills::SkillDescription{
39  .description = "Scan locations of an articulated object looking for another object.",
40  .rootProfileDefaults = defaults.toAron(),
41  .timeout = ::armarx::Duration::Minutes(10),
42  .parametersType = ParamType::ToAronType(),
43  };
44  }
45 
47  lookAtArticulatedObjectFrame{
48  .providerId =
50  .providerName =
52  .skillName =
54 
55  }
56  {
57  }
58 
60  const Properties& properties) :
61  ::armarx::skills::SimpleSpecializedSkill<ParamType>(GetSkillDescription()),
62  services(services),
63  properties(properties)
64  {
65  }
66 
68  ScanLocationsForObject::main(const SpecializedMainInput& in)
69  {
70  armarx::DateTime skillStartTime = armarx::DateTime::Now();
71 
72  armarx::ObjectID objectToSearchFor;
73  armarx::fromAron(in.parameters.objectToSearchFor, objectToSearchFor);
74 
75  ARMARX_INFO << "Scanning " << in.parameters.objectToSearch.dataset << "/"
76  << in.parameters.objectToSearch.className << "/"
77  << in.parameters.objectToSearch.instanceName << ". Looking for "
78  << objectToSearchFor;
79  for (const auto& location : in.parameters.locationsToScan)
80  {
82  ARMARX_VERBOSE << "Facing " << location;
83 
84  using Parameters =
85  armarx::view_selection::skills::arondto::LookAtArticulatedObjectFrameParams;
86 
89  Parameters subSkillParams = subSkill.getRootProfileParameters();
90 
91  subSkillParams.object = in.parameters.objectToSearch;
92  subSkillParams.node = location; // node to face for searching
93  subSkillParams.objectPoseProvider = std::nullopt; // "any"
94  subSkillParams.durationSeconds = in.parameters.durationPerLocationSeconds;
95  subSkillParams.priority = 100;
96 
97  const auto viewSelectionResult = callSubskill(subSkill, subSkillParams.toAron());
98  if (not viewSelectionResult.has_value() or not viewSelectionResult->hasBeenSucceeded())
99  {
100  ARMARX_WARNING << "View selection failed";
101  return MakeFailedResult();
102  }
103 
104  armarx::DateTime timeout =
106  armarx::Duration::Seconds(in.parameters.durationPerLocationSeconds);
107 
108  // wait until the timeout has expired and periodically check whether the object has been found already.
109  Metronome metronome(Frequency::Hertz(5));
110  while (armarx::DateTime::Now() < timeout)
111  {
113 
114 
115  const auto object = [&]() -> std::optional<objpose::ObjectPose>
116  {
117  if (in.parameters.matchInstanceName)
118  {
119  // match object including instance name
120  return services.objectReader.queryLatestObjectInstance(objectToSearchFor);
121  }
122 
123  // get all objects of the desired class
124  for (const auto& [_, obj] :
125  services.objectReader.queryLatestObjectInstances(objectToSearchFor))
126  {
127  // we count an object as found, if it was seen after the skill was started
128  if (obj.timestamp > skillStartTime)
129  {
130  return obj;
131  }
132  }
133  return std::nullopt;
134  }();
135 
136  if (object.has_value() && object->timestamp > skillStartTime)
137  {
138  // object has been found
139  ARMARX_INFO << "Object " << object->objectID << " found at "
140  << object->timestamp;
141  return MakeSucceededResult();
142  }
143  metronome.waitForNextTick();
144  }
145  }
146 
147  ARMARX_WARNING << "Object not found in any location";
148  return MakeFailedResult();
149  }
150 
151 
152 } // namespace armarx::view_selection::skills
armarx::view_selection::skills
This file is part of ArmarX.
Definition: constants.cpp:25
armarx::view_selection::skills::ScanLocationsForObject::Properties
Definition: ScanLocationsForObject.h:22
armarx::view_selection::skills::ScanLocationsForObject::Properties::subSkillIDs
SubSkillIds subSkillIDs
Definition: ScanLocationsForObject.h:31
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:187
armarx::skills::Skill::manager
manager::dti::SkillManagerInterfacePrx manager
Definition: Skill.h:314
armarx::ObjectID
A known object ID of the form "Dataset/ClassName" or "Dataset/ClassName/InstanceName".
Definition: ObjectID.h:10
skills
This file is part of ArmarX.
armarx::skills::SimpleSpecializedSkill< arondto::ScanLocationsForObjectParams >::ParamType
arondto::ScanLocationsForObjectParams ParamType
Definition: SimpleSpecializedSkill.h:14
armarx::armem::obj::instance::Reader::queryLatestObjectInstances
std::map< std::string, objpose::ObjectPose > queryLatestObjectInstances(const ObjectID &classId)
Definition: ObjectReader.cpp:136
SpecializedSkillProxy.h
armarx::view_selection::skills::ScanLocationsForObject::GetSkillDescription
::armarx::skills::SkillDescription GetSkillDescription()
Definition: ScanLocationsForObject.cpp:19
armarx::skills::SkillDescription
Definition: SkillDescription.h:17
armarx::core::time::DateTime::Now
static DateTime Now()
Definition: DateTime.cpp:51
armarx::skills::ProviderID::providerName
std::string providerName
Definition: ProviderID.h:28
armarx::view_selection::skills::ScanLocationsForObject::Services::objectReader
armarx::armem::obj::instance::Reader objectReader
Definition: ScanLocationsForObject.h:19
armarx::skills::gui::Parameters
aron::data::DictPtr Parameters
Definition: SkillManagerWrapper.h:21
armarx::view_selection::skills::constants::skill_names::LookAtArticulatedObjectFrame
const std::string LookAtArticulatedObjectFrame
Definition: constants.cpp:37
armarx::view_selection::skills::constants::ViewSelectionSkillProviderName
const std::string ViewSelectionSkillProviderName
Definition: constants.cpp:27
armarx::skills::Skill::callSubskill
std::optional< TerminatedSkillStatusUpdate > callSubskill(const skills::SkillProxy &proxy)
Call a subskill with default parameters and block until the subskill terminates.
Definition: Skill.cpp:32
armarx::armem::obj::instance::Reader::queryLatestObjectInstance
std::optional< objpose::ObjectPose > queryLatestObjectInstance(const ObjectID &instanceId)
Definition: ObjectReader.cpp:102
armarx::skills::Skill::MakeFailedResult
static MainResult MakeFailedResult()
Definition: Skill.cpp:355
armarx::view_selection::skills::skill_ids::ScanLocationsForObject
const armarx::skills::SkillID ScanLocationsForObject
Definition: skill_ids.cpp:56
armarx::core::time::Duration::Seconds
static Duration Seconds(std::int64_t seconds)
Constructs a duration in seconds.
Definition: Duration.cpp:72
armarx::skills::ProviderID
Definition: ProviderID.h:12
ObjectID.h
armarx::skills::SpecializedSkillProxy
Definition: SpecializedSkillProxy.h:10
armarx::skills::SkillDescription::skillId
SkillID skillId
Definition: SkillDescription.h:19
armarx::view_selection::skills::ScanLocationsForObject::Services
Definition: ScanLocationsForObject.h:17
Metronome.h
constants.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
armarx::core::time::DateTime
Represents a point in time.
Definition: DateTime.h:24
armarx::view_selection::skills::ScanLocationsForObject::ScanLocationsForObject
ScanLocationsForObject(const Services &services, const Properties &properties)
Definition: ScanLocationsForObject.cpp:59
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::skills::SimpleSpecializedSkill< arondto::ScanLocationsForObjectParams >::main
Skill::MainResult main() final
Definition: SimpleSpecializedSkill.h:71
armarx::view_selection::skills::ScanLocationsForObject::Properties::SubSkillIds::lookAtArticulatedObjectFrame
armarx::skills::SkillID lookAtArticulatedObjectFrame
Definition: ScanLocationsForObject.h:28
armarx::core::time::Metronome
Simple rate limiter for use in loops to maintain a certain frequency given a clock.
Definition: Metronome.h:34
armarx::fromAron
void fromAron(const arondto::PackagePath &dto, PackageFileLocation &bo)
armarx::core::time::Frequency::Hertz
static Frequency Hertz(std::int64_t hertz)
Definition: Frequency.cpp:20
armarx::skills::Skill::throwIfSkillShouldTerminate
void throwIfSkillShouldTerminate(const std::string &abortedMessage="")
Definition: Skill.cpp:322
armarx::view_selection::skills::ScanLocationsForObject::Properties::SubSkillIds::SubSkillIds
SubSkillIds()
Definition: ScanLocationsForObject.cpp:46
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
aron_conversions.h
ScanLocationsForObject.h
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27