Apollo 11.0
自动驾驶开放平台
apollo::perception::algorithm::VoxelGridXY< T > 模板类 参考

#include <i_struct_s.h>

apollo::perception::algorithm::VoxelGridXY< T > 的协作图:

Public 成员函数

 VoxelGridXY ()
 
 VoxelGridXY (unsigned int nr_voxel_x, unsigned int nr_voxel_y, T spatial_bound_x_min, T spatial_bound_x_max, T spatial_bound_y_min, T spatial_bound_y_max, T spatial_bound_z_min, T spatial_bound_z_max)
 
VoxelGridXY & operator= (const VoxelGridXY< T > &vg)
 
void CleanUp ()
 
 ~VoxelGridXY ()
 
bool Alloc (unsigned int nr_voxel_x, unsigned int nr_voxel_y, T spatial_bound_x_min, T spatial_bound_x_max, T spatial_bound_y_min, T spatial_bound_y_max, T spatial_bound_z_min, T spatial_bound_z_max)
 
bool Set (const T *data, const int *semantic_data, unsigned int nr_points, unsigned int nr_point_element)
 
bool SetS (const float *data, const int *semantic_data, unsigned int nr_points, unsigned int nr_point_element)
 
bool Set (const T *data, const int *semantic_data, unsigned int nr_points, unsigned int nr_point_element, unsigned int nr_voxel_x, unsigned int nr_voxel_y, T spatial_bound_x_min, T spatial_bound_x_max, T spatial_bound_y_min, T spatial_bound_y_max, T spatial_bound_z_min, T spatial_bound_z_max, bool force_bound=true)
 
bool Initialized () const
 
unsigned int NrVoxel () const
 
unsigned int NrVoxelX () const
 
unsigned int NrVoxelY () const
 
unsigned int NrVoxelZ () const
 
unsigned int NrPoints () const
 
unsigned int NrPointElement () const
 
unsigned int NrIndexedPoints () const
 
std::vector< Voxel< T > > & GetVoxels ()
 
const std::vector< Voxel< T > > & GetConstVoxels () const
 
void SetVoxels (const std::vector< Voxel< T > > &voxels)
 
bool GetGridDimension (T *dim_min_x, T *dim_max_x, T *dim_min_y, T *dim_max_y, T *dim_min_z, T *dim_max_z) const
 
void SetGridDimension (T dim_min_x, T dim_max_x, T dim_min_y, T dim_max_y, T dim_min_z, T dim_max_z)
 
bool GetVoxelDimension (T *voxel_width_x, T *voxel_width_y, T *voxel_width_z) const
 
void SetVoxelDimension (T voxel_width_x, T voxel_width_y, T voxel_width_z)
 
void SetNrPoints (unsigned int nr_points)
 
void SetNrPointElement (unsigned int nr_point_element)
 
void SetNrVoxel (unsigned int nr_voxel_x, unsigned int nr_voxel_y, unsigned int nr_voxel_z)
 
void SetPointCloudsData (const T *data)
 
void SetSematicValueData (const int *data)
 
void SetInitialized (bool initialized)
 
int WhichVoxel (T x, T y, T z) const
 
bool GetVoxelCoordinateXY (T x, T y, int *row, int *col) const
 
Voxel< T > & operator[] (unsigned int i)
 
const Voxel< T > & operator[] (unsigned int i) const
 
Voxel< T > & operator[] (int i)
 
const Voxel< T > & operator[] (int i) const
 
Voxel< T > & operator() (unsigned int iy, unsigned int ix)
 
const Voxel< T > & operator() (unsigned int iy, unsigned int ix) const
 
T * Data ()
 
const T * const_data () const
 
int * SemanticData ()
 
const int * const_semantic_data () const
 

详细描述

template<typename T>
class apollo::perception::algorithm::VoxelGridXY< T >

在文件 i_struct_s.h 第 294 行定义.

构造及析构函数说明

◆ VoxelGridXY() [1/2]

template<typename T >
apollo::perception::algorithm::VoxelGridXY< T >::VoxelGridXY ( )

在文件 i_struct_s.h 第 509 行定义.

510 : nr_points_(0),
511 nr_point_element_(0),
512 nr_voxel_x_(0),
513 nr_voxel_y_(0),
514 nr_voxel_z_(1),
515 data_(nullptr),
516 semantic_data_(nullptr),
517 initialized_(false),
518 mem_aligned16_f32_(nullptr),
519 mem_aligned16_i32_(nullptr) {
520 IZero2(dim_x_);
521 IZero2(dim_y_);
522 IZero2(dim_z_);
523 IZero3(voxel_dim_);
524 AllocAlignedMemory();
525}

◆ VoxelGridXY() [2/2]

template<typename T >
apollo::perception::algorithm::VoxelGridXY< T >::VoxelGridXY ( unsigned int  nr_voxel_x,
unsigned int  nr_voxel_y,
T  spatial_bound_x_min,
T  spatial_bound_x_max,
T  spatial_bound_y_min,
T  spatial_bound_y_max,
T  spatial_bound_z_min,
T  spatial_bound_z_max 
)

在文件 i_struct_s.h 第 542 行定义.

