25 #include <SimoxUtility/algorithm/string/string_tools.h>
26 #include <VirtualRobot/Grasping/Grasp.h>
27 #include <VirtualRobot/Grasping/GraspSet.h>
41 leftColor(
armarx::DrawColor{0.f, 0.f, 1.f, 0.25f}),
42 rightColor(armarx::DrawColor{0.f, 1.f, 0.f, 0.25f}),
43 leftGraspable(PredicateInfo{
"leftgraspable", 1}),
44 rightGraspable(PredicateInfo{
"rightgraspable", 1})
49 GraspablePredicateProvider::stringToBoxes(
const std::string& boxesString)
51 std::vector<Box> result;
54 for (
const auto& boxTupleString : boxTuples)
59 result.push_back(
Box{std::stof(boxTuple[0]),
60 std::stof(boxTuple[1]),
61 std::stof(boxTuple[2]),
62 std::stof(boxTuple[3]),
63 std::stof(boxTuple[4]),
64 std::stof(boxTuple[5])});
73 boxesL = stringToBoxes(getProperty<std::string>(
"BoundingBoxesL").getValue());
74 boxesR = stringToBoxes(getProperty<std::string>(
"BoundingBoxesR").getValue());
79 debugDrawerTopicName = getProperty<std::string>(
"DebugDrawerTopicName").getValue();
81 if (!debugDrawerTopicName.empty())
90 wm = getProxy<WorkingMemoryInterfacePrx>(
"WorkingMemory");
91 objectInstances = wm->getObjectInstancesSegment();
92 prior = getProxy<PriorKnowledgeInterfacePrx>(
"PriorKnowledge");
93 objectClasses = prior->getObjectClassesSegment();
97 if (!debugDrawerTopicName.empty())
100 getTopic<armarx::DebugDrawerInterfacePrx>(debugDrawerTopicName);
102 for (
size_t i = 0; i < boxesL.size(); ++i)
104 boxesL[i].drawTo(debugDrawer,
110 for (
size_t i = 0; i < boxesR.size(); ++i)
112 boxesR[i].drawTo(debugDrawer,
123 return "GraspablePredicateProvider";
129 return {leftGraspable, rightGraspable};
133 GraspablePredicateProvider::addPredicateIfInside(PredicateInstanceList& result,
134 const std::string& predicateName,
136 const std::vector<Box>& boxes)
139 auto pos = obj->getPosition();
143 pos = armarx::FramedPosePtr::dynamicCast(
144 wm->getAgentInstancesSegment()->convertToWorldPose(pos->agent, obj->getPose()))
148 ARMARX_DEBUG <<
"Obj: " << obj->getName() <<
" pos: " << *pos;
150 for (
const auto& box : boxes)
152 inside |= box.inside(pos);
158 result.push_back(PredicateInstance{
159 predicateName, {objectInstances->getEntityRefById(obj->getId())},
true});
163 PredicateInstanceList
166 PredicateInstanceList result;
168 for (
const auto& entity : objectInstances->getAllEntities())
171 const std::string className =
object->getMostProbableClass();
173 auto graspabilityDescriptorIt = std::find_if(graspabilityDescriptors.cbegin(),
174 graspabilityDescriptors.cend(),
175 [&](
const GraspabilityDescriptor& gd)
176 { return gd.className == className; });
178 if (graspabilityDescriptorIt == graspabilityDescriptors.cend())
181 objectClasses->getObjectClassByNameWithAllParents(className)->getParentClasses();
183 bool hasGraspableSuperclass =
184 std::find(parents.cbegin(), parents.cend(),
"graspable") != parents.cend();
185 hasGraspableSuperclass |=
186 std::find(parents.cbegin(), parents.cend(),
"bothhandsgraspable") != parents.cend();
187 GraspabilityDescriptor gd{className, hasGraspableSuperclass,
false,
false};
190 ObjectClassPtr::dynamicCast(objectClasses->getEntityByName(className));
193 VirtualRobot::ManipulationObjectPtr mo = simoxWrapper->getManipulationObject();
195 gd.hasLeftGrasp =
false;
196 gd.hasRightGrasp =
false;
199 auto hasGrasp = [](VirtualRobot::GraspSetPtr
set)
206 for (
size_t i = 0; i <
set->getSize(); ++i)
215 gd.hasLeftGrasp = hasGrasp(mo->getGraspSet(
"TCP L"));
216 gd.hasRightGrasp = hasGrasp(mo->getGraspSet(
"TCP R"));
219 graspabilityDescriptors.push_back(gd);
220 graspabilityDescriptorIt = std::prev(graspabilityDescriptors.cend());
222 ARMARX_INFO <<
"new graspability descriptor: [className: '" << className
223 <<
"'; child of graspable/bothhandsgraspable: " << gd.hasGraspableSuperclass
224 <<
"; has left grasp: " << gd.hasLeftGrasp
225 <<
"; has right grasp: " << gd.hasRightGrasp <<
"]";
228 const auto& gd = *graspabilityDescriptorIt;
229 ARMARX_DEBUG <<
"checking " << className <<
"/" << gd.className <<
" "
230 << gd.hasGraspableSuperclass <<
" " << gd.hasLeftGrasp <<
" "
233 if (!gd.hasGraspableSuperclass)
240 addPredicateIfInside(result, leftGraspable.name,
object, boxesL);
243 if (gd.hasRightGrasp)
245 addPredicateIfInside(result, rightGraspable.name,
object, boxesR);