diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp index abc0ec1516ec54fa890541862771078b9e5164be..40a529a910c6622055880b2ada42d632ace774fb 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp +++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp @@ -528,22 +528,21 @@ namespace armarx { TIMING_START(Visu); - std::map<std::string, objpose::ObjectPoseSeq> objectPoses; + objpose::ObjectPoseSeq objectPoses; ObjectFinder objectFinder; - float minConfidence = -1; + visu.minConfidence = -1; { std::scoped_lock lock(dataMutex); const IceUtil::Time now = TimeUtil::GetTime(); - data.updateObjectPoses(now); - objectPoses = data.getStoredObjectPoses(); + objectPoses = data.getObjectPoses(now); objectFinder = data.objectFinder; if (data.decay.enabled) { - minConfidence = data.decay.removeObjectsBelowConfidence; + visu.minConfidence = data.decay.removeObjectsBelowConfidence; } } - const std::vector<viz::Layer> layers = visu.visualizeCommit(objectPoses, minConfidence, objectFinder); + const std::vector<viz::Layer> layers = visu.visualizeCommit(objectPoses, objectFinder); arviz.commit(layers); TIMING_END_STREAM(Visu, ARMARX_VERBOSE); diff --git a/source/RobotAPI/components/ObjectPoseObserver/detail/Data.cpp b/source/RobotAPI/components/ObjectPoseObserver/detail/Data.cpp index e5745f0c48ec74561bc2d2dcd10252a3670d4a4b..96c5afad46d8fb8edf959bd5c7c1178f4ad956ed 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/detail/Data.cpp +++ b/source/RobotAPI/components/ObjectPoseObserver/detail/Data.cpp @@ -41,21 +41,16 @@ namespace armarx::objpose::observer ObjectPoseSeq Data::getObjectPoses(IceUtil::Time now) { - bool synchronized = false; - ObjectPoseSeq result; + bool agentSynchronized = false; + ObjectPoseSeq latestObjectPoses = getLatestObjectPoses(); - for (auto& [providerName, objectPoses] : objectPoses) + ObjectPoseSeq result; + for (ObjectPose& objectPose : latestObjectPoses) { - // Update data. - updateObjectPoses(objectPoses, now, robot, synchronized); - - // Collect results. - for (const ObjectPose& objectPose : objectPoses) + updateObjectPose(objectPose, now, robot, agentSynchronized); + if (!(decay.enabled && objectPose.confidence < decay.removeObjectsBelowConfidence)) { - if (!(decay.enabled && objectPose.confidence < decay.removeObjectsBelowConfidence)) - { - result.push_back(objectPose); - } + result.push_back(objectPose); } } return result; @@ -138,15 +133,6 @@ namespace armarx::objpose::observer } - void Data::updateObjectPoses(IceUtil::Time now) - { - bool synchronized = false; - for (auto& [providerName, objectPoses] : objectPoses) - { - updateObjectPoses(objectPoses, now, robot, synchronized); - } - } - void Data::updateObjectPoses( ObjectPoseSeq& objectPoses, @@ -204,6 +190,33 @@ namespace armarx::objpose::observer objectPose.updateAttached(agent); } + ObjectPoseSeq Data::getLatestObjectPoses() const + { + ARMARX_CHECK_NOT_NULL(coreSegment); + + ObjectPoseSeq result; + + for (const auto& [_, provSegment] : *coreSegment) + { + for (const auto& [_, entity] : provSegment) + { + if (!entity.empty()) + { + for (const armem::EntityInstance& instance : entity.getLatestSnapshot()) + { + arondto::ObjectPose dto; + dto.fromAron(instance.data()); + + ObjectPose& pose = result.emplace_back(); + fromAron(dto, pose); + } + } + } + } + + return result; + } + ObjectPose* Data::findObjectPose(const ObjectID& objectID, const std::string& providerName) { diff --git a/source/RobotAPI/components/ObjectPoseObserver/detail/Data.h b/source/RobotAPI/components/ObjectPoseObserver/detail/Data.h index 938dcf601ca908e0dbe81059c15d7269c70b51e6..f538cc284f788ab76a86a03f99d4c725f53dc201 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/detail/Data.h +++ b/source/RobotAPI/components/ObjectPoseObserver/detail/Data.h @@ -69,7 +69,6 @@ namespace armarx::objpose::observer void setObjectPoses(const std::string& providerName, const ObjectPoseSeq& objectPoses); - void updateObjectPoses(IceUtil::Time now); void updateObjectPoses( ObjectPoseSeq& objectPoses, IceUtil::Time now, @@ -96,6 +95,10 @@ namespace armarx::objpose::observer void updateAttachement(ObjectPose& objectPose, VirtualRobot::RobotPtr agent, bool& synchronized) const; + private: + + ObjectPoseSeq getLatestObjectPoses() const; + public: @@ -115,7 +118,6 @@ namespace armarx::objpose::observer /// Decay model. Decay decay; - private: diff --git a/source/RobotAPI/components/ObjectPoseObserver/detail/Visu.cpp b/source/RobotAPI/components/ObjectPoseObserver/detail/Visu.cpp index 467dba24f947b38c02b47044986cf3086775b6a1..11f8a3ebbda0911471d02e721f71f472e0b44c47 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/detail/Visu.cpp +++ b/source/RobotAPI/components/ObjectPoseObserver/detail/Visu.cpp @@ -31,31 +31,49 @@ namespace armarx::objpose::observer std::vector<viz::Layer> Visu::visualizeCommit( const std::map<std::string, ObjectPoseSeq>& objectPoses, - float minConfidence, const ObjectFinder& objectFinder) const { std::vector<viz::Layer> layers; for (const auto& [name, poses] : objectPoses) { - layers.push_back(visualizeProvider(name, poses, minConfidence, objectFinder)); + layers.push_back(visualizeProvider(name, poses, objectFinder)); } return layers; } + std::vector<viz::Layer> Visu::visualizeCommit( + const ObjectPoseSeq& objectPoses, + const ObjectFinder& objectFinder) const + { + std::map<std::string, viz::Layer> layers; + + auto getLayer = [this, &layers](const std::string & providerName) -> viz::Layer & + { + auto it = layers.find(providerName); + if (it == layers.end()) + { + it = layers.emplace(providerName, arviz.layer(providerName)).first; + } + return it->second; + }; + + for (const ObjectPose& objectPose : objectPoses) + { + visualizeObjectPose(getLayer(objectPose.providerName), objectPose, objectFinder); + } + + return simox::alg::get_values(layers); + } + viz::Layer Visu::visualizeProvider( const std::string& providerName, const ObjectPoseSeq& objectPoses, - float minConfidence, const ObjectFinder& objectFinder) const { viz::Layer layer = arviz.layer(providerName); for (const ObjectPose& objectPose : objectPoses) { - const bool show = not(objectPose.confidence < minConfidence); - if (show) - { - visualizeObjectPose(layer, objectPose, objectFinder); - } + visualizeObjectPose(layer, objectPose, objectFinder); } return layer; } @@ -65,6 +83,11 @@ namespace armarx::objpose::observer const ObjectPose& objectPose, const ObjectFinder& objectFinder) const { + const bool show = not(objectPose.confidence < minConfidence); + if (!show) + { + return; + } const armarx::ObjectID id = objectPose.objectID; const std::string key = id.str(); diff --git a/source/RobotAPI/components/ObjectPoseObserver/detail/Visu.h b/source/RobotAPI/components/ObjectPoseObserver/detail/Visu.h index 9677f6198adcd9f52918061925876860640ba999..fcdfd4f240a903dc505bd7eb3732c6242838e0e4 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/detail/Visu.h +++ b/source/RobotAPI/components/ObjectPoseObserver/detail/Visu.h @@ -29,17 +29,22 @@ namespace armarx::objpose::observer std::vector<viz::Layer> visualizeCommit( const std::map<std::string, ObjectPoseSeq>& objectPoses, - float minConfidence, + const ObjectFinder& objectFinder + ) const; + + /// Visualize the given object poses, with one layer per provider. + std::vector<viz::Layer> visualizeCommit( + const ObjectPoseSeq& objectPoses, const ObjectFinder& objectFinder ) const; viz::Layer visualizeProvider( const std::string& providerName, const ObjectPoseSeq& objectPoses, - float minConfidence, const ObjectFinder& objectFinder ) const; + void visualizeObjectPose( viz::Layer& layer, const ObjectPose& objectPose, @@ -55,6 +60,7 @@ namespace armarx::objpose::observer float frequencyHz = 25; bool inGlobalFrame = true; + float minConfidence = -1; float alpha = 1.0; bool alphaByConfidence = false; bool oobbs = false; diff --git a/source/RobotAPI/libraries/ArmarXObjects/ObjectPose.h b/source/RobotAPI/libraries/ArmarXObjects/ObjectPose.h index 36379f97d0d3d047058dbb9a9d57e9517a0caa71..d5c3d55167c4e1f70654b0a8e4a8990a40c4a35b 100644 --- a/source/RobotAPI/libraries/ArmarXObjects/ObjectPose.h +++ b/source/RobotAPI/libraries/ArmarXObjects/ObjectPose.h @@ -20,7 +20,7 @@ namespace armarx::objpose { std::string frameName; std::string agentName; - Eigen::Matrix4f poseInFrame; + Eigen::Matrix4f poseInFrame = Eigen::Matrix4f::Identity(); };