RCPointCloudProvider.cpp
Go to the documentation of this file.
1/*
2 * This file is part of ArmarX.
3 *
4 * ArmarX is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 *
8 * ArmarX is distributed in the hope that it will be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 *
16 * @package VisionX::ArmarXObjects::RCPointCloudProvider
17 * @author Markus Grotz ( markus dot grotz at kit dot edu )
18 * @date 2017
19 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20 * GNU General Public License
21 */
22
24
26
27#include <stdlib.h>
28
29#include <pcl/common/transforms.h>
30
31#include <VirtualRobot/MathTools.h>
32
34
36
39
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>
49
50
51using namespace visionx;
52
53namespace visionx
54{
55
56 using Point = pcl::PointXYZRGBA;
57 using PointCloud = pcl::PointCloud<Point>;
58
59 // Our installed version is missing the getColor method
60 // From: https://github.com/roboception/rc_genicam_api/blob/f7f1621fc3ac5d638292e3d5d1ea9393959ecd9d/rc_genicam_api/image.cc
61 static void
62 rcg_getColor(uint8_t rgb[3],
63 const std::shared_ptr<const rcg::Image>& img,
64 uint32_t ds,
65 uint32_t i,
66 uint32_t k)
67 {
68 i *= ds;
69 k *= ds;
70
71 if (img->getPixelFormat() == Mono8) // convert from monochrome
72 {
73 size_t lstep = img->getWidth() + img->getXPadding();
74 const uint8_t* p = img->getPixels() + k * lstep + i;
75
76 uint32_t g = 0, n = 0;
77
78 for (uint32_t kk = 0; kk < ds; kk++)
79 {
80 for (uint32_t ii = 0; ii < ds; ii++)
81 {
82 g += p[ii];
83 n++;
84 }
85
86 p += lstep;
87 }
88
89 rgb[2] = rgb[1] = rgb[0] = static_cast<uint8_t>(g / n);
90 }
91 else if (img->getPixelFormat() == YCbCr411_8) // convert from YUV
92 {
93 size_t lstep = (img->getWidth() >> 2) * 6 + img->getXPadding();
94 const uint8_t* p = img->getPixels() + k * lstep;
95
96 uint32_t r = 0;
97 uint32_t g = 0;
98 uint32_t b = 0;
99 uint32_t n = 0;
100
101 for (uint32_t kk = 0; kk < ds; kk++)
102 {
103 for (uint32_t ii = 0; ii < ds; ii++)
104 {
105 uint8_t v[3];
106 rcg::convYCbCr411toRGB(v, p, static_cast<int>(i + ii));
107
108 r += v[0];
109 g += v[1];
110 b += v[2];
111 n++;
112 }
113
114 p += lstep;
115 }
116
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);
120 }
121 }
122
123 // Adapted from: https://github.com/roboception/rc_genicam_api/blob/master/tools/gc_pointcloud.cc
124 static void
125 storePointCloud(double f,
126 double t,
127 double scale,
128 std::shared_ptr<const rcg::Image> intensityCombined,
129 std::shared_ptr<const rcg::Image> disp,
130 PointCloud* outPoints)
131 {
132 // intensityCombined: Top half is the left image, bottom half the right image
133 // get size and scale factor between left image and disparity image
134
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();
140
141 // convert focal length factor into focal length in (disparity) pixels
142
143 f *= width;
144
145 // get pointer to disparity data and size of row in bytes
146
147 const uint8_t* dps = disp->getPixels();
148 size_t dstep = disp->getWidth() * sizeof(uint16_t) + disp->getXPadding();
149
150 // count number of valid disparities
151
152 int n = 0;
153 for (size_t k = 0; k < height; k++)
154 {
155 int j = 0;
156 for (size_t i = 0; i < width; i++)
157 {
158 if ((dps[j] | dps[j + 1]) != 0)
159 {
160 n++;
161 }
162 j += 2;
163 }
164
165 dps += dstep;
166 }
167
168 dps = disp->getPixels();
169
170 outPoints->clear();
171 outPoints->reserve(height * width);
172
173 // create point cloud
174
175 for (size_t k = 0; k < height; k++)
176 {
177 for (size_t i = 0; i < width; i++)
178 {
179 // convert disparity from fixed comma 16 bit integer into float value
180
181 double d;
182 if (bigendian)
183 {
184 size_t j = i << 1;
185 d = scale * ((dps[j] << 8) | dps[j + 1]);
186 }
187 else
188 {
189 size_t j = i << 1;
190 d = scale * ((dps[j + 1] << 8) | dps[j]);
191 }
192
193 // if disparity is valid and color can be obtained
194
195 if (d > 0)
196 {
197 // reconstruct 3D point from disparity value
198
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;
202
203 // compute size of reconstructed point
204
205 // double x2=(i-0.5*width)*t/d;
206 // double size=2*1.4*std::abs(x2-x); // unused
207
208 // get corresponding color value
209
210 uint8_t rgb[3] = {0, 0, 0};
211 // FIXME: Replace with rcg::getColor once available
212 ::rcg_getColor(rgb,
213 intensityCombined,
214 static_cast<uint32_t>(ds),
215 static_cast<uint32_t>(i),
216 static_cast<uint32_t>(k));
217
218 // store colored point
219 Point point;
220 const double meterToMillimeter = 1000.0f;
221 point.x = x * meterToMillimeter;
222 point.y = y * meterToMillimeter;
223 point.z = z * meterToMillimeter;
224 point.r = rgb[0];
225 point.g = rgb[1];
226 point.b = rgb[2];
227 point.a = 255;
228
229 outPoints->push_back(point);
230 }
231 }
232
233 dps += dstep;
234 }
235 }
236
237 RCPointCloudProvider::RCPointCloudProvider() : intensityBuffer(50), disparityBuffer(25)
238 {
239 }
240
241 void
243 {
246
247 updateFinalCloudTransform(getProperty<float>("PointCloud_Scale_X").getValue(),
248 getProperty<float>("PointCloud_Scale_Y").getValue(),
249 getProperty<float>("PointCloud_Scale_Z").getValue(),
250 getProperty<float>("PointCloud_Rotate_Roll").getValue(),
251 getProperty<float>("PointCloud_Rotate_Pitch").getValue(),
252 getProperty<float>("PointCloud_Rotate_Yaw").getValue(),
253 getProperty<float>("PointCloud_Translate_X").getValue(),
254 getProperty<float>("PointCloud_Translate_Y").getValue(),
255 getProperty<float>("PointCloud_Translate_Z").getValue());
256 }
257
258 void
266
267 void
273
274 void
280
281 void
283 {
284 using namespace visionx::roboception;
285
286 if (!initDevice(getProperty<std::string>("DeviceId")))
287 {
288 getArmarXManager()->asyncShutdown();
289 return;
290 }
291 enableIntensity(false);
293 enableDisparity(true);
294 enableConfidence(false);
295 enableError(false);
296
297 rcg::setString(nodemap, GC_COMPONENT_SELECTOR, "IntensityCombined", true);
298
299 // Color format
300 if (rcg::setEnum(nodemap, "PixelFormat", "YCbCr411_8", false))
301 {
302 ARMARX_INFO << "Enabling color mode";
303 }
304 else
305 {
306 ARMARX_INFO << "Falling back to monochrome mode";
307 }
308
310 "/tmp/armar6_rc_point_cloud_calibration.txt");
311
312 std::string depthQuality = getProperty<std::string>("DepthImageResolution").getValue();
313 try
314 {
315 rcg::setEnum(nodemap, GC_DEPTH_QUALITY, depthQuality.c_str(), true);
316 }
317 catch (std::invalid_argument& e)
318 {
319 ARMARX_INFO << e.what();
320 ARMARX_WARNING << "Selected DepthImageResolution '" << depthQuality.c_str()
321 << "' is currently not available for this device. "
322 << "Falling back to '" << GC_DEPTH_QUALITY_HIGH << "' (640x480@3FPS).";
323 rcg::setEnum(nodemap, GC_DEPTH_QUALITY, GC_DEPTH_QUALITY_HIGH, true);
324 }
325 ARMARX_INFO << "Setting depth quality to " << rcg::getEnum(nodemap, GC_DEPTH_QUALITY)
326 << " (out of Low, Medium, High, Full)";
328
329 frameRate = std::min(frameRate, getProperty<float>("framerate").getValue());
330 rcg::setFloat(nodemap, "AcquisitionFrameRate", frameRate);
332
333 scan3dCoordinateScale =
334 rcg::getFloat(nodemap, "Scan3dCoordinateScale", nullptr, nullptr, true);
335
337 setImageFormat(dimensions, visionx::eRgb, visionx::eBayerPatternRg);
338 setPointCloudSyncMode(visionx::eCaptureSynchronization);
339 }
340
341 void
346
347 void
349 {
350 startRC();
351 }
352
353 void
358
359 bool
361 {
362 const rcg::Buffer* buffer = stream->grab(10000);
363 if (!buffer)
364 {
365 ARMARX_WARNING << deactivateSpam(10) << "Unable to get image";
366 return false;
367 }
368
369 // check for a complete image in the buffer
370
371 if (buffer->getIsIncomplete() || !buffer->getImagePresent(0))
372 {
373 ARMARX_INFO << deactivateSpam(1) << "Waiting for image";
374 return false;
375 }
376
377 // store image in the corresponding list
378
379 uint64_t pixelformat = buffer->getPixelFormat(0);
380 if (pixelformat == Mono8 || pixelformat == YCbCr411_8)
381 {
382 intensityBuffer.add(buffer, 0);
383 }
384 else if (pixelformat == Coord3D_C16)
385 {
386 disparityBuffer.add(buffer, 0);
387 }
388 else
389 {
390 ARMARX_WARNING << "Unexpected pixel format: " << pixelformat;
391 return false;
392 }
393 // check if both lists contain an image with the current timestamp
394
395 uint64_t timestamp = buffer->getTimestampNS();
396
397 std::shared_ptr<const rcg::Image> intensityCombined = intensityBuffer.find(timestamp);
398 std::shared_ptr<const rcg::Image> disparity = disparityBuffer.find(timestamp);
399
400 if (!intensityCombined || !disparity)
401 {
402 // Waiting for second synchronized image
403 return false;
404 }
405 updateTimestamp(buffer->getTimestamp());
406
407 // compute and store point cloud from synchronized image pair
408
409 PointCloud::Ptr pointCloud(new PointCloud());
410 storePointCloud(focalLengthFactor,
411 baseline,
412 scan3dCoordinateScale,
413 intensityCombined,
414 disparity,
415 pointCloud.get());
416
417
418 // Provide images
419 {
420 visionx::ImageFormatInfo imageFormat = getImageFormat();
421
422 // ARMARX_LOG << "grabbing image " << imageFormat.dimension.width << "x" << imageFormat.dimension.height << " vs " << buffer->getWidth() << "x" << buffer->getHeight();
423
424 int width = imageFormat.dimension.width;
425 int height = imageFormat.dimension.height;
426 if (scaleFactor > 1.0)
427 {
428 width *= scaleFactor;
429 height *= scaleFactor;
430 }
431
432 //const int imageSize = imageFormat.dimension.width * imageFormat.dimension.height * imageFormat.bytesPerPixel;
433 const uint8_t* p = intensityCombined->getPixels();
434
435 size_t px = intensityCombined->getXPadding();
436 uint64_t format = intensityCombined->getPixelFormat();
437
438 for (size_t n = 0; n < numImages; n++)
439 {
440 //fillCameraImageRGB(cameraImages[n]->pixels, n, *intensityCombined);
441 fillCameraImageRGB(cameraImages[n]->pixels, n, p, width, height, format, px);
442 }
443
444
445 if (scaleFactor > 1.0)
446 {
447 ::ImageProcessor::Resize(cameraImages[0], smallImages[0]);
448 ::ImageProcessor::Resize(cameraImages[1], smallImages[1]);
450
451 // armarx::SharedMemoryScopedWriteLockPtr lock(this->ImageProvider::sharedMemoryProvider->getScopedWriteLock());
452
453 // for (size_t i = 0; i < numImages; i++)
454 // {
455 // memcpy(ppImageBuffers[i], smallImages[i]->pixels, imageSize);
456 // }
457 }
458 else
459 {
461 // for (size_t i = 0; i < numImages; i++)
462 // {
463 // memcpy(ppImageBuffers[i], cameraImages[i]->pixels, imageSize);
464 // }
465 }
466 }
467
468 PointCloud::Ptr transformedPointCloud(new PointCloud());
469 const auto& tr = getFinalCloudTransform();
470 ARMARX_DEBUG << deactivateSpam(0.5) << "final transform =\n" << tr;
471 pcl::transformPointCloud(*pointCloud, *transformedPointCloud, tr);
472
473 providePointCloud(transformedPointCloud);
474
475 // remove all images from the buffer with the current or an older time stamp
476 intensityBuffer.removeOld(timestamp);
477 disparityBuffer.removeOld(timestamp);
478
479 return true;
480 }
481
488
489 void
491 {
492 throw std::runtime_error("Not yet implemented");
493 }
494
495 void
499
500 void
504
506 std::string prefix) :
508 {
509 using namespace visionx::roboception;
510
511 defineOptionalProperty<std::string>("DeviceId", "00_14_2d_2c_6e_ed", "");
512 defineOptionalProperty<float>("ScaleFactor", 2.0, "Image down scale factor");
514 25.0f,
515 "Frames per second, actual framerate is equal to min(this "
516 "framerate, framerate provided by the device)")
517 .setMatchRegex("\\d+(.\\d*)?")
518 .setMin(0.0f)
519 .setMax(25.0f);
520 defineOptionalProperty<bool>("isEnabled", true, "enable the capturing process immediately");
522 "DepthImageResolution",
523 "640x480@3Fps",
524 "Resolution of the depth image. "
525 "The higher the resolution, the lower the framerate provided by the device")
526 .setCaseInsensitive(true)
527 .map("214x160@25Fps", GC_DEPTH_QUALITY_LOW)
528 .map("320x240@15Fps", GC_DEPTH_QUALITY_MEDIUM)
529 .map("640x480@3Fps", GC_DEPTH_QUALITY_HIGH)
530 .map("1280x960@0.8Fps", GC_DEPTH_QUALITY_FULL);
531
533 "ReferenceFrameName", "Roboception_LeftCamera", "Optional reference frame name.");
534
535 defineOptionalProperty<float>("PointCloud_Scale_X", 1.0, "");
536 defineOptionalProperty<float>("PointCloud_Scale_Y", 1.0, "");
537 defineOptionalProperty<float>("PointCloud_Scale_Z", 1.0, "");
538 defineOptionalProperty<float>("PointCloud_Translate_X", 0, "");
539 defineOptionalProperty<float>("PointCloud_Translate_Y", 0, "");
540 defineOptionalProperty<float>("PointCloud_Translate_Z", 0, "");
541 defineOptionalProperty<float>("PointCloud_Rotate_Roll", 0, "");
542 defineOptionalProperty<float>("PointCloud_Rotate_Pitch", 0, "");
543 defineOptionalProperty<float>("PointCloud_Rotate_Yaw", 0, "");
544 }
545
546 armarx::RemoteGui::WidgetPtr
547 RCPointCloudProvider::buildGui()
548 {
549 const auto& srt = finalCloudTransform.getWriteBuffer();
550 ;
552 .cols(5)
553 .addTextLabel("Scale x/y/z")
554 .addChild(armarx::RemoteGui::makeFloatSpinBox("sx").decimals(4).min(0).max(1000).value(
555 srt(0)))
556 .addChild(armarx::RemoteGui::makeFloatSpinBox("sy").decimals(4).min(0).max(1000).value(
557 srt(1)))
558 .addChild(armarx::RemoteGui::makeFloatSpinBox("sz").decimals(4).min(0).max(1000).value(
559 srt(2)))
560 .addChild(new armarx::RemoteGui::HSpacer)
561
562 .addTextLabel("Roll / Pitch / Yaw")
566 .addChild(new armarx::RemoteGui::HSpacer)
567
568 .addTextLabel("Translate x/y/z")
569 .addChild(armarx::RemoteGui::makeFloatSpinBox("tx").value(srt(6)).min(-1000).max(1000))
570 .addChild(armarx::RemoteGui::makeFloatSpinBox("ty").value(srt(7)).min(-1000).max(1000))
571 .addChild(armarx::RemoteGui::makeFloatSpinBox("tz").value(srt(8)).min(-1000).max(1000))
572 .addChild(new armarx::RemoteGui::HSpacer);
573 }
574
575 void
576 RCPointCloudProvider::processGui(armarx::RemoteGui::TabProxy& prx)
577 {
578 prx.receiveUpdates();
579 updateFinalCloudTransform(prx.getValue<float>("sx").get(),
580 prx.getValue<float>("sy").get(),
581 prx.getValue<float>("sz").get(),
582 prx.getValue<float>("rx").get(),
583 prx.getValue<float>("ry").get(),
584 prx.getValue<float>("rz").get(),
585 prx.getValue<float>("tx").get(),
586 prx.getValue<float>("ty").get(),
587 prx.getValue<float>("tz").get());
588 }
589
590 void
591 RCPointCloudProvider::updateFinalCloudTransform(float sx,
592 float sy,
593 float sz,
594 float rx,
595 float ry,
596 float rz,
597 float tx,
598 float ty,
599 float tz)
600 {
601 finalCloudTransform.getWriteBuffer()(0) = sx;
602 finalCloudTransform.getWriteBuffer()(1) = sy;
603 finalCloudTransform.getWriteBuffer()(2) = sz;
604
605 finalCloudTransform.getWriteBuffer()(3) = rx;
606 finalCloudTransform.getWriteBuffer()(4) = ry;
607 finalCloudTransform.getWriteBuffer()(5) = rz;
608
609 finalCloudTransform.getWriteBuffer()(6) = tx;
610 finalCloudTransform.getWriteBuffer()(7) = ty;
611 finalCloudTransform.getWriteBuffer()(8) = tz;
612
613 finalCloudTransform.commitWrite();
614 }
615
616 Eigen::Matrix4f
617 RCPointCloudProvider::getFinalCloudTransform()
618 {
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();
623 }
624
625 std::string
627 {
628 return "RCPointCloudProvider";
629 }
630
633
634} // namespace visionx
std::string timestamp()
#define ARMARX_REGISTER_COMPONENT_EXECUTABLE(ComponentT, applicationName)
Definition Decoupled.h:29
#define M_PI
Definition MathTools.h:17
#define VAROUT(x)
void push_back(const T &v)
Definition Vector.h:354
void reserve(size_type s)
Definition Vector.h:189
void clear()
Definition Vector.h:175
ComponentPropertyDefinitions(std::string prefix, bool hasObjectNameParameter=true)
Definition Component.cpp:46
std::string getConfigIdentifier()
Retrieve config identifier for this component as set in constructor.
Definition Component.cpp:90
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.
Definition Logging.cpp:99
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)
ValueProxy< T > getValue(std::string const &name)
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.
Brief description of class RCPointCloudProvider.
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 onStopCapture() override
This is called when the point cloud provider capturing has been stopped.
void onInitImageProvider() override
This is called when the Component::onInitComponent() is called.
void onExitImageProvider() override
This is called when the Component::onExitComponent() setup is called.
void startCaptureForNumFrames(Ice::Int, const Ice::Current &) override
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)
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)
T min(T t1, T t2)
Definition gdiam.h:44
T max(T t1, T t2)
Definition gdiam.h:51
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
Definition Logging.h:184
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
Definition Logging.h:193
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
ArmarX headers.
Eigen::Vector3f Point
pcl::PointCloud< Point > PointCloud
SimpleGridLayoutBuilder & addTextLabel(std::string const &text, int colspan)
SimpleGridLayoutBuilder & addChild(WidgetPtr const &child, int colspan)