Apollo 10.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, unsigned int nr_points, unsigned int nr_point_element)
 
bool SetS (const float *data, unsigned int nr_points, unsigned int nr_point_element)
 
bool Set (const T *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 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
 

详细描述

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 第 500 行定义.

501 : nr_points_(0),
502 nr_point_element_(0),
503 nr_voxel_x_(0),
504 nr_voxel_y_(0),
505 nr_voxel_z_(1),
506 data_(nullptr),
507 initialized_(false),
508 mem_aligned16_f32_(nullptr),
509 mem_aligned16_i32_(nullptr) {
510 IZero2(dim_x_);
511 IZero2(dim_y_);
512 IZero2(dim_z_);
513 IZero3(voxel_dim_);
514 AllocAlignedMemory();
515}

◆ 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 第 531 行定义.

534 {
535 Alloc(nr_voxel_x, nr_voxel_y, spatial_bound_x_min, spatial_bound_x_max,
536 spatial_bound_y_min, spatial_bound_y_max, spatial_bound_z_min,
537 spatial_bound_z_max);
538 AllocAlignedMemory();
539 initialized_ = false;
540}
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:634

◆ ~VoxelGridXY()

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

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

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

成员函数说明

◆ 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 第 634 行定义.

637 {
638 if (!nr_voxel_x || !nr_voxel_y) {
639 initialized_ = false;
640 return initialized_;
641 }
642 nr_voxel_x_ = nr_voxel_x;
643 nr_voxel_y_ = nr_voxel_y;
644
645 unsigned int i, j, k, n = 0;
646 unsigned int nr_voxel_xy = (nr_voxel_x_ * nr_voxel_y_);
647 unsigned int nr_voxel = nr_voxel_xy;
648
649 T vx, vy, vz, voxel_width_x, voxel_width_y, voxel_width_z;
650
651 voxels_.clear();
652 voxels_.resize(nr_voxel);
653
654 // voxel grid dimesion is forced to be the manual input
655 dim_x_[0] = spatial_bound_x_min;
656 dim_x_[1] = spatial_bound_x_max;
657
658 dim_y_[0] = spatial_bound_y_min;
659 dim_y_[1] = spatial_bound_y_max;
660
661 dim_z_[0] = spatial_bound_z_min;
662 dim_z_[1] = spatial_bound_z_max;
663
664 T span_x = (dim_x_[1] - dim_x_[0]);
665 T span_y = (dim_y_[1] - dim_y_[0]);
666 T span_z = (dim_z_[1] - dim_z_[0]);
667
668 assert(span_x > 0 && span_y > 0 && span_z > 0);
669
670 voxel_dim_[0] = voxel_width_x = IDiv(span_x, static_cast<int>(nr_voxel_x_));
671 voxel_dim_[1] = voxel_width_y = IDiv(span_y, static_cast<int>(nr_voxel_y_));
672 voxel_dim_[2] = voxel_width_z = span_z;
673
674 std::vector<T> vxs(nr_voxel_x_);
675
676 vxs[0] = dim_x_[0];
677 for (i = 1; i < nr_voxel_x_; i++) {
678 vxs[i] = vxs[i - 1] + voxel_width_x;
679 }
680
681 vy = dim_y_[0];
682 vz = dim_z_[0];
683
684 for (j = 0; j < nr_voxel_y_; j++) {
685 for (k = 0; k < nr_voxel_x_; k++) {
686 vx = vxs[k];
687 voxels_[n++].Init(vx, vy, vz, voxel_width_x, voxel_width_y, voxel_width_z,
688 static_cast<int>(k), static_cast<int>(j), 0);
689 }
690 vy += voxel_width_y;
691 }
692
693 // pre-Alloc capacaity for indices_ vector - speed-up the code slightly
694 Reserve();
695 return (true);
696}
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 第 518 行定义.

518 {
519 initialized_ = false;
520 data_ = nullptr;
521 nr_points_ = nr_point_element_ = nr_voxel_x_ = nr_voxel_y_ = 0;
522 nr_voxel_z_ = 1;
523 IZero2(dim_x_);
524 IZero2(dim_y_);
525 IZero2(dim_z_);
526 IZero3(voxel_dim_);
527 voxels_.clear();
528}

◆ const_data()

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

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

479{ return (data_); }

◆ Data()

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

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

477{ return (data_); }

◆ GetConstVoxels()

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

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

370{ 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 第 376 行定义.

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

◆ GetVoxelCoordinateXY()

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

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

623 {
624 if (x < dim_x_[0] || x > dim_x_[1] || y < dim_y_[0] || y > dim_y_[1]) {
625 return false; // points that are outside the defined BBOX are ignored
626 }
627
628 *col = static_cast<int>((x - dim_x_[0]) / voxel_dim_[0]);
629 *row = static_cast<int>((y - dim_y_[0]) / voxel_dim_[1]);
630 return true;
631}

◆ 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 第 402 行定义.

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

◆ GetVoxels()

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

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

368{ return voxels_; }

◆ Initialized()

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

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

352{ return initialized_; }

◆ NrIndexedPoints()

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

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

1036 {
1037 if (!initialized_) {
1038 return 0;
1039 }
1040 unsigned int i, n = 0;
1041 for (i = 0; i < voxels_.size(); ++i) {
1042 n += voxels_[i].indices_.size();
1043 }
1044 return n;
1045}

◆ NrPointElement()

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

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

364{ return nr_point_element_; }

◆ NrPoints()

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

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

362{ return nr_points_; }

◆ NrVoxel()

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

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

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

◆ NrVoxelX()

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

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

356{ return nr_voxel_x_; }

◆ NrVoxelY()

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

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

358{ return nr_voxel_y_; }

◆ NrVoxelZ()

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

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

360{ 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 第 463 行定义.

463 {
464 assert(iy < nr_voxel_y_ && ix < nr_voxel_x_);
465 unsigned int i = nr_voxel_x_ * iy + ix;
466 assert(i < voxels_.size());
467 return (voxels_[i]);
468 }

◆ 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 第 470 行定义.

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

◆ 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 vg.GetGridDimension(&this->dim_x_[0], &this->dim_x_[1], &this->dim_y_[0],
315 &this->dim_y_[1], &this->dim_z_[0], &this->dim_z_[1]);
316 this->voxels_.resize(vg.NrVoxel());
317 for (unsigned int i = 0; i < vg.NrVoxel(); ++i) {
318 this->voxels_[i] = vg[i];
319 }
320
321 this->AllocAlignedMemory();
322 }
323 return (*this);
324 }

◆ operator[]() [1/4]

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

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

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

◆ operator[]() [2/4]

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

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

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

◆ operator[]() [3/4]

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

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

444 {
445 assert(i >= 0 && i < voxels_.size());
446 return (voxels_[i]);
447 }

◆ operator[]() [4/4]

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

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

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

◆ Set() [1/2]

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

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

700 {
701 if (!data || !nr_points || !nr_point_element || !nr_voxel_x_ ||
702 !nr_voxel_y_ || nr_voxel_z_ != 1) {
703 initialized_ = false;
704 return initialized_;
705 }
706
707 data_ = data;
708 nr_points_ = nr_points;
709 nr_point_element_ = nr_point_element;
710
711 unsigned int nr_voxel = (nr_voxel_x_ * nr_voxel_y_);
712 unsigned int i, nd = 0;
713 int id, n = 0;
714
715 T voxel_width_x_rec = IRec(voxel_dim_[0]);
716 T voxel_width_y_rec = IRec(voxel_dim_[1]);
717
718 T bound_x_min = dim_x_[0];
719 T bound_x_max = dim_x_[1];
720 T bound_y_min = dim_y_[0];
721 T bound_y_max = dim_y_[1];
722 T bound_z_min = dim_z_[0];
723 T bound_z_max = dim_z_[1];
724
725 // clear the old index buffer
726 for (i = 0; i < nr_voxel; ++i) {
727 voxels_[i].indices_.clear();
728 }
729
730 // Assign point indices
731 for (; n < static_cast<int>(nr_points_); n++, nd += nr_point_element_) {
733 data_ + nd, bound_x_min, bound_x_max, bound_y_min, bound_y_max,
734 bound_z_min, bound_z_max, voxel_width_x_rec, voxel_width_y_rec,
735 static_cast<int>(nr_voxel_x_), static_cast<int>(nr_voxel_y_));
736
737 if (id >= 0) {
738 voxels_[id].indices_.push_back(n);
739 }
740 }
741
742 initialized_ = true;
743 return (initialized_);
744}
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,
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 第 902 行定义.