545 {
546 Alloc(nr_voxel_x, nr_voxel_y, spatial_bound_x_min, spatial_bound_x_max,
547 spatial_bound_y_min, spatial_bound_y_max, spatial_bound_z_min,
548 spatial_bound_z_max);
549 AllocAlignedMemory();
550 initialized_ = false;
551}
bool Alloc(unsigned int nr_voxel_x, unsigned int nr_voxel_y, T spatial_bound_x_min, T spatial_bound_x_max, T spatial_bound_y_min, T spatial_bound_y_max, T spatial_bound_z_min, T spatial_bound_z_max)
Definition i_struct_s.h:645

◆ ~VoxelGridXY()

template<typename T >
apollo::perception::algorithm::VoxelGridXY< T >::~VoxelGridXY ( )
inline

在文件 i_struct_s.h 第 329 行定义.

329 {
330 IFreeAligned<float>(&mem_aligned16_f32_);
331 IFreeAligned<int>(&mem_aligned16_i32_);
332 CleanUp();
333 }

成员函数说明

◆ Alloc()

template<typename T >
bool apollo::perception::algorithm::VoxelGridXY< T >::Alloc ( unsigned int  nr_voxel_x,
unsigned int  nr_voxel_y,
T  spatial_bound_x_min,
T  spatial_bound_x_max,
T  spatial_bound_y_min,
T  spatial_bound_y_max,
T  spatial_bound_z_min,
T  spatial_bound_z_max 
)

在文件 i_struct_s.h 第 645 行定义.

648 {
649 if (!nr_voxel_x || !nr_voxel_y) {
650 initialized_ = false;
651 return initialized_;
652 }
653 nr_voxel_x_ = nr_voxel_x;
654 nr_voxel_y_ = nr_voxel_y;
655
656 unsigned int i, j, k, n = 0;
657 unsigned int nr_voxel_xy = (nr_voxel_x_ * nr_voxel_y_);
658 unsigned int nr_voxel = nr_voxel_xy;
659
660 T vx, vy, vz, voxel_width_x, voxel_width_y, voxel_width_z;
661
662 voxels_.clear();
663 voxels_.resize(nr_voxel);
664
665 // voxel grid dimesion is forced to be the manual input
666 dim_x_[0] = spatial_bound_x_min;
667 dim_x_[1] = spatial_bound_x_max;
668
669 dim_y_[0] = spatial_bound_y_min;
670 dim_y_[1] = spatial_bound_y_max;
671
672 dim_z_[0] = spatial_bound_z_min;
673 dim_z_[1] = spatial_bound_z_max;
674
675 T span_x = (dim_x_[1] - dim_x_[0]);
676 T span_y = (dim_y_[1] - dim_y_[0]);
677 T span_z = (dim_z_[1] - dim_z_[0]);
678
679 assert(span_x > 0 && span_y > 0 && span_z > 0);
680
681 voxel_dim_[0] = voxel_width_x = IDiv(span_x, static_cast<int>(nr_voxel_x_));
682 voxel_dim_[1] = voxel_width_y = IDiv(span_y, static_cast<int>(nr_voxel_y_));
683 voxel_dim_[2] = voxel_width_z = span_z;
684
685 std::vector<T> vxs(nr_voxel_x_);
686
687 vxs[0] = dim_x_[0];
688 for (i = 1; i < nr_voxel_x_; i++) {
689 vxs[i] = vxs[i - 1] + voxel_width_x;
690 }
691
692 vy = dim_y_[0];
693 vz = dim_z_[0];
694
695 for (j = 0; j < nr_voxel_y_; j++) {
696 for (k = 0; k < nr_voxel_x_; k++) {
697 vx = vxs[k];
698 voxels_[n++].Init(vx, vy, vz, voxel_width_x, voxel_width_y, voxel_width_z,
699 static_cast<int>(k), static_cast<int>(j), 0);
700 }
701 vy += voxel_width_y;
702 }
703
704 // pre-Alloc capacaity for indices_ vector - speed-up the code slightly
705 Reserve();
706 return (true);
707}
float IDiv(float a, float b)
Definition i_basic.h:35

◆ CleanUp()

template<typename T >
void apollo::perception::algorithm::VoxelGridXY< T >::CleanUp ( )

在文件 i_struct_s.h 第 528 行定义.

528 {
529 initialized_ = false;
530 data_ = nullptr;
531 semantic_data_ = nullptr;
532 nr_points_ = nr_point_element_ = nr_voxel_x_ = nr_voxel_y_ = 0;
533 nr_voxel_z_ = 1;
534 IZero2(dim_x_);
535 IZero2(dim_y_);
536 IZero2(dim_z_);
537 IZero3(voxel_dim_);
538 voxels_.clear();
539}

◆ const_data()

template<typename T >
const T * apollo::perception::algorithm::VoxelGridXY< T >::const_data ( ) const
inline

在文件 i_struct_s.h 第 483 行定义.

483{ return (data_); }

◆ const_semantic_data()

template<typename T >
const int * apollo::perception::algorithm::VoxelGridXY< T >::const_semantic_data ( ) const
inline

在文件 i_struct_s.h 第 487 行定义.

487{ return (semantic_data_); }

◆ Data()

template<typename T >
T * apollo::perception::algorithm::VoxelGridXY< T >::Data ( )
inline

在文件 i_struct_s.h 第 481 行定义.

481{ return (data_); }

◆ GetConstVoxels()

template<typename T >
const std::vector< Voxel< T > > & apollo::perception::algorithm::VoxelGridXY< T >::GetConstVoxels ( ) const
inline

