42 return "ArMemToImageProvider";
57 defs->topic(debugObserver);
60 p.providerSegmentName,
"img.ProviderSegmentName",
"Name of the provider segment(s).");
61 defs->optional(p.resultImagesName,
62 "img.ResultImagesName",
63 "Name of the resulting (provided) images.\n"
64 "If '(auto)', the provider segment name is used.");
66 defs->defineOptionalPropertyVector(
67 "img.FallbackDimensions",
69 "Image dimensions to use when they cannot be fetched from memory.",
72 p.images.define(*defs);
81 getProperty(p.fallbackDims,
"img.FallbackDimensions");
82 if (p.resultImagesName ==
"(auto)")
84 p.resultImagesName = p.providerSegmentName;
86 p.images.read(*
this, p.providerSegmentName);
89 armemToImage.addImagesRGB(p.images.rgbEntityID, p.images.rgbIndices);
90 armemToImage.addImagesDepth(p.images.depthEntityID, p.images.depthIndices);
91 ARMARX_INFO <<
"Result image structure: \n" << armemToImage.summarizeStructure();
95 const std::vector<armarx::armem::MemoryID>& updatedSnapshotIDs)
96 { this->fetchUpdates(entityID, updatedSnapshotIDs); };
104 armemToImage.setDebugObserver(debugObserver,
getName());
108 armemToImage.memoryReader =
118 Eigen::Vector2i dimensions = p.fallbackDims;
120 armemToImage.fetchLatest();
121 if (armemToImage.updated)
123 dimensions = armemToImage.getImageDimensions();
124 ARMARX_VERBOSE <<
"Image formats: \n" << armemToImage.printFormats();
128 armemToImage.images.size(), {dimensions(0), dimensions(1)}, eRgb, p.resultImagesName);
134 if (resultImageProvider)
137 resultImageProvider =
nullptr;
158 ArMemToImageProvider::enableResultImages(
size_t numberImages,
159 ImageDimension imageDimension,
161 const std::string& name)
163 if (!resultImageProvider)
166 <<
" result images of size " << imageDimension.width <<
"x"
167 << imageDimension.height <<
".";
170 Component::create<LocalResultImageProvider>();
171 provider->setName(name);
172 provider->setNumberResultImages(
static_cast<int>(numberImages));
173 provider->setResultImageFormat(imageDimension, imageType);
179 catch (
const Ice::AlreadyRegisteredException& e)
182 <<
"' is already used. Please choose another one.\n"
183 <<
"Reason: " << e.what();
186 provider->getObjectScheduler()->waitForObjectState(
187 armarx::ManagedIceObjectState::eManagedIceObjectStarted);
190 this->resultImageProvider = provider;
195 ArMemToImageProvider::fetchUpdates(
196 const armarx::armem::MemoryID& entityID,
197 const std::vector<armarx::armem::MemoryID>& updatedSnapshotIDs)
199 std::scoped_lock lock(armemToImageMutex);
200 armemToImage.fetchUpdates(entityID, updatedSnapshotIDs);
202 if (resultImageProvider && armemToImage.updated)
204 std::vector<CByteImage> ivtImages;
205 std::vector<CByteImage*> ivtImagesBuffer;
206 ivtImages.reserve(armemToImage.images.size());
207 ivtImagesBuffer.reserve(armemToImage.images.size());
208 for (
auto& image : armemToImage.images)
210 CByteImage& ivt = ivtImages.emplace_back(image->toCByteImage());
211 ivtImagesBuffer.emplace_back(&ivt);
214 resultImageProvider->provideResultImages(
215 ivtImagesBuffer.data(), armemToImage.timestamp.toMicroSecondsSinceEpoch());
217 armemToImage.updated =
false;
221 debugObserver->setDebugChannel(
224 {
"Provide [us]",
new armarx::Variant(Provide.toMicroSecondsDouble())},
#define ARMARX_REGISTER_COMPONENT_EXECUTABLE(ComponentT, applicationName)
Default component property definition container.
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Property< PropertyType > getProperty(const std::string &name)
std::string getName() const
Retrieve name of object.
ArmarXManagerPtr getArmarXManager() const
Returns the ArmarX manager used to add and remove components.
Reader useReader(const MemoryID &memoryID)
Use a memory server and get a reader for it.
MemoryNameSystem & memoryNameSystem()
SubscriptionHandle subscribe(const MemoryID &subscriptionID, Callback Callback)
Indicates that a query to the Memory Name System failed.
Brief description of class ArMemToImageProvider.
void onInitComponent() override
Pure virtual hook for the subclass.
void onDisconnectComponent() override
Hook for subclass.
armarx::PropertyDefinitionsPtr createPropertyDefinitions() override
void onConnectComponent() override
Pure virtual hook for the subclass.
static std::string GetDefaultName()
void onExitComponent() override
Hook for subclass.
std::string getDefaultName() const override
Retrieve default name of component.
#define ARMARX_INFO
The normal logging level.
#define ARMARX_ERROR
The logging level for unexpected behaviour, that must be fixed.
#define ARMARX_VERBOSE
The logging level for verbose information.
#define TIMING_START(name)
Helper macro to do timing tests.
#define TIMING_END_STREAM(name, os)
Prints duration.
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
virtual ~LocalResultImageProvider() override
friend ArMemToImageProvider