Conscience Core
CscEntityDetectionState.h
Go to the documentation of this file.
1 //
2 // CscEntityDetectionState.h
3 // ConscienceRobotManager
4 //
5 // Created by Hazar Zaoui on 15/12/2023.
6 // Copyright © 2023 IliesZaoui. All rights reserved.
7 //
8 
9 #ifndef CscEntityDetectionState_h
10 #define CscEntityDetectionState_h
11 
12 #include <ctime>
13 #include <numeric>
14 #include "CscCommon.h"
15 #include "alerts.h"
18 
19 using namespace conscience_core::ai::alerts;
20 
21 using std::chrono_literals::operator""s, std::chrono_literals::operator""ms, std::chrono_literals::operator""h;
22 using std::prev, std::recursive_mutex, std::chrono::system_clock, std::chrono::duration, std::remove_if, std::chrono::duration_cast, std::chrono::milliseconds, std::function;
23 
24 namespace cv {
25 class Tracker;
26 }
27 namespace conscience_core::ai {
28 
30  const unsigned long long timestampMillis;
32 
36  const bool actualDetection;
37 
38  TrackHit(unsigned long long timestampMillis, const CscRect2d &rectangle, bool actualDetection);
39 };
40 
42 private:
43 
44  inline static int counter = 0;
45  vector<TrackHit *> trackingHistory;
46  float certitude;
50  const float motionIouThreshold = 0.35;
51 
55  vector<const TrackHit *> getRecentHits(long lastMillis) const;
56 public:
57 
58  const int uid = counter++;
61  const system_clock::time_point firstDetectionTime = system_clock::now();
62  system_clock::time_point lastDetectionTime = system_clock::now();
63  system_clock::time_point lastActualDetectionTime = system_clock::now();
64  system_clock::time_point lastMotionTime = system_clock::now();
65 
66  TrackedObject(CscWorldObject * worldObject, ptr<cv::Tracker> tracker, const CscRect2d & firstDetectionBox, float certitude);
67  ~TrackedObject();
68 
72  void onDetected(const CscRect2d & newDetectionBox, float updatedCertitude, bool actualDetection, const CscPoint3d * position = nullptr, const CscPoint3d * rotation = nullptr);
73 
74  operator string() const;
75 
76  const CscRect2d &getLastDetectionBox() const;
77  bool isLastHitAnActualDetection() const;
78 
79  unsigned long long getImmobileSinceMilliseconds() const;
80 
85  vector<CscRect2d> getLastDetectionBoxes(optional<int> count = {}) const;
86 
91  CscRect2d getAverageBox(optional<int> count = {}) const;
92 
96  float getCertitude() const;
97 
101  int countActualDetections(long lastMillis) const;
102 
106  float getActualDetectionsRatio(long lastMillis) const;
107 
111  float getMotionRatio(long lastMillis) const;
112 
113  bool isOlderThan(long millis) const;
114 
118  int getHitsCount(long lastMillis) const;
119 
123  unsigned long long getMaxDurationBetweenHits(long observationPeriodMillis) const;
124 
125  CscDetectedAlert *toAlert(CscAlertTypeBuiltin alertType, optional<float> forcedCertitude = {}) const;
126 
127 };
128 
133 public:
134  unsigned long long lastFramesWithPersonRatioCheckMillis = nowMillis();
136  vector<bool> framesWithPerson;
137 };
138 
140 public:
141  operator string() const;
142  map<string, double> previousCarePulseValues;
143  map<string, double> previousCareRedonValues;
144  bool pulseDisconnectedAlertSent = false;
145  bool redonDisconnectedAlertSent = false;
146  bool hasReceivedCareSureValues = false;
147  bool hasReceivedCarePulseValues = false;
148  unsigned long long lastRedonSensorTimestamp = 0;
149  unsigned long long lastPulseSensorTimestamp = 0;
150 
151  vector<ptr<TrackedObject>> updateDetectionState(const cv::Mat &pristineImage, cv::Mat &processedImage, ptr<detector_engine::DetectionResult> detectionResult, bool trackingEnabled);
152 
153  ptr<TrackedObject> getTrackedObject(int uid) const;
154  system_clock::time_point lastUpdateTime = system_clock::now();
155 
156  const vector<ptr<TrackedObject>> & getTrackedObjects() const;
157 
158  void trackObject(ptr<TrackedObject> object);
159 
163  ptr<TrackedObject> untrackObject(const int trackedObjectUid);
164 
165  vector<ptr<TrackedObject>> clear();
169  template <class Rep, class Period>
170  vector<ptr<TrackedObject>> untrackObjectsAbsentFor(duration<Rep, Period> maxAbsenceDuration) {
171  system_clock::time_point now = system_clock::now();
172 
173  vector<ptr<TrackedObject>> removedObjects;
174  vector<ptr<TrackedObject>> updatedTrackedObjects;
175  for (ptr<TrackedObject> trackedObject : trackedObjects) {
176  if (now < (trackedObject->lastDetectionTime + maxAbsenceDuration)) {
177  updatedTrackedObjects.push_back(trackedObject);
178  } else {
179  removedObjects.push_back(trackedObject);
180  }
181  }
182 
183  trackedObjects = updatedTrackedObjects;
184 
185  return removedObjects;
186  }
187 
192  template <class Rep, class Period>
193  vector<ptr<TrackedObject>> untrackObjectsMissingActualDetectionFor(duration<Rep, Period> maxDuration) {
194  system_clock::time_point now = system_clock::now();
195 
196  vector<ptr<TrackedObject>> removedObjects;
197  vector<ptr<TrackedObject>> updatedTrackedObjects;
198 
199  for (ptr<TrackedObject> trackedObject : trackedObjects) {
200  if (now < (trackedObject->lastActualDetectionTime + maxDuration)) {
201  updatedTrackedObjects.push_back(trackedObject);
202  } else {
203  removedObjects.push_back(trackedObject);
204  }
205  }
206 
207  trackedObjects = updatedTrackedObjects;
208 
209  return removedObjects;
210  }
211 
212 
213  ptr<TrackedObject> getClosestObject(const CscPoint3d * fromReferencePoint, bool requireActualDetection = false) const;
214  static constexpr unsigned long long framesWithPersonRatioPeriodMillis = 60'000;
215 
216  ptr<TrackedObject> getCurrentPersonFall();
217 
221  CscEntityAlertIdentificationState &getAlertIdentificationState();
222  void resetIdentificationState();
223 
224 private:
225  milliseconds trackingMaxActualDetectionMissingDuration = 200ms;
226  milliseconds trackingMaxAbsenceDuration = 100ms;
227  vector<ptr<TrackedObject>> trackedObjects;
228 
229  CscEntityAlertIdentificationState alertIdentificationState;
230 
231  ptr<TrackedObject> currentPersonFall = nullptr;
232  ptr<TrackedObject> currentPersonOutsideBed = nullptr;
233  std::unique_ptr<CscLogger> logger;
234 
235 
236 };
237 }
238 #endif /* CscEntityDetectionState_h */
conscience_core::ai::CscEntityDetectionState::untrackObjectsMissingActualDetectionFor
vector< ptr< TrackedObject > > untrackObjectsMissingActualDetectionFor(duration< Rep, Period > maxDuration)
Definition: CscEntityDetectionState.h:193
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::ai::TrackedObject::worldObject
CscWorldObject *const worldObject
Definition: CscEntityDetectionState.h:59
CSC_DLL_IMPORTEXPORT
#define CSC_DLL_IMPORTEXPORT
Definition: os.h:34
conscience_core::ai
Definition: alerts.cpp:12
CscWorldObject
Definition: CscWorldObject.h:26
conscience_core::ai::alerts
Definition: alerts.cpp:12
CscDetectorEngine.h
conscience_core::ai::CscEntityAlertIdentificationState::framesWithPersonRatioPerPeriod
vector< float > framesWithPersonRatioPerPeriod
Definition: CscEntityDetectionState.h:135
conscience_utils::nowMillis
unsigned long long nowMillis()
Definition: conscience_util.cpp:294
conscience_core::ai::CscEntityDetectionState::previousCareRedonValues
map< string, double > previousCareRedonValues
Definition: CscEntityDetectionState.h:143
conscience_core::ai::CscEntityAlertIdentificationState::framesWithPerson
vector< bool > framesWithPerson
Definition: CscEntityDetectionState.h:136
conscience_core::ai::CscEntityDetectionState::untrackObjectsAbsentFor
vector< ptr< TrackedObject > > untrackObjectsAbsentFor(duration< Rep, Period > maxAbsenceDuration)
Definition: CscEntityDetectionState.h:170
CscWorldObject.h
alerts.h
conscience_core::ai::TrackHit::timestampMillis
const unsigned long long timestampMillis
Definition: CscEntityDetectionState.h:30
conscience_core::ai::TrackHit::rectangle
const CscRect2d rectangle
Definition: CscEntityDetectionState.h:31
conscience_core::ai::CscEntityDetectionState::previousCarePulseValues
map< string, double > previousCarePulseValues
Definition: CscEntityDetectionState.h:142
conscience_core::ai::TrackHit::actualDetection
const bool actualDetection
Definition: CscEntityDetectionState.h:36
CscCommon.h
conscience_core::ai::TrackedObject
Definition: CscEntityDetectionState.h:41
conscience_core::ai::TrackHit
Definition: CscEntityDetectionState.h:29
conscience_core::ai::TrackedObject::tracker
const ptr< cv::Tracker > tracker
Definition: CscEntityDetectionState.h:60
conscience_core::ai::CscEntityDetectionState
Definition: CscEntityDetectionState.h:139
conscience_core::ai::alerts::CscDetectedAlert
Definition: alerts.h:80
conscience_core::axiomes::CscRect2d
Definition: Csc2dTypes.h:114
conscience_core::ai::TrackHit
struct CSC_DLL_IMPORTEXPORT TrackHit
Definition: CscEntityReflexion.h:85
cv
Definition: CscEntityDetectionState.h:24
s
double s
Definition: HybridAStar.cpp:85
ptr
std::shared_ptr< T > ptr
Definition: CscCommon.h:29
conscience_core::ai::CscEntityAlertIdentificationState
Definition: CscEntityDetectionState.h:132