ifm3d
distance_image_info.h
1 /*
2  * Copyright 2022-present ifm electronic, gmbh
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 #ifndef IFM3D_DISTANCE_IMAGE_INFO_H
6 #define IFM3D_DISTANCE_IMAGE_INFO_H
7 
8 #include <cstddef>
9 #include <cstdint>
10 #include <ifm3d/fg/buffer.h>
11 #include <memory>
12 #include <vector>
13 
14 #include <ifm3d/fg/module_frame_grabber.h>
15 
16 namespace ifm3d
17 {
18  constexpr auto CHUNK_SIZE_INFO_OFFSET = 4;
19  constexpr auto HEADER_SIZE_INFO_OFFSET = 8;
20  constexpr auto HEADER_VERSION_INFO_OFFSET = 12;
21  constexpr auto DISTANCE_IMAGE_INFO_DATA_SIZE = 360;
22 
23  constexpr auto NR_MODEL_PARAMS = 32;
24  constexpr auto AMPL_NORM_FACTOR_VECTOR_SIZE = 3;
25  constexpr auto EXTR_OPTIC_USER_VECTOR_SIZE = 6;
26 
27  // NOLINTNEXTLINE(performance-enum-size)
28  enum class ExtrinsicParam : std::uint32_t
29  {
30  TRANS_X = 0, // Translation along x-direction in meters.
31  TRANS_Y = 1, // Translation along y-direction in meters.
32  TRANS_Z = 2, // Translation along Z-direction in meters.
33  ROT_X = 3, // Rotation along x-axis in radians. Positive values indicate
34  // clockwise rotation.
35  ROT_Y = 4, // Rotation along y-axis in radians. Positive values indicate
36  // clockwise rotation.
37  ROT_Z = 5 // Rotation along z-axis in radians. Positive values indicate
38  // clockwise rotation.
39  };
40 
42  {
43  uint32_t model_id;
44  std::array<float, NR_MODEL_PARAMS> model_parameters;
45  };
46 
47  class IFM3D_EXPORT DistanceImageInfo
48  {
49  float _dist_resolution;
50  float _ampl_resolution;
51  std::vector<float> _amp_norm_factors;
52  std::vector<float> _extrinsic_optic_to_user;
53  IntrinsicCalibration _intrinsic_calibration;
54  IntrinsicCalibration _inverse_intrinsic_calibration;
55  std::vector<std::uint16_t> _u16_distance_buffer;
56  std::vector<std::uint16_t> _u16_amplitude_buffer;
57  std::uint32_t _width, _height;
58  std::vector<uint64_t> _timestamps_nsec;
59  std::vector<float> _exposure_times_sec;
60 
61  public:
62  DistanceImageInfo(const DistanceImageInfo&) = default;
64  DistanceImageInfo& operator=(const DistanceImageInfo&) = delete;
65  DistanceImageInfo& operator=(DistanceImageInfo&&) = delete;
66  DistanceImageInfo(float dist_res,
67  float ampl_res,
68  const std::vector<float>& amp_norm_fctrs,
69  const std::vector<float>& extr_opt_to_usr,
70  const IntrinsicCalibration& intr_calib,
71  const IntrinsicCalibration& inv_intr_calib,
72  const std::vector<std::uint16_t>& distance_buffer,
73  const std::vector<std::uint16_t>& amplitude_buffer,
74  const std::vector<uint64_t>& timestamps_nsec,
75  const std::vector<float>& exposure_times_sec,
76  std::uint32_t width,
77  std::uint32_t height);
78  ~DistanceImageInfo() = default;
79  std::vector<std::uint8_t> GetXyzdVector();
80  std::vector<std::uint8_t> GetAmplitudeVector();
81 
82  auto
83  GetExtrinsicOpticToUser()
84  {
85  return _extrinsic_optic_to_user;
86  }
87 
88  auto
89  GetIntrinsicCalibration()
90  {
91  return _intrinsic_calibration;
92  }
93 
94  auto
95  GetInverseIntrinsicCalibration()
96  {
97  return _inverse_intrinsic_calibration;
98  }
99 
100  [[nodiscard]] auto
101  GetNpts() const
102  {
103  return (_width * _height);
104  }
105 
106  [[nodiscard]] auto
107  GetWidth() const
108  {
109  return _width;
110  }
111 
112  [[nodiscard]] auto
113  GetHeight() const
114  {
115  return _height;
116  }
117 
121  std::vector<uint64_t>
123  {
124  return _timestamps_nsec;
125  }
126 
131  std::vector<float>
133  {
134  return _exposure_times_sec;
135  }
136 
141  [[nodiscard]] ifm3d::Buffer ApplyDistanceResolution(
142  const ifm3d::Buffer& ui16_distance_buffer) const;
143  };
144  using DistanceImageInfoPtr = std::unique_ptr<DistanceImageInfo>;
145  IFM3D_EXPORT DistanceImageInfoPtr
146  create_distance_image_info(const std::vector<std::uint8_t>& data_buffer,
147  std::size_t distimageinfo_idx,
148  std::size_t dist_idx,
149  std::size_t amp_idx,
150  std::uint32_t width,
151  std::uint32_t height);
152 } // end: namespace ifm3d
153 
154 #endif // IFM3D_DISTANCE_IMAGE_INFO_H
ifm3d::Buffer
The class Buffer represent a STL container to store data from the ifm devices in 2 dimension and supp...
Definition: buffer.h:98
ifm3d::DistanceImageInfo
Definition: distance_image_info.h:47
ifm3d::DistanceImageInfo::GetTimestamps
std::vector< uint64_t > GetTimestamps()
returns the timestamps in nano seconds
Definition: distance_image_info.h:122
ifm3d::DistanceImageInfo::GetExposureTimes
std::vector< float > GetExposureTimes()
return the exposure time for each phase data
Definition: distance_image_info.h:132
ifm3d::IntrinsicCalibration
Definition: distance_image_info.h:41