在文件 i_struct_s.h 第 372 行定义.

372{ return voxels_; }

◆ GetGridDimension()

template<typename T >
bool apollo::perception::algorithm::VoxelGridXY< T >::GetGridDimension ( T *  dim_min_x,
T *  dim_max_x,
T *  dim_min_y,
T *  dim_max_y,
T *  dim_min_z,
T *  dim_max_z 
) const
inline

在文件 i_struct_s.h 第 378 行定义.

379 {
380 if (!initialized_) {
381 dim_min_x = dim_max_x = dim_min_y = dim_max_y = dim_min_z = dim_max_z =
382 static_cast<T>(0);
383 return (false);
384 }
385 *dim_min_x = dim_x_[0];
386 *dim_max_x = dim_x_[1];
387 *dim_min_y = dim_y_[0];
388 *dim_max_y = dim_y_[1];
389 *dim_min_z = dim_z_[0];
390 *dim_max_z = dim_z_[1];
391 return (true);
392 }

◆ GetVoxelCoordinateXY()

template<typename T >
bool apollo::perception::algorithm::VoxelGridXY< T >::GetVoxelCoordinateXY ( T  x,
T  y,
int *  row,
int *  col 
) const

在文件 i_struct_s.h 第 634 行定义.

634 {
635 if (x < dim_x_[0] || x > dim_x_[1] || y < dim_y_[0] || y > dim_y_[1]) {
636 return false; // points that are outside the defined BBOX are ignored
637 }
638
639 *col = static_cast<int>((x - dim_x_[0]) / voxel_dim_[0]);
640 *row = static_cast<int>((y - dim_y_[0]) / voxel_dim_[1]);
641 return true;
642}

◆ GetVoxelDimension()

template<typename T >
bool apollo::perception::algorithm::VoxelGridXY< T >::GetVoxelDimension ( T *  voxel_width_x,
T *  voxel_width_y,
T *  voxel_width_z 
) const
inline

在文件 i_struct_s.h 第 404 行定义.

405 {
406 if (!initialized_) {
407 *voxel_width_x = *voxel_width_y = *voxel_width_z = static_cast<T>(0);
408 return (false);
409 }
410 *voxel_width_x = voxel_dim_[0];
411 *voxel_width_y = voxel_dim_[1];
412 *voxel_width_z = voxel_dim_[2];
413 return (true);
414 }

◆ GetVoxels()

template<typename T >
std::vector< Voxel< T > > & apollo::perception::algorithm::VoxelGridXY< T >::GetVoxels ( )
inline

在文件 i_struct_s.h 第 370 行定义.

370{ return voxels_; }

◆ Initialized()

template<typename T >
bool apollo::perception::algorithm::VoxelGridXY< T >::Initialized ( ) const
inline

在文件 i_struct_s.h 第 354 行定义.

354{ return initialized_; }

◆ NrIndexedPoints()

template<typename T >
unsigned int apollo::perception::algorithm::VoxelGridXY< T >::NrIndexedPoints ( ) const

在文件 i_struct_s.h 第 1049 行定义.

1049 {
1050 if (!initialized_) {
1051 return 0;
1052 }
1053 unsigned int i, n = 0;
1054 for (i = 0; i < voxels_.size(); ++i) {
1055 n += voxels_[i].indices_.size();
1056 }
1057 return n;
1058}

◆ NrPointElement()

template<typename T >
unsigned int apollo::perception::algorithm::VoxelGridXY< T >::NrPointElement ( ) const
inline

在文件 i_struct_s.h 第 366 行定义.

366{ return nr_point_element_; }

◆ NrPoints()

template<typename T >
unsigned int apollo::perception::algorithm::VoxelGridXY< T >::NrPoints ( ) const
inline

在文件 i_struct_s.h 第 364 行定义.

364{ return nr_points_; }

◆ NrVoxel()

template<typename T >
unsigned int apollo::perception::algorithm::VoxelGridXY< T >::NrVoxel ( ) const
inline

在文件 i_struct_s.h 第 356 行定义.

356{ return (unsigned int)voxels_.size(); }

◆ NrVoxelX()

template<typename T >
unsigned int apollo::perception::algorithm::VoxelGridXY< T >::NrVoxelX ( ) const
inline

在文件 i_struct_s.h 第 358 行定义.

358{ return nr_voxel_x_; }

◆ NrVoxelY()

template<typename T >
unsigned int apollo::perception::algorithm::VoxelGridXY< T >::NrVoxelY ( ) const
inline

在文件 i_struct_s.h 第 360 行定义.

360{ return nr_voxel_y_; }

◆ NrVoxelZ()

template<typename T >
unsigned int apollo::perception::algorithm::VoxelGridXY< T >::NrVoxelZ ( ) const
inline

在文件 i_struct_s.h 第 362 行定义.

362{ return (1); }

◆ operator()() [1/2]

template<typename T >
Voxel< T > & apollo::perception::algorithm::VoxelGridXY< T >::operator() ( unsigned int  iy,
unsigned int  ix 
)
inline

在文件 i_struct_s.h 第 467 行定义.

467 {
468 assert(iy < nr_voxel_y_ && ix < nr_voxel_x_);
469 unsigned int i = nr_voxel_x_ * iy + ix;
470 assert(i < voxels_.size());
471 return (voxels_[i]);
472 }

