32 #include <AffordanceKit/embodiments/Armar3Embodiment.h>
33 #include <AffordanceKit/embodiments/Armar4Embodiment.h>
34 #include <AffordanceKit/embodiments/WalkManEmbodiment.h>
43 hasNewPrimitives(false), lastProcessedTimestamp(0),
enabled(true)
64 <<
"New segmentation available, but failed to access environmental primitives segment";
71 std::string embodimentName = getProperty<std::string>(
"EmbodimentName").getValue();
73 ARMARX_INFO <<
"Using embodiment '" << embodimentName <<
"'";
74 if (embodimentName ==
"Armar3")
76 embodiment.reset(
new AffordanceKit::Armar3Embodiment());
78 else if (embodimentName ==
"Armar4")
80 embodiment.reset(
new AffordanceKit::Armar4Embodiment());
82 else if (embodimentName ==
"WalkMan")
84 embodiment.reset(
new AffordanceKit::WalkManEmbodiment());
89 <<
"' specified. Affordance extraction will not work properly.";
90 embodiment.reset(
new AffordanceKit::Embodiment());
123 new AffordanceKit::BimanualOpposedPlatformGraspAffordance(
126 new AffordanceKit::BimanualOpposedPrismaticGraspAffordance(
129 new AffordanceKit::BimanualAlignedPlatformGraspAffordance(
132 new AffordanceKit::BimanualAlignedPrismaticGraspAffordance(
137 new AffordanceKit::BimanualLiftAffordance(
embodiment,
154 memoryx::eAffordanceTypeBimanualGraspPlatform;
156 memoryx::eAffordanceTypeBimanualGraspPrismatic;
159 memoryx::eAffordanceTypeBimanualGraspOpposed;
161 memoryx::eAffordanceTypeBimanualGraspAligned;
163 memoryx::eAffordanceTypeBimanualOpposedGraspPlatform;
165 memoryx::eAffordanceTypeBimanualOpposedGraspPrismatic;
167 memoryx::eAffordanceTypeBimanualAlignedGraspPlatform;
169 memoryx::eAffordanceTypeBimanualAlignedGraspPrismatic;
200 std::string affordanceRestrictionString =
201 getProperty<std::string>(
"RestrictToAffordanceList").getValue();
202 if (affordanceRestrictionString !=
"")
204 auto affordanceRestrictionList =
Split(affordanceRestrictionString,
",");
206 affordanceRestrictionList.end());
209 std::vector<std::string> affordances;
215 affordances.push_back(
a->getName());
224 affordances.push_back(
a->getName());
228 ARMARX_INFO <<
"Configured affordances: " << affordances;
230 offeringTopic(getProperty<std::string>(
"AffordanceExtractionTopicName").getValue());
231 usingTopic(getProperty<std::string>(
"PrimitiveExtractionTopicName").getValue());
233 usingProxy(getProperty<std::string>(
"WorkingMemoryName").getValue());
235 offeringTopic(getProperty<std::string>(
"DebugObserverName").getValue());
247 getProperty<std::string>(
"WorkingMemoryName").getValue());
250 ARMARX_ERROR <<
"Failed to obtain working memory proxy";
257 ARMARX_ERROR <<
"Failed to obtain affordance segment pointer";
264 ARMARX_ERROR <<
"Failed to obtain environmental primitive segment pointer";
269 getProperty<std::string>(
"DebugObserverName").getValue());
271 listenerPrx = getTopic<AffordanceExtractionListenerPrx>(
272 getProperty<std::string>(
"AffordanceExtractionTopicName").getValue());
291 const std::string& affordance,
292 const std::string& primitiveId,
297 const Ice::Current&
c)
302 Eigen::Matrix4f pose = PosePtr::dynamicCast(endEffectorPose)->toEigen();
311 ARMARX_INFO <<
"Adding Experiment(primitive=" << primitiveId <<
", affordance=" << affordance
312 <<
", result=" << result <<
", certainty=" << certainty
313 <<
", sigma_pos=" << sigma_pos <<
", sigma_rot=" << sigma_rot <<
")";
320 if (
a->getName() == affordance &&
a->existsForPrimitive(primitive))
322 a->addObservation(AffordanceKit::ObservationPtr(
new AffordanceKit::Observation(
323 primitive, pose, result, certainty, sigma_pos, sigma_rot)));
330 if (
a->getName() == affordance &&
a->existsForPrimitive(primitive))
332 a->addObservation(AffordanceKit::ObservationPtr(
new AffordanceKit::Observation(
333 primitive, pose, result, certainty, sigma_pos, sigma_rot)));
340 ARMARX_WARNING <<
"Discarding experiment, because affordance or primitive were not found.";
348 <<
" affordances updated and reported";
377 AffordanceKit::PrimitiveSetPtr primitives;
400 long originalTimestamp = 0;
401 if (primitives->size() > 0)
403 originalTimestamp = (*primitives->begin())->getTimestamp();
405 IceUtil::Time ts = IceUtil::Time::microSeconds(originalTimestamp);
406 std::string timestampString = ts.toDateTime().substr(ts.toDateTime().find(
' ') + 1);
408 ARMARX_INFO <<
"Processing new set of primitives (timestamp: " << timestampString <<
")";
413 ARMARX_INFO <<
"Primitives older than " << timestampString <<
" removed";
416 int spatialStepSize = getProperty<float>(
"SpatialSamplingDistance").getValue();
417 int numOrientationalSteps = getProperty<int>(
"NumOrientationalSamplings").getValue();
439 bool samplingNeeded =
true;
440 for (
auto& primitive : *primitives)
442 if (primitive->getSamplingSize() > 0)
444 samplingNeeded =
false;
451 ARMARX_INFO <<
"Ignoring primitive " << primitive->getId() <<
", sampling size "
452 << primitive->getSamplingSize() <<
" is too large";
453 primitive->resetSampling();
462 << (IceUtil::Time::now() - t).toMilliSeconds() <<
" ms";
475 a->evaluatePrimitiveSet(primitives);
476 ARMARX_INFO <<
"Evaluation of affordance '" <<
a->getName() <<
"' took "
477 << (IceUtil::Time::now() - t).toMilliSeconds() <<
" ms";
487 a->evaluatePrimitiveSet(primitives);
488 ARMARX_INFO <<
"Evaluation of affordance '" <<
a->getName() <<
"' took "
489 << (IceUtil::Time::now() - t).toMilliSeconds() <<
" ms";
493 ARMARX_INFO <<
"Total time for affordance extraction: "
494 << (IceUtil::Time::now() - t).toMilliSeconds() <<
" ms";
501 ARMARX_INFO <<
"Affordance extraction interrupted (pipeline step disabled)";
506 t = IceUtil::Time::now();
510 std::string affordanceName =
"";
511 float uncertainty =
s.getTotalUncertainty(affordanceName);
512 float positiveDecisionRate =
s.getPositiveDecisionRate(affordanceName);
513 float negativeDecisionRate =
s.getNegativeDecisionRate(affordanceName);
514 float conflict =
s.getTotalConflict(affordanceName);
517 valueMap[
"uncertainty"] =
new Variant(uncertainty);
518 valueMap[
"positiveDecisionRate"] =
new Variant(positiveDecisionRate);
519 valueMap[
"negativeDecisionRate"] =
new Variant(negativeDecisionRate);
520 valueMap[
"conflict"] =
new Variant(conflict);
525 <<
" new affordances written to memory: "
526 << (IceUtil::Time::now() - t).toMilliSeconds() <<
" ms";
535 <<
" affordances extracted and reported";
549 std::unique_lock lock(enableMutex);
571 armarx::TimestampBasePtr
574 std::unique_lock lock(timestampMutex);