base
DepthMap.hpp
Go to the documentation of this file.
1 #ifndef __BASE_SAMPLES_DEPTH_MAP_HPP__
2 #define __BASE_SAMPLES_DEPTH_MAP_HPP__
3 
4 #include <vector>
5 #include <Eigen/Geometry>
6 
7 #include <base/Angle.hpp>
8 #include <base/Time.hpp>
9 #include <base-logging/Singleton.hpp>
10 
11 #include <stdexcept>
12 
13 #include <boost/cstdint.hpp>
14 
15 namespace base { namespace samples {
16 
29 struct DepthMap
30 {
31 public:
32  typedef float scalar;
33  typedef boost::uint32_t uint32_t;
34  typedef Eigen::Matrix<scalar, Eigen::Dynamic, Eigen::Dynamic, Eigen::DontAlign | Eigen::RowMajor> DepthMatrix;
35  typedef const Eigen::Matrix<scalar, Eigen::Dynamic, Eigen::Dynamic, Eigen::DontAlign | Eigen::RowMajor> DepthMatrixConst;
36  typedef Eigen::Map< DepthMatrix > DepthMatrixMap;
37  typedef const Eigen::Map< DepthMatrixConst > DepthMatrixMapConst;
38 
40  {
42  TOO_FAR = 1,
43  TOO_NEAR = 2,
45  };
46 
48  {
51  };
52 
53  enum UNIT_AXIS
54  {
55  UNIT_X = 0,
56  UNIT_Y = 1,
57  UNIT_Z = 2
58  };
59 
66 
71  std::vector<base::Time> timestamps;
72 
78 
84 
97  std::vector<double> vertical_interval;
98 
111  std::vector<double> horizontal_interval;
112 
114  uint32_t vertical_size;
115 
117  uint32_t horizontal_size;
118 
124  std::vector<scalar> distances;
125 
131  std::vector<scalar> remissions;
132 
133  DepthMap() : vertical_projection(POLAR), horizontal_projection(POLAR),
134  vertical_size(0), horizontal_size(0) {}
135 
137  void reset();
138 
140  DepthMatrixMap getDistanceMatrixMap();
141 
143  DepthMatrixMapConst getDistanceMatrixMapConst() const;
144 
149  DEPTH_MEASUREMENT_STATE getIndexState(size_t index) const;
150 
156  DEPTH_MEASUREMENT_STATE getMeasurementState(uint32_t v_index, uint32_t h_index) const;
157 
162  DEPTH_MEASUREMENT_STATE getMeasurementState(scalar distance) const;
163 
168  bool isIndexValid(size_t index) const;
169 
176  bool isMeasurementValid(uint32_t v_index, uint32_t h_index) const;
177 
182  bool isMeasurementValid(scalar distance) const;
183 
188  size_t getIndex(uint32_t v_index, uint32_t h_index) const;
189 
200  template<typename T>
201  void convertDepthMapToPointCloud(std::vector<T> &point_cloud,
202  bool use_lut = false,
203  bool skip_invalid_measurements = true) const
204  {
205  convertDepthMapToPointCloud(point_cloud, Eigen::Transform<typename T::Scalar,3,Eigen::Affine>::Identity(),
206  use_lut,
207  skip_invalid_measurements);
208  }
209 
222  template<typename T>
223  void convertDepthMapToPointCloud(std::vector<T> &point_cloud,
224  const Eigen::Transform<typename T::Scalar,3,Eigen::Affine>& transformation,
225  bool use_lut = false,
226  bool skip_invalid_measurements = true) const
227  {
228  point_cloud.clear();
229 
230  // check row and col size
231  if(!checkSizeConfig())
232  throw std::out_of_range("Number of rows and columns does not match the distance array size.");
233 
234  // check if nothing to do
235  if(distances.empty())
236  return;
237 
238  // give the vector a hint about the size it might be
239  point_cloud.reserve(distances.size());
240 
241  // precompute local transformations
242  std::vector< Eigen::Transform<typename T::Scalar,3,Eigen::Affine>, Eigen::aligned_allocator< Eigen::Transform<typename T::Scalar,3,Eigen::Affine> > > rows2column;
243  std::vector< Eigen::Transform<typename T::Scalar,3,Eigen::Affine>, Eigen::aligned_allocator< Eigen::Transform<typename T::Scalar,3,Eigen::Affine> > > columns2pointcloud;
244  computeLocalTransformations(rows2column, columns2pointcloud, use_lut);
245 
246  // convert rows
247  for(unsigned v = 0; v < vertical_size; v++)
248  convertSingleRow(point_cloud, v, rows2column[v], columns2pointcloud, transformation, skip_invalid_measurements);
249  }
250 
263  template<typename T>
264  void convertDepthMapToPointCloud(std::vector<T> &point_cloud,
265  const Eigen::Transform<typename T::Scalar,3,Eigen::Affine>& first_transformation,
266  const Eigen::Transform<typename T::Scalar,3,Eigen::Affine>& last_transformation,
267  bool use_lut = false,
268  bool skip_invalid_measurements = true,
269  bool apply_transforms_vertically = true) const
270  {
271  point_cloud.clear();
272 
273  // check row and col size
274  if(!checkSizeConfig())
275  throw std::out_of_range("Number of rows and columns does not match the distance array size.");
276 
277  // check if nothing to do
278  if(distances.empty())
279  return;
280 
281  // give the vector a hint about the size it might be
282  point_cloud.reserve(distances.size());
283 
284  // precompute local transformations
285  std::vector< Eigen::Transform<typename T::Scalar,3,Eigen::Affine>, Eigen::aligned_allocator< Eigen::Transform<typename T::Scalar,3,Eigen::Affine> > > rows2column;
286  std::vector< Eigen::Transform<typename T::Scalar,3,Eigen::Affine>, Eigen::aligned_allocator< Eigen::Transform<typename T::Scalar,3,Eigen::Affine> > > columns2pointcloud;
287  computeLocalTransformations(rows2column, columns2pointcloud, use_lut);
288 
289  Eigen::Matrix<typename T::Scalar,3,1> translation_delta = last_transformation.translation() - first_transformation.translation();
290  Eigen::Quaternion<typename T::Scalar> first_rotation = Eigen::Quaternion<typename T::Scalar>(first_transformation.linear());
291  Eigen::Quaternion<typename T::Scalar> last_rotation = Eigen::Quaternion<typename T::Scalar>(last_transformation.linear());
292 
293  // apply global interpolated transformations
294  if(!apply_transforms_vertically)
295  {
296  for(unsigned h = 0; h < horizontal_size; h++)
297  {
298  Eigen::Transform<typename T::Scalar,3,Eigen::Affine> transformation =
299  Eigen::Transform<typename T::Scalar,3,Eigen::Affine>(first_rotation.slerp((double)h / (double)(horizontal_size-1), last_rotation));
300  transformation.pretranslate(first_transformation.translation() + ((double)h / (double)(horizontal_size-1)) * translation_delta);
301  columns2pointcloud[h] = transformation * columns2pointcloud[h];
302  }
303 
304  // convert rows
305  for(unsigned v = 0; v < vertical_size; v++)
306  convertSingleRow(point_cloud, v, rows2column[v], columns2pointcloud,
307  Eigen::Transform<typename T::Scalar,3,Eigen::Affine>::Identity(),
308  skip_invalid_measurements);
309  }
310  else
311  {
312  std::vector< Eigen::Transform<typename T::Scalar,3,Eigen::Affine>, Eigen::aligned_allocator< Eigen::Transform<typename T::Scalar,3,Eigen::Affine> > > pointcloud2world;
313  for(unsigned v = 0; v < vertical_size; v++)
314  {
315  Eigen::Transform<typename T::Scalar,3,Eigen::Affine> transformation =
316  Eigen::Transform<typename T::Scalar,3,Eigen::Affine>(first_rotation.slerp((double)v / (double)(vertical_size-1), last_rotation));
317  transformation.pretranslate(first_transformation.translation() + ((double)v / (double)(vertical_size-1)) * translation_delta);
318  pointcloud2world.push_back(transformation);
319  }
320 
321  // convert rows
322  for(unsigned v = 0; v < vertical_size; v++)
323  convertSingleRow(point_cloud, v, rows2column[v], columns2pointcloud,
324  pointcloud2world[v], skip_invalid_measurements);
325  }
326  }
327 
340  template<typename T>
341  void convertDepthMapToPointCloud(std::vector<T> &point_cloud,
342  const std::vector< Eigen::Transform<typename T::Scalar,3,Eigen::Affine>, Eigen::aligned_allocator< Eigen::Transform<typename T::Scalar,3,Eigen::Affine> > >& transformations,
343  bool use_lut = false,
344  bool skip_invalid_measurements = true,
345  bool apply_transforms_vertically = true) const
346  {
347  point_cloud.clear();
348 
349  // check row and col size
350  if(!checkSizeConfig())
351  throw std::out_of_range("Number of rows and columns does not match the distance array size.");
352 
353  // check if nothing to do
354  if(distances.empty())
355  return;
356 
357  // give the vector a hint about the size it might be
358  point_cloud.reserve(distances.size());
359 
360  // precompute local transformations
361  std::vector< Eigen::Transform<typename T::Scalar,3,Eigen::Affine>, Eigen::aligned_allocator< Eigen::Transform<typename T::Scalar,3,Eigen::Affine> > > rows2column;
362  std::vector< Eigen::Transform<typename T::Scalar,3,Eigen::Affine>, Eigen::aligned_allocator< Eigen::Transform<typename T::Scalar,3,Eigen::Affine> > > columns2pointcloud;
363  computeLocalTransformations(rows2column, columns2pointcloud);
364 
365  // apply global transformations
366  if(!apply_transforms_vertically)
367  {
368  if(transformations.size() != horizontal_size)
369  throw std::out_of_range("Invalid amount of transformations given");
370  for(unsigned h = 0; h < horizontal_size; h++)
371  columns2pointcloud[h] = transformations[h] * columns2pointcloud[h];
372 
373  // convert rows
374  for(unsigned v = 0; v < vertical_size; v++)
375  convertSingleRow(point_cloud, v, rows2column[v], columns2pointcloud,
376  Eigen::Transform<typename T::Scalar,3,Eigen::Affine>::Identity(),
377  skip_invalid_measurements);
378  }
379  else
380  {
381  if(transformations.size() != vertical_size)
382  throw std::out_of_range("Invalid amount of transformations given");
383 
384  // convert rows
385  for(unsigned v = 0; v < vertical_size; v++)
386  convertSingleRow(point_cloud, v, rows2column[v], columns2pointcloud,
387  transformations[v],
388  skip_invalid_measurements);
389  }
390  }
391 
392 private:
393  template<typename T, UNIT_AXIS> class RotationLUT;
394 
395 protected:
397  template<typename T>
398  void convertSingleRow(std::vector<T> &point_cloud,
399  unsigned int row,
400  const Eigen::Transform<typename T::Scalar,3,Eigen::Affine>& row2column,
401  const std::vector< Eigen::Transform<typename T::Scalar,3,Eigen::Affine>, Eigen::aligned_allocator< Eigen::Transform<typename T::Scalar,3,Eigen::Affine> > >& columns2pointcloud,
402  const Eigen::Transform<typename T::Scalar,3,Eigen::Affine>& pointcloud2world,
403  bool skip_invalid_measurements) const
404  {
405  size_t row_index = (size_t)row * (size_t)horizontal_size;
406  for(unsigned h = 0; h < horizontal_size; h++)
407  {
408  scalar distance = distances[row_index + h];
409  if(isMeasurementValid(distance))
410  {
411  T point(distance, 0.0, 0.0);
412  point = pointcloud2world * (columns2pointcloud[h] * row2column * point);
413  point_cloud.push_back(point);
414  }
415  else if(!skip_invalid_measurements)
416  {
417  point_cloud.push_back(T(base::unknown<typename T::Scalar>(),
418  base::unknown<typename T::Scalar>(),
419  base::unknown<typename T::Scalar>()));
420  }
421  }
422  }
423 
425  template<typename T>
426  void computeLocalTransformations(std::vector< Eigen::Transform<T,3,Eigen::Affine>, Eigen::aligned_allocator< Eigen::Transform<T,3,Eigen::Affine> > >& rows2column,
427  std::vector< Eigen::Transform<T,3,Eigen::Affine>, Eigen::aligned_allocator< Eigen::Transform<T,3,Eigen::Affine> > >& columns2pointcloud,
428  bool use_lut = false) const
429  {
430  // check interval sizes
431  if(vertical_interval.size() > 2 && vertical_interval.size() != vertical_size)
432  {
433  std::string err_msg = "Number of vertical ";
434  err_msg += vertical_projection == POLAR ? "angles " : "distances ";
435  err_msg += "does no match the expected number of entries.";
436  throw std::invalid_argument(err_msg);
437  }
438  if(horizontal_interval.size() > 2 && horizontal_interval.size() != horizontal_size)
439  {
440  std::string err_msg = "Number of horizontal ";
441  err_msg += horizontal_projection == POLAR ? "angles " : "distances ";
442  err_msg += "does no match the expected number of entries.";
443  throw std::invalid_argument(err_msg);
444  }
445 
446  // compute row2column transformations
447  rows2column.resize(vertical_size, Eigen::Transform<T,3,Eigen::Affine>::Identity());
448  if(vertical_interval.size() == 1)
449  {
450  // one planar translation or polar rotation for all vertical measurements
451  if(vertical_projection == PLANAR)
452  rows2column.resize(vertical_size, Eigen::Transform<T,3,Eigen::Affine>(Eigen::AngleAxis<T>(
453  base::Angle::normalizeRad(atan(vertical_interval.front())), Eigen::Matrix<T,3,1>::UnitY())));
454  else if(vertical_projection == POLAR)
455  rows2column.resize(vertical_size, Eigen::Transform<T,3,Eigen::Affine>(Eigen::AngleAxis<T>(
456  base::Angle::normalizeRad(vertical_interval.front()), Eigen::Matrix<T,3,1>::UnitY())));
457  else
458  throw std::invalid_argument("Invalid argument for vertical projection type.");
459  }
460  else if(vertical_interval.size() == 2)
461  {
462  // interpolate transformations between the given start and end values for all vertical measurements
463  std::vector<base::Angle> vertical_angles(vertical_size);
464  double step_resolution = computeResolution(vertical_interval, vertical_size, vertical_projection);
465  if(vertical_projection == PLANAR)
466  {
467  for(unsigned v = 0; v < vertical_size; v++)
468  vertical_angles[v] = base::Angle::fromRad(atan(vertical_interval.front() + ((double)v * step_resolution)));
469  }
470  else if(vertical_projection == POLAR)
471  {
472  for(unsigned v = 0; v < vertical_size; v++)
473  vertical_angles[v] = base::Angle::fromRad(vertical_interval.front() + ((double)v * step_resolution));
474  }
475  else
476  throw std::invalid_argument("Invalid argument for vertical projection type.");
477 
478  computeRotations(rows2column, vertical_angles, UNIT_Y, use_lut);
479  }
480  else if(vertical_interval.size() > 2)
481  {
482  // use unique planar translation or polar rotation for each vertical measurement
483  std::vector<base::Angle> vertical_angles(vertical_size);
484  if(vertical_projection == PLANAR)
485  for(unsigned v = 0; v < vertical_size; v++)
486  vertical_angles[v] = base::Angle::fromRad(atan(vertical_interval[v]));
487  else if(vertical_projection == POLAR)
488  {
489  for(unsigned v = 0; v < vertical_size; v++)
490  vertical_angles[v] = base::Angle::fromRad(vertical_interval[v]);
491  }
492  else
493  throw std::invalid_argument("Invalid argument for vertical projection type.");
494 
495  computeRotations(rows2column, vertical_angles, UNIT_Y, use_lut);
496  }
497 
498  // compute columns2pointcloud transformations
499  columns2pointcloud.resize(horizontal_size, Eigen::Transform<T,3,Eigen::Affine>::Identity());
500  if(horizontal_interval.size() == 1)
501  {
502  // one planar translation or polar rotation for all horizontal measurements
503  if(horizontal_projection == PLANAR)
504  columns2pointcloud.resize(horizontal_size, Eigen::Transform<T,3,Eigen::Affine>(Eigen::AngleAxis<T>(
505  base::Angle::normalizeRad(atan(horizontal_interval.front())), Eigen::Matrix<T,3,1>::UnitZ())));
506  else if(horizontal_projection == POLAR)
507  columns2pointcloud.resize(horizontal_size, Eigen::Transform<T,3,Eigen::Affine>(Eigen::AngleAxis<T>(
508  base::Angle::normalizeRad(horizontal_interval.front()), Eigen::Matrix<T,3,1>::UnitZ())));
509  else
510  throw std::invalid_argument("Invalid argument for horizontal projection type.");
511  }
512  else if(horizontal_interval.size() == 2)
513  {
514  // interpolate transformations between the given start and end values for all horizontal measurements
515  std::vector<base::Angle> horizontal_angles(horizontal_size);
516  double step_resolution = computeResolution(horizontal_interval, horizontal_size, horizontal_projection);
517  if(horizontal_projection == PLANAR)
518  {
519  for(unsigned h = 0; h < horizontal_size; h++)
520  horizontal_angles[h] = base::Angle::fromRad(atan(-1.0 * (horizontal_interval.front() + ((double)h * step_resolution))));
521  }
522  else if(horizontal_projection == POLAR)
523  {
524  for(unsigned h = 0; h < horizontal_size; h++)
525  horizontal_angles[h] = base::Angle::fromRad(horizontal_interval.front() + ((double)h * step_resolution));
526  }
527  else
528  throw std::invalid_argument("Invalid argument for horizontal projection type.");
529 
530  computeRotations(columns2pointcloud, horizontal_angles, UNIT_Z, use_lut);
531  }
532  else if(horizontal_interval.size() > 2)
533  {
534  // use unique planar translation or polar rotation for each horizontal measurement
535  std::vector<base::Angle> horizontal_angles(horizontal_size);
536  if(horizontal_projection == PLANAR)
537  for(unsigned h = 0; h < horizontal_size; h++)
538  horizontal_angles[h] = base::Angle::fromRad(atan(-1.0 * horizontal_interval[h]));
539  else if(horizontal_projection == POLAR)
540  for(unsigned h = 0; h < horizontal_size; h++)
541  horizontal_angles[h] = base::Angle::fromRad(horizontal_interval[h]);
542  else
543  throw std::invalid_argument("Invalid argument for horizontal projection type.");
544 
545  computeRotations(columns2pointcloud, horizontal_angles, UNIT_Z, use_lut);
546  }
547  }
548 
550  template<typename T>
551  void computeRotations(std::vector< Eigen::Transform<T,3,Eigen::Affine>, Eigen::aligned_allocator< Eigen::Transform<T,3,Eigen::Affine> > >& rotations,
552  const std::vector<base::Angle>& angles,
553  UNIT_AXIS axis,
554  bool use_lut = false) const
555  {
556  rotations.clear();
557  rotations.resize(angles.size());
558 
559  if(use_lut)
560  {
561  if(axis == UNIT_X)
562  {
563  RotationLUT<T,UNIT_X>* lut = Singleton< RotationLUT<T,UNIT_X> >::getInstance();
564  for(unsigned i = 0; i < angles.size(); i++)
565  rotations[i] = lut->getTransformation(angles[i].getRad());
566  }
567  else if(axis == UNIT_Y)
568  {
569  RotationLUT<T,UNIT_Y>* lut = Singleton< RotationLUT<T,UNIT_Y> >::getInstance();
570  for(unsigned i = 0; i < angles.size(); i++)
571  rotations[i] = lut->getTransformation(angles[i].getRad());
572  }
573  else if(axis == UNIT_Z)
574  {
575  RotationLUT<T,UNIT_Z>* lut = Singleton< RotationLUT<T,UNIT_Z> >::getInstance();
576  for(unsigned i = 0; i < angles.size(); i++)
577  rotations[i] = lut->getTransformation(angles[i].getRad());
578  }
579  }
580  else
581  {
582  for(unsigned i = 0; i < angles.size(); i++)
583  rotations[i] = Eigen::AngleAxis<T>(angles[i].getRad(), Eigen::Matrix<T,3,1>::Unit(axis));
584  }
585  };
586 
588  double computeResolution(const std::vector<double> &interval, uint32_t elements, PROJECTION_TYPE projection) const
589  {
590  if(interval.size() != 2)
591  throw std::invalid_argument("Expecting two interval values.");
592 
593  double step_resolution = 0.0;
594  if(projection == PLANAR)
595  {
596  double diff = interval.back() - interval.front();
597  step_resolution = diff / (double)(elements-1);
598  }
599  else if(projection == POLAR)
600  {
601  if(interval.back() == interval.front())
602  step_resolution = (2.0 * M_PI) / (double)(elements-1);
603  else
604  step_resolution = (interval.back() - interval.front()) / (double)(elements-1);
605  }
606  else
607  throw std::invalid_argument("Invalid argument for projection type.");
608 
609  return step_resolution;
610  };
611 
613  bool checkSizeConfig() const;
614 
615 
616 private:
618  template<typename T, UNIT_AXIS unit_axis>
619  class RotationLUT
620  {
621  static const unsigned resolution = 36000;
622 
623  public:
624  Eigen::Transform<T,3,Eigen::Affine> getTransformation(double rad)
625  {
626  uint16_t deg = (uint16_t)((rad < 0.0 ? rad + 2.0*M_PI: rad) * rad2deg);
627  return transformations[deg];
628  };
629 
630  RotationLUT() : rad2deg( ((double)resolution) / (2.0*M_PI) ), deg2rad( (2.0*M_PI) / ((double)resolution) )
631  {
632  transformations.resize(resolution);
633  for(unsigned i = 0; i < resolution; i++)
634  transformations[i] = Eigen::Transform<T,3,Eigen::Affine>(Eigen::AngleAxis<T>((double)i * deg2rad, Eigen::Matrix<T,3,1>::Unit(unit_axis)));
635  }
636  virtual ~RotationLUT() {}
637 
638  private:
639  double rad2deg;
640  double deg2rad;
641  std::vector< Eigen::Transform<T,3,Eigen::Affine>, Eigen::aligned_allocator< Eigen::Transform<T,3,Eigen::Affine> > > transformations;
642  };
643 };
644 
645 }} // namespaces
646 
647 #endif
Definition: DepthMap.hpp:42
const Eigen::Map< DepthMatrixConst > DepthMatrixMapConst
Definition: DepthMap.hpp:37
bool isMeasurementValid(uint32_t v_index, uint32_t h_index) const
Definition: DepthMap.cpp:68
const Eigen::Matrix< scalar, Eigen::Dynamic, Eigen::Dynamic, Eigen::DontAlign|Eigen::RowMajor > DepthMatrixConst
Definition: DepthMap.hpp:35
Definition: DepthMap.hpp:50
bool isIndexValid(size_t index) const
Definition: DepthMap.cpp:60
float scalar
Definition: DepthMap.hpp:32
double computeResolution(const std::vector< double > &interval, uint32_t elements, PROJECTION_TYPE projection) const
Definition: DepthMap.hpp:588
void computeRotations(std::vector< Eigen::Transform< T, 3, Eigen::Affine >, Eigen::aligned_allocator< Eigen::Transform< T, 3, Eigen::Affine > > > &rotations, const std::vector< base::Angle > &angles, UNIT_AXIS axis, bool use_lut=false) const
Definition: DepthMap.hpp:551
PROJECTION_TYPE
Definition: DepthMap.hpp:47
void convertDepthMapToPointCloud(std::vector< T > &point_cloud, const std::vector< Eigen::Transform< typename T::Scalar, 3, Eigen::Affine >, Eigen::aligned_allocator< Eigen::Transform< typename T::Scalar, 3, Eigen::Affine > > > &transformations, bool use_lut=false, bool skip_invalid_measurements=true, bool apply_transforms_vertically=true) const
Definition: DepthMap.hpp:341
Definition: DepthMap.hpp:57
std::vector< scalar > distances
Definition: DepthMap.hpp:124
static double normalizeRad(double rad)
Definition: Angle.hpp:75
void reset()
Definition: DepthMap.cpp:7
DEPTH_MEASUREMENT_STATE
Definition: DepthMap.hpp:39
Definition: Time.hpp:11
Definition: DepthMap.hpp:49
void convertSingleRow(std::vector< T > &point_cloud, unsigned int row, const Eigen::Transform< typename T::Scalar, 3, Eigen::Affine > &row2column, const std::vector< Eigen::Transform< typename T::Scalar, 3, Eigen::Affine >, Eigen::aligned_allocator< Eigen::Transform< typename T::Scalar, 3, Eigen::Affine > > > &columns2pointcloud, const Eigen::Transform< typename T::Scalar, 3, Eigen::Affine > &pointcloud2world, bool skip_invalid_measurements) const
Definition: DepthMap.hpp:398
std::vector< base::Time > timestamps
Definition: DepthMap.hpp:71
uint32_t vertical_size
Definition: DepthMap.hpp:114
void convertDepthMapToPointCloud(std::vector< T > &point_cloud, bool use_lut=false, bool skip_invalid_measurements=true) const
Definition: DepthMap.hpp:201
size_t getIndex(uint32_t v_index, uint32_t h_index) const
Definition: DepthMap.cpp:83
std::vector< double > vertical_interval
Definition: DepthMap.hpp:97
Definition: DepthMap.hpp:29
boost::uint32_t uint32_t
Definition: DepthMap.hpp:33
static Angle fromRad(double rad)
Definition: Angle.hpp:85
UNIT_AXIS
Definition: DepthMap.hpp:53
DepthMatrixMap getDistanceMatrixMap()
Definition: DepthMap.cpp:20
uint32_t horizontal_size
Definition: DepthMap.hpp:117
Definition: LinearAngular6DCommand.hpp:8
bool checkSizeConfig() const
Definition: DepthMap.cpp:88
base::Time time
Definition: DepthMap.hpp:65
Eigen::Map< DepthMatrix > DepthMatrixMap
Definition: DepthMap.hpp:36
void computeLocalTransformations(std::vector< Eigen::Transform< T, 3, Eigen::Affine >, Eigen::aligned_allocator< Eigen::Transform< T, 3, Eigen::Affine > > > &rows2column, std::vector< Eigen::Transform< T, 3, Eigen::Affine >, Eigen::aligned_allocator< Eigen::Transform< T, 3, Eigen::Affine > > > &columns2pointcloud, bool use_lut=false) const
Definition: DepthMap.hpp:426
Eigen::Matrix< scalar, Eigen::Dynamic, Eigen::Dynamic, Eigen::DontAlign|Eigen::RowMajor > DepthMatrix
Definition: DepthMap.hpp:34
DepthMatrixMapConst getDistanceMatrixMapConst() const
Definition: DepthMap.cpp:25
Definition: DepthMap.hpp:55
DepthMap()
Definition: DepthMap.hpp:133
DEPTH_MEASUREMENT_STATE getMeasurementState(uint32_t v_index, uint32_t h_index) const
Definition: DepthMap.cpp:38
Definition: DepthMap.hpp:43
DEPTH_MEASUREMENT_STATE getIndexState(size_t index) const
Definition: DepthMap.cpp:30
PROJECTION_TYPE horizontal_projection
Definition: DepthMap.hpp:83
std::vector< double > horizontal_interval
Definition: DepthMap.hpp:111
std::vector< scalar > remissions
Definition: DepthMap.hpp:131
PROJECTION_TYPE vertical_projection
Definition: DepthMap.hpp:77
void convertDepthMapToPointCloud(std::vector< T > &point_cloud, const Eigen::Transform< typename T::Scalar, 3, Eigen::Affine > &transformation, bool use_lut=false, bool skip_invalid_measurements=true) const
Definition: DepthMap.hpp:223
Definition: DepthMap.hpp:56
void convertDepthMapToPointCloud(std::vector< T > &point_cloud, const Eigen::Transform< typename T::Scalar, 3, Eigen::Affine > &first_transformation, const Eigen::Transform< typename T::Scalar, 3, Eigen::Affine > &last_transformation, bool use_lut=false, bool skip_invalid_measurements=true, bool apply_transforms_vertically=true) const
Definition: DepthMap.hpp:264