Open3D (C++ API)  0.19.0
Loading...
Searching...
No Matches
RegistrationImpl.h
Go to the documentation of this file.
1// ----------------------------------------------------------------------------
2// - Open3D: www.open3d.org -
3// ----------------------------------------------------------------------------
4// Copyright (c) 2018-2024 www.open3d.org
5// SPDX-License-Identifier: MIT
6// ----------------------------------------------------------------------------
7
8// Private header. Do not include in Open3d.h.
9
10#pragma once
11
12#include <cmath>
13
15#include "open3d/core/Tensor.h"
19
20#ifndef __CUDACC__
21using std::abs;
22#endif
23
24namespace open3d {
25namespace t {
26namespace pipelines {
27namespace kernel {
28
29void ComputePosePointToPlaneCPU(const core::Tensor &source_points,
30 const core::Tensor &target_points,
31 const core::Tensor &target_normals,
32 const core::Tensor &correspondence_indices,
33 core::Tensor &pose,
34 float &residual,
35 int &inlier_count,
36 const core::Dtype &dtype,
37 const core::Device &device,
38 const registration::RobustKernel &kernel);
39
40void ComputePoseColoredICPCPU(const core::Tensor &source_points,
41 const core::Tensor &source_colors,
42 const core::Tensor &target_points,
43 const core::Tensor &target_normals,
44 const core::Tensor &target_colors,
45 const core::Tensor &target_color_gradients,
46 const core::Tensor &correspondence_indices,
47 core::Tensor &pose,
48 float &residual,
49 int &inlier_count,
50 const core::Dtype &dtype,
51 const core::Device &device,
52 const registration::RobustKernel &kernel,
53 const double &lambda_geometric);
54
56 const core::Tensor &source_points,
57 const core::Tensor &source_dopplers,
58 const core::Tensor &source_directions,
59 const core::Tensor &target_points,
60 const core::Tensor &target_normals,
61 const core::Tensor &correspondence_indices,
62 core::Tensor &output_pose,
63 float &residual,
64 int &inlier_count,
65 const core::Dtype &dtype,
66 const core::Device &device,
67 const core::Tensor &R_S_to_V,
68 const core::Tensor &r_v_to_s_in_V,
69 const core::Tensor &w_v_in_V,
70 const core::Tensor &v_v_in_V,
71 const double period,
72 const bool reject_dynamic_outliers,
73 const double doppler_outlier_threshold,
74 const registration::RobustKernel &kernel_geometric,
75 const registration::RobustKernel &kernel_doppler,
76 const double lambda_doppler);
77
78#ifdef BUILD_CUDA_MODULE
79void ComputePosePointToPlaneCUDA(const core::Tensor &source_points,
80 const core::Tensor &target_points,
81 const core::Tensor &target_normals,
82 const core::Tensor &correspondence_indices,
83 core::Tensor &pose,
84 float &residual,
85 int &inlier_count,
86 const core::Dtype &dtype,
87 const core::Device &device,
88 const registration::RobustKernel &kernel);
89
90void ComputePoseColoredICPCUDA(const core::Tensor &source_points,
91 const core::Tensor &source_colors,
92 const core::Tensor &target_points,
93 const core::Tensor &target_normals,
94 const core::Tensor &target_colors,
95 const core::Tensor &target_color_gradients,
96 const core::Tensor &correspondence_indices,
97 core::Tensor &pose,
98 float &residual,
99 int &inlier_count,
100 const core::Dtype &dtype,
101 const core::Device &device,
102 const registration::RobustKernel &kernel,
103 const double &lambda_geometric);
104
105void ComputePoseDopplerICPCUDA(
106 const core::Tensor &source_points,
107 const core::Tensor &source_dopplers,
108 const core::Tensor &source_directions,
109 const core::Tensor &target_points,
110 const core::Tensor &target_normals,
111 const core::Tensor &correspondence_indices,
112 core::Tensor &output_pose,
113 float &residual,
114 int &inlier_count,
115 const core::Dtype &dtype,
116 const core::Device &device,
117 const core::Tensor &R_S_to_V,
118 const core::Tensor &r_v_to_s_in_V,
119 const core::Tensor &w_v_in_V,
120 const core::Tensor &v_v_in_V,
121 const double period,
122 const bool reject_dynamic_outliers,
123 const double doppler_outlier_threshold,
124 const registration::RobustKernel &kernel_geometric,
125 const registration::RobustKernel &kernel_doppler,
126 const double lambda_doppler);
127#endif
128
129void ComputeRtPointToPointCPU(const core::Tensor &source_points,
130 const core::Tensor &target_points,
131 const core::Tensor &correspondence_indices,
132 core::Tensor &R,
133 core::Tensor &t,
134 int &inlier_count,
135 const core::Dtype &dtype,
136 const core::Device &device);
137
138void ComputeInformationMatrixCPU(const core::Tensor &target_points,
139 const core::Tensor &correspondence_indices,
140 core::Tensor &information_matrix,
141 const core::Dtype &dtype,
142 const core::Device &device);
143
144#ifdef BUILD_CUDA_MODULE
145void ComputeInformationMatrixCUDA(const core::Tensor &target_points,
146 const core::Tensor &correspondence_indices,
147 core::Tensor &information_matrix,
148 const core::Dtype &dtype,
149 const core::Device &device);
150#endif
151
152#ifdef BUILD_SYCL_MODULE
153void ComputePosePointToPlaneSYCL(const core::Tensor &source_points,
154 const core::Tensor &target_points,
155 const core::Tensor &target_normals,
156 const core::Tensor &correspondence_indices,
157 core::Tensor &pose,
158 float &residual,
159 int &inlier_count,
160 const core::Dtype &dtype,
161 const core::Device &device,
162 const registration::RobustKernel &kernel);
163
164void ComputePoseColoredICPSYCL(const core::Tensor &source_points,
165 const core::Tensor &source_colors,
166 const core::Tensor &target_points,
167 const core::Tensor &target_normals,
168 const core::Tensor &target_colors,
169 const core::Tensor &target_color_gradients,
170 const core::Tensor &correspondence_indices,
171 core::Tensor &pose,
172 float &residual,
173 int &inlier_count,
174 const core::Dtype &dtype,
175 const core::Device &device,
176 const registration::RobustKernel &kernel,
177 const double &lambda_geometric);
178
180 const core::Tensor &source_points,
181 const core::Tensor &source_dopplers,
182 const core::Tensor &source_directions,
183 const core::Tensor &target_points,
184 const core::Tensor &target_normals,
185 const core::Tensor &correspondence_indices,
186 core::Tensor &output_pose,
187 float &residual,
188 int &inlier_count,
189 const core::Dtype &dtype,
190 const core::Device &device,
191 const core::Tensor &R_S_to_V,
192 const core::Tensor &r_v_to_s_in_V,
193 const core::Tensor &w_v_in_V,
194 const core::Tensor &v_v_in_V,
195 const double period,
196 const bool reject_dynamic_outliers,
197 const double doppler_outlier_threshold,
198 const registration::RobustKernel &kernel_geometric,
199 const registration::RobustKernel &kernel_doppler,
200 const double lambda_doppler);
201
202void ComputeInformationMatrixSYCL(const core::Tensor &target_points,
203 const core::Tensor &correspondence_indices,
204 core::Tensor &information_matrix,
205 const core::Dtype &dtype,
206 const core::Device &device);
207#endif
208
209template <typename scalar_t>
211 int64_t workload_idx,
212 const scalar_t *source_points_ptr,
213 const scalar_t *target_points_ptr,
214 const scalar_t *target_normals_ptr,
215 const int64_t *correspondence_indices,
216 scalar_t *J_ij,
217 scalar_t &r) {
218 if (correspondence_indices[workload_idx] == -1) {
219 return false;
220 }
221
222 const int64_t target_idx = 3 * correspondence_indices[workload_idx];
223 const int64_t source_idx = 3 * workload_idx;
224
225 const scalar_t &sx = source_points_ptr[source_idx + 0];
226 const scalar_t &sy = source_points_ptr[source_idx + 1];
227 const scalar_t &sz = source_points_ptr[source_idx + 2];
228 const scalar_t &tx = target_points_ptr[target_idx + 0];
229 const scalar_t &ty = target_points_ptr[target_idx + 1];
230 const scalar_t &tz = target_points_ptr[target_idx + 2];
231 const scalar_t &nx = target_normals_ptr[target_idx + 0];
232 const scalar_t &ny = target_normals_ptr[target_idx + 1];
233 const scalar_t &nz = target_normals_ptr[target_idx + 2];
234
235 r = (sx - tx) * nx + (sy - ty) * ny + (sz - tz) * nz;
236
237 J_ij[0] = nz * sy - ny * sz;
238 J_ij[1] = nx * sz - nz * sx;
239 J_ij[2] = ny * sx - nx * sy;
240 J_ij[3] = nx;
241 J_ij[4] = ny;
242 J_ij[5] = nz;
243
244 return true;
245}
246
247template bool GetJacobianPointToPlane(int64_t workload_idx,
248 const float *source_points_ptr,
249 const float *target_points_ptr,
250 const float *target_normals_ptr,
251 const int64_t *correspondence_indices,
252 float *J_ij,
253 float &r);
254
255template bool GetJacobianPointToPlane(int64_t workload_idx,
256 const double *source_points_ptr,
257 const double *target_points_ptr,
258 const double *target_normals_ptr,
259 const int64_t *correspondence_indices,
260 double *J_ij,
261 double &r);
262
263template <typename scalar_t>
265 const int64_t workload_idx,
266 const scalar_t *source_points_ptr,
267 const scalar_t *source_colors_ptr,
268 const scalar_t *target_points_ptr,
269 const scalar_t *target_normals_ptr,
270 const scalar_t *target_colors_ptr,
271 const scalar_t *target_color_gradients_ptr,
272 const int64_t *correspondence_indices,
273 const scalar_t &sqrt_lambda_geometric,
274 const scalar_t &sqrt_lambda_photometric,
275 scalar_t *J_G,
276 scalar_t *J_I,
277 scalar_t &r_G,
278 scalar_t &r_I) {
279 if (correspondence_indices[workload_idx] == -1) {
280 return false;
281 }
282
283 const int64_t target_idx = 3 * correspondence_indices[workload_idx];
284 const int64_t source_idx = 3 * workload_idx;
285
286 const scalar_t vs[3] = {source_points_ptr[source_idx],
287 source_points_ptr[source_idx + 1],
288 source_points_ptr[source_idx + 2]};
289
290 const scalar_t vt[3] = {target_points_ptr[target_idx],
291 target_points_ptr[target_idx + 1],
292 target_points_ptr[target_idx + 2]};
293
294 const scalar_t nt[3] = {target_normals_ptr[target_idx],
295 target_normals_ptr[target_idx + 1],
296 target_normals_ptr[target_idx + 2]};
297
298 const scalar_t d = (vs[0] - vt[0]) * nt[0] + (vs[1] - vt[1]) * nt[1] +
299 (vs[2] - vt[2]) * nt[2];
300
301 J_G[0] = sqrt_lambda_geometric * (-vs[2] * nt[1] + vs[1] * nt[2]);
302 J_G[1] = sqrt_lambda_geometric * (vs[2] * nt[0] - vs[0] * nt[2]);
303 J_G[2] = sqrt_lambda_geometric * (-vs[1] * nt[0] + vs[0] * nt[1]);
304 J_G[3] = sqrt_lambda_geometric * nt[0];
305 J_G[4] = sqrt_lambda_geometric * nt[1];
306 J_G[5] = sqrt_lambda_geometric * nt[2];
307 r_G = sqrt_lambda_geometric * d;
308
309 const scalar_t vs_proj[3] = {vs[0] - d * nt[0], vs[1] - d * nt[1],
310 vs[2] - d * nt[2]};
311
312 const scalar_t intensity_source =
313 (source_colors_ptr[source_idx] + source_colors_ptr[source_idx + 1] +
314 source_colors_ptr[source_idx + 2]) /
315 3.0;
316
317 const scalar_t intensity_target =
318 (target_colors_ptr[target_idx] + target_colors_ptr[target_idx + 1] +
319 target_colors_ptr[target_idx + 2]) /
320 3.0;
321
322 const scalar_t dit[3] = {target_color_gradients_ptr[target_idx],
323 target_color_gradients_ptr[target_idx + 1],
324 target_color_gradients_ptr[target_idx + 2]};
325
326 const scalar_t is_proj = dit[0] * (vs_proj[0] - vt[0]) +
327 dit[1] * (vs_proj[1] - vt[1]) +
328 dit[2] * (vs_proj[2] - vt[2]) + intensity_target;
329
330 const scalar_t s = dit[0] * nt[0] + dit[1] * nt[1] + dit[2] * nt[2];
331 const scalar_t ditM[3] = {s * nt[0] - dit[0], s * nt[1] - dit[1],
332 s * nt[2] - dit[2]};
333
334 J_I[0] = sqrt_lambda_photometric * (-vs[2] * ditM[1] + vs[1] * ditM[2]);
335 J_I[1] = sqrt_lambda_photometric * (vs[2] * ditM[0] - vs[0] * ditM[2]);
336 J_I[2] = sqrt_lambda_photometric * (-vs[1] * ditM[0] + vs[0] * ditM[1]);
337 J_I[3] = sqrt_lambda_photometric * ditM[0];
338 J_I[4] = sqrt_lambda_photometric * ditM[1];
339 J_I[5] = sqrt_lambda_photometric * ditM[2];
340 r_I = sqrt_lambda_photometric * (intensity_source - is_proj);
341
342 return true;
343}
344
345template bool GetJacobianColoredICP(const int64_t workload_idx,
346 const float *source_points_ptr,
347 const float *source_colors_ptr,
348 const float *target_points_ptr,
349 const float *target_normals_ptr,
350 const float *target_colors_ptr,
351 const float *target_color_gradients_ptr,
352 const int64_t *correspondence_indices,
353 const float &sqrt_lambda_geometric,
354 const float &sqrt_lambda_photometric,
355 float *J_G,
356 float *J_I,
357 float &r_G,
358 float &r_I);
359
360template bool GetJacobianColoredICP(const int64_t workload_idx,
361 const double *source_points_ptr,
362 const double *source_colors_ptr,
363 const double *target_points_ptr,
364 const double *target_normals_ptr,
365 const double *target_colors_ptr,
366 const double *target_color_gradients_ptr,
367 const int64_t *correspondence_indices,
368 const double &sqrt_lambda_geometric,
369 const double &sqrt_lambda_photometric,
370 double *J_G,
371 double *J_I,
372 double &r_G,
373 double &r_I);
374
375template <typename scalar_t>
377 const scalar_t *R_S_to_V,
378 const scalar_t *r_v_to_s_in_V,
379 const scalar_t *w_v_in_V,
380 const scalar_t *v_v_in_V,
381 scalar_t *v_s_in_S) {
382 // Compute v_s_in_V = v_v_in_V + w_v_in_V.cross(r_v_to_s_in_V).
383 scalar_t v_s_in_V[3] = {0};
384 core::linalg::kernel::cross_3x1(w_v_in_V, r_v_to_s_in_V, v_s_in_V);
385 v_s_in_V[0] += v_v_in_V[0];
386 v_s_in_V[1] += v_v_in_V[1];
387 v_s_in_V[2] += v_v_in_V[2];
388
389 // Compute v_s_in_S = R_S_to_V * v_s_in_V.
390 core::linalg::kernel::matmul3x3_3x1(R_S_to_V, v_s_in_V, v_s_in_S);
391}
392
393template void PreComputeForDopplerICP(const float *R_S_to_V,
394 const float *r_v_to_s_in_V,
395 const float *w_v_in_V,
396 const float *v_v_in_V,
397 float *v_s_in_S);
398
399template void PreComputeForDopplerICP(const double *R_S_to_V,
400 const double *r_v_to_s_in_V,
401 const double *w_v_in_V,
402 const double *v_v_in_V,
403 double *v_s_in_S);
404
405template <typename scalar_t>
407 const int64_t workload_idx,
408 const scalar_t *source_points_ptr,
409 const scalar_t *source_dopplers_ptr,
410 const scalar_t *source_directions_ptr,
411 const scalar_t *target_points_ptr,
412 const scalar_t *target_normals_ptr,
413 const int64_t *correspondence_indices,
414 const scalar_t *R_S_to_V,
415 const scalar_t *r_v_to_s_in_V,
416 const scalar_t *v_s_in_S,
417 const bool reject_dynamic_outliers,
418 const scalar_t doppler_outlier_threshold,
419 const scalar_t &sqrt_lambda_geometric,
420 const scalar_t &sqrt_lambda_doppler,
421 const scalar_t &sqrt_lambda_doppler_by_dt,
422 scalar_t *J_G,
423 scalar_t *J_D,
424 scalar_t &r_G,
425 scalar_t &r_D) {
426 if (correspondence_indices[workload_idx] == -1) {
427 return false;
428 }
429
430 const int64_t target_idx = 3 * correspondence_indices[workload_idx];
431 const int64_t source_idx = 3 * workload_idx;
432
433 const scalar_t &doppler_in_S = source_dopplers_ptr[workload_idx];
434
435 const scalar_t ds_in_V[3] = {source_directions_ptr[source_idx],
436 source_directions_ptr[source_idx + 1],
437 source_directions_ptr[source_idx + 2]};
438
439 // Compute predicted Doppler velocity (in sensor frame).
440 scalar_t ds_in_S[3] = {0};
441 core::linalg::kernel::matmul3x3_3x1(R_S_to_V, ds_in_V, ds_in_S);
442 const scalar_t doppler_pred_in_S =
443 -core::linalg::kernel::dot_3x1(ds_in_S, v_s_in_S);
444
445 // Compute Doppler error.
446 const double doppler_error = doppler_in_S - doppler_pred_in_S;
447
448 // Dynamic point outlier rejection.
449 if (reject_dynamic_outliers &&
450 abs(doppler_error) > doppler_outlier_threshold) {
451 // Jacobian and residual are set to 0 by default.
452 return true;
453 }
454
455 // Compute Doppler residual and Jacobian.
456 scalar_t J_D_w[3] = {0};
457 core::linalg::kernel::cross_3x1(ds_in_V, r_v_to_s_in_V, J_D_w);
458 J_D[0] = sqrt_lambda_doppler_by_dt * J_D_w[0];
459 J_D[1] = sqrt_lambda_doppler_by_dt * J_D_w[1];
460 J_D[2] = sqrt_lambda_doppler_by_dt * J_D_w[2];
461 J_D[3] = sqrt_lambda_doppler_by_dt * -ds_in_V[0];
462 J_D[4] = sqrt_lambda_doppler_by_dt * -ds_in_V[1];
463 J_D[5] = sqrt_lambda_doppler_by_dt * -ds_in_V[2];
464 r_D = sqrt_lambda_doppler * doppler_error;
465
466 const scalar_t ps[3] = {source_points_ptr[source_idx],
467 source_points_ptr[source_idx + 1],
468 source_points_ptr[source_idx + 2]};
469
470 const scalar_t pt[3] = {target_points_ptr[target_idx],
471 target_points_ptr[target_idx + 1],
472 target_points_ptr[target_idx + 2]};
473
474 const scalar_t nt[3] = {target_normals_ptr[target_idx],
475 target_normals_ptr[target_idx + 1],
476 target_normals_ptr[target_idx + 2]};
477
478 // Compute geometric point-to-plane error.
479 const scalar_t p2p_error = (ps[0] - pt[0]) * nt[0] +
480 (ps[1] - pt[1]) * nt[1] +
481 (ps[2] - pt[2]) * nt[2];
482
483 // Compute geometric point-to-plane residual and Jacobian.
484 J_G[0] = sqrt_lambda_geometric * (-ps[2] * nt[1] + ps[1] * nt[2]);
485 J_G[1] = sqrt_lambda_geometric * (ps[2] * nt[0] - ps[0] * nt[2]);
486 J_G[2] = sqrt_lambda_geometric * (-ps[1] * nt[0] + ps[0] * nt[1]);
487 J_G[3] = sqrt_lambda_geometric * nt[0];
488 J_G[4] = sqrt_lambda_geometric * nt[1];
489 J_G[5] = sqrt_lambda_geometric * nt[2];
490 r_G = sqrt_lambda_geometric * p2p_error;
491
492 return true;
493}
494
495template bool GetJacobianDopplerICP(const int64_t workload_idx,
496 const float *source_points_ptr,
497 const float *source_dopplers_ptr,
498 const float *source_directions_ptr,
499 const float *target_points_ptr,
500 const float *target_normals_ptr,
501 const int64_t *correspondence_indices,
502 const float *R_S_to_V,
503 const float *r_v_to_s_in_V,
504 const float *v_s_in_S,
505 const bool reject_dynamic_outliers,
506 const float doppler_outlier_threshold,
507 const float &sqrt_lambda_geometric,
508 const float &sqrt_lambda_doppler,
509 const float &sqrt_lambda_doppler_by_dt,
510 float *J_G,
511 float *J_D,
512 float &r_G,
513 float &r_D);
514
515template bool GetJacobianDopplerICP(const int64_t workload_idx,
516 const double *source_points_ptr,
517 const double *source_dopplers_ptr,
518 const double *source_directions_ptr,
519 const double *target_points_ptr,
520 const double *target_normals_ptr,
521 const int64_t *correspondence_indices,
522 const double *R_S_to_V,
523 const double *r_v_to_s_in_V,
524 const double *v_s_in_S,
525 const bool reject_dynamic_outliers,
526 const double doppler_outlier_threshold,
527 const double &sqrt_lambda_geometric,
528 const double &sqrt_lambda_doppler,
529 const double &sqrt_lambda_doppler_by_dt,
530 double *J_G,
531 double *J_D,
532 double &r_G,
533 double &r_D);
534
535template <typename scalar_t>
537 int64_t workload_idx,
538 const scalar_t *target_points_ptr,
539 const int64_t *correspondence_indices,
540 scalar_t *jacobian_x,
541 scalar_t *jacobian_y,
542 scalar_t *jacobian_z) {
543 if (correspondence_indices[workload_idx] == -1) {
544 return false;
545 }
546
547 const int64_t target_idx = 3 * correspondence_indices[workload_idx];
548
549 jacobian_x[0] = jacobian_x[4] = jacobian_x[5] = 0.0;
550 jacobian_x[1] = target_points_ptr[target_idx + 2];
551 jacobian_x[2] = -target_points_ptr[target_idx + 1];
552 jacobian_x[3] = 1.0;
553
554 jacobian_y[1] = jacobian_y[3] = jacobian_y[5] = 0.0;
555 jacobian_y[0] = -target_points_ptr[target_idx + 2];
556 jacobian_y[2] = target_points_ptr[target_idx];
557 jacobian_y[4] = 1.0;
558
559 jacobian_z[2] = jacobian_z[3] = jacobian_z[4] = 0.0;
560 jacobian_z[0] = target_points_ptr[target_idx + 1];
561 jacobian_z[1] = -target_points_ptr[target_idx];
562 jacobian_z[5] = 1.0;
563
564 return true;
565}
566
567template bool GetInformationJacobians(int64_t workload_idx,
568 const float *target_points_ptr,
569 const int64_t *correspondence_indices,
570 float *jacobian_x,
571 float *jacobian_y,
572 float *jacobian_z);
573
574template bool GetInformationJacobians(int64_t workload_idx,
575 const double *target_points_ptr,
576 const int64_t *correspondence_indices,
577 double *jacobian_x,
578 double *jacobian_y,
579 double *jacobian_z);
580
581} // namespace kernel
582} // namespace pipelines
583} // namespace t
584} // namespace open3d
Common CUDA utilities.
#define OPEN3D_HOST_DEVICE
Definition CUDAUtils.h:43
double t
Definition SurfaceReconstructionPoisson.cpp:172
OPEN3D_HOST_DEVICE OPEN3D_FORCE_INLINE void cross_3x1(const scalar_t *A_3x1_input, const scalar_t *B_3x1_input, scalar_t *C_3x1_output)
Definition Matrix.h:63
OPEN3D_HOST_DEVICE OPEN3D_FORCE_INLINE scalar_t dot_3x1(const scalar_t *A_3x1_input, const scalar_t *B_3x1_input)
Definition Matrix.h:89
OPEN3D_HOST_DEVICE bool GetJacobianPointToPlane(int64_t workload_idx, const scalar_t *source_points_ptr, const scalar_t *target_points_ptr, const scalar_t *target_normals_ptr, const int64_t *correspondence_indices, scalar_t *J_ij, scalar_t &r)
Definition RegistrationImpl.h:210
void ComputeInformationMatrixCPU(const core::Tensor &target_points, const core::Tensor &correspondence_indices, core::Tensor &information_matrix, const core::Dtype &dtype, const core::Device &device)
Definition RegistrationCPU.cpp:640
OPEN3D_HOST_DEVICE bool GetJacobianDopplerICP(const int64_t workload_idx, const scalar_t *source_points_ptr, const scalar_t *source_dopplers_ptr, const scalar_t *source_directions_ptr, const scalar_t *target_points_ptr, const scalar_t *target_normals_ptr, const int64_t *correspondence_indices, const scalar_t *R_S_to_V, const scalar_t *r_v_to_s_in_V, const scalar_t *v_s_in_S, const bool reject_dynamic_outliers, const scalar_t doppler_outlier_threshold, const scalar_t &sqrt_lambda_geometric, const scalar_t &sqrt_lambda_doppler, const scalar_t &sqrt_lambda_doppler_by_dt, scalar_t *J_G, scalar_t *J_D, scalar_t &r_G, scalar_t &r_D)
Definition RegistrationImpl.h:406
void ComputeRtPointToPointCPU(const core::Tensor &source_points, const core::Tensor &target_points, const core::Tensor &corres, core::Tensor &R, core::Tensor &t, int &inlier_count, const core::Dtype &dtype, const core::Device &device)
Definition RegistrationCPU.cpp:547
void ComputePoseDopplerICPCPU(const core::Tensor &source_points, const core::Tensor &source_dopplers, const core::Tensor &source_directions, const core::Tensor &target_points, const core::Tensor &target_normals, const core::Tensor &correspondence_indices, core::Tensor &output_pose, float &residual, int &inlier_count, const core::Dtype &dtype, const core::Device &device, const core::Tensor &R_S_to_V, const core::Tensor &r_v_to_s_in_V, const core::Tensor &w_v_in_V, const core::Tensor &v_v_in_V, const double period, const bool reject_dynamic_outliers, const double doppler_outlier_threshold, const registration::RobustKernel &kernel_geometric, const registration::RobustKernel &kernel_doppler, const double lambda_doppler)
Definition RegistrationCPU.cpp:354
void ComputePoseColoredICPSYCL(const core::Tensor &source_points, const core::Tensor &source_colors, const core::Tensor &target_points, const core::Tensor &target_normals, const core::Tensor &target_colors, const core::Tensor &target_color_gradients, const core::Tensor &correspondence_indices, core::Tensor &pose, float &residual, int &inlier_count, const core::Dtype &dtype, const core::Device &device, const registration::RobustKernel &kernel, const double &lambda_geometric)
Definition RegistrationSYCL.cpp:98
void ComputePosePointToPlaneCPU(const core::Tensor &source_points, const core::Tensor &target_points, const core::Tensor &target_normals, const core::Tensor &correspondence_indices, core::Tensor &pose, float &residual, int &inlier_count, const core::Dtype &dtype, const core::Device &device, const registration::RobustKernel &kernel)
Definition RegistrationCPU.cpp:99
void ComputeInformationMatrixSYCL(const core::Tensor &target_points, const core::Tensor &correspondence_indices, core::Tensor &information_matrix, const core::Dtype &dtype, const core::Device &device)
Definition RegistrationSYCL.cpp:320
void ComputePoseColoredICPCPU(const core::Tensor &source_points, const core::Tensor &source_colors, const core::Tensor &target_points, const core::Tensor &target_normals, const core::Tensor &target_colors, const core::Tensor &target_color_gradients, const core::Tensor &correspondence_indices, core::Tensor &pose, float &residual, int &inlier_count, const core::Dtype &dtype, const core::Device &device, const registration::RobustKernel &kernel, const double &lambda_geometric)
Definition RegistrationCPU.cpp:211
void ComputePosePointToPlaneSYCL(const core::Tensor &source_points, const core::Tensor &target_points, const core::Tensor &target_normals, const core::Tensor &correspondence_indices, core::Tensor &pose, float &residual, int &inlier_count, const core::Dtype &dtype, const core::Device &device, const registration::RobustKernel &kernel)
Definition RegistrationSYCL.cpp:31
OPEN3D_HOST_DEVICE bool GetJacobianColoredICP(const int64_t workload_idx, const scalar_t *source_points_ptr, const scalar_t *source_colors_ptr, const scalar_t *target_points_ptr, const scalar_t *target_normals_ptr, const scalar_t *target_colors_ptr, const scalar_t *target_color_gradients_ptr, const int64_t *correspondence_indices, const scalar_t &sqrt_lambda_geometric, const scalar_t &sqrt_lambda_photometric, scalar_t *J_G, scalar_t *J_I, scalar_t &r_G, scalar_t &r_I)
Definition RegistrationImpl.h:264
OPEN3D_HOST_DEVICE void PreComputeForDopplerICP(const scalar_t *R_S_to_V, const scalar_t *r_v_to_s_in_V, const scalar_t *w_v_in_V, const scalar_t *v_v_in_V, scalar_t *v_s_in_S)
Definition RegistrationImpl.h:376
void ComputePoseDopplerICPSYCL(const core::Tensor &source_points, const core::Tensor &source_dopplers, const core::Tensor &source_directions, const core::Tensor &target_points, const core::Tensor &target_normals, const core::Tensor &correspondence_indices, core::Tensor &output_pose, float &residual, int &inlier_count, const core::Dtype &dtype, const core::Device &device, const core::Tensor &R_S_to_V, const core::Tensor &r_v_to_s_in_V, const core::Tensor &w_v_in_V, const core::Tensor &v_v_in_V, const double period, const bool reject_dynamic_outliers, const double doppler_outlier_threshold, const registration::RobustKernel &kernel_geometric, const registration::RobustKernel &kernel_doppler, const double lambda_doppler)
Definition RegistrationSYCL.cpp:191
OPEN3D_HOST_DEVICE bool GetInformationJacobians(int64_t workload_idx, const scalar_t *target_points_ptr, const int64_t *correspondence_indices, scalar_t *jacobian_x, scalar_t *jacobian_y, scalar_t *jacobian_z)
Definition RegistrationImpl.h:536
Definition PinholeCameraIntrinsic.cpp:16