◆ operator()() [2/2]

template<typename T >
const Voxel< T > & apollo::perception::algorithm::VoxelGridXY< T >::operator() ( unsigned int  iy,
unsigned int  ix 
) const
inline

在文件 i_struct_s.h 第 474 行定义.

474 {
475 assert(iy < nr_voxel_y_ && ix < nr_voxel_x_);
476 unsigned int i = nr_voxel_x_ * iy + ix;
477 assert(i < voxels_.size());
478 return (voxels_[i]);
479 }

◆ operator=()

template<typename T >
VoxelGridXY & apollo::perception::algorithm::VoxelGridXY< T >::operator= ( const VoxelGridXY< T > &  vg)
inline

在文件 i_struct_s.h 第 305 行定义.

305 {
306 if (this != &vg) {
307 this->initialized_ = vg.Initialized();
308 this->nr_points_ = vg.NrPoints();
309 this->nr_point_element_ = vg.NrPointElement();
310 this->nr_voxel_x_ = vg.NrVoxelX();
311 this->nr_voxel_y_ = vg.NrVoxelY();
312 this->nr_voxel_z_ = vg.NrVoxelZ();
313 this->data_ = vg.const_data();
314 this->semantic_data_ = vg.const_semantic_data();
315 vg.GetGridDimension(&this->dim_x_[0], &this->dim_x_[1], &this->dim_y_[0],
316 &this->dim_y_[1], &this->dim_z_[0], &this->dim_z_[1]);
317 this->voxels_.resize(vg.NrVoxel());
318 for (unsigned int i = 0; i < vg.NrVoxel(); ++i) {
319 this->voxels_[i] = vg[i];
320 }
321
322 this->AllocAlignedMemory();
323 }
324 return (*this);
325 }

◆ operator[]() [1/4]

template<typename T >
Voxel< T > & apollo::perception::algorithm::VoxelGridXY< T >::operator[] ( int  i)
inline

在文件 i_struct_s.h 第 458 行定义.

458 {
459 assert(i >= 0 && i < static_cast<int>(voxels_.size()));
460 return (voxels_[i]);
461 }

◆ operator[]() [2/4]

template<typename T >
const Voxel< T > & apollo::perception::algorithm::VoxelGridXY< T >::operator[] ( int  i) const
inline

在文件 i_struct_s.h 第 462 行定义.

462 {
463 assert(i >= 0 && i < static_cast<int>(voxels_.size()));
464 return (voxels_[i]);
465 }

◆ operator[]() [3/4]

template<typename T >
Voxel< T > & apollo::perception::algorithm::VoxelGridXY< T >::operator[] ( unsigned int  i)
inline

在文件 i_struct_s.h 第 448 行定义.

448 {
449 assert(i >= 0 && i < voxels_.size());
450 return (voxels_[i]);
451 }

◆ operator[]() [4/4]

template<typename T >
const Voxel< T > & apollo::perception::algorithm::VoxelGridXY< T >::operator[] ( unsigned int  i) const
inline

在文件 i_struct_s.h 第 453 行定义.

453 {
454 assert(i >= 0 && i < voxels_.size());
455 return (voxels_[i]);
456 }

◆ SemanticData()

template<typename T >
int * apollo::perception::algorithm::VoxelGridXY< T >::SemanticData ( )
inline

在文件 i_struct_s.h 第 485 行定义.

485{ return (semantic_data_); }

◆ Set() [1/2]

template<typename T >
bool apollo::perception::algorithm::VoxelGridXY< T >::Set ( const T *  data,
const int *  semantic_data,
unsigned int  nr_points,
unsigned int  nr_point_element 
)

在文件 i_struct_s.h 第 710 行定义.

711 {
712 if (!data || !nr_points || !nr_point_element || !nr_voxel_x_ ||
713 !semantic_data || !nr_voxel_y_ || nr_voxel_z_ != 1) {
714 initialized_ = false;
715 return initialized_;
716 }
717
718 data_ = data;
719 semantic_data_ = semantic_data;
720 nr_points_ = nr_points;
721 nr_point_element_ = nr_point_element;
722
723 unsigned int nr_voxel = (nr_voxel_x_ * nr_voxel_y_);
724 unsigned int i, nd = 0;
725 int id, n = 0;
726
727 T voxel_width_x_rec = IRec(voxel_dim_[0]);
728 T voxel_width_y_rec = IRec(voxel_dim_[1]);
729
730 T bound_x_min = dim_x_[0];
731 T bound_x_max = dim_x_[1];
732 T bound_y_min = dim_y_[0];
733 T bound_y_max = dim_y_[1];
734 T bound_z_min = dim_z_[0];
735 T bound_z_max = dim_z_[1];
736
737 // clear the old index buffer
738 for (i = 0; i < nr_voxel; ++i) {
739 voxels_[i].indices_.clear();
740 }
741
742 // Assign point indices
743 for (; n < static_cast<int>(nr_points_); n++, nd += nr_point_element_) {
745 data_ + nd, bound_x_min, bound_x_max, bound_y_min, bound_y_max,
746 bound_z_min, bound_z_max, voxel_width_x_rec, voxel_width_y_rec,
747 static_cast<int>(nr_voxel_x_), static_cast<int>(nr_voxel_y_));
748
749 if (id >= 0) {
750 voxels_[id].indices_.push_back(n);
751 }
752 }
753
754 initialized_ = true;
755 return (initialized_);
756}
int IAssignPointToVoxel(const T *data, T bound_x_min, T bound_x_max, T bound_y_min, T bound_y_max, T bound_z_min, T bound_z_max, T voxel_width_x_rec, T voxel_width_y_rec, int nr_voxel_x, int nr_voxel_y)
Definition i_struct_s.h:160

