stereo_camera_helpers.h
Go to the documentation of this file.
1 #pragma once
2 
4 
8 
10 
11 #include <limits>
12 #include <string>
13 #include <vector>
14 
15 #include "nxLib.h"
16 
18 {
19 protected:
20  bool useOpenGL;
21 
22 public:
23  explicit RenderPointMapParams(bool _useOpenGl) : useOpenGL(_useOpenGl){};
24  virtual bool useOpenGl() const
25  {
26  return useOpenGL;
27  };
28 
29  virtual ensenso::std::optional<int> pixelScale() const
30  {
31  return {};
32  }
33 
34  virtual ensenso::std::optional<double> scaling() const
35  {
36  return {};
37  }
38 
39  virtual ensenso::std::optional<int> sizeWidth() const
40  {
41  return {};
42  }
43 
44  virtual ensenso::std::optional<int> sizeHeight() const
45  {
46  return {};
47  }
48 
49  virtual ensenso::std::optional<double> far() const
50  {
51  return {};
52  }
53 
54  virtual ensenso::std::optional<double> near() const
55  {
56  return {};
57  }
58 
59  virtual ensenso::std::optional<bool> withTexture() const
60  {
61  return {};
62  }
63 
64  virtual ensenso::std::optional<tf2::Transform> transform() const
65  {
66  return {};
67  }
68 };
69 
71 {
72 private:
74  double mScaling;
78 
79 public:
82  : RenderPointMapParams(useOpenGl)
83  , mPixelScale(pixelScale)
84  , mScaling(scaling)
85  , mSizeWidth(sizeWidth)
86  , mSizeHeight(sizeHeight)
87  , mTransform(std::move(transform))
88  {
89  }
90 
91  ensenso::std::optional<int> pixelScale() const override
92  {
93  return mPixelScale;
94  }
95 
96  ensenso::std::optional<double> scaling() const override
97  {
98  return mScaling;
99  }
100 
101  ensenso::std::optional<int> sizeWidth() const override
102  {
103  return mSizeWidth;
104  }
105 
106  ensenso::std::optional<int> sizeHeight() const override
107  {
108  return mSizeHeight;
109  }
110 
111  ensenso::std::optional<tf2::Transform> transform() const override
112  {
113  return mTransform;
114  }
115 };
116 
118 {
119 private:
120  double mFar, mNear;
122 
123 public:
125  : RenderPointMapParams(useOpenGL), mFar(far), mNear(near), mWithTexture(withTexture){};
126 
127  ensenso::std::optional<double> far() const override
128  {
129  return mFar;
130  }
131 
132  ensenso::std::optional<double> near() const override
133  {
134  return mNear;
135  }
136 
137  ensenso::std::optional<bool> withTexture() const override
138  {
139  return mWithTexture;
140  }
141 };
142 
143 void setRenderParams(NxLibItem const& cmdParams, RenderPointMapParams const* params)
144 {
145  cmdParams[itmUseOpenGL] = params->useOpenGl();
146  if (params->pixelScale())
147  {
148  cmdParams[itmPixelSize] = *params->pixelScale();
149  }
150  if (params->scaling())
151  {
152  cmdParams[itmScaling] = *params->scaling();
153  }
154  if (params->withTexture())
155  {
156  cmdParams[itmTexture] = *params->withTexture();
157  }
158  if (params->sizeWidth())
159  {
160  cmdParams[itmSize][0] = *params->sizeWidth();
161  }
162  if (params->sizeHeight())
163  {
164  cmdParams[itmSize][1] = *params->sizeHeight();
165  }
166  if (params->transform())
167  {
168  writeTransformToNxLib(*params->transform(), cmdParams[itmViewPose]);
169  }
170 
171  // Some parameters are both in the command parameters and the global parameter node.
172  if (params->far())
173  {
174  cmdParams[itmFar] = *params->far();
175  }
176  if (params->near())
177  {
178  cmdParams[itmNear] = *params->near();
179  }
180 }
181 
182 std::unique_ptr<ensenso::pcl::PointCloud> pointCloudFromNxLib(NxLibItem const& node, std::string const& frame,
183  bool isFileCamera = false,
184  PointCloudROI const* roi = nullptr)
185 {
186  int width, height;
187  double timestamp;
188  std::vector<float> data;
189 
190  node.getBinaryDataInfo(&width, &height, 0, 0, 0, &timestamp);
191  node.getBinaryData(data, 0);
192 
193  auto cloud = ensenso::std::make_unique<ensenso::pcl::PointCloud>();
194 
195  // PCL timestamp is in microseconds and Unix time.
196  cloud->header.stamp = ensenso_conversion::nxLibToPclTimestamp(timestamp, isFileCamera);
197  cloud->header.frame_id = frame;
198 
199  cloud->width = width;
200  cloud->height = height;
201  cloud->is_dense = false;
202  cloud->points.resize(width * height);
203 
204  for (int i = 0; i < width * height; i++)
205  {
206  // The NxLib point cloud is in millimeters, ROS needs everything in meters.
207  cloud->points[i].x = data[3 * i] / 1000.0f;
208  cloud->points[i].y = data[3 * i + 1] / 1000.0f;
209  cloud->points[i].z = data[3 * i + 2] / 1000.0f;
210 
211  if (roi != nullptr && !roi->contains(cloud->points[i].x, cloud->points[i].y, cloud->points[i].z))
212  {
213  cloud->points[i].x = std::numeric_limits<float>::quiet_NaN();
214  cloud->points[i].y = std::numeric_limits<float>::quiet_NaN();
215  cloud->points[i].z = std::numeric_limits<float>::quiet_NaN();
216  }
217  }
218 
219  return cloud;
220 }
221 
222 std::unique_ptr<ensenso::pcl::PointCloudNormals> pointCloudWithNormalsFromNxLib(NxLibItem const& pointMapNode,
223  NxLibItem const& normalNode,
224  std::string const& frame,
225  bool isFileCamera = false,
226  PointCloudROI const* roi = nullptr)
227 {
228  int width, height;
229  double timestamp;
230  std::vector<float> pointData;
231  std::vector<float> normalData;
232 
233  pointMapNode.getBinaryDataInfo(&width, &height, 0, 0, 0, &timestamp);
234  pointMapNode.getBinaryData(pointData, 0);
235  normalNode.getBinaryData(normalData, 0);
236 
237  auto cloud = ensenso::std::make_unique<ensenso::pcl::PointCloudNormals>();
238 
239  // PCL timestamp is in microseconds and Unix time.
240  cloud->header.stamp = ensenso_conversion::nxLibToPclTimestamp(timestamp, isFileCamera);
241  cloud->header.frame_id = frame;
242 
243  cloud->width = width;
244  cloud->height = height;
245  cloud->is_dense = false;
246  cloud->points.resize(width * height);
247 
248  for (int i = 0; i < width * height; i++)
249  {
250  // The NxLib point cloud is in millimeters, ROS needs everything in meters.
251  cloud->points[i].x = pointData[3 * i] / 1000.0f;
252  cloud->points[i].y = pointData[3 * i + 1] / 1000.0f;
253  cloud->points[i].z = pointData[3 * i + 2] / 1000.0f;
254 
255  if (roi != nullptr && !roi->contains(cloud->points[i].x, cloud->points[i].y, cloud->points[i].z))
256  {
257  cloud->points[i].x = std::numeric_limits<float>::quiet_NaN();
258  cloud->points[i].y = std::numeric_limits<float>::quiet_NaN();
259  cloud->points[i].z = std::numeric_limits<float>::quiet_NaN();
260  continue;
261  }
262 
263  cloud->points[i].normal_x = normalData[3 * i];
264  cloud->points[i].normal_y = normalData[3 * i + 1];
265  cloud->points[i].normal_z = normalData[3 * i + 2];
266  }
267 
268  return cloud;
269 }
270 
271 std::unique_ptr<ensenso::pcl::PointCloudColored> pointCloudTexturedFromNxLib(NxLibItem const& imageNode,
272  NxLibItem const& pointsNode,
273  std::string const& frame,
274  bool isFileCamera = false,
275  PointCloudROI const* roi = nullptr)
276 {
277  int width, height;
278  double timestamp;
279  std::vector<float> data;
280  std::vector<unsigned char> imageData;
281 
282  pointsNode.getBinaryDataInfo(&width, &height, 0, 0, 0, 0);
283  pointsNode.getBinaryData(data, &timestamp);
284  imageNode.getBinaryData(imageData, 0);
285 
286  auto cloud = ensenso::std::make_unique<ensenso::pcl::PointCloudColored>();
287 
288  // PCL timestamp is in microseconds and Unix time.
289  cloud->header.stamp = ensenso_conversion::nxLibToPclTimestamp(timestamp, isFileCamera);
290  cloud->header.frame_id = frame;
291 
292  cloud->width = width;
293  cloud->height = height;
294  cloud->is_dense = false;
295  cloud->points.resize(width * height);
296 
297  for (int i = 0; i < width * height; i++)
298  {
299  // The NxLib point cloud is in millimeters, ROS needs everything in meters.
300  cloud->points[i].x = data[3 * i] / 1000.0f;
301  cloud->points[i].y = data[3 * i + 1] / 1000.0f;
302  cloud->points[i].z = data[3 * i + 2] / 1000.0f;
303 
304  cloud->points[i].r = imageData[4 * i];
305  cloud->points[i].g = imageData[4 * i + 1];
306  cloud->points[i].b = imageData[4 * i + 2];
307  cloud->points[i].a = imageData[4 * i + 3];
308 
309  if (roi != nullptr && !roi->contains(cloud->points[i].x, cloud->points[i].y, cloud->points[i].z))
310  {
311  cloud->points[i].x = std::numeric_limits<float>::quiet_NaN();
312  cloud->points[i].y = std::numeric_limits<float>::quiet_NaN();
313  cloud->points[i].z = std::numeric_limits<float>::quiet_NaN();
314  }
315  }
316 
317  return cloud;
318 }
319 
320 std::unique_ptr<ensenso::pcl::PointCloud> retrieveRenderedPointCloud(NxLibItem const& cmdResult,
321  std::string const& frame,
322  bool isFileCamera = false)
323 {
324  return pointCloudFromNxLib(cmdResult[itmImages][itmRenderPointMap], frame, isFileCamera);
325 }
326 
327 std::unique_ptr<ensenso::pcl::PointCloudColored> retrieveTexturedPointCloud(NxLibItem const& cmdResult,
328  std::string const& targetFrame,
329  bool isFileCamera = false)
330 {
331  return pointCloudTexturedFromNxLib(cmdResult[itmImages][itmRenderPointMapTexture],
332  cmdResult[itmImages][itmRenderPointMap], targetFrame, isFileCamera);
333 }
334 
335 sensor_msgs::msg::ImagePtr retrieveRenderedDepthMap(NxLibItem const& cmdResult, std::string const& frame,
336  bool isFileCamera)
337 {
338  sensor_msgs::msg::ImagePtr renderedImage;
339  return depthImageFromNxLibNode(cmdResult[itmImages][itmRenderPointMap], frame, isFileCamera);
340 }
virtual ensenso::std::optional< int > sizeWidth() const
void writeTransformToNxLib(Transform const &transform, NxLibItem const &node)
virtual ensenso::std::optional< bool > withTexture() const
ensenso::std::optional< double > far() const override
double nxLibToPclTimestamp(double const &timestamp, bool isFileCamera=false)
Definition: conversion.cpp:46
ensenso::std::optional< tf2::Transform > transform() const override
std::unique_ptr< ensenso::pcl::PointCloud > pointCloudFromNxLib(NxLibItem const &node, std::string const &frame, bool isFileCamera=false, PointCloudROI const *roi=nullptr)
RenderPointMapParams(bool _useOpenGl)
ensenso::std::optional< double > scaling() const override
virtual ensenso::std::optional< double > scaling() const
virtual ensenso::std::optional< tf2::Transform > transform() const
std::unique_ptr< ensenso::pcl::PointCloudColored > pointCloudTexturedFromNxLib(NxLibItem const &imageNode, NxLibItem const &pointsNode, std::string const &frame, bool isFileCamera=false, PointCloudROI const *roi=nullptr)
virtual ensenso::std::optional< double > near() const
std::unique_ptr< ensenso::pcl::PointCloudNormals > pointCloudWithNormalsFromNxLib(NxLibItem const &pointMapNode, NxLibItem const &normalNode, std::string const &frame, bool isFileCamera=false, PointCloudROI const *roi=nullptr)
ensenso::std::optional< int > sizeHeight() const override
ensenso::std::optional< bool > withTexture() const override
void setRenderParams(NxLibItem const &cmdParams, RenderPointMapParams const *params)
ensenso::std::optional< int > pixelScale() const override
ImagePtr depthImageFromNxLibNode(NxLibItem const &node, std::string const &frame, bool isFileCamera)
virtual ensenso::std::optional< double > far() const
std::unique_ptr< ensenso::pcl::PointCloud > retrieveRenderedPointCloud(NxLibItem const &cmdResult, std::string const &frame, bool isFileCamera=false)
ensenso::std::optional< int > sizeWidth() const override
void move(std::vector< T > &a, std::vector< T > &b)
ensenso::std::optional< double > near() const override
virtual ensenso::std::optional< int > pixelScale() const
virtual bool useOpenGl() const
sensor_msgs::msg::ImagePtr ImagePtr
virtual ensenso::std::optional< int > sizeHeight() const
RenderPointMapParamsProjection(bool useOpenGL, double far, double near, bool withTexture)
std::unique_ptr< ensenso::pcl::PointCloudColored > retrieveTexturedPointCloud(NxLibItem const &cmdResult, std::string const &targetFrame, bool isFileCamera=false)
RenderPointMapParamsTelecentric(bool useOpenGl, int pixelScale, double scaling, int sizeWidth, int sizeHeight, tf2::Transform transform)
sensor_msgs::msg::ImagePtr retrieveRenderedDepthMap(NxLibItem const &cmdResult, std::string const &frame, bool isFileCamera)


ensenso_camera
Author(s): Ensenso
autogenerated on Sat Jun 3 2023 02:17:04