ObjectMemoryObserver.cpp
Go to the documentation of this file.
1/*
2* This file is part of ArmarX.
3*
4* ArmarX is free software; you can redistribute it and/or modify
5* it under the terms of the GNU General Public License version 2 as
6* published by the Free Software Foundation.
7*
8* ArmarX is distributed in the hope that it will be useful, but
9* WITHOUT ANY WARRANTY; without even the implied warranty of
10* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11* GNU General Public License for more details.
12*
13* You should have received a copy of the GNU General Public License
14* along with this program. If not, see <http://www.gnu.org/licenses/>.
15*
16* @package VisionX::Observers
17* @author Kai Welke (welke at kit dot edu), David Schiebener (david dot schiebener at kit dot edu)
18* @copyright 2012 Humanoids Group, HIS, KIT
19* @license http://www.gnu.org/licenses/gpl-2.0.txt
20* GNU General Public License
21*/
22
24
26
27#include <RobotAPI/interface/components/ViewSelectionInterface.h>
28
35
36// checks
42
43namespace memoryx
44{
45 // ********************************************************************
46 // observer framework hooks
47 // ********************************************************************
48 void
50 {
51 usingProxy(getProperty<std::string>("WorkingMemoryProxy").getValue());
52 usingProxy(getProperty<std::string>("PriorKnowledgeProxy").getValue());
53
54 uniqueId = 0;
55
56 // register all checks
62
63 // use working memory update topic
64 usingTopic(getProperty<std::string>("WorkingMemoryListenerTopic").getValue());
65 }
66
67 void
69 {
70 // retrieve object memory proxy
72 getProperty<std::string>("WorkingMemoryProxy").getValue());
73 getProxy(priorKnowledge, getProperty<std::string>("PriorKnowledgeProxy").getValue());
74 priorObjectClassesSegment = priorKnowledge->getObjectClassesSegment();
75 // retrieve required segments of memory
76 objectInstancesSegment = ObjectInstanceMemorySegmentBasePrx::checkedCast(
77 proxyWorkingMemory->getSegment("objectInstances"));
78 objectClassesSegment = ObjectClassMemorySegmentBasePrx::checkedCast(
79 proxyWorkingMemory->getSegment("objectClasses"));
80 }
81
82 // ********************************************************************
83 // ObjectMemoryObserverInterface implementation
84 // ********************************************************************
85
86 armarx::ChannelRefBasePtr
87 ObjectMemoryObserver::requestObjectClassOnce(const std::string& objectClassName,
88 const IceUtil::Optional<Ice::Int>& priority,
89 const ::Ice::Current& c)
90 {
91 return requestObjectClassRepeated(objectClassName, -1, priority, c);
92 }
93
94 armarx::ChannelRefBasePtr
95 ObjectMemoryObserver::requestObjectClassRepeated(const std::string& objectClassName,
96 int cycleTimeMS,
97 const IceUtil::Optional<Ice::Int>& priority,
98 const ::Ice::Current& c)
99 {
100 ARMARX_IMPORTANT << "attending to objects of class: " << objectClassName
101 << " with cycle time " << cycleTimeMS;
102
103 // assure complete ontology tree is in object classes segment
104 ObjectClassList classes =
105 objectClassesSegment->addPriorClassWithSubclasses(objectClassName);
106
107 if (classes.size() == 0)
108 {
109 ARMARX_WARNING_S << "Class " << objectClassName << " not found ";
110 return NULL;
111 }
112
113 // create name for query
114 std::stringstream ss;
115 ss << objectClassName << "_query_" << getUniqueId();
116 std::string queryName = ss.str();
117
118 // update requested entity with query
119 ObjectClassPtr objectClass = ObjectClassPtr::dynamicCast(
120 objectClassesSegment->getEntityByName(objectClassName)->ice_clone());
122 objectClass->addWrapper(new EntityWrappers::ObjectRecognitionWrapper());
123
124 int localizationPriority = armarx::DEFAULT_VIEWTARGET_PRIORITY;
125 if (priority)
126 {
127 localizationPriority = priority.get();
128 }
130 new LocalizationQuery(queryName, objectClassName, cycleTimeMS, localizationPriority);
131 recognitionWrapper->addLocalizationQuery(query);
132
133 // create channel
134 armarx::ChannelRefBasePtr queryChannel = createObjectLocalizationQueryChannel(query);
135
136 // update class segment
137 objectClassesSegment->updateEntity(objectClass->getId(), objectClass);
138
139 return queryChannel;
140 }
141
142 void
143 ObjectMemoryObserver::releaseObjectClass(const armarx::ChannelRefBasePtr& objectClassChannel,
144 const ::Ice::Current& c)
145 {
146 armarx::ChannelRefPtr channelRef = armarx::ChannelRefPtr::dynamicCast(objectClassChannel);
147 if (!existsChannel(objectClassChannel->channelName))
148 {
149 ARMARX_INFO << "Object class query channel " << objectClassChannel->channelName
150 << "does not exist - skipping removal";
151 return;
152 }
153 std::string objectClassName = channelRef->getDataField("className")->getString();
154
155 ARMARX_IMPORTANT << "releasing objects of class " << objectClassName;
156
157 // remove query requested entity with query
158 auto entity = objectClassesSegment->getEntityByName(objectClassName);
159 ObjectClassPtr objectClass = ObjectClassPtr::dynamicCast(entity);
160 if (objectClass)
161 {
163 objectClass->addWrapper(new EntityWrappers::ObjectRecognitionWrapper());
164
165 recognitionWrapper->removeLocalizationQuery(objectClassChannel->channelName);
166
167 // update the entity
168 objectClassesSegment->updateEntity(objectClass->getId(), objectClass);
169
170 // remove reference to the class
171 objectClassesSegment->removePriorClassWithSubclasses(objectClassName);
172 }
173
174 // remove channel
175 removeChannel(objectClassChannel->channelName);
176 }
177
178 memoryx::ChannelRefBaseSequence
179 ObjectMemoryObserver::getObjectInstancesByClass(const std::string& objectClassName,
180 const ::Ice::Current& c)
181 {
182 memoryx::ChannelRefBaseSequence channels;
183
184 // retrieve all subclasses of the object class
185 ObjectClassList relevantClasses =
186 priorObjectClassesSegment->getClassWithSubclasses(objectClassName);
187 for (ObjectClassBasePtr& objClass : relevantClasses)
188 {
189 ARMARX_DEBUG << "relevant class: " << objClass->getName();
190 }
191 // go through channels
192 armarx::ChannelRegistry registry = getAvailableChannels(false);
193
194 for (armarx::ChannelRegistry::iterator iter = registry.begin(); iter != registry.end();
195 iter++)
196 {
197 // check whether channel is instances channel
198 armarx::ChannelRegistryEntry channelEntry = iter->second;
199 ARMARX_DEBUG << "Checking " << channelEntry.name;
200
201 if (channelEntry.dataFields.find("instanceName") == channelEntry.dataFields.end())
202 {
203 ARMARX_DEBUG << "No instance name for " << channelEntry.name;
204 continue;
205 }
206
207 // check whether channel belongs to requested class
208 armarx::DataFieldRegistry dataFields = channelEntry.dataFields;
209 armarx::DataFieldRegistry::const_iterator iterDataFields = dataFields.find("className");
210
211 if (iterDataFields == dataFields.end())
212 {
213 ARMARX_DEBUG << "No class name for " << channelEntry.name;
214 continue;
215 }
216
217 armarx::DataFieldRegistryEntry dataField = iterDataFields->second;
218 if (!dataField.value->getInitialized())
219 {
220 ARMARX_DEBUG << "className not init. for " << channelEntry.name;
221
222 continue;
223 }
224 std::string channelObjectClassName = dataField.value->getString();
225
226 bool relevant = false;
227
228 for (ObjectClassList::iterator iterClasses = relevantClasses.begin();
229 iterClasses != relevantClasses.end();
230 iterClasses++)
231 {
232 ObjectClassBasePtr objectClass = *iterClasses;
233
234 if (objectClass->getName() == channelObjectClassName)
235 {
236 relevant = true;
237 }
238 }
239
240 if (relevant)
241 {
242 ARMARX_DEBUG << "Adding instance " << iter->first << " to result";
243 channels.push_back(new armarx::ChannelRef(this, iter->first));
244 }
245 else
246 {
247 ARMARX_DEBUG << "No relevant class found";
248 }
249 }
250
251 return channels;
252 }
253
254 armarx::ChannelRefBasePtr
256 const armarx::ChannelRefBasePtr& objectClassChannel,
257 const Ice::Current& c)
258 {
259 auto instances = getObjectInstances(objectClassChannel, c);
260
261 if (instances.size() > 0)
262 {
263 return instances.front();
264 }
265 else
266 {
267 return armarx::ChannelRefBasePtr();
268 }
269 }
270
271 armarx::ChannelRefBasePtr
272 ObjectMemoryObserver::getFirstObjectInstanceByClass(const std::string& objectClassName,
273 const Ice::Current& c)
274 {
275 auto instances = getObjectInstancesByClass(objectClassName, c);
276
277 if (instances.size() > 0)
278 {
279 return instances.front();
280 }
281 else
282 {
283 return armarx::ChannelRefBasePtr();
284 }
285 }
286
287 memoryx::ChannelRefBaseSequence
288 ObjectMemoryObserver::getObjectInstances(const armarx::ChannelRefBasePtr& objectClassChannel,
289 const ::Ice::Current& c)
290 {
291 armarx::ChannelRefPtr channelRef = armarx::ChannelRefPtr::dynamicCast(objectClassChannel);
292 return getObjectInstancesByClass(channelRef->getDataField("className")->getString(), c);
293 }
294
295 void
296 ObjectMemoryObserver::reportEntityCreated(const std::string& segmentName,
297 const EntityBasePtr& entity,
298 const ::Ice::Current& c)
299 {
300 ARMARX_VERBOSE << "reportEntityCreated(): " << entity->getName()
301 << ", segmentName: " << segmentName;
302
303 ObjectInstancePtr instance = ObjectInstancePtr::dynamicCast(entity);
304
305 // check whether this is the correct type of entity
306 if (!instance)
307 {
308 return;
309 }
310
311 // check whether entity is in channel list -> error
312 if (existsChannel(getInstanceChannelName(instance)))
313 {
314 ARMARX_ERROR << "Object instance " << instance->getName() << " already in channel list";
315 return;
316 }
317
318 // create and update channel
319 createObjectInstanceChannel(instance);
320 updateObjectInstanceChannel(instance);
321 }
322
323 void
324 ObjectMemoryObserver::reportEntityUpdated(const std::string& segmentName,
325 const EntityBasePtr& entityOld,
326 const EntityBasePtr& entityNew,
327 const ::Ice::Current& c)
328 {
329 ARMARX_DEBUG << deactivateSpam(5, entityNew->getName())
330 << "ObjectMemoryObserver::reportEntityUpdated(): " << entityNew->getName()
331 << ", segmentName: " << segmentName;
332 try
333 {
334 if (segmentName == "objectClasses")
335 {
336 ObjectClassPtr objectClass = ObjectClassPtr::dynamicCast(entityNew);
338 objectClass->addWrapper(new EntityWrappers::ObjectRecognitionWrapper());
339
340 LocalizationQueryList queries = recognitionWrapper->getLocalizationQueries();
341
342 for (LocalizationQueryList::iterator iter = queries.begin(); iter != queries.end();
343 iter++)
344 {
345 try
346 {
347 updateObjectLocalizationQueryChannel(
348 LocalizationQueryPtr::dynamicCast(*iter));
349 }
351 {
352 createObjectLocalizationQueryChannel(
353 LocalizationQueryPtr::dynamicCast(*iter));
354 }
355 }
356
357 return;
358 }
359
360 if (segmentName == "objectInstances")
361 {
362 ObjectInstancePtr instance = ObjectInstancePtr::dynamicCast(entityNew);
363
364 // check whether this is the correct type of entity
365 if (!instance)
366 {
367 return;
368 }
369
370 // check if instance has associated channel
371 if (!existsChannel(getInstanceChannelName(instance)))
372 {
373
374 ARMARX_INFO << "Object instance " << instance->getName()
375 << " not in channel list - creating it";
376
377
378 createObjectInstanceChannel(instance);
379 }
380
381 // update instance channel
382 updateObjectInstanceChannel(instance);
383 }
384 }
385 catch (...)
386 {
388 }
389 }
390
391 void
392 ObjectMemoryObserver::reportEntityRemoved(const std::string& segmentName,
393 const EntityBasePtr& entity,
394 const ::Ice::Current& c)
395 {
396 ARMARX_VERBOSE << "reportEntityRemoved(): " << entity->getName()
397 << ", segmentName: " << segmentName;
398
399 ObjectInstancePtr instance = ObjectInstancePtr::dynamicCast(entity);
400 ObjectClassPtr objClass = ObjectClassPtr::dynamicCast(entity);
401
402 // check whether this is the correct type of entity
403 if (instance)
404 {
405
406 // check whether entity is in channel list -> error
407 if (!existsChannel(getInstanceChannelName(instance)))
408 {
409 ARMARX_ERROR << "Object instance " << instance->getName() << " not in channel list";
410 return;
411 }
412
413 // remove channel
414 removeChannel(getInstanceChannelName(instance));
415 }
416 else if (objClass)
417 {
418 auto channels = getObjectClassQueries(objClass->getName());
419 for (auto& channel : channels)
420 {
421 releaseObjectClass(channel);
422 }
423 }
424 }
425
426 // Should this really be in the observer interface??? At least all other report methods should be called accordingly
427 void
428 ObjectMemoryObserver::reportSnapshotLoaded(const std::string& segmentName,
429 const ::Ice::Current& c)
430 {
431 }
432
433 void
434 ObjectMemoryObserver::reportMemoryCleared(const std::string& segmentName,
435 const ::Ice::Current& c)
436 {
437 std::scoped_lock lock(channelsMutex);
438
439 if (segmentName == "objectClasses" || segmentName == "objectInstances")
440 {
441 ARMARX_IMPORTANT << "Working memory was cleared! deleting all channels";
442 auto channels = getAvailableChannels(false);
443
444 for (auto& channel : channels)
445 {
446 removeChannel(channel.first);
447 }
448 }
449 }
450
451 // ********************************************************************
452 // utility methods
453 // ********************************************************************
455 ObjectMemoryObserver::createObjectLocalizationQueryChannel(const LocalizationQueryPtr& query)
456 {
457 ARMARX_INFO << "Creating channel for object class: " << query->className;
458 std::string channelName = query->queryName;
459
460 // offer the channel
461 offerChannel(channelName, "object class information for " + query->className);
462
463 // set datafields
465 channelName, "className", query->className, "name of object class");
466 offerDataFieldWithDefault(channelName,
467 "localizationFinished",
468 bool(false),
469 "has the localization query finished yet?");
470
471 return new armarx::ChannelRef(this, channelName);
472 }
473
474 void
475 ObjectMemoryObserver::updateObjectLocalizationQueryChannel(const LocalizationQueryPtr& query)
476 {
477 ARMARX_DEBUG << "updateObjectLocalizationQueryChannel()";
478
479 // create unique channel name
480 std::string channelName = query->queryName;
481
482 setDataField(channelName, "localizationFinished", query->getFinished());
483
484 updateChannel(channelName);
485 }
486
487 std::vector<armarx::ChannelRefPtr>
488 ObjectMemoryObserver::getObjectClassQueries(const std::string& objectClassName)
489 {
490 std::vector<armarx::ChannelRefPtr> result;
491 armarx::ChannelRegistry registry = getAvailableChannels(false);
492 for (auto& pair : registry)
493 {
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() &&
497 it->second.value->getType() == armarx::VariantType::String &&
498 it->second.value->getString() == objectClassName)
499 {
500 result.push_back(new armarx::ChannelRef(this, entry.name));
501 }
502 }
503 return result;
504 }
505
506 void
507 ObjectMemoryObserver::createObjectInstanceChannel(const ObjectInstancePtr& instance)
508 {
509 // create unique channel name
510 std::string channelName = getInstanceChannelName(instance);
511 std::string objectInstanceName = instance->getName();
512
513 ARMARX_INFO << "Creating channel " << channelName
514 << " for instance: " << objectInstanceName;
515
516 // offer the channel
517 offerChannel(channelName, "object instance information for " + objectInstanceName);
518
519 // set datafields
520 offerDataField(channelName,
521 "id",
523 "id of the object instance in the working memory");
525 channelName, "className", armarx::VariantType::String, "name of object class");
527 channelName, "instanceName", armarx::VariantType::String, "name of object instance");
529 channelName, "position", armarx::VariantType::FramedPosition, "object position");
530 offerDataField(channelName,
531 "orientation",
533 "quaternion for object orientation");
534 offerDataField(channelName, "pose", armarx::VariantType::FramedPose, "object pose");
535 offerDataField(channelName, "priority", armarx::VariantType::Int, "localization priority");
536 offerDataField(channelName,
537 "existenceCertainty",
539 "Existence certainty of this object");
540 offerDataField(channelName,
541 "uncertaintyOfPosition",
543 "Std deviation of the position uncertainty");
544 offerDataField(channelName,
545 "timestamp",
547 "timestamp of last localization");
548 }
549
550 void
551 ObjectMemoryObserver::updateObjectInstanceChannel(const ObjectInstancePtr& instance)
552 {
553 ARMARX_DEBUG << deactivateSpam(5) << "updateObjectInstanceChannel()";
554
555 std::string channelName = getInstanceChannelName(instance);
556
557 // set datafields
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();
568
569 if (instance->getPositionUncertainty())
570 {
571 Gaussian posUncertaintyDistribution =
572 EarlyVisionConverters::convertToGaussian(instance->getPositionUncertainty());
573 stdDeviation = pow(posUncertaintyDistribution.getCovariance().determinant(),
574 0.5 / posUncertaintyDistribution.getDimensions());
575 }
576
577 setDataField(channelName, "uncertaintyOfPosition", armarx::Variant(stdDeviation));
579 channelName,
580 "timestamp",
581 armarx::Variant(instance->hasLocalizationTimestamp()
582 ? new armarx::TimestampVariant(instance->getLocalizationTimestamp())
584
585 // update the channel
586 updateChannel(channelName);
587 }
588
589 std::string
590 ObjectMemoryObserver::getInstanceChannelName(const EntityBasePtr& instance,
591 const ::Ice::Current& c) const
592 {
593 std::string channelName = instance->getName() + instance->getId();
594 return channelName;
595 }
596
597 armarx::ChannelRefBasePtr
598 memoryx::ObjectMemoryObserver::getObjectInstanceById(const std::string& id, const Ice::Current&)
599 {
600 armarx::ChannelRegistry registry = getAvailableChannels(false);
601
602 for (armarx::ChannelRegistry::iterator iter = registry.begin(); iter != registry.end();
603 iter++)
604 {
605 armarx::ChannelRegistryEntry channelEntry = iter->second;
606 ARMARX_DEBUG << "Checking " << channelEntry.name;
607
608 if (channelEntry.dataFields.find("instanceName") == channelEntry.dataFields.end())
609 {
610 // ARMARX_DEBUG << "No instance name for " << channelEntry.name;
611 continue;
612 }
613 auto it = channelEntry.dataFields.find("id");
614 if (it == channelEntry.dataFields.end())
615 {
616 // ARMARX_DEBUG << "No id for " << channelEntry.name;
617 continue;
618 }
619 if (it->second.value->getString() == id)
620 {
621 return new armarx::ChannelRef(this, iter->first);
622 }
623 }
624 return NULL;
625 }
626} // namespace memoryx
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
Definition Logging.cpp:75
constexpr T c
const covariance_type & getCovariance() const
Definition Gaussian.h:82
int getDimensions() const
Definition Gaussian.h:94
The ChannelRef class is a reference to a channel on an Observer.
Definition ChannelRef.h:51
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.
Definition Observer.cpp:131
void removeChannel(std::string channelName)
Remove a channel.
Definition Observer.cpp:318
void offerDataField(std::string channelName, std::string datafieldName, VariantTypeId type, std::string description)
Offer a datafield without default value.
Definition Observer.cpp:201
void offerConditionCheck(std::string checkName, ConditionCheck *conditionCheck)
Offer a condition check.
Definition Observer.cpp:301
void updateChannel(const std::string &channelName, const std::set< std::string > &updatedDatafields=std::set< std::string >())
Update all conditions for a channel.
Definition Observer.cpp:788
void offerDataFieldWithDefault(std::string channelName, std::string datafieldName, const Variant &defaultValue, std::string description)
Offer a datafield with default value.
Definition Observer.cpp:160
std::recursive_mutex channelsMutex
Definition Observer.h:600
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
Definition Observer.cpp:508
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.
Definition Logging.h:181
#define ARMARX_IMPORTANT
The logging level for always important information, but expected behaviour (in contrast to ARMARX_WAR...
Definition Logging.h:190
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
Definition Logging.h:196
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
Definition Logging.h:184
#define ARMARX_VERBOSE
The logging level for verbose information.
Definition Logging.h:187
#define ARMARX_WARNING_S
The logging level for unexpected behaviour, but not a serious problem.
Definition Logging.h:213
const VariantTypeId Timestamp
const VariantTypeId FramedPosition
Definition FramedPose.h:38
const VariantTypeId FramedOrientation
Definition FramedPose.h:39
const VariantTypeId String
Definition Variant.h:921
const VariantTypeId FramedPose
Definition FramedPose.h:36
const VariantTypeId Int
Definition Variant.h:917
const VariantTypeId Float
Definition Variant.h:919
void handleExceptions()
IceInternal::Handle< ChannelRef > ChannelRefPtr
Definition ChannelRef.h:40
Gaussian convertToGaussian(const NormalDistributionBasePtr &normalDistribution)
IceInternal::Handle< ObjectRecognitionWrapper > ObjectRecognitionWrapperPtr
VirtualRobot headers.
IceInternal::Handle< LocalizationQuery > LocalizationQueryPtr
IceInternal::Handle< ObjectInstance > ObjectInstancePtr
IceInternal::Handle< ObjectClass > ObjectClassPtr
Definition ObjectClass.h:35