ObjectReader.cpp
Go to the documentation of this file.
1 #include "ObjectReader.h"
2 
3 #include <mutex>
4 #include <optional>
5 
8 
15 #include <RobotAPI/libraries/armem_objects/aron/Attachment.aron.generated.h>
17 // #include <RobotAPI/libraries/armem_robot_state/aron/Robot.aron.generated.h>
18 // #include <RobotAPI/libraries/armem_robot_state/aron_conversions.h>
19 // #include <RobotAPI/libraries/armem_robot_state/robot_conversions.h>
21 
23 {
24  void
26  {
27  const std::string prefix = propertyPrefix;
28 
29  def->optional(properties.memoryName, prefix + "MemoryName");
30  }
31 
32  void
34  {
35  // Wait for the memory to become available and add it as dependency.
36  ARMARX_IMPORTANT << "Waiting for memory '" << properties.memoryName << "' ...";
37  try
38  {
39  // simply wait until memory is ready. Do nothing with reader but get prx
40  auto r = memoryNameSystem.useReader(properties.memoryName);
41 
42  // cast MemoryPrx to objPoseStoragePrx --> NOT WORKING DUE TO SOME ICE CACHING OR SO.
43  // Explanation:
44  // When the readingPrx disconnects and reconnects, the cast fails as it uses internally
45  // a ice_isA call which results in connection refused. The reason is, that for some
46  // reason the mns thinks that the reconnected prx is similar to the old info
47  // (check ice_identity) so it returnes the cached prx in its server map. Could be fixed
48  // by always querying the mns component for new proxies, but this may slow the system
49  // down.
50  //this->objPoseStorage =
51  // objpose::ObjectPoseStorageInterfacePrx::uncheckedCast(r.readingPrx);
52  // Current fix: Get prx from mns:
53  this->readingPrx = r.readingPrx;
54 
55  ARMARX_INFO << "Connected to Memory '" << properties.memoryName << "'";
56  }
58  {
59  ARMARX_ERROR << e.what();
60  return;
61  }
62  }
63 
64  std::map<std::string, bool>
66  const armarx::core::time::Duration& until)
67  {
68  std::map<std::string, bool> ret;
69  auto providers = getObjectPoseStorage()->getAvailableProvidersInfo();
70  for (const auto& [k, p] : providers)
71  {
72  // TODO: check supported objects?
73  ret[k] = this->requestLocalization(instanceId, k, until);
74  }
75  return ret;
76  }
77 
78  bool
80  const std::string& provider,
81  const armarx::core::time::Duration& until)
82  {
83 
84  armarx::data::ObjectID requestObject;
85  armarx::toIce(requestObject, instanceId);
86 
87  armarx::objpose::observer::RequestObjectsInput req;
88  req.provider = provider;
89  req.request.objectIDs = {requestObject};
90  req.request.relativeTimeoutMS = until.toMilliSeconds();
91 
92  auto requestResult = getObjectPoseStorage()->requestObjects(req);
93 
94  if (requestResult.results.count(requestObject))
95  {
96  return requestResult.results.at(requestObject).result.success;
97  }
98  return false;
99  }
100 
101  std::optional<objpose::ObjectPose>
103  {
104  // TODO: Shall we throw an exception if no instance index is set?
105 
106  auto objectPoses = getObjectPoseStorage()->getObjectPoses();
107  for (const auto& pose : objectPoses)
108  {
109  ObjectID oid;
110  fromIce(pose.objectID, oid);
111  if (oid == instanceId)
112  {
114  fromIce(pose, oi);
115  return oi;
116  }
117  }
118  return std::nullopt;
119  }
120 
121  std::map<std::string, objpose::ObjectPose>
123  {
124  std::map<std::string, objpose::ObjectPose> ret;
125  auto objectPoses = getObjectPoseStorage()->getObjectPoses();
126  for (const auto& pose : objectPoses)
127  {
128  ObjectID oid;
129  fromIce(pose.objectID, oid);
130  fromIce(pose, ret[oid.str()]);
131  }
132  return ret;
133  }
134 
135  std::map<std::string, objpose::ObjectPose>
137  {
138  std::map<std::string, objpose::ObjectPose> ret;
139  auto objectPoses = getObjectPoseStorage()->getObjectPoses();
140  for (const auto& pose : objectPoses)
141  {
142  ObjectID oid;
143  fromIce(pose.objectID, oid);
144 
145  if (oid.equalClass(classId))
146  {
147  fromIce(pose, ret[oid.str()]);
148  }
149  }
150  return ret;
151  }
152 
153 } // namespace armarx::armem::obj::instance
armarx::armem::obj::instance::Reader::requestLocalization
std::map< std::string, bool > requestLocalization(const ObjectID &instanceId, const armarx::core::time::Duration &until)
Definition: ObjectReader.cpp:65
armarx::aron::ret
ReaderT::InputType T & ret
Definition: rw.h:13
ice_conversions.h
armarx::ObjectID
A known object ID of the form "Dataset/ClassName" or "Dataset/ClassName/InstanceName".
Definition: ObjectID.h:10
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:190
armarx::armem::attachment::ObjectID
armem::MemoryID ObjectID
Definition: types.h:79
armarx::armem::obj::instance::Reader::Properties::memoryName
std::string memoryName
Definition: ObjectReader.h:46
armarx::armem::obj::instance::Reader::getObjectPoseStorage
objpose::ObjectPoseStorageInterfacePrx getObjectPoseStorage() const
Definition: ObjectReader.h:79
armarx::armem::obj::instance::Reader::queryLatestObjectInstance
std::optional< objpose::ObjectPose > queryLatestObjectInstance(const ObjectID &instanceId)
Definition: ObjectReader.cpp:102
armarx::armem::obj::instance::Reader::queryLatestObjectInstances
std::map< std::string, objpose::ObjectPose > queryLatestObjectInstances()
Definition: ObjectReader.cpp:122
armarx::toIce
void toIce(std::map< IceKeyT, IceValueT > &iceMap, const boost::container::flat_map< CppKeyT, CppValueT > &cppMap)
Definition: ice_conversions_boost_templates.h:15
error.h
armarx::armem::client::MemoryNameSystem::useReader
Reader useReader(const MemoryID &memoryID)
Use a memory server and get a reader for it.
Definition: MemoryNameSystem.cpp:198
armarx::armem::obj::instance::Reader::connect
void connect(armem::client::MemoryNameSystem &memoryNameSystem)
Definition: ObjectReader.cpp:33
ARMARX_ERROR
#define ARMARX_ERROR
Definition: Logging.h:196
armarx::armem::fromIce
void fromIce(const data::MemoryID &ice, MemoryID &id)
Definition: ice_conversions.cpp:31
memory_definitions.h
armarx::ObjectID::equalClass
bool equalClass(const ObjectID &rhs) const
Indicates whether dataset and class name are equal.
Definition: ObjectID.cpp:77
aron_conversions.h
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
IceUtil::Handle< class PropertyDefinitionContainer >
armarx::core::time::Duration
Represents a duration.
Definition: Duration.h:16
Time.h
Builder.h
ObjectReader.h
armarx::armem::client::MemoryNameSystem
The memory name system (MNS) client.
Definition: MemoryNameSystem.h:68
armarx::armem::error::CouldNotResolveMemoryServer
Indicates that a query to the Memory Name System failed.
Definition: mns.h:24
armarx::core::time::Duration::toMilliSeconds
std::int64_t toMilliSeconds() const
Returns the amount of milliseconds.
Definition: Duration.cpp:60
util.h
Logging.h
armarx::armem::obj::instance
Definition: ObjectReader.cpp:22
aron_conversions.h
armarx::objpose::ObjectPose
An object pose as stored by the ObjectPoseStorage.
Definition: ObjectPose.h:33
armarx::armem::obj::instance::Reader::registerPropertyDefinitions
void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr &def)
Definition: ObjectReader.cpp:25
armarx::ObjectID::str
std::string str() const
Return "dataset/className" or "dataset/className/instanceName".
Definition: ObjectID.cpp:60
PackagePath.h