27 #include <RobotAPI/interface/components/ViewSelectionInterface.h>
51 usingProxy(getProperty<std::string>(
"WorkingMemoryProxy").getValue());
52 usingProxy(getProperty<std::string>(
"PriorKnowledgeProxy").getValue());
64 usingTopic(getProperty<std::string>(
"WorkingMemoryListenerTopic").getValue());
71 proxyWorkingMemory = getProxy<AbstractWorkingMemoryInterfacePrx>(
72 getProperty<std::string>(
"WorkingMemoryProxy").getValue());
73 getProxy(priorKnowledge, getProperty<std::string>(
"PriorKnowledgeProxy").getValue());
74 priorObjectClassesSegment = priorKnowledge->getObjectClassesSegment();
76 objectInstancesSegment = ObjectInstanceMemorySegmentBasePrx::checkedCast(
77 proxyWorkingMemory->getSegment(
"objectInstances"));
78 objectClassesSegment = ObjectClassMemorySegmentBasePrx::checkedCast(
79 proxyWorkingMemory->getSegment(
"objectClasses"));
86 armarx::ChannelRefBasePtr
88 const IceUtil::Optional<Ice::Int>& priority,
89 const ::Ice::Current&
c)
94 armarx::ChannelRefBasePtr
97 const IceUtil::Optional<Ice::Int>& priority,
98 const ::Ice::Current&
c)
101 <<
" with cycle time " << cycleTimeMS;
104 ObjectClassList classes =
105 objectClassesSegment->addPriorClassWithSubclasses(objectClassName);
107 if (classes.size() == 0)
114 std::stringstream ss;
115 ss << objectClassName <<
"_query_" << getUniqueId();
116 std::string queryName = ss.str();
120 objectClassesSegment->getEntityByName(objectClassName)->ice_clone());
124 int localizationPriority = armarx::DEFAULT_VIEWTARGET_PRIORITY;
127 localizationPriority = priority.get();
130 new LocalizationQuery(queryName, objectClassName, cycleTimeMS, localizationPriority);
131 recognitionWrapper->addLocalizationQuery(query);
134 armarx::ChannelRefBasePtr queryChannel = createObjectLocalizationQueryChannel(query);
137 objectClassesSegment->updateEntity(objectClass->getId(), objectClass);
144 const ::Ice::Current&
c)
149 ARMARX_INFO <<
"Object class query channel " << objectClassChannel->channelName
150 <<
"does not exist - skipping removal";
153 std::string objectClassName = channelRef->getDataField(
"className")->getString();
158 auto entity = objectClassesSegment->getEntityByName(objectClassName);
165 recognitionWrapper->removeLocalizationQuery(objectClassChannel->channelName);
168 objectClassesSegment->updateEntity(objectClass->getId(), objectClass);
171 objectClassesSegment->removePriorClassWithSubclasses(objectClassName);
178 memoryx::ChannelRefBaseSequence
180 const ::Ice::Current&
c)
182 memoryx::ChannelRefBaseSequence channels;
185 ObjectClassList relevantClasses =
186 priorObjectClassesSegment->getClassWithSubclasses(objectClassName);
187 for (ObjectClassBasePtr& objClass : relevantClasses)
189 ARMARX_DEBUG <<
"relevant class: " << objClass->getName();
194 for (armarx::ChannelRegistry::iterator iter = registry.begin(); iter != registry.end();
198 armarx::ChannelRegistryEntry channelEntry = iter->second;
201 if (channelEntry.dataFields.find(
"instanceName") == channelEntry.dataFields.end())
203 ARMARX_DEBUG <<
"No instance name for " << channelEntry.name;
208 armarx::DataFieldRegistry dataFields = channelEntry.dataFields;
209 armarx::DataFieldRegistry::const_iterator iterDataFields = dataFields.find(
"className");
211 if (iterDataFields == dataFields.end())
213 ARMARX_DEBUG <<
"No class name for " << channelEntry.name;
217 armarx::DataFieldRegistryEntry dataField = iterDataFields->second;
218 if (!dataField.value->getInitialized())
220 ARMARX_DEBUG <<
"className not init. for " << channelEntry.name;
224 std::string channelObjectClassName = dataField.value->getString();
226 bool relevant =
false;
228 for (ObjectClassList::iterator iterClasses = relevantClasses.begin();
229 iterClasses != relevantClasses.end();
232 ObjectClassBasePtr objectClass = *iterClasses;
234 if (objectClass->getName() == channelObjectClassName)
242 ARMARX_DEBUG <<
"Adding instance " << iter->first <<
" to result";
254 armarx::ChannelRefBasePtr
256 const armarx::ChannelRefBasePtr& objectClassChannel,
257 const Ice::Current&
c)
261 if (instances.size() > 0)
263 return instances.front();
267 return armarx::ChannelRefBasePtr();
271 armarx::ChannelRefBasePtr
273 const Ice::Current&
c)
277 if (instances.size() > 0)
279 return instances.front();
283 return armarx::ChannelRefBasePtr();
287 memoryx::ChannelRefBaseSequence
289 const ::Ice::Current&
c)
297 const EntityBasePtr& entity,
298 const ::Ice::Current&
c)
301 <<
", segmentName: " << segmentName;
314 ARMARX_ERROR <<
"Object instance " << instance->getName() <<
" already in channel list";
319 createObjectInstanceChannel(instance);
320 updateObjectInstanceChannel(instance);
325 const EntityBasePtr& entityOld,
326 const EntityBasePtr& entityNew,
327 const ::Ice::Current&
c)
330 <<
"ObjectMemoryObserver::reportEntityUpdated(): " << entityNew->getName()
331 <<
", segmentName: " << segmentName;
334 if (segmentName ==
"objectClasses")
336 ObjectClassPtr objectClass = ObjectClassPtr::dynamicCast(entityNew);
340 LocalizationQueryList queries = recognitionWrapper->getLocalizationQueries();
342 for (LocalizationQueryList::iterator iter = queries.begin(); iter != queries.end();
347 updateObjectLocalizationQueryChannel(
348 LocalizationQueryPtr::dynamicCast(*iter));
352 createObjectLocalizationQueryChannel(
353 LocalizationQueryPtr::dynamicCast(*iter));
360 if (segmentName ==
"objectInstances")
374 ARMARX_INFO <<
"Object instance " << instance->getName()
375 <<
" not in channel list - creating it";
378 createObjectInstanceChannel(instance);
382 updateObjectInstanceChannel(instance);
393 const EntityBasePtr& entity,
394 const ::Ice::Current&
c)
397 <<
", segmentName: " << segmentName;
409 ARMARX_ERROR <<
"Object instance " << instance->getName() <<
" not in channel list";
418 auto channels = getObjectClassQueries(objClass->getName());
419 for (
auto& channel : channels)
429 const ::Ice::Current&
c)
435 const ::Ice::Current&
c)
439 if (segmentName ==
"objectClasses" || segmentName ==
"objectInstances")
444 for (
auto& channel : channels)
457 ARMARX_INFO <<
"Creating channel for object class: " << query->className;
458 std::string channelName = query->queryName;
461 offerChannel(channelName,
"object class information for " + query->className);
465 channelName,
"className", query->className,
"name of object class");
467 "localizationFinished",
469 "has the localization query finished yet?");
477 ARMARX_DEBUG <<
"updateObjectLocalizationQueryChannel()";
480 std::string channelName = query->queryName;
482 setDataField(channelName,
"localizationFinished", query->getFinished());
487 std::vector<armarx::ChannelRefPtr>
488 ObjectMemoryObserver::getObjectClassQueries(
const std::string& objectClassName)
490 std::vector<armarx::ChannelRefPtr> result;
492 for (
auto& pair : registry)
494 armarx::ChannelRegistryEntry& entry = pair.second;
495 auto it = entry.dataFields.find(
"className");
496 if (entry.name.find(
"_query_") != std::string::npos && it != entry.dataFields.end() &&
498 it->second.value->getString() == objectClassName)
507 ObjectMemoryObserver::createObjectInstanceChannel(
const ObjectInstancePtr& instance)
510 std::string channelName = getInstanceChannelName(instance);
511 std::string objectInstanceName = instance->getName();
514 <<
" for instance: " << objectInstanceName;
517 offerChannel(channelName,
"object instance information for " + objectInstanceName);
523 "id of the object instance in the working memory");
533 "quaternion for object orientation");
537 "existenceCertainty",
539 "Existence certainty of this object");
541 "uncertaintyOfPosition",
543 "Std deviation of the position uncertainty");
547 "timestamp of last localization");
551 ObjectMemoryObserver::updateObjectInstanceChannel(
const ObjectInstancePtr& instance)
555 std::string channelName = getInstanceChannelName(instance);
566 channelName,
"existenceCertainty",
armarx::Variant(instance->getExistenceCertainty()));
569 if (instance->getPositionUncertainty())
571 Gaussian posUncertaintyDistribution =
573 stdDeviation = pow(posUncertaintyDistribution.
getCovariance().determinant(),
590 ObjectMemoryObserver::getInstanceChannelName(
const EntityBasePtr& instance,
591 const ::Ice::Current&
c)
const
593 std::string channelName = instance->getName() + instance->getId();
597 armarx::ChannelRefBasePtr
600 armarx::ChannelRegistry registry = getAvailableChannels(
false);
602 for (armarx::ChannelRegistry::iterator iter = registry.begin(); iter != registry.end();
605 armarx::ChannelRegistryEntry channelEntry = iter->second;
608 if (channelEntry.dataFields.find(
"instanceName") == channelEntry.dataFields.end())
613 auto it = channelEntry.dataFields.find(
"id");
614 if (it == channelEntry.dataFields.end())
619 if (it->second.value->getString() ==
id)