diff --git a/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.cpp b/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.cpp index ff55654b049adfe37980d243b1717e69c5938d73..ea5d2df495d8f427695f8778562035439f632397 100644 --- a/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.cpp +++ b/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.cpp @@ -18,12 +18,13 @@ #include <ArmarXCore/core/time/Metronome.h> #include <ArmarXCore/core/time/forward_declarations.h> -#include "RobotAPI/components/ArViz/Client/elements/Robot.h" -#include "RobotAPI/libraries/armem/core/MemoryID.h" +#include <RobotAPI/components/ArViz/Client/elements/Color.h> +#include <RobotAPI/components/ArViz/Client/elements/Robot.h> #include <RobotAPI/libraries/ArmarXObjects/aron_conversions/armarx.h> #include <RobotAPI/libraries/GraspingUtility/GraspCandidateVisu.h> #include <RobotAPI/libraries/GraspingUtility/aron/GraspCandidate.aron.generated.h> #include <RobotAPI/libraries/GraspingUtility/aron_conversions.h> +#include <RobotAPI/libraries/armem/core/MemoryID.h> #include <RobotAPI/libraries/armem/core/error.h> #include <RobotAPI/libraries/armem/core/ice_conversions.h> #include <RobotAPI/libraries/armem/server/MemoryRemoteGui.h> @@ -48,6 +49,11 @@ namespace armarx::armem::server::grasp defs->optional(enableVisualizeKnownGraspCandidates, "p.enableVisualizeKnownGraspCandidates"); + defs->optional(enableVisualizeKnownGraspCandidatesPreposes, + "p.enableVisualizeKnownGraspCandidatesPreposes"); + defs->optional(enableVisualizeKnownGraspCandidatesApproach, + "p.enableVisualizeKnownGraspCandidatesApproach"); + defs->optional(frequencyHzVisualizeKnownGraspCandidates, "p.frequencyHzVisualizeKnownGraspCandidates"); @@ -1016,16 +1022,55 @@ namespace armarx::armem::server::grasp const Eigen::Isometry3f eef_T_hand_root{ handRootNode->getPoseInFrame(tcp)}; - const Eigen::Isometry3f pose = + const Eigen::Isometry3f global_T_grasp_pose = Eigen::Isometry3f{object.objectPoseGlobal} * - Eigen::Isometry3f{grasp.pose}.inverse() * eef_T_hand_root; + Eigen::Isometry3f{grasp.pose}.inverse(); + + // visualize grasp pose + { + viz::Robot graspHandVisu(visuName + "_grasp"); + graspHandVisu.useCollisionModel() + .file(visuRobotPartXML) + .pose( + Eigen::Isometry3f{global_T_grasp_pose * eef_T_hand_root} + .matrix()); + + layer.add(graspHandVisu); + } + + // visualize prepose if available + if (grasp.prepose.has_value()) + { + const Eigen::Isometry3f global_T_prepose = + Eigen::Isometry3f{object.objectPoseGlobal} * + Eigen::Isometry3f{grasp.prepose.value()}.inverse(); - viz::Robot handVisu(visuName); - handVisu.useCollisionModel() - .file(visuRobotPartXML) - .pose(pose.matrix()); + // visualize as prepose as hand + if (enableVisualizeKnownGraspCandidatesPreposes) + { + viz::Robot graspHandVisuPrepose(visuName + "_prepose"); + graspHandVisuPrepose.useCollisionModel() + .file(visuRobotPartXML) + .pose(Eigen::Isometry3f{global_T_prepose * + eef_T_hand_root} + .matrix()) + .overrideColor(viz::Color::blue()); + + layer.add(graspHandVisuPrepose); + } + + // visualize approach direction (arrow between poses) + if (enableVisualizeKnownGraspCandidatesApproach) + { + viz::Arrow arrow(visuName + "_approach"); + arrow + .fromTo(global_T_prepose.translation(), + global_T_grasp_pose.translation()) + .color(viz::Color::green()); - layer.add(handVisu); + layer.add(arrow); + } + } } } } diff --git a/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.h b/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.h index 40ef25686fc4c8b545bd0aa49ed787c4035ab7c5..d6ea24e6ecf3f421f62f2b8c904e7e15ff678c3b 100644 --- a/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.h +++ b/source/RobotAPI/components/armem/server/GraspMemory/GraspMemory.h @@ -120,6 +120,10 @@ namespace armarx::armem::server::grasp bool enableRemoteGui{true}; bool enableVisualizeKnownGraspCandidates = false; + bool enableVisualizeKnownGraspCandidatesPreposes = false; + bool enableVisualizeKnownGraspCandidatesApproach = false; + + std::size_t frequencyHzVisualizeKnownGraspCandidates = 5; void visualizeGraspCandidates(); diff --git a/source/RobotAPI/libraries/ArmarXObjects/ObjectFinder.cpp b/source/RobotAPI/libraries/ArmarXObjects/ObjectFinder.cpp index 1167db200b5cacded7c52f265e8c2b9261b85bed..f2c6108a9ace4740e0add45b27ed7aa827347d41 100644 --- a/source/RobotAPI/libraries/ArmarXObjects/ObjectFinder.cpp +++ b/source/RobotAPI/libraries/ArmarXObjects/ObjectFinder.cpp @@ -1,7 +1,5 @@ #include <VirtualRobot/XML/ObjectIO.h> -#include <set> - #include <SimoxUtility/algorithm/string.h> #include <SimoxUtility/filesystem/list_directory.h> diff --git a/source/RobotAPI/libraries/RobotUnitDataStreamingReceiver/RobotUnitDataStreamingReceiver.cpp b/source/RobotAPI/libraries/RobotUnitDataStreamingReceiver/RobotUnitDataStreamingReceiver.cpp index 3ab4e0530b54331305cdbc8f8ad05603607b0ac9..fb834d52c07e86f500d05c097d5a5d19616ee2c5 100644 --- a/source/RobotAPI/libraries/RobotUnitDataStreamingReceiver/RobotUnitDataStreamingReceiver.cpp +++ b/source/RobotAPI/libraries/RobotUnitDataStreamingReceiver/RobotUnitDataStreamingReceiver.cpp @@ -185,7 +185,7 @@ namespace armarx { if (_last_iteration_id != -1 && _last_iteration_id + 1 != step.iterationId) { - ARMARX_INFO << deactivateSpam(10) + ARMARX_INFO << deactivateSpam(60) << "Missing Iterations or iterations out of order! " << "This should not happen. " << VAROUT(_last_iteration_id) << ", " << VAROUT(step.iterationId); diff --git a/source/RobotAPI/libraries/armem/server/ltm/processors/converter/data/image/png/PngConverter.cpp b/source/RobotAPI/libraries/armem/server/ltm/processors/converter/data/image/png/PngConverter.cpp index b9d4a92d4514075c72d9f70948ab9d39a7428d65..3294e56c181c8811d7471a7fb01a46db48ee14cf 100644 --- a/source/RobotAPI/libraries/armem/server/ltm/processors/converter/data/image/png/PngConverter.cpp +++ b/source/RobotAPI/libraries/armem/server/ltm/processors/converter/data/image/png/PngConverter.cpp @@ -3,6 +3,7 @@ // ArmarX #include <opencv2/imgcodecs.hpp> #include <opencv2/imgproc.hpp> +#include <opencv2/imgproc/types_c.h> #include <opencv2/opencv.hpp> #include <RobotAPI/libraries/aron/converter/opencv/OpenCVConverter.h> diff --git a/source/RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.xml b/source/RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.xml index fcce7ea3a3319aa4b7afeeacae9c02abb7f00482..2f48fb22ba086c0ff82dd096272d2b317d41a086 100644 --- a/source/RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.xml +++ b/source/RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.xml @@ -21,6 +21,10 @@ <ObjectChild key='pose'> <Pose /> </ObjectChild> + + <ObjectChild key='prepose'> + <Pose optional="true" /> + </ObjectChild> </Object> <!-- A Grasp set is a set of grasps that need to be executed to grasp an object. The order is important! --> diff --git a/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp index c805d2ee70a55356bfd46c463cd2f9b315aec583..e18c49fcbbefa6a08196536a49705a55adf87866 100644 --- a/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp +++ b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp @@ -1,5 +1,6 @@ #include "KnownGraspProviderSegment.h" +#include <SimoxUtility/algorithm/string/string_tools.h> #include <VirtualRobot/Grasping/GraspSet.h> #include <VirtualRobot/XML/ObjectIO.h> @@ -63,9 +64,46 @@ namespace armarx::armem::grasping::segment arondto::KnownGraspSet retGraspSet; retGraspSet.name = graspSet->getName(); - retGraspSet.robot = graspSet->getRobotType(); + + retGraspSet.robot = simox::alg::split(graspSet->getRobotType(), " ").front(); + retGraspSet.endeffector = graspSet->getEndEffector(); + VirtualRobot::GraspSetPtr preGraspSet = [&graspSet]() + { + std::vector<VirtualRobot::GraspPtr> preGrasps; + for (const auto& grasp : graspSet->getGrasps()) + { + // check if grasp is a prepose by checking if grasp name ends with "_Prepose" + if (simox::alg::ends_with(grasp->getName(), PREPOSE_SUFFIX)) + { + preGrasps.emplace_back(grasp); + } + + // everything else is assumed to be a grasp + } + + // create a new grasp set with the preposes + VirtualRobot::GraspSetPtr preGraspSet = graspSet->clone(); + preGraspSet->removeAllGrasps(); // just keep the EEF info etc + for (const auto& preGrasp : preGrasps) + { + preGraspSet->addGrasp(preGrasp); + } + + return preGraspSet; + }(); + + + ARMARX_DEBUG << VAROUT(preGraspSet->getSize()); + + // remove all preposes from the grasp set + for (const auto& preGrasp : preGraspSet->getGrasps()) + { + graspSet->removeGrasp(preGrasp); + } + + for (const VirtualRobot::GraspPtr& grasp : graspSet->getGrasps()) { ARMARX_CHECK_NOT_NULL(grasp); @@ -76,8 +114,57 @@ namespace armarx::armem::grasping::segment retGrasp.quality = grasp->getQuality(); retGrasp.creator = grasp->getCreationMethod(); retGrasp.pose = grasp->getTransformation(); - - ARMARX_VERBOSE << "Found grasp '" << retGrasp.name << "' in set '" + retGrasp.prepose.reset(); + + // check if grasp has a prepose by checking if grasp name ends with "_Prepose" + { + const std::string prePoseName = retGrasp.name + PREPOSE_SUFFIX; + + ARMARX_DEBUG << "Checking for prepose '" << prePoseName << "' ..."; + + if (preGraspSet->hasGrasp(prePoseName)) + { + retGrasp.prepose = + preGraspSet->getGrasp(prePoseName)->getTransformation(); + + // remove the prepose from the set as it found its match + preGraspSet->removeGrasp(preGraspSet->getGrasp(prePoseName)); + + + ARMARX_DEBUG << "Found prepose `" + prePoseName + "` for grasp '" << retGrasp.name << "' in set '" + << retGraspSet.name << "' for obj '" << objectClassName + << "' with pose \n" + << retGrasp.prepose.value(); + } + } + + // check if grasp has a prepose for a grasp with a specific name, e.g., "XY_Grasp" (GRASP_OPTIONAL_SUFFIX) + if (// not retGrasp.prepose.has_value() and + simox::alg::ends_with(retGrasp.name, GRASP_OPTIONAL_SUFFIX)) + { + const std::string prePoseName = + retGrasp.name.substr( + 0, retGrasp.name.size() - std::strlen(GRASP_OPTIONAL_SUFFIX)) + + PREPOSE_SUFFIX; + + ARMARX_DEBUG << "Checking for prepose '" << prePoseName << "' ..."; + + if (preGraspSet->hasGrasp(prePoseName)) + { + retGrasp.prepose = + preGraspSet->getGrasp(prePoseName)->getTransformation(); + + // remove the prepose from the set as it found its match + preGraspSet->removeGrasp(preGraspSet->getGrasp(prePoseName)); + + ARMARX_DEBUG << "Found prepose `" + prePoseName + "` for grasp '" << retGrasp.name << "' in set '" + << retGraspSet.name << "' for obj '" << objectClassName + << "' with pose \n" + << retGrasp.prepose.value(); + } + } + + ARMARX_DEBUG << "Found grasp '" << retGrasp.name << "' in set '" << retGraspSet.name << "' for obj '" << objectClassName << "' with pose \n" << retGrasp.pose; @@ -85,6 +172,19 @@ namespace armarx::armem::grasping::segment retGraspSet.grasps.push_back(retGrasp); } + // Now, check if there are any preposes left in the set. This should not have happened. + if (preGraspSet->getSize() > 0) + { + ARMARX_WARNING << "Found " << preGraspSet->getSize() + << " preposes in the grasp set '" << retGraspSet.name + << "' for obj '" << objectClassName + << "' that do not have a corresponding grasp!"; + for(const auto& preGrasp : preGraspSet->getGrasps()) + { + ARMARX_WARNING << "Prepose '" << preGrasp->getName(); + } + } + ARMARX_CHECK(ret.graspSets.count(retGraspSet.robot + "/" + retGraspSet.name) == 0) << "The grasp set `" << retGraspSet.robot + "/" + retGraspSet.name @@ -132,13 +232,13 @@ namespace armarx::armem::grasping::segment update.instancesData = {knownGraspCandidate->toAron()}; - ARMARX_VERBOSE << VAROUT(knownGraspCandidate->graspSets.size()); + ARMARX_DEBUG << VAROUT(knownGraspCandidate->graspSets.size()); for (const auto& gs : knownGraspCandidate->graspSets) { - ARMARX_VERBOSE << VAROUT(gs.second.grasps.size()); + ARMARX_DEBUG << VAROUT(gs.second.grasps.size()); for (const auto& grasp : gs.second.grasps) { - ARMARX_VERBOSE << VAROUT(grasp.name); + ARMARX_DEBUG << VAROUT(grasp.name); } } } diff --git a/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.h b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.h index de92372581076450341fb53e4628c4dd7ae4ba7c..75aadd96aff419a636b802fcc73548b080e4d8d8 100644 --- a/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.h +++ b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.h @@ -23,5 +23,9 @@ namespace armarx::armem::grasping::segment public: static const constexpr char* CORE_SEGMENT_NAME = "KnownGraspCandidate"; static const constexpr char* PROVIDER_SEGMENT_NAME = "PriorKnowledgeData"; + + private: + static const constexpr char* PREPOSE_SUFFIX = "_Prepose"; + static const constexpr char* GRASP_OPTIONAL_SUFFIX = "_Grasp"; }; } diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectReader.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectReader.cpp index a702857316a46fb59fd581c95e92b8b2413d371e..f0ec3136995b80a3a8efedb5132e73df04801849 100644 --- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectReader.cpp +++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectReader.cpp @@ -7,6 +7,7 @@ #include <VirtualRobot/XML/RobotIO.h> #include <ArmarXCore/core/PackagePath.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> #include <ArmarXCore/core/logging/Logging.h> #include <ArmarXCore/core/system/ArmarXDataPath.h> @@ -32,37 +33,27 @@ namespace armarx::armem::articulated_object const std::string& instanceName, VirtualRobot::RobotIO::RobotDescription loadMode) { - const auto descriptions = queryDescriptions(timestamp, providerName); + ARMARX_VERBOSE << "Getting `" << typeName + "/" + instanceName << "`"; - ARMARX_INFO << "Found " << descriptions.size() << " articulated object descriptions"; + const std::optional<ArticulatedObject> articulatedObjectDescription = + get(typeName + "/" + instanceName, timestamp, providerName); + ARMARX_CHECK_NOT_NULL(articulatedObjectDescription) + << "Failed to get articulated object `" << typeName << "/" << instanceName << "`"; - const auto it = std::find_if( - descriptions.begin(), - descriptions.end(), - [&](const armem::articulated_object::ArticulatedObjectDescription& desc) -> bool - { return desc.name == typeName; }); - - if (it == descriptions.end()) - { - ARMARX_WARNING << "Description for articulate object with type <" << typeName - << "> not (yet) available!"; - return nullptr; - } - - ARMARX_DEBUG << "Description for articulate object with type <" << typeName - << "> available!"; - - auto obj = VirtualRobot::RobotIO::loadRobot(it->xml.toSystemPath(), loadMode); + auto obj = VirtualRobot::RobotIO::loadRobot( + articulatedObjectDescription->description.xml.toSystemPath(), loadMode); if (not obj) { - ARMARX_WARNING << "Failed to load description for articulated object <" << typeName - << ">!"; + ARMARX_WARNING << "Failed to load articulated object `" << typeName << "/" + << instanceName << "` from file `" + << articulatedObjectDescription->description.xml.toSystemPath() << "`."; + return nullptr; } obj->setName(instanceName); - obj->setType(it->name); + obj->setType(typeName); return obj; } diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.cpp index f293741f9ba9baa56853717f1984389ce30ad1d1..0085fd3fade1e29d046b22b62887196584332508 100644 --- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.cpp +++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.cpp @@ -51,7 +51,8 @@ namespace armarx::armem::articulated_object bool ArticulatedObjectWriter::storeArticulatedObject(const VirtualRobot::RobotPtr& articulatedObject, - const armem::Time& timestamp) + const armem::Time& timestamp, + const bool isStatic) { ARMARX_CHECK_NOT_NULL(articulatedObject); @@ -59,6 +60,6 @@ namespace armarx::armem::articulated_object armarx::armem::articulated_object::ArticulatedObject armemArticulatedObject = convert(*articulatedObject, Time::Now()); - return store(armemArticulatedObject); + return store(armemArticulatedObject, isStatic); } } // namespace armarx::armem::articulated_object diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.h index ff39d70f049fa670e41157dbb79608b16d98b66c..edc401b6e0d55487f9446c1b5d0129cd623ea5c1 100644 --- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.h +++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/ArticulatedObjectWriter.h @@ -14,8 +14,8 @@ namespace armarx::armem::articulated_object public: using Writer::Writer; - bool - storeArticulatedObject(const VirtualRobot::RobotPtr& articulatedObject, - const armem::Time& timestamp); + bool storeArticulatedObject(const VirtualRobot::RobotPtr& articulatedObject, + const armem::Time& timestamp, + bool isStatic = false); }; } // namespace armarx::armem::articulated_object diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp index e0ce311486d06c5dc859422976f4c96aa9d037dc..ac40111242347fc16a1e3557c02206a18377f27b 100644 --- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp +++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp @@ -171,6 +171,7 @@ namespace armarx::armem::articulated_object if (providerName.has_value()) // query single provider { + ARMARX_VERBOSE << "Single provider query"; ARMARX_CHECK_NOT_EMPTY(providerName.value()); // clang-format off @@ -183,6 +184,8 @@ namespace armarx::armem::articulated_object } else // query all providers { + ARMARX_VERBOSE << "All provider query"; + // clang-format off qb .coreSegments().withName(objects::constants::CoreClassSegmentName) @@ -192,7 +195,9 @@ namespace armarx::armem::articulated_object // clang-format on } + ARMARX_VERBOSE << "Before query"; const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput()); + ARMARX_VERBOSE << "After query"; ARMARX_DEBUG << "Lookup result in reader: " << qResult; @@ -201,6 +206,8 @@ namespace armarx::armem::articulated_object return {}; } + ARMARX_TRACE; + ARMARX_VERBOSE << "getRobotDescriptions"; return getRobotDescriptions(qResult.memory); } @@ -380,20 +387,18 @@ namespace armarx::armem::articulated_object memory.getCoreSegment(objects::constants::CoreClassSegmentName); std::vector<robot_state::description::RobotDescription> descriptions; - coreSegment.forEachEntity( - [&descriptions](const wm::Entity& entity) + coreSegment.forEachInstance( + [&descriptions](const wm::EntityInstance& instance) { - if (not entity.empty()) + ARMARX_VERBOSE << "Converting ..."; + if (const auto robotDescription = convertRobotDescription(instance)) { - const auto robotDescription = - convertRobotDescription(entity.getFirstSnapshot().getInstance(0)); - if (robotDescription) - { - descriptions.push_back(*robotDescription); - } + descriptions.push_back(*robotDescription); } }); + ARMARX_VERBOSE << descriptions.size() << " descriptions"; + return descriptions; } diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp index d061c692e3399b07279a6cd5420c295396d34e38..f5ae8c13b383662411bc4d33399cc87ec3048a79 100644 --- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp +++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp @@ -15,11 +15,11 @@ #include <RobotAPI/libraries/armem/core/operations.h> #include <RobotAPI/libraries/armem_objects/aron/ObjectClass.aron.generated.h> #include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h> +#include <RobotAPI/libraries/armem_objects/client/articulated_object/aron_conversions.h> #include <RobotAPI/libraries/armem_robot_state/aron/Robot.aron.generated.h> #include <RobotAPI/libraries/armem_robot_state/aron/RobotDescription.aron.generated.h> #include <RobotAPI/libraries/armem_robot_state/aron_conversions.h> #include <RobotAPI/libraries/armem_robot_state/robot_conversions.h> -#include <RobotAPI/libraries/armem_objects/client/articulated_object/aron_conversions.h> #include "utils.h" @@ -191,7 +191,7 @@ namespace armarx::armem::articulated_object } bool - Writer::storeInstance(const ArticulatedObject& obj) const + Writer::storeInstance(const ArticulatedObject& obj, const bool isStatic) const { std::lock_guard g{memoryWriterMutex}; @@ -218,7 +218,7 @@ namespace armarx::armem::articulated_object arondto::ObjectInstance objectInstance; toAron(objectInstance, obj.config); - const auto classId = storeOrGetClass(obj); + const std::optional<armem::MemoryID> classId = storeOrGetClass(obj); if (not classId) { @@ -229,10 +229,17 @@ namespace armarx::armem::articulated_object // install memory link toAron(objectInstance.classID, *classId); + // set object instance id + const MemoryID memoryInstanceId = classId->withEntityName(entityName); + armem::MemoryID id; - id.setEntityID(classId->getEntityID()); + id.setEntityID(memoryInstanceId.getEntityID()); armarx::ObjectID objectId(id.entityName); + ARMARX_INFO << "Object ID: " << objectId; + + ARMARX_CHECK_NOT_EMPTY(objectId.instanceName()) + << "An object instance name must be provided!"; armarx::arondto::ObjectID cs; cs.className = objectId.className(); @@ -243,6 +250,8 @@ namespace armarx::armem::articulated_object objectInstance.pose.providerName = properties.providerName; objectInstance.pose.attachmentValid = false; + objectInstance.pose.isStatic = isStatic; + update.instancesData = {objectInstance.toAron()}; update.referencedTime = timestamp; @@ -260,7 +269,7 @@ namespace armarx::armem::articulated_object } bool - Writer::store(const ArticulatedObject& obj) const + Writer::store(const ArticulatedObject& obj, const bool isStatic) const { const std::optional<armem::MemoryID> classId = storeOrGetClass(obj); @@ -271,7 +280,7 @@ namespace armarx::armem::articulated_object return false; } - return storeInstance(obj); + return storeInstance(obj, isStatic); } // TODO this is a duplicate diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h index dcc49a2b2dc9e9e32a8edd06efa2026e0bb326c6..568bec35dad164f665cd41f9067d92b16693e380 100644 --- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h +++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.h @@ -45,9 +45,9 @@ namespace armarx::armem::articulated_object void connect(armem::client::MemoryNameSystem& memoryNameSystem); - bool store(const ArticulatedObject& obj) const override; + bool store(const ArticulatedObject& obj, bool isStatic) const override; - bool storeInstance(const ArticulatedObject& obj) const; + bool storeInstance(const ArticulatedObject& obj, bool isStatic) const; std::optional<armem::MemoryID> storeClass(const ArticulatedObject& obj) const; // const std::string& getPropertyPrefix() const override; diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h index 899cb1e79ac7ada7991e064b2a1ae1c20310749a..19043a9cc3d4c3409012d7111eee172edb4d579b 100644 --- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h +++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h @@ -30,7 +30,7 @@ namespace armarx::armem::articulated_object public: virtual ~WriterInterface() = default; - virtual bool store(const ArticulatedObject& obj) const = 0; + virtual bool store(const ArticulatedObject& obj, bool isStatic) const = 0; }; } // namespace armarx::armem::articulated_object diff --git a/source/RobotAPI/libraries/armem_objects/server/familiar_object_instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/familiar_object_instance/Segment.cpp index a141b97e4e8b9d4b169ff5b9118c330b71080d5a..fcb2a94487dc7034ce7a02c24478a35890e5ff77 100644 --- a/source/RobotAPI/libraries/armem_objects/server/familiar_object_instance/Segment.cpp +++ b/source/RobotAPI/libraries/armem_objects/server/familiar_object_instance/Segment.cpp @@ -1,6 +1,5 @@ #include "Segment.h" -#include <filesystem> #include <sstream> #include <sys/inotify.h> diff --git a/source/RobotAPI/libraries/armem_objects/server/familiar_object_instance/Visu.cpp b/source/RobotAPI/libraries/armem_objects/server/familiar_object_instance/Visu.cpp index 39604fa3dabac64b806d63001bcb2866e2b421ed..f7a8f7adb35f4eb54dbbb199c076e20f46e0625d 100644 --- a/source/RobotAPI/libraries/armem_objects/server/familiar_object_instance/Visu.cpp +++ b/source/RobotAPI/libraries/armem_objects/server/familiar_object_instance/Visu.cpp @@ -3,6 +3,7 @@ #include <Eigen/Geometry> #include <SimoxUtility/color/Color.h> +#include <SimoxUtility/color/cmaps/colormaps.h> #include <SimoxUtility/math/pose.h> #include <SimoxUtility/math/rescale.h> @@ -72,6 +73,9 @@ namespace armarx::armem::server::obj::familiar_object_instance auto layerPointCloud = arviz.layer("familiar_objects/points/" + providerName); auto layerBox = arviz.layer("familiar_objects/box/" + providerName); + auto confidenceCmap = simox::color::cmaps::viridis(); + confidenceCmap.set_vlimits(0, 1); + for (const auto& familiarObject : familiarObjects) { if (not isWithinTimeFrame(familiarObject)) @@ -120,7 +124,11 @@ namespace armarx::armem::server::obj::familiar_object_instance auto box = viz::Box(objectId.str()); box.pose(global_T_bb.matrix()); box.size(familiarObject.bounding_box.extents); - box.color(simox::Color::gray(128, alpha)); + + auto color = confidenceCmap.at(familiarObject.confidence); + color.a = alpha; + + box.color(color); layerBox.add(box); } } diff --git a/source/RobotAPI/libraries/obstacle_avoidance/CollisionModelHelper.cpp b/source/RobotAPI/libraries/obstacle_avoidance/CollisionModelHelper.cpp index 0f1f8047f3f47976a7ce52a928bac858d665b053..05a230a8e02ffab13ae9c2970a817889e56e2982 100644 --- a/source/RobotAPI/libraries/obstacle_avoidance/CollisionModelHelper.cpp +++ b/source/RobotAPI/libraries/obstacle_avoidance/CollisionModelHelper.cpp @@ -62,7 +62,7 @@ namespace armarx::obstacle_avoidance if (auto obstacle = finder.loadManipulationObject(objectPose)) { obstacle->setGlobalPose(objectPose.objectPoseGlobal); - obstacle->setName(objectPose.objectID.instanceName()); + obstacle->setName(objectPose.objectID.str()); sceneObjects->addSceneObject(obstacle); } } @@ -104,7 +104,6 @@ namespace armarx::obstacle_avoidance Eigen::Affine3f world_T_obj = world_T_map * map_T_obj; - // ARMARX_INFO << world_T_obj.translation(); auto cube = factory.createBox(boxSize, boxSize, boxSize); @@ -177,4 +176,4 @@ namespace armarx::obstacle_avoidance arviz.commitLayerContaining("CollisionModel", mesh); } -} // namespace armarx::obstacle_avoidance \ No newline at end of file +} // namespace armarx::obstacle_avoidance diff --git a/source/RobotAPI/libraries/skills/core/Skill.cpp b/source/RobotAPI/libraries/skills/core/Skill.cpp index 62fee239e4bf83fdfe6cb3d9a09428484280d4aa..cf6c57f98d8970194c2f362dcfa122bb19c183a0 100644 --- a/source/RobotAPI/libraries/skills/core/Skill.cpp +++ b/source/RobotAPI/libraries/skills/core/Skill.cpp @@ -1,5 +1,7 @@ #include "Skill.h" +#include <RobotAPI/libraries/skills/core/error/Exception.h> + namespace armarx { namespace skills diff --git a/source/RobotAPI/libraries/skills/core/Skill.h b/source/RobotAPI/libraries/skills/core/Skill.h index 9fffd35a6f258e778200351ef387ba9d3b184480..d9edf529c300968b4b428066836ba106a39e76e8 100644 --- a/source/RobotAPI/libraries/skills/core/Skill.h +++ b/source/RobotAPI/libraries/skills/core/Skill.h @@ -2,7 +2,6 @@ #include <functional> #include <mutex> -#include <queue> #include <thread> #include <ArmarXCore/core/logging/Logging.h> @@ -14,10 +13,8 @@ #include "SkillDescription.h" #include "SkillID.h" -#include "SkillPreparationInput.h" #include "SkillProxy.h" #include "SkillStatusUpdate.h" -#include "error/Exception.h" namespace armarx { diff --git a/source/RobotAPI/libraries/skills/core/SkillDescription.h b/source/RobotAPI/libraries/skills/core/SkillDescription.h index 784afd9321f4d677109c1f43672f0bdff4846db8..f65ba3f45e5da2c36c223c79797bb3b27ac52450 100644 --- a/source/RobotAPI/libraries/skills/core/SkillDescription.h +++ b/source/RobotAPI/libraries/skills/core/SkillDescription.h @@ -1,7 +1,6 @@ #pragma once #include <string> -#include <vector> #include <ArmarXCore/core/time/Duration.h> diff --git a/source/RobotAPI/libraries/skills/core/SkillID.h b/source/RobotAPI/libraries/skills/core/SkillID.h index 91494c78c331272e85babe5052ccd2369e29833e..8bf5eb0f34a4a73ef8255f1ac64e1222ca71692d 100644 --- a/source/RobotAPI/libraries/skills/core/SkillID.h +++ b/source/RobotAPI/libraries/skills/core/SkillID.h @@ -1,14 +1,12 @@ #pragma once #include <string> -#include <vector> #include <SimoxUtility/algorithm/string.h> #include <RobotAPI/interface/skills/SkillManagerInterface.h> #include "ProviderID.h" -#include "error/Exception.h" namespace armarx { diff --git a/source/RobotAPI/libraries/skills/core/SkillProxy.cpp b/source/RobotAPI/libraries/skills/core/SkillProxy.cpp index ea4fc4d1a0192d5ad4819be4248df3ea52566164..fb46cdc96d1e6581afd938a6e5cbd981e3ea9016 100644 --- a/source/RobotAPI/libraries/skills/core/SkillProxy.cpp +++ b/source/RobotAPI/libraries/skills/core/SkillProxy.cpp @@ -3,6 +3,8 @@ #include <chrono> #include <thread> +#include <RobotAPI/libraries/skills/core/error/Exception.h> + namespace armarx { namespace skills diff --git a/source/RobotAPI/libraries/skills/core/SkillStatusUpdate.cpp b/source/RobotAPI/libraries/skills/core/SkillStatusUpdate.cpp index 39220a32bc28269232f506d8368cb5394980b87b..8e5ade1866d4d71a389443c1b5ce1fc48485e9ea 100644 --- a/source/RobotAPI/libraries/skills/core/SkillStatusUpdate.cpp +++ b/source/RobotAPI/libraries/skills/core/SkillStatusUpdate.cpp @@ -1,5 +1,7 @@ #include "SkillStatusUpdate.h" +#include <RobotAPI/libraries/skills/core/error/Exception.h> + namespace armarx { namespace skills diff --git a/source/RobotAPI/libraries/skills/core/SkillStatusUpdate.h b/source/RobotAPI/libraries/skills/core/SkillStatusUpdate.h index ace31510a8a362ed45289c4facdd51c97ba22fbb..f6318d5c1993fd94d17a6a5e5e16086794d1f34d 100644 --- a/source/RobotAPI/libraries/skills/core/SkillStatusUpdate.h +++ b/source/RobotAPI/libraries/skills/core/SkillStatusUpdate.h @@ -1,8 +1,5 @@ #pragma once -#include <string> -#include <vector> - #include <ArmarXCore/core/time/DateTime.h> #include <ArmarXCore/core/time/ice_conversions.h> @@ -10,8 +7,6 @@ #include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h> #include "SkillExecutionID.h" -#include "SkillID.h" -#include "SkillParameterization.h" namespace armarx { diff --git a/source/RobotAPI/libraries/skills/core/error/Exception.h b/source/RobotAPI/libraries/skills/core/error/Exception.h index 9e01205b27e74eddc69fa8ff7c28d2646eafc9e2..d9107d8213b9d5d2b1e70f578ee7b376be0f102a 100644 --- a/source/RobotAPI/libraries/skills/core/error/Exception.h +++ b/source/RobotAPI/libraries/skills/core/error/Exception.h @@ -24,9 +24,7 @@ #pragma once // STD/STL -#include <map> #include <string> -#include <vector> // ArmarX #include <ArmarXCore/core/exceptions/Exception.h> diff --git a/source/RobotAPI/libraries/skills/provider/PeriodicSkill.cpp b/source/RobotAPI/libraries/skills/provider/PeriodicSkill.cpp index fa354d03d242c9e19b95a4a846309227503ae182..4b8a07d07238f87a2cea835ed33b75c0520d8639 100644 --- a/source/RobotAPI/libraries/skills/provider/PeriodicSkill.cpp +++ b/source/RobotAPI/libraries/skills/provider/PeriodicSkill.cpp @@ -27,6 +27,7 @@ #include <ArmarXCore/core/time/Metronome.h> #include "RobotAPI/libraries/skills/core/Skill.h" +#include <RobotAPI/libraries/skills/core/error/Exception.h> namespace armarx::skills { diff --git a/source/RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h b/source/RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h index 914c6da0221973624309a57666064669e05de14a..b707aee0d5224ab8588c4c95461ec22f5f300fa6 100644 --- a/source/RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h +++ b/source/RobotAPI/libraries/skills/provider/PeriodicSpecializedSkill.h @@ -24,6 +24,7 @@ #include <ArmarXCore/core/time/Frequency.h> #include <ArmarXCore/core/time/Metronome.h> +#include <RobotAPI/libraries/skills/core/error/Exception.h> #include <RobotAPI/libraries/skills/core/Skill.h> #include "PeriodicSkill.h" diff --git a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.cpp b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.cpp index 33a6475b3a9e2e01a30c40f4cee60e304a600b40..db3c05d511872e082bf4b2bb3a01a1293f7468af 100644 --- a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.cpp +++ b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSkill.cpp @@ -1,5 +1,7 @@ #include "SimplePeriodicSkill.h" +#include <RobotAPI/libraries/skills/core/error/Exception.h> + namespace armarx::skills { SimplePeriodicSkill::SimplePeriodicSkill(const SkillDescription& skillDescription, diff --git a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.h b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.h index ce3c968f587a7984fb606e8485297aa56ffff04a..c0f8b7ebd23df0d41429b2e9c7ddd3a7b0f66e94 100644 --- a/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.h +++ b/source/RobotAPI/libraries/skills/provider/SimplePeriodicSpecializedSkill.h @@ -1,5 +1,6 @@ #pragma once +#include <RobotAPI/libraries/skills/core/error/Exception.h> #include "PeriodicSkill.h" #include "SimpleSpecializedSkill.h" diff --git a/source/RobotAPI/libraries/skills/provider/SpecializedSkill.h b/source/RobotAPI/libraries/skills/provider/SpecializedSkill.h index 2fded9a0a50ede4cdc3e8d76861217fbc1127c58..fa3c43ce54eda2feacd0f88895ede30840c08e1f 100644 --- a/source/RobotAPI/libraries/skills/provider/SpecializedSkill.h +++ b/source/RobotAPI/libraries/skills/provider/SpecializedSkill.h @@ -3,47 +3,41 @@ #include <RobotAPI/libraries/aron/core/type/variant/container/Object.h> #include <RobotAPI/libraries/skills/core/Skill.h> -// Debug -#include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h> - -namespace armarx +namespace armarx::skills { - namespace skills + template <class AronT> + class SpecializedSkill : public Skill { - template <class AronT> - class SpecializedSkill : public Skill + public: + using Base = Skill; + using ParamType = AronT; + + using Skill::Skill; + virtual ~SpecializedSkill() = default; + + void + setParameters(const AronT& d) + { + Base::setParameters(d.toAron()); + } + + /// Overwrite getter for parameters. Shadow Skill::getParameters() + AronT + getParameters() const + { + AronT d; + d.fromAron(this->parameters); + return d; + } + + /// returns the accepted type of the skill + static armarx::aron::type::ObjectPtr + GetAcceptedType() { - public: - using Base = Skill; - using ParamType = AronT; - - using Skill::Skill; - virtual ~SpecializedSkill() = default; - - void - setParameters(const AronT& d) - { - Base::setParameters(d.toAron()); - } - - /// Overwrite getter for parameters. Shadow Skill::getParameters() - AronT - getParameters() const - { - AronT d; - d.fromAron(this->parameters); - return d; - } - - /// returns the accepted type of the skill - static armarx::aron::type::ObjectPtr - GetAcceptedType() - { - return AronT::ToAronType(); - } - - - protected: - }; - } // namespace skills -} // namespace armarx + return AronT::ToAronType(); + } + + + protected: + }; +} // namespace armarx::skills diff --git a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp index a244ae6593ec82b802dcbd930af07990ce3d4503..0e1515343b7cf9bf84daa949eb70d2035f35e751 100644 --- a/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp +++ b/source/RobotAPI/libraries/skills/provider/detail/SkillImplementationWrapper.cpp @@ -1,5 +1,6 @@ #include "SkillImplementationWrapper.h" #include <ArmarXCore/core/exceptions/LocalException.h> +#include <RobotAPI/libraries/skills/core/error/Exception.h> #include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h> #include <RobotAPI/libraries/skills/core/aron/SkillErrorResult.aron.generated.h>