supereight
volume_carver.hpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: 2020-2021 Smart Robotics Lab, Imperial College London, Technical University of Munich
3  * SPDX-FileCopyrightText: 2020-2021 Nils Funk
4  * SPDX-FileCopyrightText: 2021 Sotiris Papatheodorou
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #ifndef SE_VOLUME_CARVER_HPP
9 #define SE_VOLUME_CARVER_HPP
10 
11 
12 
13 #include <Eigen/Core>
14 #include <set>
15 
17 #include "se/common/str_utils.hpp"
19 #include "se/map/map.hpp"
20 
21 
22 
23 namespace se {
24 
25 
26 
28 
30  std::vector<se::OctantBase*> node_list;
31  std::vector<se::OctantBase*> block_list;
32  std::vector<se::VarianceState> variance_state_list;
33  std::vector<bool> projects_inside_list;
34 };
35 
36 
37 
38 template<typename MapT, typename SensorT>
39 class VolumeCarver {
40  public:
41  VolumeCarver(MapT& /* map */,
42  const SensorT& /* sensor */,
43  const se::Image<float>& /* depth_img */,
44  const se::DensePoolingImage<SensorT>& /* depth_pooling_img */,
45  const Eigen::Matrix4f& /* T_SW */,
46  const int /* frame */){};
47 };
48 
49 
50 
59 template<se::Colour ColB, se::Semantics SemB, int BlockSize, typename SensorT>
60 class VolumeCarver<Map<Data<se::Field::Occupancy, ColB, SemB>, se::Res::Multi, BlockSize>,
61  SensorT> {
62  public:
64  typedef typename MapType::OctreeType OctreeType;
65  typedef typename OctreeType::NodeType NodeType;
66  typedef typename OctreeType::BlockType BlockType;
67 
73  struct VolumeCarverConfig {
74  VolumeCarverConfig(const MapType& map) :
75  sigma_min(map.getDataConfig().sigma_min_factor * map.getRes()),
76  sigma_max(map.getDataConfig().sigma_max_factor * map.getRes()),
77  tau_min(map.getDataConfig().tau_min_factor * map.getRes()),
78  tau_max(map.getDataConfig().tau_max_factor * map.getRes())
79  {
80  }
81 
82  const float sigma_min;
83  const float sigma_max;
84  const float tau_min;
85  const float tau_max;
86  };
87 
88 
98  VolumeCarver(MapType& map,
99  const SensorT& sensor,
100  const se::Image<float>& depth_img,
101  const Eigen::Matrix4f& T_WS,
102  const int frame);
103 
107  VolumeCarverAllocation operator()();
108 
109 
110 
111  private:
119  bool crossesFrustum(std::vector<srl::projection::ProjectionStatus>& proj_corner_stati);
120 
130  bool cameraInNode(const Eigen::Vector3i& node_coord,
131  const int node_size,
132  const Eigen::Matrix4f& T_WS);
133 
145  se::VarianceState computeVariance(const float depth_value_min,
146  const float depth_value_max,
147  const float node_dist_min_m,
148  const float node_dist_max_m);
149 
161  template<class SensorTDummy = SensorT>
162  typename std::enable_if_t<std::is_same<SensorTDummy, se::PinholeCamera>::value, void>
163  operator()(const Eigen::Vector3i& octant_coord,
164  const int octant_size,
165  const int octant_depth,
166  se::OctantBase* octant_ptr);
167 
179  template<class SensorTDummy = SensorT>
180  typename std::enable_if_t<std::is_same<SensorTDummy, se::OusterLidar>::value, void>
181  operator()(const Eigen::Vector3i& octant_coord,
182  const int octant_size,
183  const int octant_depth,
184  se::OctantBase* octant_ptr);
185 
186  MapType& map_;
187  OctreeType& octree_;
188  const SensorT& sensor_;
189  const se::DensePoolingImage<SensorT> depth_pooling_img_;
190  const Eigen::Matrix4f T_SW_;
191  const int frame_;
192  const float map_res_;
193  VolumeCarverConfig config_;
194  const float max_depth_value_;
195  const float zero_depth_band_;
196  const float size_to_radius_;
197  VolumeCarverAllocation allocation_list_;
198 };
199 
200 
201 
202 } // namespace se
203 
204 #include "impl/volume_carver_impl.hpp"
205 
206 #endif // SE_VOLUME_CARVER_HPP
std::vector< se::OctantBase * > node_list
Definition: volume_carver.hpp:30
std::vector< se::OctantBase * > block_list
Definition: volume_carver.hpp:31
VolumeCarver(MapT &, const SensorT &, const se::Image< float > &, const se::DensePoolingImage< SensorT > &, const Eigen::Matrix4f &, const int)
Definition: volume_carver.hpp:41
std::vector< se::VarianceState > variance_state_list
Definition: volume_carver.hpp:32
Definition: data.hpp:95
std::vector< bool > projects_inside_list
Definition: volume_carver.hpp:33
Definition: volume_carver.hpp:39
Map< Data< se::Field::Occupancy, ColB, SemB >, se::Res::Multi > MapType
Definition: volume_carver.hpp:63
This class only helps to dynamic cast the octant to the right type and builds the base of nodes and b...
Definition: octant.hpp:24
Definition: map.hpp:64
VarianceState
Definition: volume_carver.hpp:27
Helper wrapper to allocate and de-allocate octants in the octree.
Definition: colour_utils.hpp:17
Definition: volume_carver.hpp:29