supereight
Loading...
Searching...
No Matches
icp.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2014 University of Edinburgh, Imperial College, University of Manchester
3 * SPDX-FileCopyrightText: 2016-2019 Emanuele Vespa
4 * SPDX-FileCopyrightText: 2022 Smart Robotics Lab, Imperial College London, Technical University of Munich
5 * SPDX-FileCopyrightText: 2022 Nils Funk
6 * SPDX-FileCopyrightText: 2022 Sotiris Papatheodorou
7 * SPDX-License-Identifier: MIT
8 */
9
10#ifndef SE_ICP_HPP
11#define SE_ICP_HPP
12
13#include <Eigen/Geometry>
16#include <se/image/image.hpp>
17
18namespace se {
19namespace icp {
20
30
31struct Data {
33 float error = 0.0f;
34 float J[6] = {0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f};
35};
36
37
38
39Eigen::Matrix<float, 6, 6> makeJTJ(const Eigen::Matrix<float, 1, 21>& v);
40
41Eigen::Matrix<float, 6, 1> solve(const Eigen::Matrix<float, 1, 27>& vals);
42
43void newReduce(const int block_idx,
44 float* output_data,
45 const Eigen::Vector2i& output_res,
46 Data* J_data,
47 const Eigen::Vector2i& J_res);
48
50 const Eigen::Vector2i& output_res,
51 Data* J_data,
52 const Eigen::Vector2i& J_res);
53
61template<typename ProjectF>
67 const Eigen::Isometry3f& T_WS,
68 const Eigen::Isometry3f& T_WS_ref,
69 const ProjectF project,
70 const float dist_threshold,
71 const float normal_threshold);
72
73bool updatePoseKernel(Eigen::Isometry3f& T_WS,
74 const float* reduction_output_data,
75 const float icp_threshold);
76
77bool checkPoseKernel(Eigen::Isometry3f& T_WS,
78 Eigen::Isometry3f& previous_T_WS,
79 const float* reduction_output_data,
80 const Eigen::Vector2i& reduction_output_res,
81 const float track_threshold);
82
83} // namespace icp
84} // namespace se
85
86#include "impl/icp_impl.hpp"
87
88#endif // SE_ICP_HPP
Definition image.hpp:19
bool checkPoseKernel(Eigen::Isometry3f &T_WS, Eigen::Isometry3f &previous_T_WS, const float *reduction_output_data, const Eigen::Vector2i &reduction_output_res, const float track_threshold)
TrackingResult
Definition icp.hpp:21
@ ResultUnknown
Definition icp.hpp:23
@ ResultSuccess
Definition icp.hpp:22
@ ResultProjectionOutside
Definition icp.hpp:25
@ ResultDistThreshold
Definition icp.hpp:27
@ ResultNormalThreshold
Definition icp.hpp:28
@ ResultInvalidRefNormal
Definition icp.hpp:26
@ ResultInvalidInputNormal
Definition icp.hpp:24
void trackKernel(Data *output_data, const Image< Eigen::Vector3f > &input_point_cloud_S, const Image< Eigen::Vector3f > &input_normals_S, const Image< Eigen::Vector3f > &surface_point_cloud_M_ref, const Image< Eigen::Vector3f > &surface_normals_M_ref, const Eigen::Isometry3f &T_WS, const Eigen::Isometry3f &T_WS_ref, const ProjectF project, const float dist_threshold, const float normal_threshold)
ProjectF is functor with the following declaration, returning whether the projection of point_S succe...
Eigen::Matrix< float, 6, 6 > makeJTJ(const Eigen::Matrix< float, 1, 21 > &v)
void newReduce(const int block_idx, float *output_data, const Eigen::Vector2i &output_res, Data *J_data, const Eigen::Vector2i &J_res)
Eigen::Matrix< float, 6, 1 > solve(const Eigen::Matrix< float, 1, 27 > &vals)
void reduceKernel(float *output_data, const Eigen::Vector2i &output_res, Data *J_data, const Eigen::Vector2i &J_res)
bool updatePoseKernel(Eigen::Isometry3f &T_WS, const float *reduction_output_data, const float icp_threshold)
Helper wrapper to allocate and de-allocate octants in the octree.
Definition bounded_vector.hpp:14
Definition icp.hpp:31
float error
Definition icp.hpp:33
TrackingResult result
Definition icp.hpp:32
float J[6]
Definition icp.hpp:34