29#include <pcl/common/transforms.h>
31#include <VirtualRobot/MathTools.h>
40#include <Calibration/Calibration.h>
41#include <Calibration/StereoCalibration.h>
42#include <Image/ImageProcessor.h>
43#include <rc_genicam_api/buffer.h>
44#include <rc_genicam_api/config.h>
45#include <rc_genicam_api/image.h>
46#include <rc_genicam_api/interface.h>
47#include <rc_genicam_api/pixel_formats.h>
48#include <rc_genicam_api/system.h>
56 using Point = pcl::PointXYZRGBA;
62 rcg_getColor(uint8_t rgb[3],
63 const std::shared_ptr<const rcg::Image>& img,
71 if (img->getPixelFormat() == Mono8)
73 size_t lstep = img->getWidth() + img->getXPadding();
74 const uint8_t* p = img->getPixels() + k * lstep + i;
76 uint32_t g = 0, n = 0;
78 for (uint32_t kk = 0; kk < ds; kk++)
80 for (uint32_t ii = 0; ii < ds; ii++)
89 rgb[2] = rgb[1] = rgb[0] =
static_cast<uint8_t
>(g / n);
91 else if (img->getPixelFormat() == YCbCr411_8)
93 size_t lstep = (img->getWidth() >> 2) * 6 + img->getXPadding();
94 const uint8_t* p = img->getPixels() + k * lstep;
101 for (uint32_t kk = 0; kk < ds; kk++)
103 for (uint32_t ii = 0; ii < ds; ii++)
106 rcg::convYCbCr411toRGB(v, p,
static_cast<int>(i + ii));
117 rgb[0] =
static_cast<uint8_t
>(r / n);
118 rgb[1] =
static_cast<uint8_t
>(g / n);
119 rgb[2] =
static_cast<uint8_t
>(b / n);
125 storePointCloud(
double f,
128 std::shared_ptr<const rcg::Image> intensityCombined,
129 std::shared_ptr<const rcg::Image> disp,
135 size_t width = disp->getWidth();
136 size_t height = disp->getHeight();
137 bool bigendian = disp->isBigEndian();
138 size_t leftWidth = intensityCombined->getWidth();
139 size_t ds = (leftWidth + disp->getWidth() - 1) / disp->getWidth();
147 const uint8_t* dps = disp->getPixels();
148 size_t dstep = disp->getWidth() *
sizeof(uint16_t) + disp->getXPadding();
153 for (
size_t k = 0; k < height; k++)
156 for (
size_t i = 0; i < width; i++)
158 if ((dps[j] | dps[j + 1]) != 0)
168 dps = disp->getPixels();
171 outPoints->
reserve(height * width);
175 for (
size_t k = 0; k < height; k++)
177 for (
size_t i = 0; i < width; i++)
185 d = scale * ((dps[j] << 8) | dps[j + 1]);
190 d = scale * ((dps[j + 1] << 8) | dps[j]);
199 double x = (i + 0.5 - 0.5 * width) * t / d;
200 double y = (k + 0.5 - 0.5 * height) * t / d;
201 double z = f * t / d;
210 uint8_t rgb[3] = {0, 0, 0};
214 static_cast<uint32_t
>(ds),
215 static_cast<uint32_t
>(i),
216 static_cast<uint32_t
>(k));
220 const double meterToMillimeter = 1000.0f;
221 point.x = x * meterToMillimeter;
222 point.y = y * meterToMillimeter;
223 point.z = z * meterToMillimeter;
300 if (rcg::setEnum(
nodemap,
"PixelFormat",
"YCbCr411_8",
false))
310 "/tmp/armar6_rc_point_cloud_calibration.txt");
317 catch (std::invalid_argument& e)
320 ARMARX_WARNING <<
"Selected DepthImageResolution '" << depthQuality.c_str()
321 <<
"' is currently not available for this device. "
326 <<
" (out of Low, Medium, High, Full)";
333 scan3dCoordinateScale =
334 rcg::getFloat(
nodemap,
"Scan3dCoordinateScale",
nullptr,
nullptr,
true);
362 const rcg::Buffer* buffer =
stream->grab(10000);
371 if (buffer->getIsIncomplete() || !buffer->getImagePresent(0))
379 uint64_t pixelformat = buffer->getPixelFormat(0);
380 if (pixelformat == Mono8 || pixelformat == YCbCr411_8)
382 intensityBuffer.add(buffer, 0);
384 else if (pixelformat == Coord3D_C16)
386 disparityBuffer.add(buffer, 0);
395 uint64_t
timestamp = buffer->getTimestampNS();
397 std::shared_ptr<const rcg::Image> intensityCombined = intensityBuffer.find(
timestamp);
398 std::shared_ptr<const rcg::Image> disparity = disparityBuffer.find(
timestamp);
400 if (!intensityCombined || !disparity)
412 scan3dCoordinateScale,
424 int width = imageFormat.dimension.width;
425 int height = imageFormat.dimension.height;
433 const uint8_t* p = intensityCombined->getPixels();
435 size_t px = intensityCombined->getXPadding();
436 uint64_t format = intensityCombined->getPixelFormat();
468 PointCloud::Ptr transformedPointCloud(
new PointCloud());
469 const auto& tr = getFinalCloudTransform();
471 pcl::transformPointCloud(*pointCloud, *transformedPointCloud, tr);
492 throw std::runtime_error(
"Not yet implemented");
515 "Frames per second, actual framerate is equal to min(this "
516 "framerate, framerate provided by the device)")
517 .setMatchRegex(
"\\d+(.\\d*)?")
522 "DepthImageResolution",
524 "Resolution of the depth image. "
525 "The higher the resolution, the lower the framerate provided by the device")
526 .setCaseInsensitive(
true)
533 "ReferenceFrameName",
"Roboception_LeftCamera",
"Optional reference frame name.");
546 armarx::RemoteGui::WidgetPtr
547 RCPointCloudProvider::buildGui()
560 .
addChild(
new armarx::RemoteGui::HSpacer)
566 .
addChild(
new armarx::RemoteGui::HSpacer)
572 .
addChild(
new armarx::RemoteGui::HSpacer);
579 updateFinalCloudTransform(prx.
getValue<
float>(
"sx").get(),
591 RCPointCloudProvider::updateFinalCloudTransform(
float sx,
601 finalCloudTransform.getWriteBuffer()(0) = sx;
602 finalCloudTransform.getWriteBuffer()(1) = sy;
603 finalCloudTransform.getWriteBuffer()(2) = sz;
605 finalCloudTransform.getWriteBuffer()(3) = rx;
606 finalCloudTransform.getWriteBuffer()(4) = ry;
607 finalCloudTransform.getWriteBuffer()(5) = rz;
609 finalCloudTransform.getWriteBuffer()(6) = tx;
610 finalCloudTransform.getWriteBuffer()(7) = ty;
611 finalCloudTransform.getWriteBuffer()(8) = tz;
613 finalCloudTransform.commitWrite();
617 RCPointCloudProvider::getFinalCloudTransform()
619 const auto& srt = finalCloudTransform.getUpToDateReadBuffer();
620 return VirtualRobot::MathTools::posrpy2eigen4f(
621 srt(6), srt(7), srt(8), srt(4), srt(5), srt(6)) *
622 Eigen::Vector4f{srt(0), srt(1), srt(2), 1.f}.asDiagonal();
628 return "RCPointCloudProvider";
#define ARMARX_REGISTER_COMPONENT_EXECUTABLE(ComponentT, applicationName)
void push_back(const T &v)
void reserve(size_type s)
ComponentPropertyDefinitions(std::string prefix, bool hasObjectNameParameter=true)
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Property< PropertyType > getProperty(const std::string &name)
SpamFilterDataPtr deactivateSpam(float deactivationDurationSec=10.0f, const std::string &identifier="", bool deactivate=true) const
disables the logging for the current line for the given amount of seconds.
virtual void onExitComponent()
Hook for subclass.
virtual void onDisconnectComponent()
Hook for subclass.
virtual void onConnectComponent()=0
Pure virtual hook for the subclass.
virtual void onInitComponent()=0
Pure virtual hook for the subclass.
ArmarXManagerPtr getArmarXManager() const
Returns the ArmarX manager used to add and remove components.
std::string prefix
Prefix of the properties such as namespace, domain, component name, etc.
PropertyDefinition< PropertyType > & defineOptionalProperty(const std::string &name, PropertyType defaultValue, const std::string &description="", PropertyDefinitionBase::PropertyConstness constness=PropertyDefinitionBase::eConstant)
void createOrUpdateRemoteGuiTab(Ts &&... ts)
ValueProxy< T > getValue(std::string const &name)
float frameRate
Required frame rate.
void setPointCloudSyncMode(ImageSyncMode pointCloudSyncMode)
Sets the point cloud synchronization mode.
void onInitComponent() override
void onDisconnectComponent() override
Hook for subclass.
void updateTimestamp(Ice::Long timestamp, bool threadSafe=true)
Updates the timestamp of the currently captured image.
ImageFormatInfo getImageFormat(const Ice::Current &c=Ice::emptyCurrent) override
Returns the entire image format info struct via Ice.
void setImageFormat(ImageDimension imageDimension, ImageType imageType, BayerPatternType bayerPatternType=visionx::eBayerPatternRg)
Sets the image basic format data.
void provideImages(void **inputBuffers, const IceUtil::Time &imageTimestamp=IceUtil::Time())
send images raw.
void onConnectComponent() override
void setNumberImages(int numberImages)
Sets the number of images on each capture.
void onExitComponent() override
void providePointCloud(PointCloudPtrT pointCloudPtr)
offer the new point cloud.
RCPointCloudProviderPropertyDefinitions(std::string prefix)
Brief description of class RCPointCloudProvider.
void onInitComponent() override
bool doCapture() override
Main capturing function.
void onExitCapturingPointCloudProvider() override
This is called when the Component::onExitComponent() setup is called.
void onDisconnectComponent() override
Hook for subclass.
void onStartCapture(float frameRate) override
This is called when the point cloud provider capturing has been started.
armarx::PropertyDefinitionsPtr createPropertyDefinitions() override
void onInitCapturingPointCloudProvider() override
This is called when the Component::onInitComponent() is called.
void onConnectComponent() override
void onStopCapture() override
This is called when the point cloud provider capturing has been stopped.
static std::string GetDefaultName()
void onInitImageProvider() override
This is called when the Component::onInitComponent() is called.
void onExitComponent() override
void onExitImageProvider() override
This is called when the Component::onExitComponent() setup is called.
void startCaptureForNumFrames(Ice::Int, const Ice::Current &) override
CByteImage ** cameraImages
void enableDisparity(bool enabled)
void enableError(bool enabled)
void enableIntensityCombined(bool enabled)
std::shared_ptr< GenApi::CNodeMapRef > nodemap
bool initDevice(const std::string &dname)
void enableConfidence(bool enabled)
CByteImage ** smallImages
void enableIntensity(bool enabled)
void setupStreamAndCalibration(float scalefactor, const std::string &calibSavePath)
visionx::ImageDimension dimensions
static void fillCameraImageRGB(unsigned char *outputPixels, size_t nImage, const uint8_t *inputPixels, size_t width, size_t height, uint64_t pixelFormat, size_t xpadding)
#define ARMARX_INFO
The normal logging level.
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
detail::FloatSpinBoxBuilder makeFloatSpinBox(std::string const &name)
detail::SimpleGridLayoutBuilder makeSimpleGridLayout(std::string const &name="")
This file offers overloads of toIce() and fromIce() functions for STL container types.
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
const char *const GC_DEPTH_QUALITY_HIGH
const char *const GC_COMPONENT_SELECTOR
const std::map< std::string, float > DepthQualityToFPS
const char *const GC_DEPTH_QUALITY_LOW
const char *const GC_DEPTH_QUALITY_MEDIUM
const char *const GC_DEPTH_QUALITY
const char *const GC_DEPTH_QUALITY_FULL
pcl::PointCloud< Point > PointCloud
SimpleGridLayoutBuilder & addTextLabel(std::string const &text, int colspan)
SimpleGridLayoutBuilder & cols(int n)
SimpleGridLayoutBuilder & addChild(WidgetPtr const &child, int colspan)