9 #ifndef CscEntityReflexion_h
10 #define CscEntityReflexion_h
26 #include <shared_mutex>
29 #pragma region forwardDefs
62 #pragma endregion forwardDefs
79 using std::prev, std::thread, std::recursive_mutex, std::chrono::system_clock, std::chrono::duration, std::remove_if, std::chrono::duration_cast, std::chrono::milliseconds, std::function;
80 using std::shared_mutex, std::chrono_literals::operator
""s, std::chrono_literals::operator
""ms, std::chrono_literals::operator
""h;
94 offsetTop = theOffsetTop;
95 offsetRight = theOffsetRight;
118 operator string()
const;
119 string serialize()
const;
127 bool isSimulated()
const;
128 bool doesPhysicsRequireAdditionalInit()
const;
135 bool physicsRequiresAdditionalInit;
159 operator string()
const;
161 bool hasBackendNotification()
const;
174 const vector<ptr<const CscAlertIdentificationConfig>>
alerts;
180 const vector<CscDetectionStatsType>
stats;
199 const vector<ptr<const CscAlertIdentificationConfig>> &alerts = {},
200 const vector<CscDetectionStatsType> &stats = {},
201 bool shouldFocusDetections =
false,
202 const optional<DetectionNotificationParameters> ¬ificationParameters = {},
203 bool locateInSimulator =
true,
204 const map<string, string> &additionalParams = {},
207 bool isNotificationEnabled()
const;
217 bool shouldVisionBeEnabled()
const;
218 bool doesAlertTypeNeedVision(
CscAlertType alertType)
const;
221 string toString()
const;
242 unsigned long long immobileSinceMilliseconds);
250 bool obsolete =
false;
252 operator string()
const;
253 void answer(
bool accept);
254 optional<bool> getAnswer()
const;
257 const Answer answerFunction;
258 optional<bool> result = {};
273 optional<IkFocusParam> ikParam = {};
283 unsigned long long lastFrameTimestampMillis = 0;
284 string activeDetectionDescription =
"";
285 string enabledAlertsDescription =
"";
403 void stopAndRelease(
bool removeFromEnvironment =
true);
405 map<string, EntitySensorValues> getAllSensorValuesBySensorName();
406 void setSensorValues(
const string &sensorName,
const map<string, double> &values);
407 bool isLidarEngineActivated();
408 bool isLidarEngineInitialized();
415 void restoreCartography(optional<fs::path> cartographyDirMaybe = {});
426 void resetToInitialState();
436 void consumeVideoSource(
const optional<string> &
id = {},
bool reopenEvenIfAlreadyOpened =
true);
459 void unwatchAlerts(
const vector<CscAlertType> &alertsToBeUnwatched);
463 vector<CscDetectedAlert> getAlerts();
469 void markAlertDone(
const AlertId &alertId);
470 bool isAlertDone(
const AlertId &alertId);
471 void setAlertsMaxAgeMillis(
long alertsMaxAgeMillis);
473 void fireLiveEnvironmentUpdate();
477 optional<ptr<DetectionResult>> getLastDetectionResult();
484 const string &getSerialNumber()
const;
485 const string &getEntityModelId()
const;
490 optional<fs::path> stopLastPeriodCaptureRecordingToFile();
492 void startLastPeriodCaptureRecordingToFile(
short durationSeconds,
const fs::path &outputPath);
494 void stopCaptureRecordingToFile();
496 void startCaptureRecordingToFile(
const fs::path &outputPath,
const optional<string> &videoSourceId = {});
498 void purgeAIObjectives();
504 float *geAIObjectivesStatus()
const;
511 void stopLidarEngine();
512 void startLidarEngineLocalDevice(
string devicePath,
double *currentState);
513 void startLidarEngineEntity();
515 void clearStringDetectorResult();
517 void vocalPhoneCallTest(
const vector<string> &phoneNumbers,
const map<string, string> &additionalParams);
521 void setSlamCartographyActivated(
bool enable);
522 void stopAndSaveLidarCartography();
527 void setSlamLocalizationActivated(
bool enable,
CscPoint3dOriented *position =
nullptr);
529 void clearLidarCartography();
533 vector<ptr<HumanDecision>> getOngoingDecisions();
534 void answerDecision(
const string &decisionUid,
bool accept);
539 map<string, ptr<CscPublicAIData>> getPublicAIDataForSubject(
const string &subject);
540 void clearPublicAIDataForSubject(
const string &subject);
549 bool isSimulated()
const;
554 bool useGnssPositioning()
const;
561 void sendSequenceToRealRobot(
CscSequence *sequence)
const;
567 void ifRunning(
function<
void()> action);
569 void loadCartographyFromPoints(
const vector<const CscPoint3d *> &points);
571 const vector<ptr<CscEntityVideoSource>> &getVideoSources()
const;
593 static bool &autoCloseStreamEnabled();
598 return detectionState;
609 bool hasStatusFlag(
const vector<CscEntityStatusFlagsList> &statuses)
const;
615 void setLastEntityStatusFlags(
const string &lastEntityStatusFlags);
623 void startAutonomousExploration();
624 void stopAutonomousExploration();
628 void ifNotStopped(
const function<
void()> &action);
633 void addCustomData(
const map<string, void *> &customData);
637 map<string, void *> getCustomData()
const;
641 void *getCustomDataValue(
const string &key)
const;
647 void *eraseCustomData(
const string &key);
649 template <
typename T>
651 std::shared_lock lock(customDataMutex);
653 auto valueMatch = customData.find(key);
654 if (valueMatch != customData.end()) {
655 result =
static_cast<T*
>(valueMatch->second);
657 return result ==
nullptr ? nullopt : optional<T>(*result);
662 bool isStopping()
const;
667 void addPublicAIDataFromTrackedObjects(map<
string, map<string, CscPublicAIData *>> &updatedPublicAIData);
669 map<string, EntitySensorValues> sensorValuesBySensorName;
670 shared_mutex sensorValuesMutex;
672 inline bool shouldTriggerNotificationsInstantly()
const {
return getSerialNumber() ==
"8"; }
673 bool loopRunning =
false;
674 unsigned loopTerminatedCount = 0;
675 thread reflexionThread;
677 void identifyDetectionAlerts();
679 unsigned long lastCartographyActivityMillis = 0;
680 const long loadCartographyLogIntervalMillis = 15000;
681 bool previousCartographyDetected =
false;
683 void captureDetectLoopTick();
685 unsigned long long cartographyOccupiedCellsLastRefreshTimeMillis;
687 vector<ptr<CscEntityVideoSource>> videoSources;
692 recursive_mutex captureDetectMutex;
693 int processKnowledgeRequestsCount = 0;
695 vector<LiveEnvironmentUpdateListener> liveEnvironmentListeners;
696 vector<SequenceProcessorSendSequenceListener> sequenceToBeSentToRealEntityListeners;
698 optional<ptr<DetectionResult>> lastDetectionResult = {};
700 thread *captureDetectThread =
nullptr;
711 void focusClosestDetectedObject();
712 optional<int> currentFocusedObjectId = {};
715 map<string, CscCaptureEngine *> secondaryCaptureEngines;
717 mutex captureFileRecorderMutex;
721 mutable mutex currentPlaceCartographyMutex;
730 void resolveDetector();
731 inline bool isDetectionEnabled()
const {
return detector !=
nullptr; }
733 vector<CscDetectorEngine *> detectorsToBeDeleted;
737 milliseconds trackingMaxAbsenceDuration = 2000ms;
741 milliseconds trackingMaxActualDetectionMissingDuration = 6000ms;
749 vector<CscDetectionStatsType> enabledStatsTypes;
751 ptr<DetectionResult> performDetectionOnImage(
const cv::Mat ¤tFrame, cv::Mat &resultingImage);
762 void reflexionThreadLoop();
779 void cartographyAndLocalizationProcess();
781 int detectionFrameId = 0;
784 optional<unsigned long long> streamOpenWithDetectionOffStartTimeMillis = {};
786 CscTimer *lastSuccessfulDetectionTimer =
nullptr;
791 const string detectionResultImagesDirectoryPath =
"";
793 bool autobackToInitialStateEnabled =
false;
801 cv::Mat *lastFrame =
nullptr;
802 unsigned long long lastFrameTimeMillis = 0;
804 unsigned fpsFramesCount = 0;
805 unsigned long long lastFpsRefreshMillis = 0;
806 bool streamUnavailabilityNotified =
true;
808 unique_ptr<CscLogger>
logger;
810 system_clock::time_point lastFocusStateTime = system_clock::now();
820 map<CscDetectionStatsType, double> gatherDetectionStats();
822 system_clock::time_point lastAlertIdentificationTime = system_clock::now() - 12h;
823 map<AlertId, CscDetectedAlert *> alerts;
827 long alertsMaxAgeMillis = 12 * 60 * 60 * 1000;
828 shared_mutex alertsMutex;
830 void purgeOldAlerts();
832 system_clock::time_point lastNotificationsCheckTime = system_clock::now() - 12h;
833 unsigned long long lastLidarCartographyTimeMillis = 0;
834 unsigned long long lastTimeLoggedLidarLossTimeMillis = 0;
835 size_t lastRenderedSceneMatrixSize = 0;
837 map<AlertId, system_clock::time_point> alertNotificationTimes;
845 void notifyDetections();
853 void updateCurrentAlerts(map<AlertId, CscDetectedAlert *> currentAlerts);
859 void showLidarLocalizationInEnvironment(
const CscPoint3d *estimatedPosition,
float eulerY);
862 bool isStoppingValue =
false;
864 mutex ongoingDecisionsMutex;
865 map<string, ptr<HumanDecision>> ongoingDecisions;
867 const string &message,
Answer answer = [](
bool accepted) {});
868 void removeDecision(
const string &decisionUid);
869 int lastDecisionUid = 0;
871 bool trackingEnabled =
false;
872 void filterAlertsOnTimeSlots(map<AlertId, CscDetectedAlert *> &alerts);
873 vector<ptr<const CscAlertIdentificationConfig>> enabledAlerts;
875 map<string, map<string, CscPublicAIData *>> publicAIData;
876 shared_mutex publicAIDataMutex;
877 void updatePublicAIData(
const map<
string, map<string, CscPublicAIData *>> &updatedPublicAIData);
880 const string logPrefix;
889 bool isUsingAiApi =
false;
891 map<string, void *> customData;
892 mutable shared_mutex customDataMutex;