Conscience Core
CscLidarEngine.h
Go to the documentation of this file.
1 //
2 // CscLidarEngine.hpp
3 // ConscienceRobotManager
4 //
5 // Created by Iliès Zaoui on 14/07/2019.
6 // Copyright © 2020 Conscience Robotics. All rights reserved.
7 //
8 
9 #ifndef CscLidarEngine_h
10 #define CscLidarEngine_h
11 
12 #include <mutex>
13 
14 #include <CscCommon.h>
15 #include <Axiomes/Csc3dTypes.h>
17 #include <queue>
19 
20 using namespace conscience_core::axiomes;
21 using std::deque, std::mutex;
22 
23 namespace conscience_core::lidar {
24 
25 struct OdometryData {
26 public:
42  double deltaPitch;
46  double deltaYaw;
50  double deltaRoll;
54  optional<uint64_t> timeStamp;
55  string toString() const;
56 
57  OdometryData(double deltaPositionX = 0, double deltaPositionY = 0, double deltaPositionZ = 0, double deltaPitch = 0, double deltaYaw = 0, double deltaRoll = 0, optional<uint64_t> timeStamp = {});
58 };
59 
67  const CscQuaternion inverseMeshBaseRoll = CscQuaternion::fromAngleAxis(M_PI * 0.5, Axis3d::AXIS_3D_X);
68 
69  CscQuaternion qNav = entityQuaternion * inverseMeshBaseRoll;
70  qNav.normalize();
71 
72  return qNav;
73 }
74 
82 inline double extractNavigationYawFromEntityQuaternion(const CscQuaternion &entityQuaternion) {
83  const CscPoint3d forward = extractNavigationQuaternionFromEntityQuaternion(entityQuaternion) * CscPoint3d(1.0, 0.0, 0.0);
84  const double robotYaw = std::atan2(forward.getZ(), forward.getX());
85  return robotYaw;
86 }
87 
88 inline vector<CscPoint3d> transformPointsLidarLocalToWorld(
89  const vector<CscPoint3d> &pointCloud,
90  const CscPoint3d &entityPosition, const CscQuaternion &entityRotationQuaternion) {
91  vector<CscPoint3d> worldCoordinates;
92  worldCoordinates.reserve(pointCloud.size());
93 
94  const CscQuaternion qNav =
95  extractNavigationQuaternionFromEntityQuaternion(entityRotationQuaternion);
96 
97  for (const CscPoint3d &point : pointCloud) {
98  const CscPoint3d rotated = qNav * point;
99 
100  worldCoordinates.emplace_back(
101  entityPosition.getX() + rotated.getX(),
102  entityPosition.getY() + rotated.getY(),
103  entityPosition.getZ() + rotated.getZ());
104  }
105 
106  return worldCoordinates;
107 }
108 
110  const CscPoint3d &localPoint,
111  const CscPoint3d &entityPosition,
112  const CscQuaternion &entityRotationQuaternion) {
113  vector<CscPoint3d> localCoordinates = {localPoint};
114  return transformPointsLidarLocalToWorld(localCoordinates, entityPosition, entityRotationQuaternion).at(0);
115 }
116 
118  const CscPoint3d &worldPoint,
119  const CscPoint3d &entityPosition,
120  const CscQuaternion &entityRotationQuaternion) {
121  const CscQuaternion qNav = extractNavigationQuaternionFromEntityQuaternion(entityRotationQuaternion);
122 
123  const CscPoint3d delta(
124  worldPoint.getX() - entityPosition.getX(),
125  worldPoint.getY() - entityPosition.getY(),
126  worldPoint.getZ() - entityPosition.getZ());
127 
128  return qNav.inverse() * delta;
129 }
130 class CscLidarEngine;
131 
133 public:
137  std::vector<CscPoint3d> points;
138 
142  double minY = 0.0f;
146  double maxY = 0.0f;
150  double avgY = 0.0f;
151 
155  bool is3d = true;
156 };
157 
159 public:
160 
162 
167  std::vector<CscPoint3d> getPointCloudWorldCoordinates(const CscPoint3d &entityPosition, const CscQuaternion &robotOrientation) const;
168 
172  unsigned long long timestamp = 0;
173 
177  optional<OdometryData> odometry = {};
178 
179 
180  LidarValuesSnapshot() = default;
181 
183  unsigned long long timestamp,
184  std::optional<OdometryData> odometry);
185 
186  // extract 2D slice around targetY (cm) with tolerance (cm)
187  void getSliceAtY(std::vector<CscPoint3d> &out,
188  double targetY,
189  double tolerance) const;
190  void getSliceAtY(std::map<double, double> &out, double targetY, double tolerance) const;
191 
195  bool is3d() const;
196 };
197 
198 class LidarValues {
199 public:
200  unsigned long long getUpdateTimeMillis() const;
201 
205  LidarValuesSnapshot getValuesSnapshot() const;
206 
210  bool has3dValues() const;
211 
212 private:
213  void setFor2D(const map<double, double> &newValues, const optional<OdometryData> &odometry, unsigned long long timestamp);
214  void setFor3DRangeImageEncoded(uint16_t rows, uint16_t cols, uint32_t frameId, bool isKeyFrame, const uint8_t *data, uint32_t itemCount, const LidarImuData &imu, const optional<OdometryData> &odometry, LidarExtrinsics lidarExtrinsics, unsigned long long timestamp);
215  void setFor3DPointCloud(
216  const CscPointCloud3d *pointCloud,
217  const optional<OdometryData> &odometry,
218  unsigned long long timestamp);
219 
223  map<double, double> lidarValues;
224  unsigned long long timestamp = 0;
225  optional<OdometryData> odometry = {};
226 
227  CscRealEntity3dLidarValues *values3dRangeImage = nullptr;
228  mutable /* mutable because we want to set cache in getValuesSnapshot */ const CscPointCloud3d *values3dPointCloud = nullptr;
229 
230  mutable mutex valuesMutex;
231 
232  friend class CscLidarEngine;
233 };
234 
235 typedef uint64_t CscLidarMode;
237  cscLidarModePaused = 1ULL << 0,
238  cscLocalisation = 1ULL << 2,
239 
243  cscSlam = 1ULL << 4,
244 };
245 
247 public:
248  static bool isSlamAutoEnabled();
249 
250  CscLidarEngine();
251  virtual void startEngine();
252  virtual void stopEngine();
257  const LidarValues &getCurrentValues();
258 
262  void integrate2DValuesAtTime(const map<double, double> &newValues, unsigned long long timestamp, optional<OdometryData> odometry = {});
263 
267  void integrate3DRangeImageAtTime(uint16_t rows, uint16_t cols, uint32_t frameId, bool isKeyFrame, const uint8_t *data, uint32_t itemCount, const LidarImuData &imu, const optional<OdometryData> &odometry, LidarExtrinsics lidarExtrinsics, unsigned long long timestamp);
268 
272  void integrate3DPointCloudAtTime(
273  const CscPointCloud3d *pointCloud,
274  unsigned long long timestamp,
275  optional<OdometryData> odometry = {});
276 
277  virtual ~CscLidarEngine();
278  void activateLidarMode(CscLidarMode newLidarMode);
279  void addLidarMode(CscLidarMode newLidarMode);
280  void removeLidarMode(CscLidarMode lidarModeToRemove);
281  bool isLidarModeRunning(CscLidarMode lidarModeSearched);
282  bool isLidarModeActive(CscLidarMode lidarModeSearched);
283  bool isLidarEngineActivated();
284  void stopLidarEngine();
285 
286  unsigned long long getLastLidarValuesTime() const;
287  unsigned long long getLidarValuesTimeToRetrieve() const;
288  unsigned long long getLidarValuesTimeBetweenUpdate() const;
289 
290  void setOnNewValuesListener(const optional<function<void(const LidarValuesSnapshot &)>> &onNewValues = {});
291  optional<function<void()>> getOnActivatedListener() const;
292  void setOnActivatedListener(const optional<function<void()>> &onActivated = {});
293 
301  static vector<CscPoint3d *> toWorldPoints(const map<double, double> &lidarValues, const CscQuaternion &entityOrientation, const CscPoint3d &entityPosition);
302 
303 private:
304  mutex cartographyMutex;
305  mutex lidarReadingsMutex;
306 
307  CscLidarMode lidarMode = cscLidarModePaused;
308 
309  unsigned long long lidarValuesTimeToRetrieveInMillis = 0;
310  unsigned long long lidarValuesTimeBetweenUpdateInMillis = 0;
311 
312 protected:
315  optional<function<void(const LidarValuesSnapshot &)>> onNewValues = {};
316  optional<function<void()>> onActivated = {};
317 
318  void get2dValues(map<double, double> **lidarPoints, optional<OdometryData> **odometry, unsigned long long &timestamp);
319 };
320 
321 }
322 
323 #endif /* CscLidarEngine */
conscience_core::axiomes::CscQuaternion::normalize
void normalize()
Definition: Csc3dTypes.cpp:680
conscience_core::lidar::extractNavigationQuaternionFromEntityQuaternion
CscQuaternion extractNavigationQuaternionFromEntityQuaternion(const CscQuaternion &entityQuaternion)
Definition: CscLidarEngine.h:66
conscience_core::axiomes::CscPoint3d
The CscPoint3d class represents a point in three-dimensional space. It is primarily used to denote a ...
Definition: Csc3dTypes.h:24
conscience_core::lidar::CscLidarEngine
Definition: CscLidarEngine.h:246
rows
int rows
Definition: PathFinding3D25D.cpp:54
conscience_core::axiomes::CscPoint3d::getY
double getY() const
Definition: Csc3dTypes.cpp:55
conscience_core::axiomes
Definition: Csc2dTypes.cpp:9
conscience_core::lidar
Definition: CscEntityReflexion.h:42
conscience_core::lidar::transformPointsLidarLocalToWorld
vector< CscPoint3d > transformPointsLidarLocalToWorld(const vector< CscPoint3d > &pointCloud, const CscPoint3d &entityPosition, const CscQuaternion &entityRotationQuaternion)
Definition: CscLidarEngine.h:88
conscience_core::lidar::OdometryData::deltaRoll
double deltaRoll
Definition: CscLidarEngine.h:50
conscience_core::lidar::CscLidarModeList
CscLidarModeList
Definition: CscLidarEngine.h:236
conscience_core::lidar::transformPointWorldToLidarLocal
CscPoint3d transformPointWorldToLidarLocal(const CscPoint3d &worldPoint, const CscPoint3d &entityPosition, const CscQuaternion &entityRotationQuaternion)
Definition: CscLidarEngine.h:117
conscience_core::lidar::OdometryData
Definition: CscLidarEngine.h:25
conscience_core::lidar::LidarImuData
Definition: CscRealEntity3dLidarValues.h:17
conscience_core::lidar::CscLidarEngine::lidarValuesMutex
mutex lidarValuesMutex
Definition: CscLidarEngine.h:313
conscience_core::lidar::transformPointLidarLocalToWorld
CscPoint3d transformPointLidarLocalToWorld(const CscPoint3d &localPoint, const CscPoint3d &entityPosition, const CscQuaternion &entityRotationQuaternion)
Definition: CscLidarEngine.h:109
conscience_core::lidar::LidarValuesSnapshot
Definition: CscLidarEngine.h:158
minY
double minY
Definition: PathFinding3D25D.cpp:27
CscRealEntity3dLidarValues.h
conscience_core::lidar::cscLocalisation
@ cscLocalisation
Definition: CscLidarEngine.h:238
conscience_core::lidar::cscLidarModePaused
@ cscLidarModePaused
Definition: CscLidarEngine.h:237
conscience_core::lidar::CscPointCloud3d::points
std::vector< CscPoint3d > points
Definition: CscLidarEngine.h:137
conscience_core::lidar::LidarValues
Definition: CscLidarEngine.h:198
cols
int cols
Definition: PathFinding3D25D.cpp:53
conscience_core::lidar::OdometryData::deltaPitch
double deltaPitch
Definition: CscLidarEngine.h:42
conscience_core::lidar::CscRealEntity3dLidarValues
Definition: CscRealEntity3dLidarValues.h:81
nlohmann::detail::void
j template void())
Definition: json.hpp:4189
CscCommon.h
maxY
double maxY
Definition: PathFinding3D25D.cpp:28
conscience_core::lidar::cscSlam
@ cscSlam
Definition: CscLidarEngine.h:243
Csc3dTypes.h
conscience_core::axiomes::CscQuaternion::fromAngleAxis
static CscQuaternion fromAngleAxis(double angleRad, Axis3d axis)
Definition: Csc3dTypes.cpp:629
conscience_core::axiomes::AXIS_3D_X
@ AXIS_3D_X
Definition: Csc3dTypes.h:143
conscience_core::lidar::CscLidarEngine::values
LidarValues values
Definition: CscLidarEngine.h:314
conscience_core::axiomes::CscPoint3d::getZ
double getZ() const
Definition: Csc3dTypes.cpp:59
conscience_core::axiomes::CscQuaternion
Definition: Csc3dTypes.h:150
conscience_core::lidar::CscLidarMode
uint64_t CscLidarMode
Definition: CscLidarEngine.h:235
conscience_core::lidar::OdometryData::deltaPositionY
double deltaPositionY
Definition: CscLidarEngine.h:34
conscience_core::lidar::LidarExtrinsics
Definition: CscRealEntity3dLidarValues.h:28
conscience_core::lidar::LidarValuesSnapshot::pointCloud
CscPointCloud3d pointCloud
Definition: CscLidarEngine.h:161
conscience_core::lidar::OdometryData::timeStamp
optional< uint64_t > timeStamp
Definition: CscLidarEngine.h:54
conscience_core::lidar::extractNavigationYawFromEntityQuaternion
double extractNavigationYawFromEntityQuaternion(const CscQuaternion &entityQuaternion)
Definition: CscLidarEngine.h:82
conscience_core::axiomes::CscPoint3d::getX
double getX() const
Definition: Csc3dTypes.cpp:51
conscience_core::lidar::OdometryData::deltaYaw
double deltaYaw
Definition: CscLidarEngine.h:46
conscience_core::lidar::CscPointCloud3d
Definition: CscLidarEngine.h:132
conscience_core::axiomes::CscQuaternion::inverse
CscQuaternion inverse() const
Definition: Csc3dTypes.cpp:694
conscience_core::lidar::OdometryData::deltaPositionZ
double deltaPositionZ
Definition: CscLidarEngine.h:38
conscience_core::lidar::OdometryData::deltaPositionX
double deltaPositionX
Definition: CscLidarEngine.h:30
CscPoint3dIterable.h