#ifndef FAST_GICP_FAST_GICP_HPP #define FAST_GICP_FAST_GICP_HPP #include #include #include #include #include #include // #include // #include #include "lsq_registration.hpp" #include "gicp_settings.hpp" namespace fast_gicp { /** * @brief Fast GICP algorithm optimized for multi threading with OpenMP */ template, typename SearchMethodTarget = pcl::search::KdTree> class FastGICP : public LsqRegistration { public: using Scalar = float; using Matrix4 = typename pcl::Registration::Matrix4; using PointCloudSource = typename pcl::Registration::PointCloudSource; using PointCloudSourcePtr = typename PointCloudSource::Ptr; using PointCloudSourceConstPtr = typename PointCloudSource::ConstPtr; using PointCloudTarget = typename pcl::Registration::PointCloudTarget; using PointCloudTargetPtr = typename PointCloudTarget::Ptr; using PointCloudTargetConstPtr = typename PointCloudTarget::ConstPtr; #if PCL_VERSION >= PCL_VERSION_CALC(1, 10, 0) using Ptr = pcl::shared_ptr>; using ConstPtr = pcl::shared_ptr>; #else using Ptr = boost::shared_ptr>; using ConstPtr = boost::shared_ptr>; #endif protected: using pcl::Registration::reg_name_; using pcl::Registration::input_; using pcl::Registration::target_; using pcl::Registration::corr_dist_threshold_; public: FastGICP(); virtual ~FastGICP() override; void setNumThreads(int n); void setCorrespondenceRandomness(int k); void setRegularizationMethod(RegularizationMethod method); virtual void swapSourceAndTarget() override; virtual void clearSource() override; virtual void clearTarget() override; virtual void setInputSource(const PointCloudSourceConstPtr& cloud) override; virtual void setSourceCovariances(const std::vector>& covs); virtual void setInputTarget(const PointCloudTargetConstPtr& cloud) override; virtual void setTargetCovariances(const std::vector>& covs); const std::vector>& getSourceCovariances() const { return source_covs_; } const std::vector>& getTargetCovariances() const { return target_covs_; } protected: virtual void computeTransformation(PointCloudSource& output, const Matrix4& guess) override; virtual void update_correspondences(const Eigen::Isometry3d& trans); virtual double linearize(const Eigen::Isometry3d& trans, Eigen::Matrix* H, Eigen::Matrix* b) override; virtual double compute_error(const Eigen::Isometry3d& trans) override; template bool calculate_covariances(const typename pcl::PointCloud::ConstPtr& cloud, pcl::search::Search& kdtree, std::vector>& covariances); protected: int num_threads_; int k_correspondences_; RegularizationMethod regularization_method_; std::shared_ptr search_source_; std::shared_ptr search_target_; std::vector> source_covs_; std::vector> target_covs_; std::vector> mahalanobis_; std::vector correspondences_; std::vector sq_distances_; }; } // namespace fast_gicp #endif