def registration_filterreg(
    source: Union[np.ndarray, o3.geometry.PointCloud],
    target: Union[np.ndarray, o3.geometry.PointCloud],
    target_normals: Optional[np.ndarray] = None,
    sigma2: Optional[float] = None,
    update_sigma2: bool = False,
    w: float = 0,
    objective_type: str = "pt2pt",
    maxiter: int = 50,
    tol: float = 0.001,
    min_sigma2: float = 1.0e-4,
    feature_fn: Callable = lambda x: x,
    callbacks: List[Callable] = [],
    **kwargs: Any,
):
    """FilterReg registration

    Args:
        source (numpy.ndarray): Source point cloud data.
        target (numpy.ndarray): Target point cloud data.
        target_normals (numpy.ndarray, optional): Normal vectors of target point cloud.
        sigma2 (float, optional): Variance of GMM. If `sigma2` is `None`, `sigma2` is automatically updated.
        w (float, optional): Weight of the uniform distribution, 0 < `w` < 1.
        objective_type (str, optional): The type of objective function selected by 'pt2pt' or 'pt2pl'.
        maxitr (int, optional): Maximum number of iterations to EM algorithm.
        tol (float, optional): Tolerance for termination.
        min_sigma2 (float, optional): Minimum variance of GMM.
        feature_fn (function, optional): Feature function. If you use FPFH feature, set `feature_fn=probreg.feature.FPFH()`.
        callback (:obj:`list` of :obj:`function`, optional): Called after each iteration.
            `callback(probreg.Transformation)`

    Keyword Args:
        tf_init_params (dict, optional): Parameters to initialize transformation (for rigid).

    Returns:
        MstepResult: Result of the registration (transformation, sigma2, q)
    """
    cv = lambda x: np.asarray(x.points if isinstance(x, o3.geometry.PointCloud) else x)
    frg = RigidFilterReg(cv(source), cv(target_normals), sigma2, update_sigma2, **kwargs)
    frg.set_callbacks(callbacks)
    return frg.registration(
        cv(target),
        w=w,
        objective_type=objective_type,
        maxiter=maxiter,
        tol=tol,
        min_sigma2=min_sigma2,
        feature_fn=feature_fn,
    )
FilterReg registration

    Args:
        source (numpy.ndarray): Source point cloud data.
        target (numpy.ndarray): Target point cloud data.
        target_normals (numpy.ndarray, optional): Normal vectors of target point cloud.
        sigma2 (float, optional): Variance of GMM. If `sigma2` is `None`, `sigma2` is automatically updated.
        w (float, optional): Weight of the uniform distribution, 0 < `w` < 1.
        objective_type (str, optional): The type of objective function selected by 'pt2pt' or 'pt2pl'.
        maxitr (int, optional): Maximum number of iterations to EM algorithm.
        tol (float, optional): Tolerance for termination.
        min_sigma2 (float, optional): Minimum variance of GMM.
        feature_fn (function, optional): Feature function. If you use FPFH feature, set `feature_fn=probreg.feature.FPFH()`.
        callback (:obj:`list` of :obj:`function`, optional): Called after each iteration.
            `callback(probreg.Transformation)`

    Keyword Args:
        tf_init_params (dict, optional): Parameters to initialize transformation (for rigid).

    Returns:
        MstepResult: Result of the registration (transformation, sigma2, q)
    
probreg/filterreg.py