◆ Set() [2/2]

template<typename T >
bool apollo::perception::algorithm::VoxelGridXY< T >::Set ( const T *  data,
const int *  semantic_data,
unsigned int  nr_points,
unsigned int  nr_point_element,
unsigned int  nr_voxel_x,
unsigned int  nr_voxel_y,
T  spatial_bound_x_min,
T  spatial_bound_x_max,
T  spatial_bound_y_min,
T  spatial_bound_y_max,
T  spatial_bound_z_min,
T  spatial_bound_z_max,
bool  force_bound = true 
)

在文件 i_struct_s.h 第 915 行定义.

919 {
920 if (!data || !nr_points || !nr_point_element || !nr_voxel_x || !nr_voxel_y) {
921 initialized_ = false;
922 return initialized_;
923 }
924
925 data_ = data;
926 semantic_data_ = semantic_data;
927 nr_points_ = nr_points;
928 nr_point_element_ = nr_point_element;
929 nr_voxel_x_ = nr_voxel_x;
930 nr_voxel_y_ = nr_voxel_y;
931 nr_voxel_z_ = 1;
932
933 unsigned int i, j, k, n = 0, nd = 0;
934 unsigned int nr_voxel_xy = (nr_voxel_x_ * nr_voxel_y_);
935 unsigned int nr_voxel = nr_voxel_xy;
936 unsigned int nr_voxel_xm1 = nr_voxel_x - 1;
937 unsigned int nr_voxel_ym1 = nr_voxel_y - 1;
938 T vx, vy, vz, x, y, z;
939 T voxel_width_x, voxel_width_y, voxel_width_z;
940
941 voxels_.clear();
942 voxels_.resize(nr_voxel);
943
944 // if force_bound then the voxel grid dimesion is forced to be the manual
945 // * input
946 if (force_bound) {
947 dim_x_[0] = spatial_bound_x_min;
948 dim_x_[1] = spatial_bound_x_max;
949
950 dim_y_[0] = spatial_bound_y_min;
951 dim_y_[1] = spatial_bound_y_max;
952
953 dim_z_[0] = spatial_bound_z_min;
954 dim_z_[1] = spatial_bound_z_max;
955 } else {
957 data_, nr_points_, 0, nr_point_element_, &dim_x_[0], &dim_x_[1],
958 &dim_y_[0], &dim_y_[1], &dim_z_[0], &dim_z_[1], spatial_bound_x_min,
959 spatial_bound_x_max, spatial_bound_y_min, spatial_bound_y_max,
960 spatial_bound_z_min, spatial_bound_z_max);
961 }
962
963 T dim_x_min = dim_x_[0];
964 T dim_x_max = dim_x_[1];
965
966 T dim_y_min = dim_y_[0];
967 T dim_y_max = dim_y_[1];
968
969 T dim_z_min = dim_z_[0];
970 T dim_z_max = dim_z_[1];
971
972 T span_x = (dim_x_max - dim_x_min);
973 T span_y = (dim_y_max - dim_y_min);
974 T span_z = (dim_z_max - dim_z_min);
975
976 assert(span_x > 0 && span_y > 0 && span_z > 0);
977
978 voxel_dim_[0] = voxel_width_x = IDiv(span_x, static_cast<int>(nr_voxel_x_));
979 voxel_dim_[1] = voxel_width_y = IDiv(span_y, static_cast<int>(nr_voxel_y_));
980 voxel_dim_[2] = voxel_width_z = span_z;
981
982 T voxel_width_x_rec = IRec(voxel_dim_[0]);
983 T voxel_width_y_rec = IRec(voxel_dim_[1]);
984
985 std::vector<T> vxs(nr_voxel_x_);
986 vxs[0] = dim_x_[0];
987
988 for (i = 1; i < nr_voxel_x_; i++) {
989 vxs[i] = vxs[i - 1] + voxel_width_x;
990 }
991
992 vy = dim_y_[0];
993 vz = dim_z_[0];
994
995 for (j = 0; j < nr_voxel_y_; j++) {
996 for (k = 0; k < nr_voxel_x_; k++) {
997 vx = vxs[k];
998 voxels_[n++].init(vx, vy, vz, voxel_width_x, voxel_width_y, voxel_width_z,
999 static_cast<int>(k), static_cast<int>(j), 0);
1000 }
1001 vy += voxel_width_y;
1002 }
1003
1004 // Assign point indices
1005 for (; n < nr_points_; n++, nd += nr_point_element_) {
1006 x = data_[nd];
1007 y = data_[nd + 1];
1008 z = data_[nd + 2];
1009
1010 if (x < dim_x_min || x > dim_x_max || y < dim_y_min || y > dim_y_max ||
1011 z < dim_z_min || z > dim_z_max) {
1012 // points that are outside the defined BBOX are ignored
1013 continue;
1014 }
1015
1016 k = IMax((unsigned int)0,
1017 IMin(nr_voxel_xm1,
1018 (unsigned int)((x - dim_x_min) * voxel_width_x_rec)));
1019 j = IMax((unsigned int)0,
1020 IMin(nr_voxel_ym1,
1021 (unsigned int)((y - dim_y_min) * voxel_width_y_rec)));
1022 i = nr_voxel_x * j + k;
1023
1024 assert(i < nr_voxel);
1025 voxels_[i].indices_.push_back(n);
1026 }
1027 initialized_ = true;
1028 return initialized_;
1029}
void IGetPointcloudsDimWBound(const T *threeds, int n, int start_offset, int element_size, T *dim_min_x, T *dim_max_x, T *dim_min_y, T *dim_max_y, T *dim_min_z, T *dim_max_z, T bound_min_x, T bound_max_x, T bound_min_y, T bound_max_y, T bound_min_z, T bound_max_z)
Definition i_util.h:27

