Go to the documentation of this file.
9 #ifndef CscSlamEngine_h
10 #define CscSlamEngine_h
16 #include <mrpt/math/TPose2D.h>
20 class COccupancyGridMap2D;
23 class CObservation2DRangeScan;
26 class CMonteCarloLocalization2D;
27 class CMetricMapBuilderRBPF;
30 using mrpt::math::TPoint2D, mrpt::math::TPose2D, mrpt::obs::CObservation2DRangeScan, mrpt::maps::COccupancyGridMap2D, mrpt::slam::CMonteCarloLocalization2D, mrpt::slam::CMetricMapBuilderRBPF;
31 using std::string, std::recursive_mutex, std::vector, std::map, std::pair, std::lock_guard, std::queue;
32 namespace fs = std::filesystem;
48 static constexpr
double defaultCellOccupiedThreshold = 0.14;
55 double overlapRatio{0.0};
62 std::vector<std::pair<int, int>>
cells;
64 std::chrono::steady_clock::time_point
lastHit;
73 const CscPoint3d &getRobotStartPosition()
const;
84 fs::path saveCartography();
85 bool loadCartography(
const fs::path &cartographyDir);
86 bool loadLatestCartography();
87 bool hasLoadedCartography();
89 bool isStarted()
const;
90 bool isStartedAndReady()
const;
92 void consumeLidarValues();
94 void forceLocalisationPosition(
double xInMeters,
double zInMeters,
double headingInRad);
101 optional<TPose2D> robotPose = nullopt;
126 const CObservation2DRangeScan *lidarScan =
nullptr;
128 void saveMrptMapToPng(
const string &filename,
131 CscPoint3d *transformToWorld3dPosition(
const TPoint2D &pointSlam2d)
const;
132 vector<CscPoint3d *> getMapAsWorldPoints(
double threshold = defaultCellOccupiedThreshold)
const;
135 if (cellValue < 0.0
f || std::abs(cellValue - 0.5
f) < 1e-6
f) {
136 return CscSlamCellOccupancyStatus::SlamCellOccupancyStatus_Unknown;
138 if (cellValue <= occupiedThreshold) {
139 return CscSlamCellOccupancyStatus::SlamCellOccupancyStatus_Occupied;
141 return CscSlamCellOccupancyStatus::SlamCellOccupancyStatus_Free;
144 void clearCartography();
150 mrpt::math::TPose2D getRobotPose()
const;
162 class PhantomClusterTracker {
164 PhantomClusterTracker(
double overlapThreshold = 0.3,
int maxAgeSeconds = 300);
167 void update(
const std::vector<PhantomCluster> &newClusters);
169 const std::vector<PhantomClusterTracked> &tracked()
const;
171 string getSummary()
const;
174 std::vector<PhantomClusterTracked> trackedClusters;
175 const double overlapThreshold;
176 const int maxAgeSeconds;
179 bool clustersSimilar(
180 const std::vector<std::pair<int, int>> &a,
181 const std::vector<std::pair<int, int>> &b)
const;
184 const string entitySerialNumber;
185 const bool isSimulatedEntity;
186 void consumeLidarValues(
const LidarValues &lidarValues);
190 CscEntityPositionManager *positionManager =
nullptr;
191 CscLidarEngine *lidarEngine =
nullptr;
193 void clearSlamData();
195 CMonteCarloLocalization2D *slamLocalization =
nullptr;
197 mutable recursive_mutex slamInstanceMutex;
198 CMetricMapBuilderRBPF *slamInstance =
nullptr;
200 bool slamInitialized =
false;
201 double robotStartYaw = 0;
203 queue<const LidarValues *> lidarValuesQueue;
205 unique_ptr<CscLogger>
logger;
207 unsigned long long lastLidarValuesTimestamp = 0;
209 mutable mutex lastRangeScanMutex;
211 std::chrono::steady_clock::time_point lastPngExportTime = std::chrono::steady_clock::now();
214 bool started =
false;
215 bool odoDiffInitialized =
false;
216 unsigned int lastMapSize = 0;
217 unsigned int identicalCount = 0;
218 std::chrono::steady_clock::time_point lastTimeSlamOdo = std::chrono::steady_clock::now();
220 struct CscSlamMapDiscrepancyState {
221 size_t discrepantScanCount = 0;
222 size_t ticksSinceDiscrepancyStart = 0;
225 size_t initializationTicksCount = 0;
227 CscSlamMapDiscrepancyState discrepancyState;
229 struct PhantomClusterParams {
234 double maxDistanceMeters = 8;
240 double minOverlapRatio = 0.2;
246 int supportRadius = 2;
251 int clusterThresh = 10;
257 int maxClusterShiftCells = 14;
263 int gapTolerance = 2;
269 int mergeDistanceCells = 3;
271 struct PhantomClusterResult {
272 bool hasPhantoms{
false};
273 vector<PhantomCluster> clusters;
274 vector<uint8_t> visible;
276 PhantomClusterResult detectPhantomClusters(
277 const COccupancyGridMap2D &slamMap,
278 const CObservation2DRangeScan &scan,
280 const PhantomClusterParams ¶ms,
282 PhantomClusterResult lastClustersResult;
283 PhantomClusterTracker phantomClusterTracker;
293 return std::hypot(pointA.x - pointB.x, pointA.y - pointB.y);
309 namespace directions {
327 CObservation2DRangeScan *scan,
328 const vector<CscAvailableDirection> &authorizedDirections,
329 double robotWidth,
double robotLength, map<int, double> *computedDirections =
nullptr);
331 const mrpt::obs::CObservation2DRangeScan &scan,
333 const std::string &bestDirName,
334 const fs::path &filename,
335 double robotWidth,
double robotLength);
338 double directionYawRads,
339 const mrpt::obs::CObservation2DRangeScan &scan,
340 double robotWidthMeters,
341 double robotLengthMeters,
342 double minClusterDistanceMeters = 0.10,
343 int minClusterSize = 3,
344 double maxDepthMeters = 2.0);
static const CscAvailableDirection AVAILABLE_DIRECTION_FORWARD
Definition: CscSlamEngine.h:316
Definition: CscSlamEngine.h:61
string mrptPoseToJson(const TPose2D &pose)
Definition: CscSlamEngine.cpp:649
The CscPoint3d class represents a point in three-dimensional space. It is primarily used to denote a ...
Definition: Csc3dTypes.h:24
double estimateFreeDistanceForLidarScan(double directionYawRads, const mrpt::obs::CObservation2DRangeScan &scan, double robotWidthMeters, double robotLengthMeters, double minClusterDistanceMeters, int minClusterSize, double maxDepthMeters)
Definition: CscSlamEngine.cpp:1557
std::chrono::steady_clock::time_point lastHit
Definition: CscSlamEngine.h:64
Definition: CscLidarEngine.h:62
CscPoint2d toMrptReferenceFrame(const CscPoint3d &point)
Definition: CscSlamEngine.h:298
CscPoint2dOriented mrptPoseToCscPointOriented(const TPose2D &pose)
Definition: CscSlamEngine.cpp:665
string name
Definition: CscSlamEngine.h:313
vector< uint8_t > cellsVisibility
Definition: CscSlamEngine.h:121
@ SlamCellOccupancyStatus_Unknown
Definition: Csc2dTypes.cpp:9
Definition: CscEntityReflexion.h:42
optional< pair< int, double > > getBestDirectionForScan(CObservation2DRangeScan *scan, const vector< CscAvailableDirection > &authorizedDirections, double robotWidth, double robotLength, map< int, double > *computedDirections)
Definition: CscSlamEngine.cpp:1650
vector< TPose2D > path
Definition: CscSlamEngine.h:111
Definition: CscSlamEngine.h:53
static const vector< CscAvailableDirection > AVAILABLE_ALL_DIRECTIONS
Definition: CscSlamEngine.h:320
static const CscAvailableDirection AVAILABLE_DIRECTION_LEFT
Definition: CscSlamEngine.h:317
Definition: CscSlamEngine.h:22
Definition: CscSlamEngine.h:311
static std::unique_ptr< CscLogger > logger
Definition: gltfHelpers.cpp:6
@ SlamCellOccupancyStatus_Occupied
CscPoint2d mrptPointToCscPoint(const TPoint2D &point)
Definition: CscSlamEngine.cpp:669
constexpr CscSlamCellOccupancyStatus getCellStatus(float cellValue, double occupiedThreshold=defaultCellOccupiedThreshold)
Definition: CscSlamEngine.h:134
Definition: conscience_log.cpp:20
static const CscAvailableDirection AVAILABLE_DIRECTION_RIGHT
Definition: CscSlamEngine.h:318
@ SlamCellOccupancyStatus_Free
vector< CscSlamEngine::PhantomClusterTracked > clustersTracked
Definition: CscSlamEngine.h:117
void saveScanWithBestDirectionAsPng(const mrpt::obs::CObservation2DRangeScan &scan, double bestYaw, const std::string &bestDirName, const fs::path &filename, double robotWidth, double robotLength)
Definition: CscSlamEngine.cpp:1675
Definition: Csc2dTypes.h:21
double relYaw
Definition: CscSlamEngine.h:312
CscSlamCellOccupancyStatus
Definition: CscSlamEngine.h:40
map< TPoint2D, Vec3 > crosses
Definition: CscSlamEngine.h:107
std::vector< std::pair< int, int > > cells
Definition: CscSlamEngine.h:62
Definition: Csc3dTypes.h:138
const double occThreshold
Definition: CscMrptAutonomousExploration.cpp:55
Definition: CscSlamEngine.h:46
Definition: CscSlamEngine.h:96
bool duplicate
Definition: CscSlamEngine.h:56
static const CscAvailableDirection AVAILABLE_DIRECTION_BACK
Definition: CscSlamEngine.h:319
vector< pair< int, int > > cells
Definition: CscSlamEngine.h:54
double distancePoints(const TPose2D &poseA, const TPose2D &poseB)
Definition: CscSlamEngine.h:295
Definition: Csc2dTypes.h:165
vector< CscSlamEngine::PhantomCluster > clusters
Definition: CscSlamEngine.h:116
Definition: CscEntityPositionManager.h:44
Definition: Csc3dTypes.h:265
Definition: CscSlamEngine.h:19
double f
Definition: HybridAStar.cpp:190
map< TPoint2D, Vec3 > dots
Definition: CscSlamEngine.h:103
double z
Definition: Csc3dTypes.h:33
Definition: CscSlamEngine.h:25
std::shared_ptr< T > ptr
Definition: CscCommon.h:29
string mrptPointToJson(const TPoint2D &point)
Definition: CscSlamEngine.cpp:657
double x
Definition: Csc3dTypes.h:31