44 distanceThreshold = getProperty<float>(
"DistanceThreshold").getValue();
45 handDistanceThreshold = getProperty<float>(
"HandDistanceThreshold").getValue();
46 sceneName = getProperty<std::string>(
"PlatformGraphSceneName").getValue();
52 wm = getProxy<WorkingMemoryInterfacePrx>(
"WorkingMemory");
53 prior = getProxy<PriorKnowledgeInterfacePrx>(
"PriorKnowledge");
54 psr = getProxy<GraphNodePoseResolverInterfacePrx>(
"GraphNodePoseResolver");
56 agentInstances = wm->getAgentInstancesSegment();
57 objectInstances = wm->getObjectInstancesSegment();
58 objectClasses = prior->getObjectClassesSegment();
59 graphs = prior->getGraphSegment();
61 graphNodes = graphs->getNodesByScene(sceneName);
63 for (
const auto& classEntity : objectClasses->getAllEntities())
65 classNameParentsMap.insert(
66 {classEntity->getName(),
67 objectClasses->getObjectClassByNameWithAllParents(classEntity->getName())
68 ->getParentClasses()});
75 return "ObjectAtPredicateProvider";
81 return {PredicateInfo{
"objectAt", 2}};
87 PredicateInstanceList result;
97 std::vector<std::pair<ObjectInstancePtr, Eigen::Matrix4f>> objects;
98 std::vector<std::pair<ObjectInstancePtr, Eigen::Matrix4f>> hands;
100 for (
const auto& objectEntity : objectInstances->getAllEntities())
102 auto objectInstance = ObjectInstancePtr::dynamicCast(objectEntity);
104 auto classes = classNameParentsMap[objectInstance->getMostProbableClass()];
110 if (!robot || robot->getName() != objectPose->agent)
112 auto agentInstance = agentInstances->getAgentInstanceByName(objectPose->agent);
114 <<
"no agent with name '" << objectPose->agent
115 <<
"' present while trying to change pose of " << objectInstance->getName();
116 robot = agentInstance->getSharedRobot();
120 objectPose->changeToGlobal(robot);
124 ARMARX_ERROR <<
"Could not change " << objectPose <<
" to global";
127 if (std::find(classes.cbegin(), classes.cend(),
"hand") != classes.cend())
129 hands.push_back({objectInstance, objectPose->toEigen()});
133 objects.push_back({objectInstance, objectPose->toEigen()});
138 for (
const auto& objectEntry : objects)
140 const auto&
object = objectEntry.first;
142 const auto& objectPosEigen = objectEntry.second;
143 bool tooCloseToHand =
false;
145 for (
const auto& handEntry : hands)
147 const auto& hand = handEntry.first;
148 const auto& handPosEigen = handEntry.second;
149 const float handDist =
150 (handPosEigen.block<2, 1>(0, 3) - objectPosEigen.block<2, 1>(0, 3)).
norm();
151 ARMARX_INFO <<
"dist from object '" <<
object->getName() <<
"' to hand '"
152 << hand->getName() <<
"': " << handDist;
153 if (handDist < handDistanceThreshold)
155 ARMARX_INFO <<
"object '" <<
object->getName() <<
"' is too close to hand '"
156 << hand->getName() <<
"'; will not check objectAt conditions";
157 tooCloseToHand =
true;
168 std::string mostProbableClass =
object->getMostProbableClass();
169 memoryx::EntityRefBasePtr closestNodeRef;
173 for (
const auto& node : graphNodes)
175 const auto& nodeInfo = getCacheEntry(node->getId());
176 if (nodeInfo.node->isMetaEntity())
181 const auto& nodePose = nodeInfo.globalPose;
183 if (nodeInfo.originalFrame == mostProbableClass)
190 ARMARX_DEBUG << nodeInfo.node->getName() <<
"\n" << nodePose->toEigen();
194 const float nodeDist =
195 (nodePose->toEigen().block<2, 1>(0, 3) - objectPosEigen.block<2, 1>(0, 3)).
norm();
196 ARMARX_DEBUG <<
object->getName() <<
": " << nodeInfo.node->getName() <<
" "
211 if (std::find(nodeInfo.parents.cbegin(), nodeInfo.parents.cend(),
"robotlocation") ==
212 nodeInfo.parents.cend() &&
216 closestNodeRef = nodeInfo.nodeRef;
222 ARMARX_INFO <<
"closest node to '" <<
object->getName() <<
"': '"
223 << closestNodeRef->entityName <<
"' with dist: " << minDist;
226 if (closestNodeRef && minDist <= distanceThreshold)
228 EntityRefBasePtr objectRef = objectInstances->getEntityRefById(object->getId());
229 result.push_back(PredicateInstance{predicateName, {objectRef, closestNodeRef},
true});
236 ObjectAtPredicateProvider::CachedNodeInfo
237 ObjectAtPredicateProvider::getCacheEntry(
const std::string& nodeId)
239 auto it = nodeInfoMap.find(nodeId);
240 if (it != nodeInfoMap.end())
245 GraphNodePtr n = GraphNodePtr::dynamicCast(graphs->getEntityById(nodeId));
248 armarx::FramedPosePtr::dynamicCast(psr->resolveToGlobalPose(n));
251 ARMARX_WARNING <<
"Could not resolve the following to a global pose:\n"
252 << armarx::FramedPosePtr::dynamicCast(n->getPose())->toEigen()
253 <<
"\n for node '" << n->getName() <<
"'";
256 CachedNodeInfo newCacheEntry{n,
257 graphs->getEntityRefById(nodeId),
259 n->getAllParentsAsStringList(),
261 nodeInfoMap.insert({n->getId(), newCacheEntry});
263 return newCacheEntry;