907 {
908 if (!data || !nr_points || !nr_point_element || !nr_voxel_x || !nr_voxel_y) {
909 initialized_ = false;
910 return initialized_;
911 }
912
913 data_ = data;
914 nr_points_ = nr_points;
915 nr_point_element_ = nr_point_element;
916 nr_voxel_x_ = nr_voxel_x;
917 nr_voxel_y_ = nr_voxel_y;
918 nr_voxel_z_ = 1;
919
920 unsigned int i, j, k, n = 0, nd = 0;
921 unsigned int nr_voxel_xy = (nr_voxel_x_ * nr_voxel_y_);
922 unsigned int nr_voxel = nr_voxel_xy;
923 unsigned int nr_voxel_xm1 = nr_voxel_x - 1;
924 unsigned int nr_voxel_ym1 = nr_voxel_y - 1;
925 T vx, vy, vz, x, y, z;
926 T voxel_width_x, voxel_width_y, voxel_width_z;
927
928 voxels_.clear();
929 voxels_.resize(nr_voxel);
930
931 // if force_bound then the voxel grid dimesion is forced to be the manual
932 // * input
933 if (force_bound) {
934 dim_x_[0] = spatial_bound_x_min;
935 dim_x_[1] = spatial_bound_x_max;
936
937 dim_y_[0] = spatial_bound_y_min;
938 dim_y_[1] = spatial_bound_y_max;
939
940 dim_z_[0] = spatial_bound_z_min;
941 dim_z_[1] = spatial_bound_z_max;
942 } else {
944 data_, nr_points_, 0, nr_point_element_, &dim_x_[0], &dim_x_[1],
945 &dim_y_[0], &dim_y_[1], &dim_z_[0], &dim_z_[1], spatial_bound_x_min,
946 spatial_bound_x_max, spatial_bound_y_min, spatial_bound_y_max,
947 spatial_bound_z_min, spatial_bound_z_max);
948 }
949
950 T dim_x_min = dim_x_[0];
951 T dim_x_max = dim_x_[1];
952
953 T dim_y_min = dim_y_[0];
954 T dim_y_max = dim_y_[1];
955
956 T dim_z_min = dim_z_[0];
957 T dim_z_max = dim_z_[1];
958
959 T span_x = (dim_x_max - dim_x_min);
960 T span_y = (dim_y_max - dim_y_min);
961 T span_z = (dim_z_max - dim_z_min);
962
963 assert(span_x > 0 && span_y > 0 && span_z > 0);
964
965 voxel_dim_[0] = voxel_width_x = IDiv(span_x, static_cast<int>(nr_voxel_x_));
966 voxel_dim_[1] = voxel_width_y = IDiv(span_y, static_cast<int>(nr_voxel_y_));
967 voxel_dim_[2] = voxel_width_z = span_z;
968
969 T voxel_width_x_rec = IRec(voxel_dim_[0]);
970 T voxel_width_y_rec = IRec(voxel_dim_[1]);
971
972 std::vector<T> vxs(nr_voxel_x_);
973 vxs[0] = dim_x_[0];
974
975 for (i = 1; i < nr_voxel_x_; i++) {
976 vxs[i] = vxs[i - 1] + voxel_width_x;
977 }
978
979 vy = dim_y_[0];
980 vz = dim_z_[0];
981
982 for (j = 0; j < nr_voxel_y_; j++) {
983 for (k = 0; k < nr_voxel_x_; k++) {
984 vx = vxs[k];
985 voxels_[n++].init(vx, vy, vz, voxel_width_x, voxel_width_y, voxel_width_z,
986 static_cast<int>(k), static_cast<int>(j), 0);
987 }
988 vy += voxel_width_y;
989 }
990
991 // Assign point indices
992 for (; n < nr_points_; n++, nd += nr_point_element_) {
993 x = data_[nd];
994 y = data_[nd + 1];
995 z = data_[nd + 2];
996
997 if (x < dim_x_min || x > dim_x_max || y < dim_y_min || y > dim_y_max ||
998 z < dim_z_min || z > dim_z_max) {
999 // points that are outside the defined BBOX are ignored
1000 continue;
1001 }
1002
1003 k = IMax((unsigned int)0,
1004 IMin(nr_voxel_xm1,
1005 (unsigned int)((x - dim_x_min) * voxel_width_x_rec)));
1006 j = IMax((unsigned int)0,
1007 IMin(nr_voxel_ym1,
1008 (unsigned int)((y - dim_y_min) * voxel_width_y_rec)));
1009 i = nr_voxel_x * j + k;
1010
1011 assert(i < nr_voxel);
1012 voxels_[i].indices_.push_back(n);
1013 }
1014 initialized_ = true;
1015 return initialized_;
1016}
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 第 392 行定义.

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

