ObjectReader.cpp
Go to the documentation of this file.
1 #include "ObjectReader.h"
2 
3 #include <optional>
4 
8 
15 #include <RobotAPI/libraries/armem_objects/aron/Attachment.aron.generated.h>
16 #include <RobotAPI/libraries/armem_objects/aron/FamiliarObjectInstance.aron.generated.h>
20 
22 {
23  void
25  {
26  const std::string prefix = propertyPrefix;
27 
28  def->optional(p.memoryName, prefix + "MemoryName");
29  }
30 
31  void
33  {
34  ARMARX_IMPORTANT << "Reader: Waiting for memory '" << objects::constants::MemoryName
35  << "' ...";
36  try
37  {
38  memoryReader = memoryNameSystem.useReader(objects::constants::MemoryName);
39  ARMARX_IMPORTANT << "Reader: Connected to memory '" << objects::constants::MemoryName
40  << "'";
41  }
43  {
44  ARMARX_ERROR << e.what();
45  return;
46  }
47  }
48 
49  inline std::optional<arondto::FamiliarObjectInstance>
50  convert(const wm::EntityInstance& instance)
51  {
52  arondto::FamiliarObjectInstance aronBo;
53  try
54  {
55  aronBo.fromAron(instance.data());
56  }
57  catch (...)
58  {
59  ARMARX_WARNING << "Conversion to ObjectPose failed!";
60  return std::nullopt;
61  }
62 
63  return aronBo;
64  }
65 
66  std::optional<std::map<std::string, arondto::FamiliarObjectInstance>>
68  const std::optional<std::string>& providerName) const
69  {
70 
72 
74  {
75  auto& cs = qb.coreSegments().withName(
77 
78  client::query::ProviderSegmentSelector* providerSegments = nullptr;
79  if (providerName.has_value())
80  {
81  providerSegments = &cs.providerSegments().withName(providerName.value());
82  }
83  else
84  {
85  providerSegments = &cs.providerSegments().all();
86  }
87 
88  providerSegments->entities().withName(instanceId.str()).snapshots().latest();
89  }
90 
91 
92  const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput());
93 
94  ARMARX_DEBUG << "Lookup result in reader: " << qResult;
95 
96  if (not qResult.success) /* c++20 [[unlikely]] */
97  {
98  ARMARX_WARNING << qResult.errorMessage;
99  return std::nullopt;
100  }
101 
102 
103  std::map<std::string, arondto::FamiliarObjectInstance> result;
104 
105  qResult.memory.forEachProviderSegment(
106  [&result](const wm::ProviderSegment& ps)
107  {
108  auto& thisResult = result[ps.name()];
109 
110  ARMARX_CHECK_EQUAL(ps.getEntityNames().size(), 1)
111  << "Query returned more than one entity";
112 
113  ps.forEachInstance(
114  [&thisResult](const wm::EntityInstance& e)
115  {
116  if (auto converted = convert(e))
117  {
118  thisResult = converted.value();
119  }
120  });
121  });
122 
123  return result;
124  }
125 
126  std::map<std::string, std::vector<arondto::FamiliarObjectInstance>>
128  const std::optional<std::string>& providerName) const
129  {
130  ARMARX_TRACE;
131 
133  {
134  auto& cs = qb.coreSegments().withName(
136 
137  client::query::ProviderSegmentSelector* providerSegments = nullptr;
138  if (providerName.has_value())
139  {
140  providerSegments = &cs.providerSegments().withName(providerName.value());
141  }
142  else
143  {
144  providerSegments = &cs.providerSegments().all();
145  }
146 
147  providerSegments->entities().all().snapshots().latest();
148  }
149 
150  const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput());
151 
152  ARMARX_DEBUG << "Lookup result in reader: " << qResult;
153 
154  if (not qResult.success) /* c++20 [[unlikely]] */
155  {
156  ARMARX_WARNING << qResult.errorMessage;
157  return {};
158  }
159 
160  std::map<std::string, std::vector<arondto::FamiliarObjectInstance>> result;
161 
162  qResult.memory.forEachProviderSegment(
163  [&result](const wm::ProviderSegment& ps)
164  {
165  auto& thisResult = result[ps.name()];
166 
167  ps.forEachInstance(
168  [&thisResult](const wm::EntityInstance& e)
169  {
170  if (auto converted = convert(e))
171  {
172  thisResult.push_back(converted.value());
173  }
174  });
175  });
176 
177  return result;
178  }
179 
180  std::map<std::string, std::vector<arondto::FamiliarObjectInstance>>
182  const ObjectID& classId,
183  const std::optional<std::string>& providerName) const
184  {
185  ARMARX_TRACE;
186 
188  {
189  auto& cs = qb.coreSegments().withName(
191 
192  client::query::ProviderSegmentSelector* providerSegments = nullptr;
193  if (providerName.has_value())
194  {
195  providerSegments = &cs.providerSegments().withName(providerName.value());
196  }
197  else
198  {
199  providerSegments = &cs.providerSegments().all();
200  }
201 
202  providerSegments->entities()
203  .withNamesStartingWith(classId.getClassID().str())
204  .snapshots()
205  .latest();
206  }
207 
208  const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput());
209 
210  ARMARX_DEBUG << "Lookup result in reader: " << qResult;
211 
212  if (not qResult.success) /* c++20 [[unlikely]] */
213  {
214  ARMARX_WARNING << qResult.errorMessage;
215  return {};
216  }
217 
218  std::map<std::string, std::vector<arondto::FamiliarObjectInstance>> result;
219 
220  qResult.memory.forEachProviderSegment(
221  [&result](const wm::ProviderSegment& ps)
222  {
223  auto& thisResult = result[ps.name()];
224 
225  ps.forEachInstance(
226  [&thisResult](const wm::EntityInstance& e)
227  {
228  if (auto converted = convert(e))
229  {
230  thisResult.push_back(converted.value());
231  }
232  });
233  });
234 
235 
236  return result;
237  }
238 
239 } // namespace armarx::armem::obj::familiar_object_instance
armarx::armem::client::query::EntitySelector::all
EntitySelector & all() override
Definition: selectors.cpp:104
constants.h
armarx::armem::client::query::ProviderSegmentSelector
Definition: selectors.h:79
armarx::armem::client::query::SnapshotSelector::latest
SnapshotSelector & latest()
Definition: selectors.cpp:30
armarx::armem::client::query::ProviderSegmentSelector::entities
EntitySelector & entities()
Start specifying entities.
Definition: selectors.cpp:135
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::ObjectID::getClassID
ObjectID getClassID() const
Return just the class ID without an intance name.
Definition: ObjectID.cpp:71
armarx::armem::wm::EntityInstance
Client-side working entity instance.
Definition: memory_definitions.h:32
armarx::armem::client::query::Builder::buildQueryInput
QueryInput buildQueryInput() const
Definition: Builder.cpp:12
armarx::armem::client::query::EntitySelector::snapshots
SnapshotSelector & snapshots()
Start specifying entity snapshots.
Definition: selectors.cpp:92
armarx::armem::client::query::detail::NameSelectorOps::withNamesStartingWith
virtual DerivedT & withNamesStartingWith(const std::string &prefix)
Definition: NameSelectorOps.h:45
armarx::armem::objects::constants::MemoryName
const std::string MemoryName
Definition: constants.h:26
armarx::armem::base::ProviderSegmentBase::name
std::string & name()
Definition: ProviderSegmentBase.h:95
armarx::armem::obj::familiar_object_instance::Reader::registerPropertyDefinitions
void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr &def)
Definition: ObjectReader.cpp:24
armarx::armem::obj::familiar_object_instance::Reader::Properties::memoryName
std::string memoryName
Definition: ObjectReader.h:48
armarx::armem::client::QueryResult
Result of a QueryInput.
Definition: Query.h:50
armarx::armem::obj::familiar_object_instance::Reader::queryLatestFamiliarObjectInstance
std::optional< std::map< std::string, arondto::FamiliarObjectInstance > > queryLatestFamiliarObjectInstance(const ObjectID &instanceId, const std::optional< std::string > &providerName=std::nullopt) const
Definition: ObjectReader.cpp:67
armarx::armem::obj::familiar_object_instance::Reader::connect
void connect(armem::client::MemoryNameSystem &memoryNameSystem)
Definition: ObjectReader.cpp:32
ARMARX_TRACE
#define ARMARX_TRACE
Definition: trace.h:77
armarx::armem::base::ProviderSegmentBase::getEntityNames
std::vector< std::string > getEntityNames() const
Definition: ProviderSegmentBase.h:239
armarx::armem::client::query::Builder::coreSegments
CoreSegmentSelector & coreSegments()
Start specifying core segments.
Definition: Builder.cpp:42
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:184
armarx::armem::client::query::CoreSegmentSelector::withName
CoreSegmentSelector & withName(const std::string &name) override
Definition: selectors.cpp:198
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::objects::constants::CoreFamiliarObjectInstanceSegmentName
const std::string CoreFamiliarObjectInstanceSegmentName
Definition: constants.h:28
ARMARX_ERROR
#define ARMARX_ERROR
Definition: Logging.h:196
armarx::armem::server::wm::ProviderSegment
Definition: memory_definitions.h:52
memory_definitions.h
aron_conversions.h
ExpressionException.h
armarx::armem::obj::familiar_object_instance
Definition: ObjectReader.cpp:21
armarx::armem::client::query::EntitySelector::withName
EntitySelector & withName(const std::string &name) override
Definition: selectors.cpp:112
armarx::armem::client::query::ProviderSegmentSelector::withName
ProviderSegmentSelector & withName(const std::string &name) override
Definition: selectors.cpp:155
IceUtil::Handle< class PropertyDefinitionContainer >
armarx::armem::base::detail::ForEachEntityInstanceMixin::forEachInstance
bool forEachInstance(InstanceFunctionT &&func)
Definition: iteration_mixins.h:147
Time.h
Builder.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::armem::client::query::Builder
The query::Builder class provides a fluent-style specification of hierarchical queries.
Definition: Builder.h:21
util.h
armarx::armem::obj::familiar_object_instance::convert
std::optional< arondto::FamiliarObjectInstance > convert(const wm::EntityInstance &instance)
Definition: ObjectReader.cpp:50
Logging.h
ARMARX_CHECK_EQUAL
#define ARMARX_CHECK_EQUAL(lhs, rhs)
This macro evaluates whether lhs is equal (==) rhs and if it turns out to be false it will throw an E...
Definition: ExpressionException.h:130
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
aron_conversions.h
armarx::armem::obj::familiar_object_instance::Reader::queryLatestFamiliarObjectInstancesFromClass
std::map< std::string, std::vector< arondto::FamiliarObjectInstance > > queryLatestFamiliarObjectInstancesFromClass(const ObjectID &classId, const std::optional< std::string > &providerName=std::nullopt) const
Definition: ObjectReader.cpp:181
armarx::armem::base::EntityInstanceBase::data
const DataT & data() const
Definition: EntityInstanceBase.h:129
ObjectReader.h
armarx::armem::client::query::ProviderSegmentSelector::all
ProviderSegmentSelector & all() override
Definition: selectors.cpp:147
armarx::armem::obj::familiar_object_instance::Reader::queryAllLatestFamiliarObjectInstances
std::map< std::string, std::vector< arondto::FamiliarObjectInstance > > queryAllLatestFamiliarObjectInstances(const std::optional< std::string > &providerName=std::nullopt) const
Definition: ObjectReader.cpp:127
armarx::armem::client::Reader::query
QueryResult query(const QueryInput &input) const
Perform a query.
Definition: Reader.cpp:32
armarx::ObjectID::str
std::string str() const
Return "dataset/className" or "dataset/className/instanceName".
Definition: ObjectID.cpp:60
PackagePath.h