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;
170 float minDist = std::numeric_limits<float>::max();
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});