138 lines
6.2 KiB
C
138 lines
6.2 KiB
C
![]() |
// ----------------------------------------------------------------------------
|
||
|
// - Open3D: www.open3d.org -
|
||
|
// ----------------------------------------------------------------------------
|
||
|
// Copyright (c) 2018-2023 www.open3d.org
|
||
|
// SPDX-License-Identifier: MIT
|
||
|
// ----------------------------------------------------------------------------
|
||
|
|
||
|
#pragma once
|
||
|
|
||
|
#include "open3d/core/Tensor.h"
|
||
|
#include "open3d/t/geometry/Image.h"
|
||
|
#include "open3d/t/geometry/RGBDImage.h"
|
||
|
#include "open3d/t/geometry/VoxelBlockGrid.h"
|
||
|
#include "open3d/t/pipelines/odometry/RGBDOdometry.h"
|
||
|
#include "open3d/t/pipelines/slam/Frame.h"
|
||
|
|
||
|
namespace open3d {
|
||
|
namespace t {
|
||
|
namespace pipelines {
|
||
|
namespace slam {
|
||
|
|
||
|
/// Model class maintaining a volumetric grid and the current active frame's
|
||
|
/// pose. Wraps functionalities including integration, ray casting, and surface
|
||
|
/// reconstruction.
|
||
|
class Model {
|
||
|
public:
|
||
|
Model() {}
|
||
|
Model(float voxel_size,
|
||
|
int block_resolution = 16,
|
||
|
int block_count = 1000,
|
||
|
const core::Tensor& T_init = core::Tensor::Eye(4,
|
||
|
core::Float64,
|
||
|
core::Device("CPU:0")),
|
||
|
const core::Device& device = core::Device("CUDA:0"));
|
||
|
|
||
|
core::Tensor GetCurrentFramePose() const { return T_frame_to_world_; }
|
||
|
void UpdateFramePose(int frame_id, const core::Tensor& T_frame_to_world) {
|
||
|
if (frame_id != frame_id_ + 1) {
|
||
|
utility::LogWarning("Skipped {} frames in update T!",
|
||
|
frame_id - (frame_id_ + 1));
|
||
|
}
|
||
|
frame_id_ = frame_id;
|
||
|
T_frame_to_world_ = T_frame_to_world.Contiguous();
|
||
|
}
|
||
|
|
||
|
/// Apply ray casting to obtain a synthesized model frame at the down
|
||
|
/// sampled resolution.
|
||
|
/// \param raycast_frame RGBD frame to fill the raycasting results.
|
||
|
/// \param depth_scale Scale factor to convert raw data into meter metric.
|
||
|
/// \param depth_min Depth where ray casting starts from.
|
||
|
/// \param depth_max Depth where ray casting stops at.
|
||
|
/// \param trunc_voxel_multiplier Truncation distance multiplier in voxel
|
||
|
/// size for signed distance. For instance, --trunc_voxel_multiplier=8 with
|
||
|
/// --voxel_size=0.006(m) creates a truncation distance of 0.048(m).
|
||
|
/// \param enable_color Enable color in the raycasting results.
|
||
|
/// \param weight_threshold Weight threshold of the TSDF voxels to prune
|
||
|
/// noise. Use -1 to apply default logic: min(frame_id_ * 1.0f, 3.0f).
|
||
|
void SynthesizeModelFrame(Frame& raycast_frame,
|
||
|
float depth_scale = 1000.0,
|
||
|
float depth_min = 0.1,
|
||
|
float depth_max = 3.0,
|
||
|
float trunc_voxel_multiplier = 8.0,
|
||
|
bool enable_color = true,
|
||
|
float weight_threshold = -1.0);
|
||
|
|
||
|
/// Track using depth odometry.
|
||
|
/// \param input_frame Input RGBD frame.
|
||
|
/// \param raycast_frame RGBD frame generated by raycasting.
|
||
|
/// \param depth_scale Scale factor to convert raw data into meter metric.
|
||
|
/// \param depth_max Depth truncation to discard points far away from the
|
||
|
/// camera
|
||
|
/// \param method Method used to apply RGBD odometry.
|
||
|
/// \param criteria Criteria used to define and terminate iterations.
|
||
|
/// In multiscale odometry the order is from coarse to fine. Inputting a
|
||
|
/// vector of iterations by default triggers the implicit conversion.
|
||
|
odometry::OdometryResult TrackFrameToModel(
|
||
|
const Frame& input_frame,
|
||
|
const Frame& raycast_frame,
|
||
|
float depth_scale = 1000.0,
|
||
|
float depth_max = 3.0,
|
||
|
float depth_diff = 0.07,
|
||
|
odometry::Method method = odometry::Method::PointToPlane,
|
||
|
const std::vector<odometry::OdometryConvergenceCriteria>& criteria =
|
||
|
{6, 3, 1});
|
||
|
|
||
|
/// Integrate RGBD frame into the volumetric voxel grid.
|
||
|
/// \param input_frame Input RGBD frame.
|
||
|
/// \param depth_scale Scale factor to convert raw data into meter metric.
|
||
|
/// \param depth_max Depth truncation to discard points far away from the
|
||
|
/// camera.
|
||
|
/// \param trunc_voxel_multiplier Truncation distance multiplier in voxel
|
||
|
/// size for signed distance. For instance, --trunc_voxel_multiplier=8 with
|
||
|
/// --voxel_size=0.006(m) creates a truncation distance of 0.048(m).
|
||
|
void Integrate(const Frame& input_frame,
|
||
|
float depth_scale = 1000.0,
|
||
|
float depth_max = 3.0,
|
||
|
float trunc_voxel_multiplier = 8.0f);
|
||
|
|
||
|
/// Extract surface point cloud for visualization / model saving.
|
||
|
/// \param weight_threshold Weight threshold of the TSDF voxels to prune
|
||
|
/// noise.
|
||
|
/// \param estimated_number Estimation of the point cloud size, helpful for
|
||
|
/// real-time visualization.
|
||
|
/// \return Extracted point cloud.
|
||
|
t::geometry::PointCloud ExtractPointCloud(float weight_threshold = 3.0f,
|
||
|
int estimated_number = -1);
|
||
|
|
||
|
/// Extract surface triangle mesh for visualization / model saving.
|
||
|
/// \param weight_threshold Weight threshold of the TSDF voxels to prune
|
||
|
/// noise.
|
||
|
/// \param estimated_number Estimation of the point cloud size, helpful for
|
||
|
/// real-time visualization.
|
||
|
/// \return Extracted point cloud.
|
||
|
t::geometry::TriangleMesh ExtractTriangleMesh(float weight_threshold = 3.0f,
|
||
|
int estimated_number = -1);
|
||
|
|
||
|
/// Get block hashmap int the VoxelBlockGrid.
|
||
|
core::HashMap GetHashMap();
|
||
|
|
||
|
public:
|
||
|
/// Maintained volumetric map.
|
||
|
t::geometry::VoxelBlockGrid voxel_grid_;
|
||
|
|
||
|
/// Active block coordinates from prior integration
|
||
|
core::Tensor frustum_block_coords_;
|
||
|
|
||
|
/// T_frame_to_model, maintained tracking state in a (4, 4), Float64 Tensor
|
||
|
/// on CPU.
|
||
|
core::Tensor T_frame_to_world_;
|
||
|
|
||
|
int frame_id_ = -1;
|
||
|
};
|
||
|
|
||
|
} // namespace slam
|
||
|
} // namespace pipelines
|
||
|
} // namespace t
|
||
|
} // namespace open3d
|