40 return "ArMemToImageProvider";
49 defs->topic(debugObserver);
52 p.providerSegmentName,
"img.ProviderSegmentName",
"Name of the provider segment(s).");
53 defs->optional(p.resultImagesName,
54 "img.ResultImagesName",
55 "Name of the resulting (provided) images.\n"
56 "If '(auto)', the provider segment name is used.");
58 defs->defineOptionalPropertyVector(
59 "img.FallbackDimensions",
61 "Image dimensions to use when they cannot be fetched from memory.",
64 p.images.define(*defs);
73 getProperty(p.fallbackDims,
"img.FallbackDimensions");
74 if (p.resultImagesName ==
"(auto)")
76 p.resultImagesName = p.providerSegmentName;
78 p.images.read(*
this, p.providerSegmentName);
81 armemToImage.addImagesRGB(p.images.rgbEntityID, p.images.rgbIndices);
82 armemToImage.addImagesDepth(p.images.depthEntityID, p.images.depthIndices);
83 ARMARX_INFO <<
"Result image structure: \n" << armemToImage.summarizeStructure();
87 const std::vector<armarx::armem::MemoryID>& updatedSnapshotIDs)
88 { this->fetchUpdates(entityID, updatedSnapshotIDs); };
96 armemToImage.setDebugObserver(debugObserver,
getName());
100 armemToImage.memoryReader =
110 Eigen::Vector2i dimensions = p.fallbackDims;
112 armemToImage.fetchLatest();
113 if (armemToImage.updated)
115 dimensions = armemToImage.getImageDimensions();
116 ARMARX_VERBOSE <<
"Image formats: \n" << armemToImage.printFormats();
120 armemToImage.images.size(), {dimensions(0), dimensions(1)}, eRgb, p.resultImagesName);
126 if (resultImageProvider)
129 resultImageProvider =
nullptr;
150 ArMemToImageProvider::enableResultImages(
size_t numberImages,
151 ImageDimension imageDimension,
153 const std::string& name)
155 if (!resultImageProvider)
158 <<
" result images of size " << imageDimension.width <<
"x"
159 << imageDimension.height <<
".";
162 Component::create<LocalResultImageProvider>();
163 provider->setName(name);
164 provider->setNumberResultImages(
static_cast<int>(numberImages));
165 provider->setResultImageFormat(imageDimension, imageType);
171 catch (
const Ice::AlreadyRegisteredException& e)
174 <<
"' is already used. Please choose another one.\n"
175 <<
"Reason: " << e.what();
178 provider->getObjectScheduler()->waitForObjectState(
179 armarx::ManagedIceObjectState::eManagedIceObjectStarted);
182 this->resultImageProvider = provider;
187 ArMemToImageProvider::fetchUpdates(
188 const armarx::armem::MemoryID& entityID,
189 const std::vector<armarx::armem::MemoryID>& updatedSnapshotIDs)
191 std::scoped_lock lock(armemToImageMutex);
192 armemToImage.fetchUpdates(entityID, updatedSnapshotIDs);
194 if (resultImageProvider && armemToImage.updated)
196 std::vector<CByteImage> ivtImages;
197 std::vector<CByteImage*> ivtImagesBuffer;
198 ivtImages.reserve(armemToImage.images.size());
199 ivtImagesBuffer.reserve(armemToImage.images.size());
200 for (
auto& image : armemToImage.images)
202 CByteImage& ivt = ivtImages.emplace_back(image->toCByteImage());
203 ivtImagesBuffer.emplace_back(&ivt);
206 resultImageProvider->provideResultImages(
207 ivtImagesBuffer.data(), armemToImage.timestamp.toMicroSecondsSinceEpoch());
209 armemToImage.updated =
false;
213 debugObserver->setDebugChannel(
216 {
"Provide [us]",
new armarx::Variant(Provide.toMicroSecondsDouble())},
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.
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.
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