◆ SetGridDimension()

template<typename T >
void apollo::perception::algorithm::VoxelGridXY< T >::SetGridDimension ( T  dim_min_x,
T  dim_max_x,
T  dim_min_y,
T  dim_max_y,
T  dim_min_z,
T  dim_max_z 
)
inline

在文件 i_struct_s.h 第 394 行定义.

395 {
396 dim_x_[0] = dim_min_x;
397 dim_x_[1] = dim_max_x;
398 dim_y_[0] = dim_min_y;
399 dim_y_[1] = dim_max_y;
400 dim_z_[0] = dim_min_z;
401 dim_z_[1] = dim_max_z;
402 }

◆ SetInitialized()

template<typename T >
void apollo::perception::algorithm::VoxelGridXY< T >::SetInitialized ( bool  initialized)
inline

在文件 i_struct_s.h 第 439 行定义.

439{ initialized_ = initialized; }

◆ SetNrPointElement()

template<typename T >
void apollo::perception::algorithm::VoxelGridXY< T >::SetNrPointElement ( unsigned int  nr_point_element)
inline

在文件 i_struct_s.h 第 424 行定义.

424 {
425 nr_point_element_ = nr_point_element;
426 }

◆ SetNrPoints()

template<typename T >
void apollo::perception::algorithm::VoxelGridXY< T >::SetNrPoints ( unsigned int  nr_points)
inline

在文件 i_struct_s.h 第 422 行定义.

422{ nr_points_ = nr_points; }

◆ SetNrVoxel()

template<typename T >
void apollo::perception::algorithm::VoxelGridXY< T >::SetNrVoxel ( unsigned int  nr_voxel_x,
unsigned int  nr_voxel_y,
unsigned int  nr_voxel_z 
)
inline

在文件 i_struct_s.h 第 428 行定义.

429 {
430 nr_voxel_x_ = nr_voxel_x;
431 nr_voxel_y_ = nr_voxel_y;
432 nr_voxel_z_ = nr_voxel_z;
433 }

◆ SetPointCloudsData()

template<typename T >
void apollo::perception::algorithm::VoxelGridXY< T >::SetPointCloudsData ( const T *  data)
inline

在文件 i_struct_s.h 第 435 行定义.

435{ data_ = data; }

◆ SetS()

template<typename T >
bool apollo::perception::algorithm::VoxelGridXY< T >::SetS ( const float *  data,
const int *  semantic_data,
unsigned int  nr_points,
unsigned int  nr_point_element 
)

在文件 i_struct_s.h 第 759 行定义.