◆ SetInitialized()

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

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

435{ initialized_ = initialized; }

◆ SetNrPointElement()

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

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

422 {
423 nr_point_element_ = nr_point_element;
424 }

◆ SetNrPoints()

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

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

420{ 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 第 426 行定义.

427 {
428 nr_voxel_x_ = nr_voxel_x;
429 nr_voxel_y_ = nr_voxel_y;
430 nr_voxel_z_ = nr_voxel_z;
431 }

◆ SetPointCloudsData()

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

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

433{ data_ = data; }

◆ SetS()

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

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

748 {
749 if (!data || !nr_points || !nr_point_element || !nr_voxel_x_ ||
750 !nr_voxel_y_ || nr_voxel_z_ != 1) {
751 initialized_ = false;
752 return initialized_;
753 }
754
755 data_ = data;
756 nr_points_ = nr_points;
757 nr_point_element_ = nr_point_element;
758
759 unsigned int nr_voxel = (nr_voxel_x_ * nr_voxel_y_);
760 unsigned int i, n = 0;
761 int id;
762
763 float voxel_width_x_rec = IRec(static_cast<float>(voxel_dim_[0]));
764 float voxel_width_y_rec = IRec(static_cast<float>(voxel_dim_[1]));
765
766 __m128i iv_nr_voxel_x = _mm_setr_epi32(static_cast<int>(nr_voxel_x_), 0,
767 static_cast<int>(nr_voxel_x_), 0);
768 __m128i iv_nr_voxel_x_m1 = _mm_set1_epi32(static_cast<int>(nr_voxel_x_ - 1));
769 __m128i iv_nr_voxel_y_m1 = _mm_set1_epi32(static_cast<int>(nr_voxel_y_ - 1));
770
771 __m128 v_width_x_rec = _mm_set_ps1(voxel_width_x_rec);
772 __m128 v_width_y_rec = _mm_set_ps1(voxel_width_y_rec);
773
774 __m128 v_x_min = _mm_set_ps1(dim_x_[0]);
775 __m128 v_x_max = _mm_set_ps1(dim_x_[1]);
776 __m128 v_y_min = _mm_set_ps1(dim_y_[0]);
777 __m128 v_y_max = _mm_set_ps1(dim_y_[1]);
778 __m128 v_z_min = _mm_set_ps1(dim_z_[0]);
779 __m128 v_z_max = _mm_set_ps1(dim_z_[1]);
780
781 __m128 v_cmp_x, v_cmp_y, v_cmp_z, v_in_roi;
782 v_in_roi = _mm_setr_ps(1.0, 1.0, 1.0, 1.0);
783
784 __m128 v_xs, v_ys, v_zs;
785 __m128i iv_indices, iv_x_indices, iv_y_indices, iv_v_indices_02,
786 iv_v_indices_13;
787
788 for (i = 0; i < nr_voxel; ++i) {
789 voxels_[i].indices_.clear();
790 }
791
792 unsigned int nr_loops = (nr_points >> 2);
793 unsigned int nr_fast_processed = (nr_loops << 2);
794 unsigned int remainder = nr_points - nr_fast_processed;
795
796 unsigned int d1 = nr_point_element;
797 unsigned int d2 = (nr_point_element << 1);
798 unsigned int d3 = d1 + d2;
799 unsigned int d4 = (nr_point_element << 2);
800
801 // xyz are required to be stored in continuous memory
802 const float *cptr_x = data;
803 const float *cptr_y = data + 1;
804 const float *cptr_z = data + 2;
805 const float *cptr_remainder = data + (nr_fast_processed * nr_point_element);
806
807 for (i = 0; i < nr_loops; ++i, n += 4) {
808 // Set memory
809 v_xs = _mm_setr_ps(cptr_x[0], cptr_x[d1], cptr_x[d2], cptr_x[d3]);
810 v_ys = _mm_setr_ps(cptr_y[0], cptr_y[d1], cptr_y[d2], cptr_y[d3]);
811 v_zs = _mm_setr_ps(cptr_z[0], cptr_z[d1], cptr_z[d2], cptr_z[d3]);
812
813 // compare range:
814 v_cmp_x =
815 _mm_and_ps(_mm_cmpge_ps(v_xs, v_x_min), _mm_cmple_ps(v_xs, v_x_max));
816 v_cmp_y =
817 _mm_and_ps(_mm_cmpge_ps(v_ys, v_y_min), _mm_cmple_ps(v_ys, v_y_max));
818 v_cmp_z =
819 _mm_and_ps(_mm_cmpge_ps(v_zs, v_z_min), _mm_cmple_ps(v_zs, v_z_max));
820 v_in_roi = _mm_and_ps(_mm_and_ps(v_cmp_x, v_cmp_y), v_cmp_z);
821
822 // vector operations, cast into signed integers
823 v_xs = _mm_sub_ps(v_xs, v_x_min);
824 v_xs = _mm_mul_ps(v_xs, v_width_x_rec);
825 iv_x_indices = _mm_cvttps_epi32(v_xs); // truncate towards zero
826 iv_x_indices = _mm_min_epi32(iv_nr_voxel_x_m1, iv_x_indices);
827
828 // vector operations, cast into signed integers
829 v_ys = _mm_sub_ps(v_ys, v_y_min);
830 v_ys = _mm_mul_ps(v_ys, v_width_y_rec);
831 iv_y_indices = _mm_cvttps_epi32(v_ys); // truncate towards zero
832 iv_y_indices = _mm_min_epi32(iv_nr_voxel_y_m1, iv_y_indices);
833
834 iv_v_indices_02 = _mm_mullo_epi32(iv_y_indices, iv_nr_voxel_x);
835 iv_y_indices = _mm_shuffle_epi32(iv_y_indices, _MM_SHUFFLE(2, 3, 0, 1));
836
837 iv_v_indices_13 = _mm_mullo_epi32(iv_y_indices, iv_nr_voxel_x);
838 iv_v_indices_13 =
839 _mm_shuffle_epi32(iv_v_indices_13, _MM_SHUFFLE(2, 3, 0, 1));
840
841 iv_indices = _mm_add_epi32(iv_v_indices_02, iv_v_indices_13);
842 iv_indices = _mm_add_epi32(iv_indices, iv_x_indices);
843
844 // store values from registers to memory
845 // address 16byte-aligned
846 _mm_store_ps(mem_aligned16_f32_, v_in_roi);
847 // address 16byte-aligned
848 _mm_store_si128(reinterpret_cast<__m128i *>(mem_aligned16_i32_),
849 iv_indices);
850
851 if (mem_aligned16_f32_[0] != 0) {
852 voxels_[mem_aligned16_i32_[0]].indices_.push_back(n);
853 }
854 if (mem_aligned16_f32_[1] != 0) {
855 voxels_[mem_aligned16_i32_[1]].indices_.push_back(n + 1);
856 }
857 if (mem_aligned16_f32_[2] != 0) {
858 voxels_[mem_aligned16_i32_[2]].indices_.push_back(n + 2);
859 }
860 if (mem_aligned16_f32_[3] != 0) {
861 voxels_[mem_aligned16_i32_[3]].indices_.push_back(n + 3);
862 }
863 cptr_x += d4;
864 cptr_y += d4;
865 cptr_z += d4;
866 }
867
868 // handling remaining points
869 for (i = 0; i < remainder; i++, n++) {
870 id = IAssignPointToVoxel(cptr_remainder, dim_x_[0], dim_x_[1], dim_y_[0],
871 dim_y_[1], dim_z_[0], dim_z_[1], voxel_width_x_rec,
872 voxel_width_y_rec, static_cast<int>(nr_voxel_x_),
873 static_cast<int>(nr_voxel_y_));
874
875 if (id >= 0) {
876 voxels_[id].indices_.push_back(n);
877 }
878
879 cptr_remainder += nr_point_element;
880 }
881
882 // for (i = 0; i < nr_voxel; ++i) {
883 // voxels_[i].indices_.clear();
884 // }
885 // for (i = 0; i < nr_points; i++, n++) {
886 // float x = data_[nr_point_element_ * i];
887 // float y = data_[nr_point_element_ * i + 1];
888 // float z = data_[nr_point_element_ * i + 2];
889 // id = AssignPointToVoxel(x, y, z, dim_x_[0], dim_x_[1], dim_y_[0], dim_y_[1], dim_z_[0], dim_z_[1],
890 // voxel_width_x_rec, voxel_width_y_rec, static_cast<int>(nr_voxel_x_), static_cast<int>(nr_voxel_y_));
891
892 // if (id >= 0) {
893 // voxels_[id].indices_.push_back(i);
894 // }
895 // }
896
897 initialized_ = true;
898 return (initialized_);
899}
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

◆ 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 第 414 行定义.

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

◆ SetVoxels()

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

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

372 {
373 voxels_.assign(voxels.begin(), voxels.end());
374 }

◆ WhichVoxel()

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

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

601 {
602 int j, k;
603 if (!initialized_) {
604 return (-1);
605 }
606
607 if (x < dim_x_[0] || x > dim_x_[1] || y < dim_y_[0] || y > dim_y_[1] ||
608 z < dim_z_[0] || z > dim_z_[1]) {
609 return (-1); // points that are outside the defined BBOX are ignored
610 }
611
612 k = static_cast<int>(IMax(
613 (unsigned int)0,
614 IMin(nr_voxel_x_ - 1, (unsigned int)((x - dim_x_[0]) / voxel_dim_[0]))));
615 j = static_cast<int>(IMax(
616 (unsigned int)0,
617 IMin(nr_voxel_y_ - 1, (unsigned int)((y - dim_y_[0]) / voxel_dim_[1]))));
618 return (nr_voxel_x_ * j + k);
619}

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