Conscience Core
CscSlamEngine.h
Go to the documentation of this file.
1 //
2 // CscSlamEngine.hpp
3 // ConscienceRobotManager
4 //
5 // Created by Iliès Zaoui on 23/10/2022.
6 // Copyright © 2022 Conscience Robotics. All rights reserved.
7 //
8 
9 #ifndef CscSlamEngine_h
10 #define CscSlamEngine_h
11 
12 #include <CscCommon.h>
13 #include <mutex>
14 #include <queue>
15 #include <filesystem>
16 #include <shared_mutex>
17 
18 #include <mrpt/math/TPose2D.h>
19 #include <mrpt/poses/CPose3D.h>
20 #include <mrpt/maps/CSimplePointsMap.h>
21 
23 #include <Lidar/CscLidarEngine.h>
24 #include <Axiomes/Csc2dTypes.h>
25 
26 #include <unordered_set>
27 
28 namespace mrpt::maps {
29 class COccupancyGridMap2D;
30 }
31 
32 namespace mrpt::obs {
33 class CObservation2DRangeScan;
34 }
35 
36 namespace mrpt::slam {
37 class CMonteCarloLocalization2D;
38 class CMetricMapBuilderRBPF;
39 }
40 
41 using namespace conscience_utils::logging;
42 
43 using mrpt::maps::CSimplePointsMap;
44 using mrpt::math::TPoint2D, mrpt::math::TPose2D, mrpt::obs::CObservation2DRangeScan, mrpt::maps::COccupancyGridMap2D, mrpt::slam::CMonteCarloLocalization2D, mrpt::slam::CMetricMapBuilderRBPF;
45 using mrpt::poses::CPose3D;
46 using std::recursive_mutex, std::pair, std::lock_guard, std::queue;
47 using std::shared_lock, std::shared_mutex, std::unique_lock;
48 
49 namespace fs = std::filesystem;
50 
51 using namespace conscience_core::axiomes;
52 
53 namespace conscience_core::lidar {
54 
55 class CscLidarEngine;
56 class LidarValues;
57 class LidarValuesSnapshot;
58 
59 enum class CscSlamCellOccupancyStatus : uint8_t {
63 };
64 
72  int32_t x = 0;
73  int32_t y = 0;
74  int32_t z = 0;
75 
76  bool operator==(const CscSlam3dMapVoxelKey &other) const;
77  bool operator!=(const CscSlam3dMapVoxelKey &other) const;
78 
83  void toMrptPoint(float voxelSizeMeters, float &outX, float &outY, float &outZ) const;
84 
85  void toCscPoint(float voxelSizeMeters, double &outX, double &outY, double &outZ) const;
86 
87  static CscSlam3dMapVoxelKey fromMrptPoint(
88  double x,
89  double y,
90  double z,
91  float voxelSizeMeters);
92 };
93 
95  size_t operator()(const CscSlam3dMapVoxelKey &key) const;
96 };
97 
98 ENUM(CscSlam3dMapVoxelDiffType, SLAM3D_VOXEL_DIFF_TYPE_ADD, SLAM3D_VOXEL_DIFF_TYPE_REMOVE);
99 
105  CscSlam3dMapVoxelDiffType type = SLAM3D_VOXEL_DIFF_TYPE_ADD;
107 };
108 
109 ENUM(CscSlam3dMapVoxelChangesMode, SLAM3D_VOXEL_CHANGES_MODE_DIFFS, SLAM3D_VOXEL_CHANGES_MODE_FULL_REBUILD);
110 
116  CscSlam3dMapVoxelChangesMode mode;
118  vector<CscSlam3dMapVoxelDiff> diffs;
119  vector<CscSlam3dMapVoxelKey> fullVoxels;
120 
121  static CscSlam3dMapVoxelChanges forDiffs(vector<CscSlam3dMapVoxelDiff> diffs, float voxelSizeMeters);
122  static CscSlam3dMapVoxelChanges forFullRebuild(vector<CscSlam3dMapVoxelKey> diffs, float voxelSizeMeters);
123 
124  bool isFullRebuild() const;
125  bool empty() const;
126 };
127 
129  function<void(const CscSlam3dMapVoxelChanges &changes)> callback;
130  uint64_t id;
131 };
132 
134  using VoxelSet = std::unordered_set<CscSlam3dMapVoxelKey, CscSlam3dMapVoxelKeyHash>;
135 
136  const float voxelSizeMeters;
137 
138  const VoxelSet &getVoxelsUnsafe() const;
139 
140  explicit CscSlam3dMapVoxelGrid(float voxelSizeMeters = 0.035);
141 
142  CscSlam3dMapVoxelKey cscPointToVoxel(const CscPoint3d &point) const;
143 
144  bool contains(const CscSlam3dMapVoxelKey &voxel) const;
145 
146  std::optional<CscSlam3dMapVoxelDiff> addVoxel(const CscSlam3dMapVoxelKey &voxel);
147  std::optional<CscSlam3dMapVoxelDiff> removeVoxel(const CscSlam3dMapVoxelKey &voxel);
148 
153  std::optional<CscSlam3dMapVoxelDiff> addPointConscience(const CscPoint3d &point);
158  std::optional<CscSlam3dMapVoxelDiff> removePointConscience(const CscPoint3d &point);
159 
160  std::optional<CscSlam3dMapVoxelDiff> addPointMrpt(double x, double y, double z);
161  std::optional<CscSlam3dMapVoxelDiff> removePointMrpt(double x, double y, double z);
162 
163  vector<CscSlam3dMapVoxelKey> getAllVoxelsCopy() const;
164 
165  void replaceWith(CscSlam3dMapVoxelGrid &&other);
166 
167  void clear();
168 
169  size_t size() const;
170  bool empty() const;
171 
172 private:
173  VoxelSet voxels;
174 };
175 
178 
179  double sumX = 0.0;
180  double sumY = 0.0;
181  double sumZ = 0.0;
182 
183  uint32_t hits = 0;
184  uint32_t misses = 0;
185 
186  uint64_t firstSeenFrame = 0;
187  uint64_t lastSeenFrame = 0;
188 
189  float confidence = 0.0f;
190 
191  void addHit(double x, double y, double z, uint64_t frameIndex);
192  void addMiss(uint64_t frameIndex);
193  void getCentroidMrpt(float &x, float &y, float &z) const;
194 
195  bool isVisible(float visibleThreshold) const;
196  bool shouldErase(float eraseThreshold) const;
197 };
198 
200 public:
201  using VoxelMap = std::unordered_map<
205 
206  explicit CscSlam3dProbabilisticVoxelGrid(float voxelSizeMeters = 0.03f);
207 
208  CscSlam3dMapVoxelKey mrptPointToVoxel(double x, double y, double z) const;
209 
210  CscSlam3dProbabilisticVoxel &touchVoxel(
211  const CscSlam3dMapVoxelKey &key,
212  uint64_t frameIndex);
213 
214  std::optional<CscSlam3dMapVoxelDiff> addMissVoxel(
215  const CscSlam3dMapVoxelKey &key,
216  uint64_t frameIndex);
217 
221  std::vector<CscSlam3dMapVoxelDiff> integrateRayMrpt(
222  double originX,
223  double originY,
224  double originZ,
225  double hitX,
226  double hitY,
227  double hitZ,
228  uint64_t frameIndex,
229  std::unordered_set<CscSlam3dMapVoxelKey, CscSlam3dMapVoxelKeyHash> &frameHitVoxels,
230  std::unordered_set<CscSlam3dMapVoxelKey, CscSlam3dMapVoxelKeyHash> &frameMissVoxels);
231 
232  optional<CscSlam3dMapVoxelDiff> addPointMrpt(
233  double x,
234  double y,
235  double z,
236  uint64_t frameIndex);
237 
238  void clear();
239 
240  size_t size() const;
241  bool empty() const;
242 
243  float getVoxelSizeMeters() const;
244  const VoxelMap &getVoxelsUnsafe() const;
245 
249  float getVisibleThreshold() const;
250 
255  CscSlam3dMapVoxelGrid buildVisibleVoxelGrid() const;
256  void eraseDeadVoxels();
257 
258  size_t visibleVoxelCount() const;
259 
260  std::vector<CscSlam3dMapVoxelKey> collectFarNeighborCandidates(
261  int minNeighborCount,
262  int minHits) const;
263 
264  std::vector<CscSlam3dMapVoxelKey> purgeFarNeighborCandidates(
265  const std::vector<CscSlam3dMapVoxelKey> &candidates,
266  int minNeighborCount,
267  int minHits);
268 
269 private:
270  size_t visibleVoxelCountCache = 0;
271  float voxelSizeMeters = 0.03f;
272  const float visibleThreshold = 1.0f;
273  double maxRayDistanceMeters = 6.5;
274  double minRayDistanceMeters = 0.10;
275  double missEndMarginMeters = 0.08;
276 
277  float eraseThreshold = 0.01f;
278 
279  VoxelMap voxels;
280 };
281 
283  mutex queueMutex;
284  deque<CscSlam3dMapVoxelChanges> changesQueue;
285 
286  void push(CscSlam3dMapVoxelChanges changes);
287  vector<CscSlam3dMapVoxelChanges> consumeAll();
288  void clear();
289 };
290 
297 public:
301  CscSlam3dMap();
302 
303  void appendLocalFrame(
304  const std::vector<CscPoint3d> &localPointsCm,
305  const CPose3D &pose,
306  size_t decimationStep,
307  double minPointDistanceMeters,
308  double maxPointDistanceMeters);
309 
315  vector<CscPoint3d *> pointsCopyPtrs(const CscPoint3d &entityStartPosition, const CscQuaternion &entityStartOrientation) const;
316 
321  vector<CscSlam3dMapVoxelKey> getAllVoxelsCopy() const {
322  return voxelGrid.getAllVoxelsCopy();
323  }
324 
325  size_t probabilisticVoxelGridSize() const;
326  CscSlam3dMapVoxelGrid buildVisibleVoxelGridFromProbabilisticState() const;
327 
328  void clear();
329 
330  bool isEmpty() const;
331 
332  uint64_t add3dMapVoxelChangesListener(function<void(const CscSlam3dMapVoxelChanges &changes)> callback, CscSlam3dMapVoxelChanges *changes = nullptr);
333  void remove3dMapVoxelChangesListener(uint64_t listenerId);
334 
343  void withProbabilisticVoxelGridReadLock(
344  const std::function<void(const CscSlam3dProbabilisticVoxelGrid &grid)> &callback) const;
345 
350  size_t visibleProbabilisticVoxelGridSize() const;
351 
356  void purgeFarNeighbors(int minNeighborCount = 2, int minHits = 3);
357 
358 private:
359  mutable std::shared_mutex updateMutex;
360 
361  CscSlam3dMapVoxelGrid voxelGrid;
362  mutex voxelChangesListenersMutex;
363  vector<CscSlam3dMapVoxelChangesListener> voxelChangesListeners;
364  std::atomic<uint64_t> nextVoxelChangesListenerId = 1;
365  void fireVoxelChanges(const CscSlam3dMapVoxelChanges &changes) {
366  vector<CscSlam3dMapVoxelChangesListener> voxelChangesListeners;
367  {
368  lock_guard lock(voxelChangesListenersMutex);
369  voxelChangesListeners = this->voxelChangesListeners;
370  }
371  for (const auto &listener : voxelChangesListeners) {
372  listener.callback(changes);
373  }
374  }
375 
376  CscSlam3dProbabilisticVoxelGrid probabilisticVoxelGrid;
377  uint64_t probabilisticFrameIndex = 0;
378 };
379 
381 public:
382  static constexpr double defaultCellOccupiedThreshold = 0.14;
383 
387  struct PhantomCluster {
388  vector<pair<int, int>> cells; // (i,j) indices
389  double overlapRatio{0.0}; // supported/occCount
390  bool duplicate;
391  };
392 
397  vector<std::pair<int, int>> cells; // occupied cells in cluster
398  int hits = 0; // number of times observed
399  std::chrono::steady_clock::time_point lastHit;
400  };
401 
402  CscSlamEngine(const string &entitySerialNumber,
403  bool isSimulatedEntity,
404  CscEntityPositionManager *positionManager,
405  CscLidarEngine *lidarEngine);
406 
407  ~CscSlamEngine();
408 
409  void stop();
410  void start(CscPoint3dOriented *initialPosition = nullptr);
411 
416  const CscPoint3d &getEntityStartPosition() const;
417 
424  const CscQuaternion &getEntityStartOrientation() const;
425 
430  fs::path saveCartography();
431  bool loadCartography(const fs::path &cartographyDir);
432  bool loadLatestCartography();
433  bool hasLoadedCartography();
434 
435  bool isStarted() const;
436  bool isStartedAndReady() const;
437 
438  void consumeLidarValues();
439 
440  void forceLocalisationPosition(double xInMeters, double zInMeters, double headingInRad);
441 
447  optional<TPose2D> entityPose = nullopt;
448 
449  map<TPoint2D, Vec3> dots;
453  map<TPoint2D, Vec3> crosses;
457  vector<TPose2D> path;
462  vector<CscSlamEngine::PhantomCluster> clusters;
463  vector<CscSlamEngine::PhantomClusterTracked> clustersTracked;
464 
468  vector<uint8_t> cellsVisibility;
469 
473  const CObservation2DRangeScan *lidarScan = nullptr;
474  };
475 
476  void saveMrpt2dMapToPng(const string &filename,
477  const MapToImageParams &params);
478 
479  CscPoint3d *transformToWorld3dPosition(const TPoint2D &pointSlam2d) const;
480  vector<CscPoint3d *> getMapAsWorldPoints(double threshold = defaultCellOccupiedThreshold) const;
481 
482  inline constexpr CscSlamCellOccupancyStatus getCellStatus(float cellValue, double occupiedThreshold = defaultCellOccupiedThreshold) {
483  if (cellValue < 0.0f || std::abs(cellValue - 0.5f) < 1e-6f) { // Tolérance pour floating point
484  return CscSlamCellOccupancyStatus::SlamCellOccupancyStatus_Unknown;
485  }
486  if (cellValue <= occupiedThreshold) {
487  return CscSlamCellOccupancyStatus::SlamCellOccupancyStatus_Occupied;
488  }
489  return CscSlamCellOccupancyStatus::SlamCellOccupancyStatus_Free;
490  }
491 
492  void clearCartography();
493 
494  // TODO Fusion CS-3742 archi -> we should have only one API for the following
500  mrpt::math::TPose2D getEntityPose2dMrpt() const;
501 
506  CscPoint3dOriented *getEntityPose3d() const;
507 
511  ptr<CObservation2DRangeScan> getLidarScan() const;
516  ptr<COccupancyGridMap2D> getSLAMMap() const;
517 
518  bool is3dSlamInitialized() const;
519 
527  uint64_t add3dMapVoxelChangesListener(function<void(const CscSlam3dMapVoxelChanges &changes)> callback, CscSlam3dMapVoxelChanges *changes = nullptr);
528  void remove3dMapVoxelChangesListener(uint64_t listenerId);
529 
535  vector<CscSlam3dMapVoxelKey> get3dMapVoxelsCopy() const;
536 
537  struct Slam3dParams {
538  bool enabled = true;
539 
543  size_t decimationStep = 1;
547  size_t decimationStepVoxelToPointCloud = 1;
548  size_t minFramePoints = 120;
549  size_t minMapPointsBeforeIcp = 1500;
550 
551  double minPointDistanceMeters = 0.20;
552  double maxPointDistanceMeters = 15.0;
553  };
554 
555 private:
556  void save3dMapTopViewPngUnlocked(const string &filename, double metersPerPixel, int imageSize, const CscPoint3dOriented *entityPosition = nullptr, const CscSize3d *entityDimensions = nullptr) const;
557  void save3dMapToPcdAsciiUnlocked(const string &filename) const;
558  class PhantomClusterTracker {
559  public:
560  PhantomClusterTracker(double overlapThreshold = 0.3, int maxAgeSeconds = 300);
561 
562  // Update tracker with new clusters from this tick
563  void update(const vector<PhantomCluster> &newClusters);
564 
565  const vector<PhantomClusterTracked> &tracked() const;
566 
567  string getSummary() const;
568 
569  private:
570  vector<PhantomClusterTracked> trackedClusters;
571  const double overlapThreshold;
572  const int maxAgeSeconds;
573 
574  // Check if clusters overlap enough to be considered the same
575  bool clustersSimilar(const vector<std::pair<int, int>> &a,
576  const vector<std::pair<int, int>> &b) const;
577  };
578 
579  const string entitySerialNumber;
580  const bool isSimulatedEntity;
581 
582  void consumeLidarValues(const LidarValuesSnapshot &lidarValues);
583 
584  CscPoint3d entityStartPosition;
585  CscQuaternion entityStartOrientation;
586 
587  CscEntityPositionManager *positionManager = nullptr;
588  CscLidarEngine *lidarEngine = nullptr;
589 
590  void clearSlamData();
591 
592  CMonteCarloLocalization2D *slamLocalization = nullptr;
593 
594  mutable recursive_mutex slamInstanceMutex;
595  CMetricMapBuilderRBPF *slamInstance = nullptr;
596  ptr<COccupancyGridMap2D> slamMap = nullptr;
597 
598  bool slamInitialized = false;
599  double entityStartYaw = 0;
600 
601  void initMrptSlam();
602 
603  queue<const LidarValuesSnapshot *> lidarValuesQueue;
604 
605  unique_ptr<CscLogger> logger;
606 
607  unsigned long long lastLidarValuesTimestamp = 0;
608 
609  mutable mutex lastRangeScanMutex;
610  ptr<CObservation2DRangeScan> lastRangeScan = nullptr;
611 
612  std::chrono::steady_clock::time_point lastPngExportTime = std::chrono::steady_clock::now();
613 
614  double odoLastX = 0;
615  double odoLastZ = 0;
616 
617  bool started = false;
618  bool odoDiffInitialized = false;
619 
620  unsigned int lastMapSize = 0;
621  unsigned int identicalCount = 0;
622 
623  std::chrono::steady_clock::time_point lastTimeSlamOdo = std::chrono::steady_clock::now();
624 
625  struct CscSlamMapDiscrepancyState {
626  size_t discrepantScanCount = 0;
627  size_t ticksSinceDiscrepancyStart = 0;
628  double refMean = 0;
629  double refStd = 0;
630  size_t initializationTicksCount = 0;
631  };
632 
633  CscSlamMapDiscrepancyState discrepancyState;
634 
635  struct PhantomClusterParams {
640  double maxDistanceMeters = 8;
645  double minOverlapRatio = 0.2;
650  int supportRadius = 2;
654  int clusterThresh = 10;
659  int maxClusterShiftCells = 14;
664  int gapTolerance = 2;
669  int mergeDistanceCells = 3;
670  };
671 
672  struct PhantomClusterResult {
673  bool hasPhantoms{false};
674  vector<PhantomCluster> clusters;
675  vector<uint8_t> visible;
676  };
677 
678  PhantomClusterResult detectPhantomClusters(const COccupancyGridMap2D &slamMap,
679  const CObservation2DRangeScan &scan,
680  const TPose2D &pose,
681  const PhantomClusterParams &params,
682  double occThreshold = defaultCellOccupiedThreshold);
683 
684  PhantomClusterResult lastClustersResult;
685  PhantomClusterTracker phantomClusterTracker;
686 
687  CscPoint3dOriented *initialPosition = nullptr;
688 
689  Slam3dParams slam3dParams;
690 
691  mutable std::mutex slam3dMutex;
692 
693  CscSlam3dMap *slam3dMap = nullptr;
694  CPose3D slam3dPose = CPose3D(0, 0, 0, 0, 0, 0);
695 
696  bool slam3dInitialized = false;
697  size_t slam3dFramesIntegrated = 0;
698 
699  bool shouldUse3dSlam(const LidarValuesSnapshot &snap) const;
700  void initMrptSlam3d();
701 
702  CPose3D odometryToMrptPose3d(const OdometryData &odometry) const;
703 
704  void consumeLidarValues3d(const LidarValuesSnapshot &snap,
705  const CPose3D &odoIncrement, optional<uint64_t> timeStamp = {});
706 };
707 
708 /* MRPT HELPERS - START */
709 
710 inline double distancePoints(const TPoint2D &pointA, const TPoint2D &pointB) {
711  return std::hypot(pointA.x - pointB.x, pointA.y - pointB.y);
712 }
713 
714 inline double distancePoints(const TPose2D &poseA, const TPose2D &poseB) {
715  return distancePoints(TPoint2D(poseA), TPoint2D(poseB));
716 }
717 
719  return CscPoint2d(point.x / 100.0 /*to meters*/, point.z / 100.0 /*to meters*/);
720 }
721 
722 inline CscPoint3d toMrptReferenceFrame3d(double x, double y, double z) {
723  return CscPoint3d(x / 100.0 /*to meters*/, -z / 100.0 /*to meters*/, y);
724 }
725 
726 inline CscPoint3d fromMrptReferenceFrame3d(double mx, double my, double mz) {
727  return CscPoint3d(
728  mx * 100.0,
729  mz * 100.0,
730  -my * 100.0);
731 }
732 
733 string mrptPoseToJson(const TPose2D &pose);
734 string mrptPointToJson(const TPoint2D &point);
736 CscPoint2d mrptPointToCscPoint(const TPoint2D &point);
737 
738 /* MRPT HELPERS - END */
739 
740 namespace directions {
741 
743  double relYaw;
744  string name;
745 };
746 
747 static const CscAvailableDirection AVAILABLE_DIRECTION_FORWARD = {0.0, "forward"};
748 static const CscAvailableDirection AVAILABLE_DIRECTION_LEFT = {M_PI_2, "left"};
749 static const CscAvailableDirection AVAILABLE_DIRECTION_RIGHT = {-M_PI_2, "right"};
750 static const CscAvailableDirection AVAILABLE_DIRECTION_BACK = {M_PI, "back"};
751 
752 static const vector<CscAvailableDirection> AVAILABLE_ALL_DIRECTIONS = {
757 
758 optional<pair<int, double>> getBestDirectionForScan(CObservation2DRangeScan *scan,
759  const vector<CscAvailableDirection> &authorizedDirections,
760  double entityWidth,
761  double entityLength,
762  map<int, double> *computedDirections = nullptr);
763 
764 void saveScanWithBestDirectionAsPng(const mrpt::obs::CObservation2DRangeScan &scan,
765  double bestYaw,
766  const std::string &bestDirName,
767  const fs::path &filename,
768  double entityWidth,
769  double entityLength);
770 
771 double estimateFreeDistanceForLidarScan(double directionYawRads,
772  const mrpt::obs::CObservation2DRangeScan &scan,
773  double entityWidthMeters,
774  double entityLengthMeters,
775  double minClusterDistanceMeters = 0.10,
776  int minClusterSize = 3,
777  double maxDepthMeters = 2.0);
778 
807  const LidarValuesSnapshot &scan,
808  const CscSize3d &entitySizeCm,
809  double voxelSizeMeters,
810  int minVoxelPointCount,
811  double maxDepthMeters,
812  double minObstacleYMeters,
813  double maxObstacleYMeters = std::numeric_limits<double>::infinity());
814 
815 }
816 
817 }
818 
819 #endif
conscience_core::lidar::directions::AVAILABLE_DIRECTION_FORWARD
static const CscAvailableDirection AVAILABLE_DIRECTION_FORWARD
Definition: CscSlamEngine.h:747
conscience_core::lidar::CscSlam3dMapVoxelChangesListener::id
uint64_t id
Definition: CscSlamEngine.h:130
conscience_core::lidar::CscSlamEngine::PhantomClusterTracked
Definition: CscSlamEngine.h:396
conscience_core::lidar::mrptPoseToJson
string mrptPoseToJson(const TPose2D &pose)
Definition: CscSlamEngine.cpp:701
conscience_core::lidar::CartographyChangesQueue::changesQueue
deque< CscSlam3dMapVoxelChanges > changesQueue
Definition: CscSlamEngine.h:284
conscience_core::lidar::CscSlam3dMapVoxelChangesListener
Definition: CscSlamEngine.h:128
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::CscSlamEngine::PhantomClusterTracked::lastHit
std::chrono::steady_clock::time_point lastHit
Definition: CscSlamEngine.h:399
conscience_core::lidar::CscLidarEngine
Definition: CscLidarEngine.h:246
conscience_core::lidar::toMrptReferenceFrame
CscPoint2d toMrptReferenceFrame(const CscPoint3d &point)
Definition: CscSlamEngine.h:718
conscience_core::axiomes::operator!=
bool operator!=(const CscPoint2d &a, const CscPoint2d &b)
Definition: Csc2dTypes.cpp:111
conscience_core::lidar::mrptPoseToCscPointOriented
CscPoint2dOriented mrptPoseToCscPointOriented(const TPose2D &pose)
Definition: CscSlamEngine.cpp:717
conscience_core::lidar::directions::CscAvailableDirection::name
string name
Definition: CscSlamEngine.h:744
conscience_core::lidar::CscSlamEngine::MapToImageParams::cellsVisibility
vector< uint8_t > cellsVisibility
Definition: CscSlamEngine.h:468
conscience_core::lidar::CscSlamCellOccupancyStatus::SlamCellOccupancyStatus_Unknown
@ SlamCellOccupancyStatus_Unknown
conscience_core::axiomes
Definition: Csc2dTypes.cpp:9
conscience_core::lidar::CscSlam3dMapVoxelChanges::fullVoxels
vector< CscSlam3dMapVoxelKey > fullVoxels
Definition: CscSlamEngine.h:119
conscience_core::lidar
Definition: CscEntityReflexion.h:42
conscience_core::lidar::directions::saveScanWithBestDirectionAsPng
void saveScanWithBestDirectionAsPng(const mrpt::obs::CObservation2DRangeScan &scan, double bestYaw, const std::string &bestDirName, const fs::path &filename, double entityWidth, double entityLength)
Definition: CscSlamEngine.cpp:3036
conscience_core::lidar::CscSlamEngine::MapToImageParams::path
vector< TPose2D > path
Definition: CscSlamEngine.h:457
conscience_core::lidar::CscSlamEngine::PhantomCluster
Definition: CscSlamEngine.h:387
conscience_core::lidar::CscSlam3dMapVoxelGrid::VoxelSet
std::unordered_set< CscSlam3dMapVoxelKey, CscSlam3dMapVoxelKeyHash > VoxelSet
Definition: CscSlamEngine.h:134
conscience_core::lidar::toMrptReferenceFrame3d
CscPoint3d toMrptReferenceFrame3d(double x, double y, double z)
Definition: CscSlamEngine.h:722
conscience_core::lidar::directions::estimateFreeDistanceForLidarScan
double estimateFreeDistanceForLidarScan(double directionYawRads, const mrpt::obs::CObservation2DRangeScan &scan, double entityWidthMeters, double entityLengthMeters, double minClusterDistanceMeters, int minClusterSize, double maxDepthMeters)
Definition: CscSlamEngine.cpp:2918
conscience_core::lidar::CscSlam3dMapVoxelDiff::voxel
CscSlam3dMapVoxelKey voxel
Definition: CscSlamEngine.h:106
conscience_core::lidar::directions::AVAILABLE_ALL_DIRECTIONS
static const vector< CscAvailableDirection > AVAILABLE_ALL_DIRECTIONS
Definition: CscSlamEngine.h:752
conscience_core::lidar::directions::AVAILABLE_DIRECTION_LEFT
static const CscAvailableDirection AVAILABLE_DIRECTION_LEFT
Definition: CscSlamEngine.h:748
conscience_core::lidar::directions::getBestDirectionForScan
optional< pair< int, double > > getBestDirectionForScan(CObservation2DRangeScan *scan, const vector< CscAvailableDirection > &authorizedDirections, double entityWidth, double entityLength, map< int, double > *computedDirections)
Definition: CscSlamEngine.cpp:3011
conscience_core::lidar::LidarValuesSnapshot
Definition: CscLidarEngine.h:158
mrpt::obs
Definition: CscSlamEngine.h:32
conscience_core::lidar::CscSlam3dProbabilisticVoxel::key
CscSlam3dMapVoxelKey key
Definition: CscSlamEngine.h:177
conscience_core::lidar::directions::CscAvailableDirection
Definition: CscSlamEngine.h:742
logger
static std::unique_ptr< CscLogger > logger
Definition: gltfHelpers.cpp:6
conscience_core::lidar::CscSlamCellOccupancyStatus::SlamCellOccupancyStatus_Occupied
@ SlamCellOccupancyStatus_Occupied
conscience_core::lidar::mrptPointToCscPoint
CscPoint2d mrptPointToCscPoint(const TPoint2D &point)
Definition: CscSlamEngine.cpp:721
conscience_core::lidar::CscSlamEngine::getCellStatus
constexpr CscSlamCellOccupancyStatus getCellStatus(float cellValue, double occupiedThreshold=defaultCellOccupiedThreshold)
Definition: CscSlamEngine.h:482
conscience_utils::logging
Definition: conscience_log.cpp:20
CscLidarEngine.h
conscience_core::lidar::CscSlam3dMapVoxelChanges::mode
CscSlam3dMapVoxelChangesMode mode
Definition: CscSlamEngine.h:116
conscience_core::lidar::CscSlam3dMapVoxelGrid
Definition: CscSlamEngine.h:133
conscience_core::lidar::directions::estimateFreeDistanceFrontMetersForLidarScan3d
double estimateFreeDistanceFrontMetersForLidarScan3d(const LidarValuesSnapshot &scan, const CscSize3d &entitySizeCm, double voxelSizeMeters, int minVoxelPointCount, double maxDepthMeters, double minObstacleYMeters, double maxObstacleYMeters)
Definition: CscSlamEngine.cpp:3136
conscience_core::lidar::directions::AVAILABLE_DIRECTION_RIGHT
static const CscAvailableDirection AVAILABLE_DIRECTION_RIGHT
Definition: CscSlamEngine.h:749
conscience_core::lidar::CscSlamCellOccupancyStatus::SlamCellOccupancyStatus_Free
@ SlamCellOccupancyStatus_Free
conscience_core::lidar::CscSlam3dMapVoxelKey
Definition: CscSlamEngine.h:71
conscience_core::lidar::CscSlamEngine::MapToImageParams::clustersTracked
vector< CscSlamEngine::PhantomClusterTracked > clustersTracked
Definition: CscSlamEngine.h:463
conscience_core::lidar::CscSlam3dMapVoxelChangesListener::callback
function< void(const CscSlam3dMapVoxelChanges &changes)> callback
Definition: CscSlamEngine.h:129
nlohmann::detail::void
j template void())
Definition: json.hpp:4189
conscience_core::lidar::CscSlam3dProbabilisticVoxelGrid
Definition: CscSlamEngine.h:199
CscCommon.h
conscience_core::axiomes::CscPoint2d
Definition: Csc2dTypes.h:21
conscience_core::lidar::directions::CscAvailableDirection::relYaw
double relYaw
Definition: CscSlamEngine.h:743
conscience_core::lidar::CscSlamCellOccupancyStatus
CscSlamCellOccupancyStatus
Definition: CscSlamEngine.h:59
conscience_core::lidar::CscSlam3dMapVoxelKeyHash
Definition: CscSlamEngine.h:94
conscience_core::lidar::CscSlamEngine::MapToImageParams::crosses
map< TPoint2D, Vec3 > crosses
Definition: CscSlamEngine.h:453
conscience_core::lidar::CscSlam3dMap::getAllVoxelsCopy
vector< CscSlam3dMapVoxelKey > getAllVoxelsCopy() const
Definition: CscSlamEngine.h:321
conscience_core::lidar::CartographyChangesQueue::queueMutex
mutex queueMutex
Definition: CscSlamEngine.h:283
conscience_core::lidar::CscSlam3dMapVoxelDiff
Definition: CscSlamEngine.h:104
Csc2dTypes.h
conscience_core::axiomes::CscQuaternion
Definition: Csc3dTypes.h:150
conscience_core::ai::occThreshold
const double occThreshold
Definition: CscMrptAutonomousExploration.cpp:55
conscience_core::lidar::CscSlamEngine
Definition: CscSlamEngine.h:380
conscience_core::lidar::CscSlam3dMapVoxelGrid::voxelSizeMeters
const float voxelSizeMeters
Definition: CscSlamEngine.h:136
conscience_core::lidar::CscSlam3dMapVoxelChanges
Definition: CscSlamEngine.h:115
conscience_core::lidar::CscSlamEngine::MapToImageParams
Definition: CscSlamEngine.h:442
conscience_core::lidar::CscSlam3dProbabilisticVoxelGrid::VoxelMap
std::unordered_map< CscSlam3dMapVoxelKey, CscSlam3dProbabilisticVoxel, CscSlam3dMapVoxelKeyHash > VoxelMap
Definition: CscSlamEngine.h:204
conscience_core::lidar::CscSlamEngine::PhantomCluster::duplicate
bool duplicate
Definition: CscSlamEngine.h:390
conscience_core::lidar::directions::AVAILABLE_DIRECTION_BACK
static const CscAvailableDirection AVAILABLE_DIRECTION_BACK
Definition: CscSlamEngine.h:750
conscience_core::lidar::CscSlamEngine::PhantomClusterTracked::cells
vector< std::pair< int, int > > cells
Definition: CscSlamEngine.h:397
conscience_core::lidar::CscSlamEngine::PhantomCluster::cells
vector< pair< int, int > > cells
Definition: CscSlamEngine.h:388
conscience_core::lidar::CscSlam3dMapVoxelChanges::voxelSizeMeters
float voxelSizeMeters
Definition: CscSlamEngine.h:117
conscience_core::lidar::CartographyChangesQueue
Definition: CscSlamEngine.h:282
conscience_core::lidar::distancePoints
double distancePoints(const TPose2D &poseA, const TPose2D &poseB)
Definition: CscSlamEngine.h:714
conscience_core::lidar::CscSlam3dMap
Definition: CscSlamEngine.h:296
conscience_core::axiomes::CscPoint2dOriented
Definition: Csc2dTypes.h:165
b
uint8_t b
Definition: PathFinding3D25D.cpp:21
sumY
double sumY
Definition: PathFinding3D25D.cpp:29
conscience_core::lidar::CscSlamEngine::MapToImageParams::clusters
vector< CscSlamEngine::PhantomCluster > clusters
Definition: CscSlamEngine.h:462
conscience_core::lidar::CscEntityPositionManager
Definition: CscEntityPositionManager.h:44
conscience_core::lidar::CscSlam3dProbabilisticVoxel
Definition: CscSlamEngine.h:176
conscience_core::axiomes::CscPoint3dOriented
Definition: Csc3dTypes.h:277
conscience_utils::logging::ENUM
ENUM(LogLevel, LogLevel_TRACE, LogLevel_DEBUG, LogLevel_INFO, LogLevel_WARN, LogLevel_ERROR, LogLevel_USER)
mrpt::maps
Definition: CscSlamEngine.h:28
f
double f
Definition: HybridAStar.cpp:190
conscience_core::lidar::CscSlamEngine::MapToImageParams::dots
map< TPoint2D, Vec3 > dots
Definition: CscSlamEngine.h:449
conscience_core::axiomes::CscPoint3d::z
double z
Definition: Csc3dTypes.h:33
CscEntityPositionManager.h
conscience_core::lidar::CscSlamEngine::Slam3dParams
Definition: CscSlamEngine.h:537
mrpt::slam
Definition: CscSlamEngine.h:36
ptr
std::shared_ptr< T > ptr
Definition: CscCommon.h:29
conscience_core::lidar::CscSlam3dMapVoxelChanges::diffs
vector< CscSlam3dMapVoxelDiff > diffs
Definition: CscSlamEngine.h:118
conscience_core::lidar::mrptPointToJson
string mrptPointToJson(const TPoint2D &point)
Definition: CscSlamEngine.cpp:709
conscience_core::axiomes::CscPoint3d::x
double x
Definition: Csc3dTypes.h:31
conscience_core::lidar::fromMrptReferenceFrame3d
CscPoint3d fromMrptReferenceFrame3d(double mx, double my, double mz)
Definition: CscSlamEngine.h:726
conscience_core::axiomes::operator==
bool operator==(const CscPoint2d &a, const CscPoint2d &b)
Definition: Csc2dTypes.cpp:107