diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp index 38845b9383215d30c1457a9c1a1180ac86d4db73..d5a7b55c3712b8ed984a0ee33e5c4b061e30f888 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp +++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp @@ -126,11 +126,9 @@ namespace armarx } - void ObjectPoseObserver::reportProviderAvailable( - const std::string& providerName, const objpose::ObjectPoseProviderPrx& provider, const Ice::Current&) + void ObjectPoseObserver::reportProviderAvailable(const std::string& providerName, const objpose::ProviderInfo& info, const Ice::Current&) { - static const bool refresh = true; - fetchProviderInfo(providerName, provider, refresh); + updateProviderInfo(providerName, info); } void ObjectPoseObserver::reportObjectPoses( @@ -138,9 +136,6 @@ namespace armarx { ARMARX_VERBOSE << "Received object poses from '" << providerName << "'."; - // static const bool refresh = false; - // fetchProviderInfo(providerName, refresh); - objpose::ObjectPoseSeq objectPoses; { std::scoped_lock lock(dataMutex); @@ -180,24 +175,14 @@ namespace armarx } - void ObjectPoseObserver::fetchProviderInfo(const std::string& providerName, objpose::ObjectPoseProviderPrx provider, bool refresh) + void ObjectPoseObserver::updateProviderInfo(const std::string& providerName, const objpose::ProviderInfo& info) { - { - std::scoped_lock lock(dataMutex); - if (!refresh && providers.count(providerName) > 0) - { - return; // Do nothing. - } - } - - if (!provider) + if (!info.proxy) { ARMARX_WARNING << "Received availability signal from provider '" << providerName << "' " - << "with invalid provider proxy."; + << "with invalid provider proxy.\nIgnoring provider '" << providerName << "'."; return; } - objpose::ProviderInfo info = provider->getProviderInfo(); - { std::scoped_lock lock(dataMutex); if (providers.count(providerName) == 0) @@ -346,7 +331,7 @@ namespace armarx offerChannel(providerName, "Channel of provider '" + providerName + "'."); } offerOrUpdateDataField(providerName, "updateCounter", Variant(updateCounters.at(providerName)), "Counter incremented for each update."); - offerOrUpdateDataField(providerName, "candidateCount", Variant(int(objectPoses.at(providerName).size())), "Number of provided object poses."); + offerOrUpdateDataField(providerName, "objectCount", Variant(int(objectPoses.at(providerName).size())), "Number of provided object poses."); if (visu.enabled) { diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h index 23017441dedf37ce0602c248fea30ed2dde3ebaf..894bf651a7e63fe969e9ca65ef6c5cb65c4d9073 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h +++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h @@ -82,7 +82,7 @@ namespace armarx // ObjectPoseTopic interface public: - void reportProviderAvailable(const std::string& providerName, const objpose::ObjectPoseProviderPrx& provider, ICE_CURRENT_ARG) override; + void reportProviderAvailable(const std::string& providerName, const objpose::ProviderInfo& info, ICE_CURRENT_ARG) override; void reportObjectPoses(const std::string& providerName, const objpose::data::ProvidedObjectPoseSeq& objectPoses, ICE_CURRENT_ARG) override; // ObjectPoseObserverInterface interface @@ -120,7 +120,7 @@ namespace armarx private: - void fetchProviderInfo(const std::string& providerName, objpose::ObjectPoseProviderPrx provider, bool refresh = false); + void updateProviderInfo(const std::string& providerName, const objpose::ProviderInfo& info); void handleProviderUpdate(const std::string& providerName); void visProviderUpdate(const std::string& providerName); diff --git a/source/RobotAPI/components/ObjectPoseObserver/plugins/ObjectPoseProviderPlugin.cpp b/source/RobotAPI/components/ObjectPoseObserver/plugins/ObjectPoseProviderPlugin.cpp index 38b31297ea1344bc6b454fa74017b91d12d17730..3112560f38f72cbb9b7777631f894ac7d7249de5 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/plugins/ObjectPoseProviderPlugin.cpp +++ b/source/RobotAPI/components/ObjectPoseObserver/plugins/ObjectPoseProviderPlugin.cpp @@ -30,7 +30,12 @@ namespace armarx::plugins objpose::ObjectPoseTopicPrx& topic = parent.objectPoseTopic; if (topic) { - topic->reportProviderAvailable(parent.getName(), ::armarx::objpose::ObjectPoseProviderPrx::checkedCast(parent.getProxy())); + objpose::ProviderInfo info = parent.getProviderInfo(); + if (!info.proxy) + { + info.proxy = ::armarx::objpose::ObjectPoseProviderPrx::checkedCast(parent.getProxy()); + } + topic->reportProviderAvailable(parent.getName(), info); } else { diff --git a/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.cpp b/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.cpp index e29c39a9e006c7279c86e4478440cbac99487ec2..4fba5d59663d3ec1b1fd569309938dce94746763 100644 --- a/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.cpp +++ b/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.cpp @@ -54,25 +54,6 @@ namespace armarx return "ObjectPoseProviderExample"; } - objpose::ProviderInfo ObjectPoseProviderExample::getProviderInfo(const Ice::Current&) - { - objpose::ProviderInfo info; - info.objectType = objpose::ObjectTypeEnum::KnownObject; - std::vector<ObjectInfo> objects = objectFinder.findAllObjectsOfDataset("KIT"); - for (const auto& obj : objects) - { - info.supportedObjects.push_back(objpose::ObjectID{obj.id().dataset(), obj.id().className(), obj.id().instanceName()}); - } - return info; - } - - void ObjectPoseProviderExample::requestObjects( - const objpose::ObjectIDSeq& objectIDs, Ice::Long relativeTimeoutMS, const Ice::Current&) - { - std::scoped_lock lock(requestedObjectsMutex); - requestedObjects.requestObjects(objectIDs, relativeTimeoutMS); - } - void ObjectPoseProviderExample::onInitComponent() { @@ -81,6 +62,15 @@ namespace armarx // -1 -> infinitely requestedObjects.requestObjects({ObjectID(initial)}, -1); } + + { + providerInfo.objectType = objpose::ObjectTypeEnum::KnownObject; + std::vector<ObjectInfo> objects = objectFinder.findAllObjectsOfDataset("KIT"); + for (const auto& obj : objects) + { + providerInfo.supportedObjects.push_back(objpose::ObjectID{obj.id().dataset(), obj.id().className(), obj.id().instanceName()}); + } + } } @@ -102,6 +92,20 @@ namespace armarx { } + + objpose::ProviderInfo ObjectPoseProviderExample::getProviderInfo(const Ice::Current&) + { + return providerInfo; + } + + void ObjectPoseProviderExample::requestObjects( + const objpose::ObjectIDSeq& objectIDs, Ice::Long relativeTimeoutMS, const Ice::Current&) + { + std::scoped_lock lock(requestedObjectsMutex); + requestedObjects.requestObjects(objectIDs, relativeTimeoutMS); + } + + void ObjectPoseProviderExample::poseEstimationTaskRun() { CycleUtil cycle(50); diff --git a/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.h b/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.h index 0d1cf3ad35a4f45cd0fbb05d3c4a600a2394903f..46fc68b8e503ecdfb906fbe419b0b8e363f57cb0 100644 --- a/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.h +++ b/source/RobotAPI/components/ObjectPoseProviderExample/ObjectPoseProviderExample.h @@ -107,11 +107,15 @@ namespace armarx private: + // To be moved to plugin std::mutex requestedObjectsMutex; objpose::RequestedObjects requestedObjects; - std::vector<std::string> initialObjectIDs = { "KIT/Amicelli", "KIT/YellowSaltCylinder" }; + + objpose::ProviderInfo providerInfo; + armarx::ObjectFinder objectFinder; + std::vector<std::string> initialObjectIDs = { "KIT/Amicelli", "KIT/YellowSaltCylinder" }; armarx::SimpleRunningTask<>::pointer_type poseEstimationTask; diff --git a/source/RobotAPI/interface/objectpose/ObjectPoseProvider.ice b/source/RobotAPI/interface/objectpose/ObjectPoseProvider.ice index 63a309c9305f2c0d945b76334f15577f9e4020ca..b3b47492743eaa13a9f0a4ca7b5121a07de92c66 100644 --- a/source/RobotAPI/interface/objectpose/ObjectPoseProvider.ice +++ b/source/RobotAPI/interface/objectpose/ObjectPoseProvider.ice @@ -33,8 +33,10 @@ module armarx // A struct's name cannot cannot differ only in capitalization from its immediately enclosing module name. module objpose { + interface ObjectPoseProvider; struct ProviderInfo { + ObjectPoseProvider* proxy; ObjectTypeEnum objectType = AnyObject; ObjectIDSeq supportedObjects; }; @@ -51,8 +53,8 @@ module armarx interface ObjectPoseTopic { - /// Signal that a new provider is now available (and ready for `getProviderInfo()`. - void reportProviderAvailable(string providerName, ObjectPoseProvider* provider); + /// Signal that a new provider is now available. + void reportProviderAvailable(string providerName, ProviderInfo info); void reportObjectPoses(string providerName, data::ProvidedObjectPoseSeq candidates); }; };