// ---------------------------------------------------------------------------- // - Open3D: www.open3d.org - // ---------------------------------------------------------------------------- // Copyright (c) 2018-2023 www.open3d.org // SPDX-License-Identifier: MIT // ---------------------------------------------------------------------------- #pragma once #include #include #include #include #include #include "open3d/pipelines/registration/RobustKernel.h" namespace open3d { namespace geometry { class PointCloud; } namespace pipelines { namespace registration { typedef std::vector CorrespondenceSet; enum class TransformationEstimationType { Unspecified = 0, PointToPoint = 1, PointToPlane = 2, ColoredICP = 3, GeneralizedICP = 4, }; /// \class TransformationEstimation /// /// Base class that estimates a transformation between two point clouds /// The virtual function ComputeTransformation() must be implemented in /// subclasses. class TransformationEstimation { public: /// \brief Default Constructor. TransformationEstimation() {} virtual ~TransformationEstimation() {} public: virtual TransformationEstimationType GetTransformationEstimationType() const = 0; /// Compute RMSE between source and target points cloud given /// correspondences. /// /// \param source Source point cloud. /// \param target Target point cloud. /// \param corres Correspondence set between source and target point cloud. virtual double ComputeRMSE(const geometry::PointCloud &source, const geometry::PointCloud &target, const CorrespondenceSet &corres) const = 0; /// Compute transformation from source to target point cloud given /// correspondences. /// /// \param source Source point cloud. /// \param target Target point cloud. /// \param corres Correspondence set between source and target point cloud. virtual Eigen::Matrix4d ComputeTransformation( const geometry::PointCloud &source, const geometry::PointCloud &target, const CorrespondenceSet &corres) const = 0; }; /// \class TransformationEstimationPointToPoint /// /// Estimate a transformation for point to point distance. class TransformationEstimationPointToPoint : public TransformationEstimation { public: /// \brief Parameterized Constructor. /// /// \param with_scaling Set to True to estimate scaling, False to force /// scaling to be 1. TransformationEstimationPointToPoint(bool with_scaling = false) : with_scaling_(with_scaling) {} ~TransformationEstimationPointToPoint() override {} public: TransformationEstimationType GetTransformationEstimationType() const override { return type_; }; double ComputeRMSE(const geometry::PointCloud &source, const geometry::PointCloud &target, const CorrespondenceSet &corres) const override; Eigen::Matrix4d ComputeTransformation( const geometry::PointCloud &source, const geometry::PointCloud &target, const CorrespondenceSet &corres) const override; public: /// \brief Set to True to estimate scaling, False to force scaling to be 1. /// /// The homogeneous transformation is given by\n /// T = [ cR t]\n /// [0 1]\n /// Sets 𝑐=1 if with_scaling is False. bool with_scaling_ = false; private: const TransformationEstimationType type_ = TransformationEstimationType::PointToPoint; }; /// \class TransformationEstimationPointToPlane /// /// Class to estimate a transformation for point to plane distance. class TransformationEstimationPointToPlane : public TransformationEstimation { public: /// \brief Default Constructor. TransformationEstimationPointToPlane() {} ~TransformationEstimationPointToPlane() override {} /// \brief Constructor that takes as input a RobustKernel \param kernel Any /// of the implemented statistical robust kernel for outlier rejection. explicit TransformationEstimationPointToPlane( std::shared_ptr kernel) : kernel_(std::move(kernel)) {} public: TransformationEstimationType GetTransformationEstimationType() const override { return type_; }; double ComputeRMSE(const geometry::PointCloud &source, const geometry::PointCloud &target, const CorrespondenceSet &corres) const override; Eigen::Matrix4d ComputeTransformation( const geometry::PointCloud &source, const geometry::PointCloud &target, const CorrespondenceSet &corres) const override; public: /// shared_ptr to an Abstract RobustKernel that could mutate at runtime. std::shared_ptr kernel_ = std::make_shared(); private: const TransformationEstimationType type_ = TransformationEstimationType::PointToPlane; }; } // namespace registration } // namespace pipelines } // namespace open3d