57 std::optional<arondto::KnownGraspInfo>
58 KnownGraspProviderSegment::knownGraspInfoFromObjectInfo(
const ObjectInfo& info)
60 return knownGraspInfoFromFile(GraspFileInfo::FromObjectInfo(info));
63 std::optional<arondto::KnownGraspInfo>
64 KnownGraspProviderSegment::knownGraspInfoFromFile(
const GraspFileInfo& graspFileInfo)
67 const std::filesystem::path graspFilePath = graspFileInfo.fileLocInfo.absolutePath;
68 if (not std::filesystem::is_regular_file(graspFilePath))
76 const std::string objectClassName = graspFileInfo.objectId.className();
79 auto manipulationObject = VirtualRobot::ObjectIO::loadManipulationObject(
81 VirtualRobot::ObjectIO::ObjectDescription::eStructure);
83 if (manipulationObject ==
nullptr)
89 arondto::KnownGraspInfo ret;
90 ret.correspondingObject.memoryName =
"Object";
91 ret.correspondingObject.coreSegmentName =
"Class";
92 ret.correspondingObject.providerSegmentName =
"PriorKnowledgeData";
93 ret.correspondingObject.entityName = graspFileInfo.objectId.str();
94 ret.xml.package = graspFileInfo.fileLocInfo.package;
95 ret.xml.path = graspFileInfo.fileLocInfo.relativePath;
97 for (
const VirtualRobot::GraspSetPtr& graspSet : manipulationObject->getAllGraspSets())
101 arondto::KnownGraspSet retGraspSet;
103 retGraspSet.name = graspSet->getName();
105 retGraspSet.robot = simox::alg::split(graspSet->getRobotType(),
" ").front();
107 retGraspSet.endeffector = graspSet->getEndEffector();
109 VirtualRobot::GraspSetPtr preGraspSet = [&graspSet]()
111 std::vector<VirtualRobot::GraspPtr> preGrasps;
112 for (
const auto& grasp : graspSet->getGrasps())
115 if (simox::alg::ends_with(grasp->getName(), PREPOSE_SUFFIX))
117 preGrasps.emplace_back(grasp);
124 VirtualRobot::GraspSetPtr preGraspSet = graspSet->clone();
125 preGraspSet->removeAllGrasps();
126 for (
const auto& preGrasp : preGrasps)
128 preGraspSet->addGrasp(preGrasp);
138 for (
const auto& preGrasp : preGraspSet->getGrasps())
140 graspSet->removeGrasp(preGrasp);
144 for (
const VirtualRobot::GraspPtr& grasp : graspSet->getGrasps())
148 arondto::KnownGrasp retGrasp;
150 retGrasp.name = grasp->getName();
151 retGrasp.quality = grasp->getQuality();
152 retGrasp.creator = grasp->getCreationMethod();
153 retGrasp.pose = grasp->getTransformation();
154 retGrasp.prepose.reset();
158 const std::string prePoseName = retGrasp.name + PREPOSE_SUFFIX;
160 ARMARX_DEBUG <<
"Checking for prepose '" << prePoseName <<
"' ...";
162 if (preGraspSet->hasGrasp(prePoseName))
165 preGraspSet->getGrasp(prePoseName)->getTransformation();
168 preGraspSet->removeGrasp(preGraspSet->getGrasp(prePoseName));
171 ARMARX_DEBUG <<
"Found prepose `" + prePoseName +
"` for grasp '"
172 << retGrasp.name <<
"' in set '" << retGraspSet.name
173 <<
"' for obj '" << objectClassName <<
"' with pose \n"
174 << retGrasp.prepose.value();
180 simox::alg::ends_with(retGrasp.name, GRASP_OPTIONAL_SUFFIX))
182 const std::string prePoseName =
183 retGrasp.name.substr(0,
185 - std::strlen(GRASP_OPTIONAL_SUFFIX))
188 ARMARX_DEBUG <<
"Checking for prepose '" << prePoseName <<
"' ...";
190 if (preGraspSet->hasGrasp(prePoseName))
193 preGraspSet->getGrasp(prePoseName)->getTransformation();
196 preGraspSet->removeGrasp(preGraspSet->getGrasp(prePoseName));
198 ARMARX_DEBUG <<
"Found prepose `" + prePoseName +
"` for grasp '"
199 << retGrasp.name <<
"' in set '" << retGraspSet.name
200 <<
"' for obj '" << objectClassName <<
"' with pose \n"
201 << retGrasp.prepose.value();
205 ARMARX_DEBUG <<
"Found grasp '" << retGrasp.name <<
"' in set '"
206 << retGraspSet.name <<
"' for obj '" << objectClassName
210 retGraspSet.grasps.push_back(retGrasp);
214 if (preGraspSet->getSize() > 0)
217 <<
" preposes in the grasp set '" << retGraspSet.name
218 <<
"' for obj '" << objectClassName
219 <<
"' that do not have a corresponding grasp!";
220 for (
const auto& preGrasp : preGraspSet->getGrasps())
226 ARMARX_CHECK(ret.graspSets.count(retGraspSet.robot +
"/" + retGraspSet.name) == 0)
227 <<
"The grasp set `" << retGraspSet.robot +
"/" + retGraspSet.name
228 <<
"` was defined twice!";
230 ret.graspSets[retGraspSet.robot +
"/" + retGraspSet.name] = retGraspSet;
236 ARMARX_WARNING << graspFilePath <<
" is not a manipulation object!"
243 KnownGraspProviderSegment::loadMemory()
246 ObjectFinder objectFinder;
249 const bool checkPaths =
false;
250 std::vector<ObjectInfo> infos = objectFinder.findAllObjects(checkPaths);
253 segmentPtr->id().withProviderSegmentName(objectFinder.getPackageName());
254 ARMARX_INFO <<
"Checking up to " << infos.size() <<
" object classes from '"
255 << objectFinder.getPackageName() <<
"' ...";
258 for (ObjectInfo& info : infos)
261 if (
auto knownGraspCandidate = knownGraspInfoFromObjectInfo(info); knownGraspCandidate)
263 EntityUpdate&
update = commit.add();
264 update.entityID = providerID.withEntityName(info.
id().
str());
268 update.instancesData = {knownGraspCandidate->toAron()};
271 for (
const auto& gs : knownGraspCandidate->graspSets)
274 for (
const auto& grasp : gs.second.grasps)
282 <<
" grasp candidates from object classes from '"
283 << objectFinder.getPackageName() <<
"'.";
284 auto result =
iceMemory.commitLocking(commit);
285 if (!result.allSuccess())
287 ARMARX_WARNING <<
"Got errors for commit: " << result.allErrorMessages();
292 KnownGraspProviderSegment::installFileWatcher()
295 const ObjectFinder objectFinder;
296 const std::vector<ObjectInfo> infos = objectFinder.findAllObjects(
false);
298 const bool autoReloadSceneSnapshotsOnFileChange =
true;
300 if (autoReloadSceneSnapshotsOnFileChange)
307 inotifyFd = inotify_init();
314 std::map<int, GraspFileInfo> wds;
317 for (
const auto& info : infos)
319 const auto graspFileInfo = GraspFileInfo::FromObjectInfo(info);
321 if (std::filesystem::exists(graspFileInfo.fileLocInfo.absolutePath))
323 auto wd = inotify_add_watch(inotifyFd,
324 graspFileInfo.fileLocInfo.absolutePath.c_str(),
329 << graspFileInfo.fileLocInfo.absolutePath <<
"` failed.";
333 << graspFileInfo.fileLocInfo.absolutePath <<
"` added.";
334 wds.emplace(wd, graspFileInfo);
338 ARMARX_INFO <<
"Set up " << wds.size() <<
" inotify events to watch for file changes.";
341 [
this, inotifyFd, wds]()
343 ObjectFinder objectFinder;
345 constexpr std::size_t BUF_LEN = (10 * (
sizeof(inotify_event) + NAME_MAX + 1));
352 numRead =
read(inotifyFd, buf, BUF_LEN);
365 for (
char* p = buf; p < buf + numRead;)
367 auto*
event =
reinterpret_cast<inotify_event*
>(p);
369 const auto& graspFileInfo = wds.at(event->wd);
371 <<
VAROUT(graspFileInfo.fileLocInfo.absolutePath);
373 ARMARX_INFO <<
"Reloading file for object `" << graspFileInfo.objectId
376 p +=
sizeof(
struct inotify_event) + event->len;
378 const bool lockMemory =
true;
384 objectFinder.getPackageName());
389 if (
auto knownGraspCandidate =
390 knownGraspInfoFromFile(graspFileInfo);
393 EntityUpdate&
update = commit.add();
395 providerID.withEntityName(graspFileInfo.objectId.str());
400 update.instancesData = {knownGraspCandidate->toAron()};
403 <<
VAROUT(knownGraspCandidate->graspSets.size());
404 for (
const auto& gs : knownGraspCandidate->graspSets)
407 for (
const auto& grasp : gs.second.grasps)
416 if (not commit.updates.empty())
420 const auto result =
iceMemory.commitLocking(commit);
421 if (not result.allSuccess())
424 << result.allErrorMessages();
432 fileWatcherTask->start();