9 #ifndef CscLidarEngine_h
10 #define CscLidarEngine_h
21 using std::deque, std::mutex;
55 string toString()
const;
57 OdometryData(
double deltaPositionX = 0,
double deltaPositionY = 0,
double deltaPositionZ = 0,
double deltaPitch = 0,
double deltaYaw = 0,
double deltaRoll = 0, optional<uint64_t> timeStamp = {});
84 const double robotYaw = std::atan2(forward.
getZ(), forward.
getX());
89 const vector<CscPoint3d> &pointCloud,
91 vector<CscPoint3d> worldCoordinates;
92 worldCoordinates.reserve(pointCloud.size());
100 worldCoordinates.emplace_back(
101 entityPosition.
getX() + rotated.
getX(),
102 entityPosition.
getY() + rotated.
getY(),
103 entityPosition.
getZ() + rotated.
getZ());
106 return worldCoordinates;
113 vector<CscPoint3d> localCoordinates = {localPoint};
124 worldPoint.
getX() - entityPosition.
getX(),
125 worldPoint.
getY() - entityPosition.
getY(),
126 worldPoint.
getZ() - entityPosition.
getZ());
130 class CscLidarEngine;
167 std::vector<CscPoint3d> getPointCloudWorldCoordinates(
const CscPoint3d &entityPosition,
const CscQuaternion &robotOrientation)
const;
172 unsigned long long timestamp = 0;
177 optional<OdometryData> odometry = {};
183 unsigned long long timestamp,
184 std::optional<OdometryData> odometry);
187 void getSliceAtY(std::vector<CscPoint3d> &out,
189 double tolerance)
const;
190 void getSliceAtY(std::map<double, double> &out,
double targetY,
double tolerance)
const;
200 unsigned long long getUpdateTimeMillis()
const;
210 bool has3dValues()
const;
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(
217 const optional<OdometryData> &odometry,
218 unsigned long long timestamp);
223 map<double, double> lidarValues;
224 unsigned long long timestamp = 0;
225 optional<OdometryData> odometry = {};
230 mutable mutex valuesMutex;
248 static bool isSlamAutoEnabled();
251 virtual void startEngine();
252 virtual void stopEngine();
262 void integrate2DValuesAtTime(
const map<double, double> &newValues,
unsigned long long timestamp, optional<OdometryData> odometry = {});
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);
272 void integrate3DPointCloudAtTime(
274 unsigned long long timestamp,
275 optional<OdometryData> odometry = {});
281 bool isLidarModeRunning(
CscLidarMode lidarModeSearched);
283 bool isLidarEngineActivated();
284 void stopLidarEngine();
286 unsigned long long getLastLidarValuesTime()
const;
287 unsigned long long getLidarValuesTimeToRetrieve()
const;
288 unsigned long long getLidarValuesTimeBetweenUpdate()
const;
290 void setOnNewValuesListener(
const optional<
function<
void(
const LidarValuesSnapshot &)>> &onNewValues = {});
291 optional<
function<
void()>> getOnActivatedListener()
const;
292 void setOnActivatedListener(
const optional<
function<
void()>> &onActivated = {});
301 static vector<CscPoint3d *> toWorldPoints(
const map<double, double> &lidarValues,
const CscQuaternion &entityOrientation,
const CscPoint3d &entityPosition);
304 mutex cartographyMutex;
305 mutex lidarReadingsMutex;
309 unsigned long long lidarValuesTimeToRetrieveInMillis = 0;
310 unsigned long long lidarValuesTimeBetweenUpdateInMillis = 0;
316 optional<
function<
void()>> onActivated = {};
318 void get2dValues(map<double, double> **lidarPoints, optional<OdometryData> **odometry,
unsigned long long ×tamp);