Open3D (C++ API)  0.20.0
Loading...
Searching...
No Matches
TransformationEstimation.h
Go to the documentation of this file.
1// ----------------------------------------------------------------------------
2// - Open3D: www.open3d.org -
3// ----------------------------------------------------------------------------
4// Copyright (c) 2018-2026 www.open3d.org
5// SPDX-License-Identifier: MIT
6// ----------------------------------------------------------------------------
7
8#pragma once
9
10#include <cmath>
11#include <memory>
12#include <string>
13#include <utility>
14#include <vector>
15
16#include "open3d/core/Tensor.h"
21
22namespace open3d {
23
24namespace t {
25namespace geometry {
26class PointCloud;
27}
28
29namespace pipelines {
30namespace registration {
31
32namespace {
33
34// Minimum time period (sec) between two sequential scans for Doppler ICP.
35constexpr double kMinTimePeriod{1e-3};
36
37} // namespace
38
40 Unspecified = 0,
41 PointToPoint = 1,
42 PointToPlane = 2,
43 ColoredICP = 3,
44 DopplerICP = 4,
45 SymmetricICP = 5,
46};
47
54public:
58
59public:
61 const = 0;
62
74 const core::Tensor &correspondences) const = 0;
92 const core::Tensor &current_transform =
94 const std::size_t iteration = 0) const = 0;
95};
96
102public:
103 // TODO: support with_scaling.
106
107public:
109 const override {
110 return type_;
111 };
123 const core::Tensor &correspondences) const override;
124
142 const core::Tensor &current_transform =
144 const std::size_t iteration = 0) const override;
145
146private:
147 const TransformationEstimationType type_ =
149};
150
156public:
160
166 : kernel_(kernel) {}
167
168public:
170 const override {
171 return type_;
172 };
173
186 const core::Tensor &correspondences) const override;
187
206 const core::Tensor &current_transform =
208 const std::size_t iteration = 0) const override;
209
210public:
213
214private:
215 const TransformationEstimationType type_ =
217};
218
226public:
230 const RobustKernel &kernel =
232 : kernel_(kernel) {}
234
235public:
240
250 const core::Tensor &correspondences) const override;
251
266 const core::Tensor &current_transform =
268 const std::size_t iteration = 0) const override;
269
270public:
272};
273
283public:
285
293 double lambda_geometric = 0.968,
294 const RobustKernel &kernel =
296 : lambda_geometric_(lambda_geometric), kernel_(kernel) {
297 if (lambda_geometric_ < 0 || lambda_geometric_ > 1.0) {
298 lambda_geometric_ = 0.968;
299 }
300 }
301
303 const override {
304 return type_;
305 };
306
307public:
321 const core::Tensor &correspondences) const override;
322
342 const core::Tensor &current_transform =
344 const std::size_t iteration = 0) const override;
345
346public:
347 double lambda_geometric_ = 0.968;
350
351private:
352 const TransformationEstimationType type_ =
354};
355
365public:
367
392 const double period = 0.1,
393 const double lambda_doppler = 0.01,
394 const bool reject_dynamic_outliers = false,
395 const double doppler_outlier_threshold = 2.0,
396 const std::size_t outlier_rejection_min_iteration = 2,
397 const std::size_t geometric_robust_loss_min_iteration = 0,
398 const std::size_t doppler_robust_loss_min_iteration = 2,
399 const RobustKernel &geometric_kernel =
401 const RobustKernel &doppler_kernel =
403 const core::Tensor &transform_vehicle_to_sensor =
405 : period_(period),
406 lambda_doppler_(lambda_doppler),
407 reject_dynamic_outliers_(reject_dynamic_outliers),
408 doppler_outlier_threshold_(doppler_outlier_threshold),
409 outlier_rejection_min_iteration_(outlier_rejection_min_iteration),
411 geometric_robust_loss_min_iteration),
412 doppler_robust_loss_min_iteration_(doppler_robust_loss_min_iteration),
413 geometric_kernel_(geometric_kernel),
414 doppler_kernel_(doppler_kernel),
415 transform_vehicle_to_sensor_(transform_vehicle_to_sensor) {
416 core::AssertTensorShape(transform_vehicle_to_sensor, {4, 4});
417
418 if (std::abs(period) < kMinTimePeriod) {
419 utility::LogError("Time period too small.");
420 }
421
422 if (lambda_doppler_ < 0 || lambda_doppler_ > 1.0) {
423 lambda_doppler_ = 0.01;
424 }
425 }
426
428 const override {
429 return type_;
430 };
431
432public:
446 const core::Tensor &correspondences) const override;
447
467 const core::Tensor &current_transform =
469 const std::size_t iteration = 0) const override;
470
471public:
473 double period_{0.1};
475 double lambda_doppler_{0.01};
495
496private:
497 const TransformationEstimationType type_ =
499};
500
501} // namespace registration
502} // namespace pipelines
503} // namespace t
504} // namespace open3d
CorrespondenceSet correspondences
Definition NormalDistributionsTransform.cpp:368
double t
Definition SurfaceReconstructionPoisson.cpp:175
Real target
Definition SurfaceReconstructionPoisson.cpp:270
Eigen::Vector3d source
Definition SymmetricICP.cpp:62
Definition Device.h:18
Definition Tensor.h:32
static Tensor Eye(int64_t n, Dtype dtype, const Device &device)
Create an identity matrix of size n x n.
Definition Tensor.cpp:417
A point cloud contains a list of 3D points.
Definition PointCloud.h:81
~TransformationEstimationForColoredICP() override
Definition TransformationEstimation.h:284
double ComputeRMSE(const geometry::PointCloud &source, const geometry::PointCloud &target, const core::Tensor &correspondences) const override
Computes RMSE (double) for ColoredICP method, between two pointclouds, given correspondences.
Definition TransformationEstimation.cpp:294
core::Tensor ComputeTransformation(const geometry::PointCloud &source, const geometry::PointCloud &target, const core::Tensor &correspondences, const core::Tensor &current_transform=core::Tensor::Eye(4, core::Float64, core::Device("CPU:0")), const std::size_t iteration=0) const override
Estimates the transformation matrix for ColoredICP method, a tensor of shape {4, 4},...
Definition TransformationEstimation.cpp:382
TransformationEstimationForColoredICP(double lambda_geometric=0.968, const RobustKernel &kernel=RobustKernel(RobustKernelMethod::L2Loss, 1.0, 1.0))
Constructor.
Definition TransformationEstimation.h:292
double lambda_geometric_
Definition TransformationEstimation.h:347
TransformationEstimationType GetTransformationEstimationType() const override
Definition TransformationEstimation.h:302
RobustKernel kernel_
RobustKernel for outlier rejection.
Definition TransformationEstimation.h:349
core::Tensor transform_vehicle_to_sensor_
Definition TransformationEstimation.h:493
std::size_t doppler_robust_loss_min_iteration_
Definition TransformationEstimation.h:485
TransformationEstimationType GetTransformationEstimationType() const override
Definition TransformationEstimation.h:427
double lambda_doppler_
Factor that weighs the Doppler residual term in DICP objective.
Definition TransformationEstimation.h:475
std::size_t geometric_robust_loss_min_iteration_
Number of iterations of ICP after which robust loss kicks in.
Definition TransformationEstimation.h:484
core::Tensor ComputeTransformation(const geometry::PointCloud &source, const geometry::PointCloud &target, const core::Tensor &correspondences, const core::Tensor &current_transform=core::Tensor::Eye(4, core::Float64, core::Device("CPU:0")), const std::size_t iteration=0) const override
Estimates the transformation matrix for DopplerICP method, a tensor of shape {4, 4},...
Definition TransformationEstimation.cpp:469
double doppler_outlier_threshold_
Definition TransformationEstimation.h:480
TransformationEstimationForDopplerICP(const double period=0.1, const double lambda_doppler=0.01, const bool reject_dynamic_outliers=false, const double doppler_outlier_threshold=2.0, const std::size_t outlier_rejection_min_iteration=2, const std::size_t geometric_robust_loss_min_iteration=0, const std::size_t doppler_robust_loss_min_iteration=2, const RobustKernel &geometric_kernel=RobustKernel(RobustKernelMethod::L2Loss, 1.0, 1.0), const RobustKernel &doppler_kernel=RobustKernel(RobustKernelMethod::L2Loss, 1.0, 1.0), const core::Tensor &transform_vehicle_to_sensor=core::Tensor::Eye(4, core::Float64, core::Device("CPU:0")))
Constructor.
Definition TransformationEstimation.h:391
double period_
Time period (in seconds) between the source and the target point clouds.
Definition TransformationEstimation.h:473
bool reject_dynamic_outliers_
Whether or not to prune dynamic point outlier correspondences.
Definition TransformationEstimation.h:477
RobustKernel doppler_kernel_
Definition TransformationEstimation.h:489
~TransformationEstimationForDopplerICP() override
Definition TransformationEstimation.h:366
std::size_t outlier_rejection_min_iteration_
Number of iterations of ICP after which outlier rejection is enabled.
Definition TransformationEstimation.h:482
double ComputeRMSE(const geometry::PointCloud &source, const geometry::PointCloud &target, const core::Tensor &correspondences) const override
Computes RMSE (double) for DopplerICP method, between two pointclouds, given correspondences.
Definition TransformationEstimation.cpp:434
RobustKernel geometric_kernel_
RobustKernel for outlier rejection.
Definition TransformationEstimation.h:487
Definition TransformationEstimation.h:53
virtual ~TransformationEstimation()
Definition TransformationEstimation.h:57
virtual TransformationEstimationType GetTransformationEstimationType() const =0
virtual core::Tensor ComputeTransformation(const geometry::PointCloud &source, const geometry::PointCloud &target, const core::Tensor &correspondences, const core::Tensor &current_transform=core::Tensor::Eye(4, core::Float64, core::Device("CPU:0")), const std::size_t iteration=0) const =0
TransformationEstimation()
Default Constructor.
Definition TransformationEstimation.h:56
virtual double ComputeRMSE(const geometry::PointCloud &source, const geometry::PointCloud &target, const core::Tensor &correspondences) const =0
TransformationEstimationPointToPlane()
Default constructor.
Definition TransformationEstimation.h:158
~TransformationEstimationPointToPlane() override
Definition TransformationEstimation.h:159
TransformationEstimationType GetTransformationEstimationType() const override
Definition TransformationEstimation.h:169
double ComputeRMSE(const geometry::PointCloud &source, const geometry::PointCloud &target, const core::Tensor &correspondences) const override
Computes RMSE (double) for PointToPlane method, between two pointclouds, given correspondences.
Definition TransformationEstimation.cpp:161
RobustKernel kernel_
RobustKernel for outlier rejection.
Definition TransformationEstimation.h:212
core::Tensor ComputeTransformation(const geometry::PointCloud &source, const geometry::PointCloud &target, const core::Tensor &correspondences, const core::Tensor &current_transform=core::Tensor::Eye(4, core::Float64, core::Device("CPU:0")), const std::size_t iteration=0) const override
Estimates the transformation matrix for PointToPlane method, a tensor of shape {4,...
Definition TransformationEstimation.cpp:196
TransformationEstimationPointToPlane(const RobustKernel &kernel)
Constructor that takes as input a RobustKernel.
Definition TransformationEstimation.h:165
TransformationEstimationPointToPoint()
Definition TransformationEstimation.h:104
TransformationEstimationType GetTransformationEstimationType() const override
Definition TransformationEstimation.h:108
double ComputeRMSE(const geometry::PointCloud &source, const geometry::PointCloud &target, const core::Tensor &correspondences) const override
Computes RMSE (double) for PointToPoint method, between two pointclouds, given correspondences.
Definition TransformationEstimation.cpp:101
~TransformationEstimationPointToPoint() override
Definition TransformationEstimation.h:105
core::Tensor ComputeTransformation(const geometry::PointCloud &source, const geometry::PointCloud &target, const core::Tensor &correspondences, const core::Tensor &current_transform=core::Tensor::Eye(4, core::Float64, core::Device("CPU:0")), const std::size_t iteration=0) const override
Estimates the transformation matrix for PointToPoint method, a tensor of shape {4,...
Definition TransformationEstimation.cpp:132
TransformationEstimationSymmetric(const RobustKernel &kernel=RobustKernel(RobustKernelMethod::L2Loss, 1.0, 1.0))
Constructs a symmetric transformation estimator.
Definition TransformationEstimation.h:229
double ComputeRMSE(const geometry::PointCloud &source, const geometry::PointCloud &target, const core::Tensor &correspondences) const override
Computes symmetric point-to-plane RMSE.
Definition TransformationEstimation.cpp:229
core::Tensor ComputeTransformation(const geometry::PointCloud &source, const geometry::PointCloud &target, const core::Tensor &correspondences, const core::Tensor &current_transform=core::Tensor::Eye(4, core::Float64, core::Device("CPU:0")), const std::size_t iteration=0) const override
Estimates a symmetric point-to-plane transformation.
Definition TransformationEstimation.cpp:276
TransformationEstimationType GetTransformationEstimationType() const override
Definition TransformationEstimation.h:236
~TransformationEstimationSymmetric() override
Definition TransformationEstimation.h:233
RobustKernel kernel_
Definition TransformationEstimation.h:271
const Dtype Float64
Definition Dtype.cpp:43
TransformationEstimationType
Definition TransformationEstimation.h:39
Definition PinholeCameraIntrinsic.cpp:16