diff --git a/source/RobotAPI/libraries/ArmarXObjects/util.cpp b/source/RobotAPI/libraries/ArmarXObjects/util.cpp index c178c759b2cd0f65c7312e76fe2c0d756320fc68..1b67997af7fbe05ac118a60ef71cd82464a42743 100644 --- a/source/RobotAPI/libraries/ArmarXObjects/util.cpp +++ b/source/RobotAPI/libraries/ArmarXObjects/util.cpp @@ -30,28 +30,93 @@ #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h> -namespace armarx::objpose +namespace armarx::objpose::util { objpose::ObjectPoseSeq - filterObjects(objpose::ObjectPoseSeq objects, const std::vector<std::string>& datasetBlocklist) + filterObjects(objpose::ObjectPoseSeq objects, + const std::vector<std::string>& datasetDisableList) { - const auto isBlacklisted = [&datasetBlocklist](const objpose::ObjectPose& objectPose) + const auto isInDisableList = [&datasetDisableList](const objpose::ObjectPose& objectPose) { const auto dataset = objectPose.objectID.dataset(); - return std::find(datasetBlocklist.begin(), datasetBlocklist.end(), dataset) != - datasetBlocklist.end(); + return std::find(datasetDisableList.begin(), datasetDisableList.end(), dataset) != + datasetDisableList.end(); }; - objects.erase(std::remove_if(objects.begin(), objects.end(), isBlacklisted), objects.end()); + objects.erase(std::remove_if(objects.begin(), objects.end(), isInDisableList), + objects.end()); return objects; } + objpose::ObjectPoseSeq + staticObjects(objpose::ObjectPoseSeq objects) + { + const auto isDynamic = [](const objpose::ObjectPose& objectPose) + { return not objectPose.isStatic; }; + + objects.erase(std::remove_if(objects.begin(), objects.end(), isDynamic), objects.end()); + return objects; + } + + objpose::ObjectPoseSeq + nonArticulatedObjects(objpose::ObjectPoseSeq objects) + { + ObjectFinder finder; + finder.setLogObjectDiscoveryError(false); + + const auto isArticulated = [&finder](const objpose::ObjectPose& objectPose) + { + const auto objInfo = finder.findObject(objectPose.objectID); + ARMARX_CHECK_NOT_NULL(objInfo) << objectPose.objectID; + const bool hasArticulatedModel = objInfo->getArticulatedModel().has_value(); + return hasArticulatedModel; + }; + + objects.erase(std::remove_if(objects.begin(), objects.end(), isArticulated), objects.end()); + return objects; + } + + objpose::ObjectPoseSeq + articulatedObjects(objpose::ObjectPoseSeq objects) + { + ObjectFinder finder; + finder.setLogObjectDiscoveryError(false); + + const auto isNonArticulated = [&finder](const objpose::ObjectPose& objectPose) + { + const auto objInfo = finder.findObject(objectPose.objectID); + ARMARX_CHECK_NOT_NULL(objInfo) << objectPose.objectID; + const bool hasArticulatedModel = objInfo->getArticulatedModel().has_value(); + return not hasArticulatedModel; + }; + + objects.erase(std::remove_if(objects.begin(), objects.end(), isNonArticulated), + objects.end()); + return objects; + } + + std::optional<objpose::ObjectPose> + findObject(const objpose::ObjectPoseSeq& objectPoses, const armarx::ObjectID& objectID) + { + const auto matchesId = [&objectID](const objpose::ObjectPose& objectPose) -> bool + { return objectPose.objectID == objectID; }; + + const auto it = std::find_if(objectPoses.begin(), objectPoses.end(), matchesId); + if (it != objectPoses.end()) + { + return *it; + } + + return std::nullopt; + } + VirtualRobot::ManipulationObjectPtr asManipulationObject(const objpose::ObjectPose& objectPose) { ObjectFinder finder; + finder.setLogObjectDiscoveryError(false); VirtualRobot::SceneObjectSetPtr sceneObjects(new VirtualRobot::SceneObjectSet); if (auto obstacle = finder.loadManipulationObject(objectPose)) @@ -68,10 +133,12 @@ namespace armarx::objpose asSceneObjects(const objpose::ObjectPoseSeq& objectPoses) { ObjectFinder finder; + finder.setLogObjectDiscoveryError(false); VirtualRobot::SceneObjectSetPtr sceneObjects(new VirtualRobot::SceneObjectSet); for (const auto& objectPose : objectPoses) { + ARMARX_VERBOSE << "Loading object `" << objectPose.objectID << "`"; if (auto obstacle = finder.loadManipulationObject(objectPose)) { obstacle->setGlobalPose(objectPose.objectPoseGlobal); @@ -82,5 +149,20 @@ namespace armarx::objpose return sceneObjects; } + VirtualRobot::SceneObjectPtr + asSceneObject(const objpose::ObjectPose& objectPose) + { + ObjectFinder finder; + finder.setLogObjectDiscoveryError(false); + + VirtualRobot::SceneObjectSetPtr sceneObjects(new VirtualRobot::SceneObjectSet); + if (auto obstacle = finder.loadManipulationObject(objectPose)) + { + obstacle->setGlobalPose(objectPose.objectPoseGlobal); + return obstacle; + } + return nullptr; + } + } // namespace armarx::objpose diff --git a/source/RobotAPI/libraries/ArmarXObjects/util.h b/source/RobotAPI/libraries/ArmarXObjects/util.h index da9535020fd06bbfa1b5402e590639b5eab1f7eb..a9a7a1261ea9c5fd4e95e1bfbbd8697f961cb3d9 100644 --- a/source/RobotAPI/libraries/ArmarXObjects/util.h +++ b/source/RobotAPI/libraries/ArmarXObjects/util.h @@ -25,12 +25,22 @@ #include <RobotAPI/libraries/ArmarXObjects/ObjectPose.h> -namespace armarx::objpose +namespace armarx::objpose::util { objpose::ObjectPoseSeq filterObjects(objpose::ObjectPoseSeq objects, - const std::vector<std::string>& datasetBlocklist); + const std::vector<std::string>& datasetDisableList); + + std::optional<objpose::ObjectPose> findObject(const objpose::ObjectPoseSeq& objectPoses, + const armarx::ObjectID& objectID); VirtualRobot::ManipulationObjectPtr asManipulationObject(const objpose::ObjectPose& objectPose); VirtualRobot::SceneObjectSetPtr asSceneObjects(const objpose::ObjectPoseSeq& objectPoses); + + objpose::ObjectPoseSeq staticObjects(objpose::ObjectPoseSeq objects); + objpose::ObjectPoseSeq nonArticulatedObjects(objpose::ObjectPoseSeq objects); + objpose::ObjectPoseSeq articulatedObjects(objpose::ObjectPoseSeq objects); + + VirtualRobot::SceneObjectPtr asSceneObject(const objpose::ObjectPose& objectPose); + } // namespace armarx::objpose diff --git a/source/RobotAPI/libraries/armem_vision/types.h b/source/RobotAPI/libraries/armem_vision/types.h index 1ddd16d87b8cd65665d97f9ea7985c4145cf97d3..cc1d7393d25aae8164dd14b37ebbccfb46c3ad01 100644 --- a/source/RobotAPI/libraries/armem_vision/types.h +++ b/source/RobotAPI/libraries/armem_vision/types.h @@ -38,7 +38,7 @@ namespace armarx::armem::vision float resolution; // [mm] std::string frame; - Eigen::Affine3f pose; + Eigen::Isometry3f pose; // using ValueType = _ValueT; using CellType = float;