760 {
761 if (!data || !nr_points || !nr_point_element || !nr_voxel_x_ ||
762 !semantic_data || !nr_voxel_y_ || nr_voxel_z_ != 1) {
763 initialized_ = false;
764 return initialized_;
765 }
766
767 data_ = data;
768 semantic_data_ = semantic_data;
769 nr_points_ = nr_points;
770 nr_point_element_ = nr_point_element;
771
772 unsigned int nr_voxel = (nr_voxel_x_ * nr_voxel_y_);
773 unsigned int i, n = 0;
774 int id;
775
776 float voxel_width_x_rec = IRec(static_cast<float>(voxel_dim_[0]));
777 float voxel_width_y_rec = IRec(static_cast<float>(voxel_dim_[1]));
778
779 __m128i iv_nr_voxel_x = _mm_setr_epi32(static_cast<int>(nr_voxel_x_), 0,
780 static_cast<int>(nr_voxel_x_), 0);
781 __m128i iv_nr_voxel_x_m1 = _mm_set1_epi32(static_cast<int>(nr_voxel_x_ - 1));
782 __m128i iv_nr_voxel_y_m1 = _mm_set1_epi32(static_cast<int>(nr_voxel_y_ - 1));
783
784 __m128 v_width_x_rec = _mm_set_ps1(voxel_width_x_rec);
785 __m128 v_width_y_rec = _mm_set_ps1(voxel_width_y_rec);
786
787 __m128 v_x_min = _mm_set_ps1(dim_x_[0]);
788 __m128 v_x_max = _mm_set_ps1(dim_x_[1]);
789 __m128 v_y_min = _mm_set_ps1(dim_y_[0]);
790 __m128 v_y_max = _mm_set_ps1(dim_y_[1]);
791 __m128 v_z_min = _mm_set_ps1(dim_z_[0]);
792 __m128 v_z_max = _mm_set_ps1(dim_z_[1]);
793
794 __m128 v_cmp_x, v_cmp_y, v_cmp_z, v_in_roi;
795 v_in_roi = _mm_setr_ps(1.0, 1.0, 1.0, 1.0);
796
797 __m128 v_xs, v_ys, v_zs;
798 __m128i iv_indices, iv_x_indices, iv_y_indices, iv_v_indices_02,
799 iv_v_indices_13;
800
801 for (i = 0; i < nr_voxel; ++i) {
802 voxels_[i].indices_.clear();
803 }
804
805 unsigned int nr_loops = (nr_points >> 2);
806 unsigned int nr_fast_processed = (nr_loops << 2);
807 unsigned int remainder = nr_points - nr_fast_processed;
808
809 unsigned int d1 = nr_point_element;
810 unsigned int d2 = (nr_point_element << 1);
811 unsigned int d3 = d1 + d2;
812 unsigned int d4 = (nr_point_element << 2);
813
814 // xyz are required to be stored in continuous memory
815 const float *cptr_x = data;
816 const float *cptr_y = data + 1;
817 const float *cptr_z = data + 2;
818 const float *cptr_remainder = data + (nr_fast_processed * nr_point_element);
819
820 for (i = 0; i < nr_loops; ++i, n += 4) {
821 // Set memory
822 v_xs = _mm_setr_ps(cptr_x[0], cptr_x[d1], cptr_x[d2], cptr_x[d3]);
823 v_ys = _mm_setr_ps(cptr_y[0], cptr_y[d1], cptr_y[d2], cptr_y[d3]);
824 v_zs = _mm_setr_ps(cptr_z[0], cptr_z[d1], cptr_z[d2], cptr_z[d3]);
825
826 // compare range:
827 v_cmp_x =
828 _mm_and_ps(_mm_cmpge_ps(v_xs, v_x_min), _mm_cmple_ps(v_xs, v_x_max));
829 v_cmp_y =
830 _mm_and_ps(_mm_cmpge_ps(v_ys, v_y_min), _mm_cmple_ps(v_ys, v_y_max));
831 v_cmp_z =
832 _mm_and_ps(_mm_cmpge_ps(v_zs, v_z_min), _mm_cmple_ps(v_zs, v_z_max));
833 v_in_roi = _mm_and_ps(_mm_and_ps(v_cmp_x, v_cmp_y), v_cmp_z);
834
835 // vector operations, cast into signed integers
836 v_xs = _mm_sub_ps(v_xs, v_x_min);
837 v_xs = _mm_mul_ps(v_xs, v_width_x_rec);
838 iv_x_indices = _mm_cvttps_epi32(v_xs); // truncate towards zero
839 iv_x_indices = _mm_min_epi32(iv_nr_voxel_x_m1, iv_x_indices);
840
841 // vector operations, cast into signed integers
842 v_ys = _mm_sub_ps(v_ys, v_y_min);
843 v_ys = _mm_mul_ps(v_ys, v_width_y_rec);
844 iv_y_indices = _mm_cvttps_epi32(v_ys); // truncate towards zero
845 iv_y_indices = _mm_min_epi32(iv_nr_voxel_y_m1, iv_y_indices);
846
847 iv_v_indices_02 = _mm_mullo_epi32(iv_y_indices, iv_nr_voxel_x);
848 iv_y_indices = _mm_shuffle_epi32(iv_y_indices, _MM_SHUFFLE(2, 3, 0, 1));
849
850 iv_v_indices_13 = _mm_mullo_epi32(iv_y_indices, iv_nr_voxel_x);
851 iv_v_indices_13 =
852 _mm_shuffle_epi32(iv_v_indices_13, _MM_SHUFFLE(2, 3, 0, 1));
853
854 iv_indices = _mm_add_epi32(iv_v_indices_02, iv_v_indices_13);
855 iv_indices = _mm_add_epi32(iv_indices, iv_x_indices);
856
857 // store values from registers to memory
858 // address 16byte-aligned
859 _mm_store_ps(mem_aligned16_f32_, v_in_roi);
860 // address 16byte-aligned
861 _mm_store_si128(reinterpret_cast<__m128i *>(mem_aligned16_i32_),
862 iv_indices);
863
864 if (mem_aligned16_f32_[0] != 0) {
865 voxels_[mem_aligned16_i32_[0]].indices_.push_back(n);
866 }
867 if (mem_aligned16_f32_[1] != 0) {
868 voxels_[mem_aligned16_i32_[1]].indices_.push_back(n + 1);
869 }
870 if (mem_aligned16_f32_[2] != 0) {
871 voxels_[mem_aligned16_i32_[2]].indices_.push_back(n + 2);
872 }
873 if (mem_aligned16_f32_[3] != 0) {
874 voxels_[mem_aligned16_i32_[3]].indices_.push_back(n + 3);
875 }
876 cptr_x += d4;
877 cptr_y += d4;
878 cptr_z += d4;
879 }
880
881 // handling remaining points
882 for (i = 0; i < remainder; i++, n++) {
883 id = IAssignPointToVoxel(cptr_remainder, dim_x_[0], dim_x_[1], dim_y_[0],
884 dim_y_[1], dim_z_[0], dim_z_[1], voxel_width_x_rec,
885 voxel_width_y_rec, static_cast<int>(nr_voxel_x_),
886 static_cast<int>(nr_voxel_y_));
887
888 if (id >= 0) {
889 voxels_[id].indices_.push_back(n);
890 }
891
892 cptr_remainder += nr_point_element;
893 }
894
895 // for (i = 0; i < nr_voxel; ++i) {
896 // voxels_[i].indices_.clear();
897 // }
898 // for (i = 0; i < nr_points; i++, n++) {
899 // float x = data_[nr_point_element_ * i];
900 // float y = data_[nr_point_element_ * i + 1];
901 // float z = data_[nr_point_element_ * i + 2];
902 // id = AssignPointToVoxel(x, y, z, dim_x_[0], dim_x_[1], dim_y_[0], dim_y_[1], dim_z_[0], dim_z_[1],
903 // voxel_width_x_rec, voxel_width_y_rec, static_cast<int>(nr_voxel_x_), static_cast<int>(nr_voxel_y_));
904
905 // if (id >= 0) {
906 // voxels_[id].indices_.push_back(i);
907 // }
908 // }
909
910 initialized_ = true;
911 return (initialized_);
912}
FORCE_INLINE __m128 _mm_sub_ps(__m128 a, __m128 b)
Definition sse2neon.h:2963
FORCE_INLINE void _mm_store_si128(__m128i *p, __m128i a)
Definition sse2neon.h:6110
float32x4_t __m128
Definition sse2neon.h:307
FORCE_INLINE __m128i _mm_add_epi32(__m128i a, __m128i b)
Definition sse2neon.h:3113
FORCE_INLINE __m128 _mm_setr_ps(float w, float z, float y, float x)
Definition sse2neon.h:2629
FORCE_INLINE __m128 _mm_cmpge_ps(__m128 a, __m128 b)
Definition sse2neon.h:1252
FORCE_INLINE __m128i _mm_set1_epi32(int)
Definition sse2neon.h:5378
FORCE_INLINE __m128i _mm_setr_epi32(int i3, int i2, int i1, int i0)
Definition sse2neon.h:5444
FORCE_INLINE __m128 _mm_mul_ps(__m128 a, __m128 b)
Definition sse2neon.h:2299
FORCE_INLINE __m128i _mm_cvttps_epi32(__m128 a)
Definition sse2neon.h:4479
FORCE_INLINE __m128 _mm_cmple_ps(__m128 a, __m128 b)
Definition sse2neon.h:1294
FORCE_INLINE __m128 _mm_set_ps1(float)
Definition sse2neon.h:2544
FORCE_INLINE __m128i _mm_min_epi32(__m128i a, __m128i b)
Definition sse2neon.h:8102
FORCE_INLINE __m128 _mm_and_ps(__m128 a, __m128 b)
Definition sse2neon.h:1183
FORCE_INLINE __m128i _mm_mullo_epi32(__m128i a, __m128i b)
Definition sse2neon.h:8295
#define _MM_SHUFFLE(fp3, fp2, fp1, fp0)
MACRO for shuffle parameter for _mm_shuffle_ps().
Definition sse2neon.h:247
int64x2_t __m128i
Definition sse2neon.h:316
FORCE_INLINE void _mm_store_ps(float *p, __m128 a)
Definition sse2neon.h:2833
#define _mm_shuffle_epi32(a, imm)
Definition sse2neon.h:5524

