25 #include <VirtualRobot/VirtualRobot.h>
36 #include <RobotAPI/libraries/armem_objects/aron/Marker.aron.generated.h>
37 #include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h>
49 const std::string prefix =
"mem.";
60 defs->topic(debugObserver);
69 defs->defineOptionalProperty<std::string>(
"cmp.KinematicUnitObserverName",
70 "KinematicUnitObserver",
71 "Name of the kinematic unit observer.");
72 defs->optional(predictionTimeWindow,
73 "prediction.TimeWindow",
74 "Duration of time window into the past to use for predictions"
75 " when requested via the PredictingMemoryInterface (in seconds).");
77 defs->optional(p.markerMemoryName, prefix +
".marker.Name",
"Marker Memory Name");
78 defs->optional(p.maxMarkerHistorySize,
79 prefix +
".marker.maxHistorySize",
80 "Maximum marker memory history size");
86 instance::SegmentAdapter(iceAdapter()),
87 familiar_object_instance::SegmentAdapter(iceAdapter()),
88 classSegment(iceAdapter()),
89 attachmentSegment(iceAdapter()),
90 virtualRobotReaderPlugin(nullptr)
102 return "ObjectMemory";
108 const auto initSegmentWithCatch = [&](
const std::string& segmentName,
const auto&& fn)
114 catch (
const LocalException& e)
116 ARMARX_ERROR <<
"Failed to init `" << segmentName <<
"` segment. Reason: \n"
119 catch (
const std::exception& e)
121 ARMARX_ERROR <<
"Failed to init `" << segmentName <<
"` segment. Reason: \n"
127 <<
"` segment for unknown reason.";
133 initSegmentWithCatch(
"class", [&]() { classSegment.
init(); });
138 initSegmentWithCatch(
"attachment", [&]() { attachmentSegment.
init(); });
140 initSegmentWithCatch(p.markerMemoryName,
144 .addCoreSegment(p.markerMemoryName,
145 arondto::Marker::ToAronType())
146 .setMaxHistorySize(p.maxMarkerHistorySize);
156 kinematicUnitObserver,
"cmp.KinematicUnitObserverName",
false,
"",
false);
164 kinematicUnitObserver,
190 armem::actions::GetActionsOutputSeq
193 using namespace armem::actions;
194 GetActionsOutputSeq outputs;
195 for (
const auto&
input : inputs)
202 Action{
"vis",
"Visualize object"},
205 outputs.push_back({menu.toIce()});
212 armem::actions::ExecuteActionOutputSeq
215 using namespace armem::actions;
216 ExecuteActionOutputSeq outputs;
218 for (
const auto&
input : inputs)
221 if (
input.actionPath == ActionPath{
"vis"})
226 classSegment.visualizeClass(
memoryID);
227 outputs.emplace_back(
true,
"");
231 std::stringstream sstream;
233 <<
" does not refer to a valid object class.";
234 outputs.emplace_back(
false, sstream.str());
239 std::stringstream sstream;
240 sstream <<
"Action path " <<
input.actionPath <<
" is not defined.";
241 outputs.emplace_back(
false, sstream.str());
247 armem::prediction::data::PredictionResultSeq
250 std::vector<armem::prediction::data::PredictionResult> results;
251 for (
const auto& request : requests)
253 auto boRequest = armarx::fromIce<armem::PredictionRequest>(request);
257 boRequest.snapshotID) and
258 not boRequest.snapshotID.hasGap() and boRequest.snapshotID.hasTimestamp())
260 objpose::ObjectPosePredictionRequest objPoseRequest;
262 objPoseRequest.objectID =
toIce(
ObjectID(request.snapshotID.entityName));
263 objPoseRequest.settings = request.settings;
264 toIce(objPoseRequest.timestamp, boRequest.snapshotID.timestamp);
266 objpose::ObjectPosePredictionResult objPoseResult =
268 result.
success = objPoseResult.success;
271 if (objPoseResult.success)
275 auto queryResult = armarx::fromIce<armem::client::QueryResult>(
277 std::string instanceError =
278 "Could not find instance '" + boRequest.snapshotID.str() +
"' in memory";
279 if (!queryResult.success)
282 result.
errorMessage << instanceError <<
":\n" << queryResult.errorMessage;
286 if (not boRequest.snapshotID.hasInstanceIndex())
288 boRequest.snapshotID.instanceIndex = 0;
290 auto* aronInstance = queryResult.memory.findLatestInstance(
291 boRequest.snapshotID, boRequest.snapshotID.instanceIndex);
292 if (aronInstance ==
nullptr)
295 result.
errorMessage << instanceError <<
": No latest instance found.";
300 armem::arondto::ObjectInstance::FromAron(aronInstance->data());
303 armarx::fromIce<objpose::ObjectPose>(objPoseResult.prediction));
312 result.
errorMessage <<
"No predictions are supported for MemoryID "
313 << boRequest.snapshotID;
315 results.push_back(result.
toIce());
326 tab.reset(
new RemoteGuiTab);
328 tab->instance.setup(*
this);
329 tab->clazz.setup(classSegment);
331 HBoxLayout segments = {tab->instance.group, tab->clazz.group};
339 tab->instance.update(*
this);
340 tab->clazz.update(classSegment);
342 if (tab->clazz.data.rebuild)