43 using t::geometry::PointCloud;
47 static PointCloud CreateTPCDFromFile(
48 const std::string& fname,
49 const core::Device& device = core::Device(
"CPU:0")) {
50 std::shared_ptr<open3d::geometry::PointCloud> pcd =
64 const float threshold) {
70 tpcd_i.GetPointNormals(), i, j, threshold);
73 void FillInRigidAlignmentTerm(
Tensor& AtA,
76 const std::vector<std::string>& fnames,
83 for (
auto& edge : pose_graph.
edges_) {
84 int i = edge.source_node_id_;
85 int j = edge.target_node_id_;
87 std::string corres_fname =
fmt::format(
"{}/{:03d}_{:03d}.npy",
94 PointCloud tpcd_i = CreateTPCDFromFile(fnames[i], device);
95 PointCloud tpcd_j = CreateTPCDFromFile(fnames[j], device);
109 FillInRigidAlignmentTerm(AtA, Atb, residual, tpcd_i_indexed,
110 tpcd_j_indexed, Ti, Tj, i, j,
120 static void FillInSLACAlignmentTerm(
Tensor& AtA,
130 const int n_fragments,
131 const float threshold) {
161 Tensor RjT_Ri_Cnormal_ps =
165 AtA, Atb, residual, Ti_Cps, Tj_Cqs, Cnormal_ps, Ri_Cnormal_ps,
166 RjT_Ri_Cnormal_ps, cgrid_index_ps, cgrid_index_qs, cgrid_ratio_ps,
167 cgrid_ratio_qs, i, j, n_fragments, threshold);
170 void FillInSLACAlignmentTerm(
Tensor& AtA,
174 const std::vector<std::string>& fnames,
179 int n_frags = pose_graph.
nodes_.size();
182 for (
auto& edge : pose_graph.
edges_) {
183 int i = edge.source_node_id_;
184 int j = edge.target_node_id_;
186 std::string corres_fname =
fmt::format(
"{}/{:03d}_{:03d}.npy",
194 PointCloud tpcd_i = CreateTPCDFromFile(fnames[i], device);
195 PointCloud tpcd_j = CreateTPCDFromFile(fnames[j], device);
220 FillInSLACAlignmentTerm(AtA, Atb, residual, ctr_grid, tpcd_param_i,
221 tpcd_param_j, Ti, Tj, i, j, n_frags,
240 Tensor active_addrs, nb_addrs, nb_masks;
246 nb_addrs, nb_masks, positions_init,
250 if (debug_option.
debug_) {
void FillInSLACRegularizerTerm(Tensor &AtA, Tensor &Atb, Tensor &residual, ControlGrid &ctr_grid, int n_frags, const SLACOptimizerParams ¶ms, const SLACDebugOption &debug_option)
Definition: FillInLinearSystemImpl.h:233
void VisualizePointCloudEmbedding(t::geometry::PointCloud &tpcd_param, ControlGrid &ctr_grid, bool show_lines)
Definition: Visualization.cpp:99
int debug_start_node_idx_
Definition: SLACOptimizer.h:115
static const std::string kGrid8NbIndices
Definition: ControlGrid.h:53
Tensor Inverse() const
Definition: Tensor.cpp:1597
#define LogWarning(...)
Definition: Console.h:95
float distance_threshold_
Distance threshold to filter inconsistent correspondences.
Definition: SLACOptimizer.h:52
int64_t GetAnchorIdx()
Definition: ControlGrid.h:136
void FillInSLACAlignmentTerm(core::Tensor &AtA, core::Tensor &Atb, core::Tensor &residual, const core::Tensor &Ti_ps, const core::Tensor &Tj_qs, const core::Tensor &normal_ps, const core::Tensor &Ri_normal_ps, const core::Tensor &RjT_Ri_normal_ps, const core::Tensor &cgrid_idx_ps, const core::Tensor &cgrid_idx_qs, const core::Tensor &cgrid_ratio_qs, const core::Tensor &cgrid_ratio_ps, int i, int j, int n, float threshold)
Definition: FillInLinearSystem.cpp:85
std::shared_ptr< geometry::PointCloud > CreatePointCloudFromFile(const std::string &filename, const std::string &format, bool print_progress)
Definition: PointCloudIO.cpp:68
Definition: SLACOptimizer.h:109
void VisualizePointCloudDeformation(const geometry::PointCloud &tpcd_param, ControlGrid &ctr_grid)
Definition: Visualization.cpp:159
core::Tensor & GetPoints()
Get the value of the "points" attribute. Convenience function.
Definition: PointCloud.h:135
Tensor Matmul(const Tensor &rhs) const
Definition: Tensor.cpp:1549
void SetPointNormals(const core::Tensor &value)
Set the value of the "normals" attribute. Convenience function.
Definition: PointCloud.h:189
void FillInRigidAlignmentTerm(core::Tensor &AtA, core::Tensor &Atb, core::Tensor &residual, const core::Tensor &Ti_ps, const core::Tensor &Tj_qs, const core::Tensor &Ri_normal_ps, int i, int j, float threshold)
Definition: FillInLinearSystem.cpp:34
Tensor IndexGet(const std::vector< Tensor > &index_tensors) const
Advanced indexing getter.
Definition: Tensor.cpp:704
Tensor T() const
Expects input to be <= 2-D Tensor by swapping dimension 0 and 1.
Definition: Tensor.cpp:772
bool debug_
Enable debug.
Definition: SLACOptimizer.h:111
Data structure defining the pose graph.
Definition: PoseGraph.h:115
geometry::PointCloud Parameterize(const geometry::PointCloud &pcd)
Definition: ControlGrid.cpp:168
Tensor To(Dtype dtype, bool copy=false) const
Definition: Tensor.cpp:540
Tensor Contiguous() const
Definition: Tensor.cpp:571
std::vector< PoseGraphNode > nodes_
List of PoseGraphNode.
Definition: PoseGraph.h:127
A pointcloud contains a set of 3D points.
Definition: PointCloud.h:95
Definition: EigenConverter.cpp:35
geometry::PointCloud Deform(const geometry::PointCloud &pcd)
Non-rigidly deform a point cloud using the control grid.
Definition: ControlGrid.cpp:258
static const Dtype Float32
Definition: Dtype.h:42
static PointCloud FromLegacyPointCloud(const open3d::geometry::PointCloud &pcd_legacy, core::Dtype dtype=core::Dtype::Float32, const core::Device &device=core::Device("CPU:0"))
Create a PointCloud from a legacy Open3D PointCloud.
Definition: PointCloud.cpp:433
static Tensor Load(const std::string &file_name)
Load tensor from numpy's npy format.
Definition: Tensor.cpp:1463
Tensor Add_(const Tensor &value)
Definition: Tensor.cpp:803
void VisualizePointCloudCorrespondences(const t::geometry::PointCloud &tpcd_i, const t::geometry::PointCloud &tpcd_j, const core::Tensor correspondences, const core::Tensor &T_ij)
Visualize pairs with correspondences.
Definition: Visualization.cpp:65
void VisualizeGridDeformation(ControlGrid &cgrid)
Definition: Visualization.cpp:207
core::Tensor & GetPointNormals()
Get the value of the "normals" attribute. Convenience function.
Definition: PointCloud.h:141
core::Device device_
Device to use.
Definition: SLACOptimizer.h:61
Definition: PinholeCameraIntrinsic.cpp:35
std::tuple< core::Tensor, core::Tensor, core::Tensor > GetNeighborGridMap()
Definition: ControlGrid.cpp:134
core::Tensor GetCurrPositions()
Definition: ControlGrid.h:130
const TensorMap & GetPointAttr() const
Getter for point_attr_ TensorMap. Used in Pybind.
Definition: PointCloud.h:125
void FillInSLACRegularizerTerm(core::Tensor &AtA, core::Tensor &Atb, core::Tensor &residual, const core::Tensor &grid_idx, const core::Tensor &grid_nbs_idx, const core::Tensor &grid_nbs_mask, const core::Tensor &positions_init, const core::Tensor &positions_curr, float weight, int n, int anchor_idx)
Definition: FillInLinearSystem.cpp:149
filament::Texture::InternalFormat format
Definition: FilamentResourceManager.cpp:199
Tensor Slice(int64_t dim, int64_t start, int64_t stop, int64_t step=1) const
Definition: Tensor.cpp:656
float regularizer_weight_
Weight of the regularizer.
Definition: SLACOptimizer.h:58
core::Tensor EigenMatrixToTensor(const Eigen::Matrix< T, M, N, A > &matrix)
Converts a Eigen matrix of shape (M, N) with alignment A and type T to a Tensor.
Definition: EigenConverter.h:47
static const std::string kGrid8NbVertexInterpRatios
8 neighbor grid interpolation ratio for vertex per point.
Definition: ControlGrid.h:55
std::string GetSubfolderName() const
Definition: SLACOptimizer.h:65
Definition: ControlGrid.h:49
Definition: SLACOptimizer.h:43
std::vector< PoseGraphEdge > edges_
List of PoseGraphEdge.
Definition: PoseGraph.h:129
core::Tensor GetInitPositions()
Get control grid original positions directly from tensor keys.
Definition: ControlGrid.h:123
bool FileExists(const std::string &filename)
Definition: FileSystem.cpp:226