diff --git a/include/laser/capture/capture_laser_3d.h b/include/laser/capture/capture_laser_3d.h index 4e0e84f6f4deb54d8c8ae6cde43efd0b0dedd7dd..ecab3a7bba17d5540cede32e56bce09290e1369c 100644 --- a/include/laser/capture/capture_laser_3d.h +++ b/include/laser/capture/capture_laser_3d.h @@ -28,6 +28,7 @@ // PCL includes #include <pcl/point_types.h> #include <pcl/point_cloud.h> +#include <pcl/filters/voxel_grid.h> namespace wolf { @@ -37,13 +38,16 @@ WOLF_PTR_TYPEDEFS(CaptureLaser3d); class CaptureLaser3d : public CaptureBase { public: - CaptureLaser3d(const TimeStamp& _timestamp, SensorBasePtr _sensor, pcl::PointCloud<pcl::PointXYZ>::Ptr _point_cloud); + CaptureLaser3d(const TimeStamp& _timestamp, SensorBasePtr _sensor, pcl::PointCloud<pcl::PointXYZ>::Ptr _point_cloud_raw, bool _downsample, double _voxel_size); ~CaptureLaser3d(); pcl::PointCloud<pcl::PointXYZ>::Ptr getPointCloud(); pcl::PointCloud<pcl::PointXYZ>::ConstPtr getPointCloud() const; + pcl::PointCloud<pcl::PointXYZ>::Ptr getPointCloudRaw(); + pcl::PointCloud<pcl::PointXYZ>::ConstPtr getPointCloudRaw() const; private: + pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud_raw_; pcl::PointCloud<pcl::PointXYZ>::Ptr point_cloud_; }; diff --git a/include/laser/utils/laser3d_tools.h b/include/laser/utils/laser3d_tools.h index 5c3acc5e03e23b576fd9133a184b1532c4a7fbe6..7992d951a32fb2ef8fa0b1753441e1694256b890 100644 --- a/include/laser/utils/laser3d_tools.h +++ b/include/laser/utils/laser3d_tools.h @@ -36,10 +36,8 @@ #include <pcl/registration/icp_nl.h> #include <pcl/registration/transforms.h> - typedef pcl::Registration<pcl::PointXYZ, pcl::PointXYZ>::Ptr RegistrationPtr; - namespace wolf { // _cloud_ref: first PointCloud @@ -48,39 +46,19 @@ inline void pairAlign(const pcl::PointCloud<pcl::PointXYZ>::Ptr _cloud_ref, const pcl::PointCloud<pcl::PointXYZ>::Ptr _cloud_other, const Eigen::Isometry3d &_transform_guess, Eigen::Isometry3d &_transform_final, - RegistrationPtr &_registration_solver, - bool _downsample = false, - double _voxel_size = 0.05) + RegistrationPtr &_registration_solver) { - // DURATION -------------------------------------------------------- auto start = std::chrono::high_resolution_clock::now(); // DURATION -------------------------------------------------------- - - // Internal PointCloud pointers (boost::shared_ptr) pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_ref = pcl::make_shared<pcl::PointCloud<pcl::PointXYZ>>(); pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_other = pcl::make_shared<pcl::PointCloud<pcl::PointXYZ>>(); - // Downsample for consistency and speed - // \note enable this for large datasets - pcl::VoxelGrid<pcl::PointXYZ> grid; // downsample for performance - if (_downsample) - { - grid.setLeafSize(_voxel_size, _voxel_size, _voxel_size); - // grid.setInputCloud(boost::static_pointer_cast<PointCloud>(_cloud_ref)); - grid.setInputCloud(_cloud_ref); - grid.filter(*cloud_ref); - - grid.setInputCloud(_cloud_other); - grid.filter(*cloud_other); - } - else - { - *cloud_ref = *_cloud_ref; - *cloud_other = *_cloud_other; - } + // Point clouds are considered already downsampled + *cloud_ref = *_cloud_ref; + *cloud_other = *_cloud_other; // Set input clouds _registration_solver->setInputSource(cloud_ref); @@ -91,7 +69,6 @@ inline void pairAlign(const pcl::PointCloud<pcl::PointXYZ>::Ptr _cloud_ref, auto start_aligning = std::chrono::high_resolution_clock::now(); // DURATION -------------------------------------------------------- - // Declare variables Eigen::Matrix4f transform_pcl; @@ -105,7 +82,6 @@ inline void pairAlign(const pcl::PointCloud<pcl::PointXYZ>::Ptr _cloud_ref, // Output the transformation as Isometry of double(s) _transform_final = Eigen::Isometry3d(transform_pcl.cast<double>()); - // DURATION -------------------------------------------------------- auto end = std::chrono::high_resolution_clock::now(); @@ -113,12 +89,12 @@ inline void pairAlign(const pcl::PointCloud<pcl::PointXYZ>::Ptr _cloud_ref, auto duration_align = std::chrono::duration_cast<std::chrono::microseconds>(end - start_aligning); auto duration_total = std::chrono::duration_cast<std::chrono::microseconds>(end - start); - WOLF_INFO("Laser3d_tools.h: Duration downsampling: ", 1e-3*(duration_downsampling).count(), " ms"); - WOLF_INFO("Laser3d_tools.h: Duration aligning : ", 1e-3*(duration_align).count(), " ms"); - WOLF_INFO("Laser3d_tools.h: Duration total : ", 1e-3*(duration_total).count(), " ms"); + WOLF_INFO("Laser3d_tools.h: Duration downsampling: ", 1e-3 * (duration_downsampling).count(), " ms"); + WOLF_INFO("Laser3d_tools.h: Duration aligning : ", 1e-3 * (duration_align).count(), " ms"); + WOLF_INFO("Laser3d_tools.h: Duration total : ", 1e-3 * (duration_total).count(), " ms"); // DURATION -------------------------------------------------------- } } // namespace wolf -#endif // LASER3D_TOOLS_H \ No newline at end of file +#endif // LASER3D_TOOLS_H \ No newline at end of file diff --git a/src/capture/capture_laser_3d.cpp b/src/capture/capture_laser_3d.cpp index 7df9a1b1f8c1a95aedd6000668c819976923ffe5..c33518b728bb2dfc6bfbb268346ef365289eadcc 100644 --- a/src/capture/capture_laser_3d.cpp +++ b/src/capture/capture_laser_3d.cpp @@ -24,9 +24,24 @@ namespace wolf { -CaptureLaser3d::CaptureLaser3d(const TimeStamp& _timestamp, SensorBasePtr _sensor, pcl::PointCloud<pcl::PointXYZ>::Ptr _point_cloud) - : CaptureBase("CaptureLaser3d", _timestamp, _sensor), point_cloud_(_point_cloud) +CaptureLaser3d::CaptureLaser3d(const TimeStamp& _timestamp, + SensorBasePtr _sensor, + pcl::PointCloud<pcl::PointXYZ>::Ptr _point_cloud_raw, + bool _downsample = false, + double _voxel_size = 0.05) + : CaptureBase("CaptureLaser3d", _timestamp, _sensor), point_cloud_raw_(_point_cloud_raw) { + if (_downsample) + { + pcl::VoxelGrid<pcl::PointXYZ> grid; + grid.setLeafSize(_voxel_size, _voxel_size, _voxel_size); + grid.setInputCloud(_point_cloud_raw); + grid.filter(*point_cloud_); + } + else + { + *point_cloud_ = *_point_cloud_raw; + } } CaptureLaser3d::~CaptureLaser3d() {} @@ -41,4 +56,14 @@ pcl::PointCloud<pcl::PointXYZ>::ConstPtr CaptureLaser3d::getPointCloud() const return point_cloud_; } +pcl::PointCloud<pcl::PointXYZ>::Ptr CaptureLaser3d::getPointCloudRaw() +{ + return point_cloud_raw_; +} + +pcl::PointCloud<pcl::PointXYZ>::ConstPtr CaptureLaser3d::getPointCloudRaw() const +{ + return point_cloud_raw_; +} + } // namespace wolf \ No newline at end of file diff --git a/src/processor/processor_odom_icp_3d.cpp b/src/processor/processor_odom_icp_3d.cpp index 979c8e5823bad6527087e69a8364dc141fc7e11b..eeede85b97e942a70e357671797188ac5fa010d9 100644 --- a/src/processor/processor_odom_icp_3d.cpp +++ b/src/processor/processor_odom_icp_3d.cpp @@ -123,9 +123,7 @@ unsigned int ProcessorOdomIcp3d::processKnown() incoming_laser_->getPointCloud(), T_origin_last_, T_origin_incoming_, - registration_solver_, - params_odom_icp_->pcl_downsample, - params_odom_icp_->pcl_downsample_voxel_size); + registration_solver_); } return 0; }; @@ -142,9 +140,7 @@ unsigned int ProcessorOdomIcp3d::processNew(const int& _max_features) incoming_laser_->getPointCloud(), Eigen::Isometry3d::Identity(), T_last_incoming_, - registration_solver_, - params_odom_icp_->pcl_downsample, - params_odom_icp_->pcl_downsample_voxel_size); + registration_solver_); } return 0; };