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:
84  , mScaling(scaling)
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:
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 }
ensenso_conversion::nxLibToPclTimestamp
double nxLibToPclTimestamp(double const &timestamp, bool isFileCamera=false)
Definition: conversion.cpp:45
pointCloudTexturedFromNxLib
std::unique_ptr< ensenso::pcl::PointCloudColored > pointCloudTexturedFromNxLib(NxLibItem const &imageNode, NxLibItem const &pointsNode, std::string const &frame, bool isFileCamera=false, PointCloudROI const *roi=nullptr)
Definition: stereo_camera_helpers.h:271
RenderPointMapParamsProjection::far
ensenso::std::optional< double > far() const override
Definition: stereo_camera_helpers.h:127
RenderPointMapParams::near
virtual ensenso::std::optional< double > near() const
Definition: stereo_camera_helpers.h:54
RenderPointMapParamsProjection::mWithTexture
bool mWithTexture
Definition: stereo_camera_helpers.h:121
pointCloudWithNormalsFromNxLib
std::unique_ptr< ensenso::pcl::PointCloudNormals > pointCloudWithNormalsFromNxLib(NxLibItem const &pointMapNode, NxLibItem const &normalNode, std::string const &frame, bool isFileCamera=false, PointCloudROI const *roi=nullptr)
Definition: stereo_camera_helpers.h:222
RenderPointMapParamsTelecentric::mPixelScale
int mPixelScale
Definition: stereo_camera_helpers.h:73
RenderPointMapParamsProjection::RenderPointMapParamsProjection
RenderPointMapParamsProjection(bool useOpenGL, double far, double near, bool withTexture)
Definition: stereo_camera_helpers.h:124
RenderPointMapParamsProjection::near
ensenso::std::optional< double > near() const override
Definition: stereo_camera_helpers.h:132
RenderPointMapParamsProjection::mFar
double mFar
Definition: stereo_camera_helpers.h:120
pointCloudFromNxLib
std::unique_ptr< ensenso::pcl::PointCloud > pointCloudFromNxLib(NxLibItem const &node, std::string const &frame, bool isFileCamera=false, PointCloudROI const *roi=nullptr)
Definition: stereo_camera_helpers.h:182
RenderPointMapParams
Definition: stereo_camera_helpers.h:17
RenderPointMapParamsProjection::withTexture
ensenso::std::optional< bool > withTexture() const override
Definition: stereo_camera_helpers.h:137
writeTransformToNxLib
void writeTransformToNxLib(Transform const &transform, NxLibItem const &node)
Definition: pose_utilities.cpp:70
RenderPointMapParamsTelecentric::mSizeHeight
int mSizeHeight
Definition: stereo_camera_helpers.h:76
RenderPointMapParams::withTexture
virtual ensenso::std::optional< bool > withTexture() const
Definition: stereo_camera_helpers.h:59
RenderPointMapParamsProjection::mNear
double mNear
Definition: stereo_camera_helpers.h:120
RenderPointMapParams::useOpenGl
virtual bool useOpenGl() const
Definition: stereo_camera_helpers.h:24
RenderPointMapParamsTelecentric::scaling
ensenso::std::optional< double > scaling() const override
Definition: stereo_camera_helpers.h:96
PointCloudROI
Definition: point_cloud_utilities.h:15
ImagePtr
sensor_msgs::msg::ImagePtr ImagePtr
Definition: image_utilities.h:16
point_cloud_utilities.h
RenderPointMapParams::transform
virtual ensenso::std::optional< tf2::Transform > transform() const
Definition: stereo_camera_helpers.h:64
RenderPointMapParamsTelecentric::RenderPointMapParamsTelecentric
RenderPointMapParamsTelecentric(bool useOpenGl, int pixelScale, double scaling, int sizeWidth, int sizeHeight, tf2::Transform transform)
Definition: stereo_camera_helpers.h:80
depthImageFromNxLibNode
ImagePtr depthImageFromNxLibNode(NxLibItem const &node, std::string const &frame, bool isFileCamera)
Definition: image_utilities.cpp:182
RenderPointMapParamsTelecentric::pixelScale
ensenso::std::optional< int > pixelScale() const override
Definition: stereo_camera_helpers.h:91
RenderPointMapParamsTelecentric::transform
ensenso::std::optional< tf2::Transform > transform() const override
Definition: stereo_camera_helpers.h:111
RenderPointMapParams::pixelScale
virtual ensenso::std::optional< int > pixelScale() const
Definition: stereo_camera_helpers.h:29
tf2::Transform
retrieveRenderedDepthMap
sensor_msgs::msg::ImagePtr retrieveRenderedDepthMap(NxLibItem const &cmdResult, std::string const &frame, bool isFileCamera)
Definition: stereo_camera_helpers.h:335
pose_utilities.h
RenderPointMapParams::RenderPointMapParams
RenderPointMapParams(bool _useOpenGl)
Definition: stereo_camera_helpers.h:23
conversion.h
RenderPointMapParamsTelecentric
Definition: stereo_camera_helpers.h:70
RenderPointMapParams::far
virtual ensenso::std::optional< double > far() const
Definition: stereo_camera_helpers.h:49
RenderPointMapParamsProjection
Definition: stereo_camera_helpers.h:117
RenderPointMapParams::useOpenGL
bool useOpenGL
Definition: stereo_camera_helpers.h:20
RenderPointMapParamsTelecentric::sizeWidth
ensenso::std::optional< int > sizeWidth() const override
Definition: stereo_camera_helpers.h:101
setRenderParams
void setRenderParams(NxLibItem const &cmdParams, RenderPointMapParams const *params)
Definition: stereo_camera_helpers.h:143
std
RenderPointMapParams::sizeWidth
virtual ensenso::std::optional< int > sizeWidth() const
Definition: stereo_camera_helpers.h:39
core.h
RenderPointMapParams::sizeHeight
virtual ensenso::std::optional< int > sizeHeight() const
Definition: stereo_camera_helpers.h:44
RenderPointMapParamsTelecentric::mSizeWidth
int mSizeWidth
Definition: stereo_camera_helpers.h:75
retrieveTexturedPointCloud
std::unique_ptr< ensenso::pcl::PointCloudColored > retrieveTexturedPointCloud(NxLibItem const &cmdResult, std::string const &targetFrame, bool isFileCamera=false)
Definition: stereo_camera_helpers.h:327
RenderPointMapParams::scaling
virtual ensenso::std::optional< double > scaling() const
Definition: stereo_camera_helpers.h:34
Transform.h
retrieveRenderedPointCloud
std::unique_ptr< ensenso::pcl::PointCloud > retrieveRenderedPointCloud(NxLibItem const &cmdResult, std::string const &frame, bool isFileCamera=false)
Definition: stereo_camera_helpers.h:320
RenderPointMapParamsTelecentric::mScaling
double mScaling
Definition: stereo_camera_helpers.h:74
RenderPointMapParamsTelecentric::mTransform
tf2::Transform mTransform
Definition: stereo_camera_helpers.h:77
RenderPointMapParamsTelecentric::sizeHeight
ensenso::std::optional< int > sizeHeight() const override
Definition: stereo_camera_helpers.h:106
move
void move(std::vector< T > &a, std::vector< T > &b)


ensenso_camera
Author(s): Ensenso
autogenerated on Wed Apr 2 2025 02:37:46