27#include <RobotAPI/interface/components/ViewSelectionInterface.h>
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)
500 result.push_back(
new armarx::ChannelRef(
this, entry.name));
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);
558 setDataField(channelName,
"id", armarx::Variant(instance->getId()));
559 setDataField(channelName,
"className", armarx::Variant(instance->getMostProbableClass()));
560 setDataField(channelName,
"instanceName", armarx::Variant(instance->getName()));
561 setDataField(channelName,
"position", armarx::Variant(instance->getPosition()));
562 setDataField(channelName,
"priority", armarx::Variant(instance->getLocalizationPriority()));
563 setDataField(channelName,
"orientation", armarx::Variant(instance->getOrientation()));
564 setDataField(channelName,
"pose", armarx::Variant(instance->getPose()));
566 channelName,
"existenceCertainty", armarx::Variant(instance->getExistenceCertainty()));
567 float stdDeviation = std::numeric_limits<float>::max();
569 if (instance->getPositionUncertainty())
571 Gaussian posUncertaintyDistribution =
573 stdDeviation = pow(posUncertaintyDistribution.
getCovariance().determinant(),
577 setDataField(channelName,
"uncertaintyOfPosition", armarx::Variant(stdDeviation));
581 armarx::Variant(instance->hasLocalizationTimestamp()
582 ?
new armarx::TimestampVariant(instance->getLocalizationTimestamp())
590 ObjectMemoryObserver::getInstanceChannelName(
const EntityBasePtr& instance,
591 const ::Ice::Current&
c)
const
593 std::string channelName = instance->getName() + instance->getId();
597 armarx::ChannelRefBasePtr
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)
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
const covariance_type & getCovariance() const
int getDimensions() const
The ChannelRef class is a reference to a channel on an Observer.
Property< PropertyType > getProperty(const std::string &name)
Checks if the numbers published in the relevant data fields equal a reference value.
Checks if the numbers published in the relevant data fields are within a reference range.
Checks if the numbers published in the relevant data fields are larger than a reference value.
Checks if the numbers published in the relevant data fields are smaller than a reference value.
Checks if the relevant data fields have been updated since the installation of this condition.
bool usingProxy(const std::string &name, const std::string &endpoints="")
Registers a proxy for retrieval after initialization and adds it to the dependency list.
void usingTopic(const std::string &name, bool orderedPublishing=false)
Registers a proxy for subscription after initialization.
Ice::ObjectPrx getProxy(long timeoutMs=0, bool waitForScheduler=true) const
Returns the proxy of this object (optionally it waits for the proxy)
bool existsChannel(const std::string &channelName) const
void offerChannel(std::string channelName, std::string description)
Offer a channel.
void removeChannel(std::string channelName)
Remove a channel.
void offerDataField(std::string channelName, std::string datafieldName, VariantTypeId type, std::string description)
Offer a datafield without default value.
void offerConditionCheck(std::string checkName, ConditionCheck *conditionCheck)
Offer a condition check.
void updateChannel(const std::string &channelName, const std::set< std::string > &updatedDatafields=std::set< std::string >())
Update all conditions for a channel.
void offerDataFieldWithDefault(std::string channelName, std::string datafieldName, const Variant &defaultValue, std::string description)
Offer a datafield with default value.
std::recursive_mutex channelsMutex
ChannelRegistry getAvailableChannels(bool includeMetaChannels)
Retrieve information on all sensory data channels available from the observer.
void setDataField(const std::string &channelName, const std::string &datafieldName, const Variant &value, bool triggerFilterUpdate=true)
set datafield with datafieldName and in channel channelName
static TimestampVariantPtr nowPtr()
The LocalizationQuery class is used to create LocalizationJob instances and provide an interface to q...
armarx::ChannelRefBasePtr getObjectInstanceById(const std::string &, const ::Ice::Current &c=::Ice::Current()) override
void onConnectObserver() override
Framework hook.
void reportEntityRemoved(const std::string &segmentName, const EntityBasePtr &entity, const ::Ice::Current &c=Ice::emptyCurrent) override
void reportEntityUpdated(const std::string &segmentName, const EntityBasePtr &entityOld, const EntityBasePtr &entityNew, const ::Ice::Current &c=Ice::emptyCurrent) override
ChannelRefBaseSequence getObjectInstances(const armarx::ChannelRefBasePtr &objectClassChannel, const ::Ice::Current &c=Ice::emptyCurrent) override
armarx::ChannelRefBasePtr requestObjectClassRepeated(const std::string &objectClassName, int cycleTimeMS, const IceUtil::Optional< Ice::Int > &priority, const ::Ice::Current &c=Ice::emptyCurrent) override
armarx::ChannelRefBasePtr requestObjectClassOnce(const std::string &objectClassName, const IceUtil::Optional< Ice::Int > &priority, const ::Ice::Current &c=Ice::emptyCurrent) override
void reportEntityCreated(const std::string &segmentName, const EntityBasePtr &entity, const ::Ice::Current &c=Ice::emptyCurrent) override
armarx::ChannelRefBasePtr getFirstObjectInstanceByClass(const std::string &objectClassName, const Ice::Current &c=Ice::emptyCurrent) override
armarx::ChannelRefBasePtr getFirstObjectInstance(const armarx::ChannelRefBasePtr &objectClassChannel, const Ice::Current &c=Ice::emptyCurrent) override
void reportSnapshotLoaded(const std::string &segmentName, const ::Ice::Current &c=Ice::emptyCurrent) override
ChannelRefBaseSequence getObjectInstancesByClass(const std::string &objectClassName, const ::Ice::Current &c=Ice::emptyCurrent) override
void onInitObserver() override
Framework hook.
void reportMemoryCleared(const std::string &segmentName, const ::Ice::Current &c=Ice::emptyCurrent) override
void releaseObjectClass(const armarx::ChannelRefBasePtr &objectClassChannel, const ::Ice::Current &c=Ice::emptyCurrent) override
#define ARMARX_INFO
The normal logging level.
#define ARMARX_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
#define ARMARX_VERBOSE
The logging level for verbose information.
#define ARMARX_WARNING_S
The logging level for unexpected behaviour, but not a serious problem.
const VariantTypeId Timestamp
const VariantTypeId FramedPosition
const VariantTypeId FramedOrientation
const VariantTypeId String
const VariantTypeId FramedPose
const VariantTypeId Float
IceInternal::Handle< ChannelRef > ChannelRefPtr
Gaussian convertToGaussian(const NormalDistributionBasePtr &normalDistribution)
IceInternal::Handle< ObjectRecognitionWrapper > ObjectRecognitionWrapperPtr
IceInternal::Handle< LocalizationQuery > LocalizationQueryPtr
IceInternal::Handle< ObjectInstance > ObjectInstancePtr
IceInternal::Handle< ObjectClass > ObjectClassPtr