◆ SetSematicValueData()

template<typename T >
void apollo::perception::algorithm::VoxelGridXY< T >::SetSematicValueData ( const int *  data)
inline

在文件 i_struct_s.h 第 437 行定义.

437{ semantic_data_ = data; }

◆ SetVoxelDimension()

template<typename T >
void apollo::perception::algorithm::VoxelGridXY< T >::SetVoxelDimension ( T  voxel_width_x,
T  voxel_width_y,
T  voxel_width_z 
)
inline

在文件 i_struct_s.h 第 416 行定义.

416 {
417 voxel_dim_[0] = voxel_width_x;
418 voxel_dim_[1] = voxel_width_y;
419 voxel_dim_[2] = voxel_width_z;
420 }

◆ SetVoxels()

template<typename T >
void apollo::perception::algorithm::VoxelGridXY< T >::SetVoxels ( const std::vector< Voxel< T > > &  voxels)
inline

在文件 i_struct_s.h 第 374 行定义.

374 {
375 voxels_.assign(voxels.begin(), voxels.end());
376 }

◆ WhichVoxel()

template<typename T >
int apollo::perception::algorithm::VoxelGridXY< T >::WhichVoxel ( T  x,
T  y,
T  z 
) const

在文件 i_struct_s.h 第 612 行定义.

612 {
613 int j, k;
614 if (!initialized_) {
615 return (-1);
616 }
617
618 if (x < dim_x_[0] || x > dim_x_[1] || y < dim_y_[0] || y > dim_y_[1] ||
619 z < dim_z_[0] || z > dim_z_[1]) {
620 return (-1); // points that are outside the defined BBOX are ignored
621 }
622
623 k = static_cast<int>(IMax(
624 (unsigned int)0,
625 IMin(nr_voxel_x_ - 1, (unsigned int)((x - dim_x_[0]) / voxel_dim_[0]))));
626 j = static_cast<int>(IMax(
627 (unsigned int)0,
628 IMin(nr_voxel_y_ - 1, (unsigned int)((y - dim_y_[0]) / voxel_dim_[1]))));
629 return (nr_voxel_x_ * j + k);
630}

该类的文档由以下文件生成: