Conscience Core
CscRealEntity3dLidarValues.h
Go to the documentation of this file.
1 //
2 // Created by Louis Grignon on 17/03/2026.
3 //
4 // based on https://chatgpt.com/c/69912668-fbb4-8385-91de-5664f0f0dfb7
5 // reception of optimized 3D pcl from entity with odo and queuing
6 #ifndef CscRealEntity3dLidarValues_H
7 #define CscRealEntity3dLidarValues_H
8 
9 #include "CscCommon.h"
10 #include "Axiomes/Csc3dTypes.h"
11 
12 #include <shared_mutex>
13 using std::shared_mutex;
14 
15 namespace conscience_core::lidar {
16 
17 struct LidarImuData {
18  double timestamp = 0.0;
19  double imu_accel_x = 0.0;
20  double imu_accel_y = 0.0;
21  double imu_accel_z = 0.0;
22  double imu_ang_vel_x = 0.0;
23  double imu_ang_vel_y = 0.0;
24  double imu_ang_vel_z = 0.0;
25  bool flag = false;
26 };
27 
29  float tx = 0.0f; // centimeters, forward
30  float ty = 0.0f; // centimeters, up
31  float tz = 0.0f; // centimeters, right
32 
33  float yawRad = 0.0f;
34  float pitchRad = 0.0f;
35  float rollRad = 0.0f;
36 
37  bool enabled = true;
38 
39  inline void applyLidarToRobotTransform(float &x, float &y, float &z) const {
40  if (!enabled) {
41  return;
42  }
43 
44  float rx = x;
45  float ry = y;
46  float rz = z;
47 
48  if (rollRad != 0.0f) {
49  const float c = std::cos(rollRad);
50  const float s = std::sin(rollRad);
51  const float ny = c * ry - s * rz;
52  const float nz = s * ry + c * rz;
53  ry = ny;
54  rz = nz;
55  }
56 
57  if (pitchRad != 0.0f) {
58  const float c = std::cos(pitchRad);
59  const float s = std::sin(pitchRad);
60  const float nx = c * rx + s * ry;
61  const float ny = -s * rx + c * ry;
62  rx = nx;
63  ry = ny;
64  }
65 
66  if (yawRad != 0.0f) {
67  const float c = std::cos(yawRad);
68  const float s = std::sin(yawRad);
69  const float nx = c * rx - s * rz;
70  const float nz = s * rx + c * rz;
71  rx = nx;
72  rz = nz;
73  }
74 
75  x = rx + tx;
76  y = ry + ty;
77  z = rz + tz;
78  }
79 };
80 
82 public:
107  static vector<float> loadVerticalAnglesRadFromCsvFile(const string &filePath, const string &elevationHeaderName = "elevation");
109  uint32_t frameId = 0u;
110  uint16_t rows = 0u;
111  uint16_t cols = 0u;
112  double timestamp = 0.0;
116 
117  void getAsPointCloud(vector<axiomes::CscPoint3d> &pointCloud,
118  double &minY,
119  double &maxY,
120  double &avgY, const vector<float> &verticalAnglesRad);
121  };
122 
123  explicit CscRealEntity3dLidarValues(const vector<float> &verticalAnglesRad);
124 
125  const vector<float> &getVerticalAnglesRad() const;
126 
127  void clear();
128 
153  void integrateFrame(uint16_t rows,
154  uint16_t cols,
155  uint32_t frameId,
156  bool isKeyFrame,
157  const uint8_t *data,
158  size_t count,
159  const LidarImuData &imu,
160  LidarExtrinsics lidarExtrinsics);
161 
162  map<double, double> get2DSliceAtHeight(double targetY = 15, double tolerance = 20) const;
163 
164  bool getLatest(QueuedRangeImage &out);
165 
166 private:
167  mutable shared_mutex mutex_;
168 
169  vector<float> verticalAnglesRad;
170 
171  ptr<QueuedRangeImage> currentFrame_ = nullptr;
172 
173  uint32_t currentFrameId_ = 0u;
174  uint16_t currentRows_ = 0u;
175  uint16_t currentCols_ = 0u;
176 
177  static size_t index_(uint16_t row, uint16_t col, uint16_t cols);
178 
179  void initCurrent_(uint16_t rows, uint16_t cols);
180 
181  unique_ptr<CscLogger> logger = CscLogger::getForCategory("CscRealEntity3dLidarValues");
182 };
183 }
184 #endif
rows
int rows
Definition: PathFinding3D25D.cpp:54
conscience_core::lidar
Definition: CscEntityReflexion.h:42
conscience_core::lidar::CscRealEntity3dLidarValues::CscRealEntity3dLidarValues
CscRealEntity3dLidarValues(const vector< float > &verticalAnglesRad)
Definition: CscRealEntity3dLidarValues.cpp:164
conscience_core::lidar::CscRealEntity3dLidarValues::getVerticalAnglesRad
const vector< float > & getVerticalAnglesRad() const
Definition: CscRealEntity3dLidarValues.cpp:168
conscience_core::lidar::CscRealEntity3dLidarValues::QueuedRangeImage::lidarExtrinsics
LidarExtrinsics lidarExtrinsics
Definition: CscRealEntity3dLidarValues.h:115
count
int count
Definition: PathFinding3D25D.cpp:25
conscience_core::lidar::LidarImuData::imu_accel_z
double imu_accel_z
Definition: CscRealEntity3dLidarValues.h:21
conscience_core::lidar::LidarImuData
Definition: CscRealEntity3dLidarValues.h:17
conscience_core::lidar::LidarImuData::imu_accel_x
double imu_accel_x
Definition: CscRealEntity3dLidarValues.h:19
conscience_core::lidar::LidarExtrinsics::yawRad
float yawRad
Definition: CscRealEntity3dLidarValues.h:33
minY
double minY
Definition: PathFinding3D25D.cpp:27
conscience_core::lidar::LidarExtrinsics::tx
float tx
Definition: CscRealEntity3dLidarValues.h:29
conscience_core::lidar::LidarImuData::imu_accel_y
double imu_accel_y
Definition: CscRealEntity3dLidarValues.h:20
conscience_core::lidar::CscRealEntity3dLidarValues::QueuedRangeImage::rows
uint16_t rows
Definition: CscRealEntity3dLidarValues.h:110
conscience_core::lidar::CscRealEntity3dLidarValues::getLatest
bool getLatest(QueuedRangeImage &out)
Definition: CscRealEntity3dLidarValues.cpp:309
conscience_core::lidar::LidarImuData::timestamp
double timestamp
Definition: CscRealEntity3dLidarValues.h:18
cols
int cols
Definition: PathFinding3D25D.cpp:53
conscience_core::lidar::CscRealEntity3dLidarValues
Definition: CscRealEntity3dLidarValues.h:81
conscience_core::lidar::LidarExtrinsics::enabled
bool enabled
Definition: CscRealEntity3dLidarValues.h:37
conscience_core::lidar::LidarImuData::imu_ang_vel_z
double imu_ang_vel_z
Definition: CscRealEntity3dLidarValues.h:24
conscience_core::lidar::CscRealEntity3dLidarValues::QueuedRangeImage::timestamp
double timestamp
Definition: CscRealEntity3dLidarValues.h:112
CscCommon.h
maxY
double maxY
Definition: PathFinding3D25D.cpp:28
Csc3dTypes.h
conscience_core::lidar::LidarExtrinsics::pitchRad
float pitchRad
Definition: CscRealEntity3dLidarValues.h:34
conscience_core::lidar::LidarExtrinsics::applyLidarToRobotTransform
void applyLidarToRobotTransform(float &x, float &y, float &z) const
Definition: CscRealEntity3dLidarValues.h:39
conscience_core::lidar::CscRealEntity3dLidarValues::QueuedRangeImage::rangesQ4mm
ptr< vector< uint16_t > > rangesQ4mm
Definition: CscRealEntity3dLidarValues.h:114
conscience_core::lidar::LidarExtrinsics
Definition: CscRealEntity3dLidarValues.h:28
conscience_core::lidar::CscRealEntity3dLidarValues::QueuedRangeImage::cols
uint16_t cols
Definition: CscRealEntity3dLidarValues.h:111
conscience_core::lidar::LidarExtrinsics::ty
float ty
Definition: CscRealEntity3dLidarValues.h:30
conscience_core::lidar::CscRealEntity3dLidarValues::QueuedRangeImage::getAsPointCloud
void getAsPointCloud(vector< axiomes::CscPoint3d > &pointCloud, double &minY, double &maxY, double &avgY, const vector< float > &verticalAnglesRad)
Definition: CscRealEntity3dLidarValues.cpp:84
conscience_core::lidar::LidarImuData::flag
bool flag
Definition: CscRealEntity3dLidarValues.h:25
conscience_core::lidar::CscRealEntity3dLidarValues::integrateFrame
void integrateFrame(uint16_t rows, uint16_t cols, uint32_t frameId, bool isKeyFrame, const uint8_t *data, size_t count, const LidarImuData &imu, LidarExtrinsics lidarExtrinsics)
Integrates a LiDAR frame (keyframe or diff) into the current range image.
Definition: CscRealEntity3dLidarValues.cpp:199
conscience_core::lidar::CscRealEntity3dLidarValues::QueuedRangeImage::frameId
uint32_t frameId
Definition: CscRealEntity3dLidarValues.h:109
conscience_core::lidar::CscRealEntity3dLidarValues::loadVerticalAnglesRadFromCsvFile
static vector< float > loadVerticalAnglesRadFromCsvFile(const string &filePath, const string &elevationHeaderName="elevation")
Load vertical beam angles (in radians) from a CSV calibration file.
Definition: CscRealEntity3dLidarValues.cpp:13
c
double c
Definition: HybridAStar.cpp:84
conscience_core::lidar::LidarImuData::imu_ang_vel_x
double imu_ang_vel_x
Definition: CscRealEntity3dLidarValues.h:22
s
double s
Definition: HybridAStar.cpp:85
f
double f
Definition: HybridAStar.cpp:190
conscience_core::lidar::CscRealEntity3dLidarValues::get2DSliceAtHeight
map< double, double > get2DSliceAtHeight(double targetY=15, double tolerance=20) const
Definition: CscRealEntity3dLidarValues.cpp:241
conscience_core::lidar::LidarExtrinsics::tz
float tz
Definition: CscRealEntity3dLidarValues.h:31
ptr
std::shared_ptr< T > ptr
Definition: CscCommon.h:29
conscience_core::lidar::LidarImuData::imu_ang_vel_y
double imu_ang_vel_y
Definition: CscRealEntity3dLidarValues.h:23
conscience_core::lidar::CscRealEntity3dLidarValues::QueuedRangeImage
Definition: CscRealEntity3dLidarValues.h:108
conscience_core::lidar::LidarExtrinsics::rollRad
float rollRad
Definition: CscRealEntity3dLidarValues.h:35
conscience_core::lidar::CscRealEntity3dLidarValues::QueuedRangeImage::imu
LidarImuData imu
Definition: CscRealEntity3dLidarValues.h:113
conscience_core::lidar::CscRealEntity3dLidarValues::clear
void clear()
Definition: CscRealEntity3dLidarValues.cpp:172