Conscience Core
CscEnvironmentSimulator.h
Go to the documentation of this file.
1 //
2 // CscEnvironmentSimulator.h
3 // ConscienceRobotManager
4 //
5 // Created by Conscience_Hazar on 05/03/2019.
6 // Copyright © 2019 IliesZaoui. All rights reserved.
7 //
8 
9 #ifndef CscEnvironmentSimulator_h
10 #define CscEnvironmentSimulator_h
11 
12 #include "CscCommon.h"
13 #include <cstring>
14 #include <iostream>
15 #include <iterator>
16 #include <mutex>
17 
25 
26 #include "Axiomes/CscGrid.h"
27 
28 
29 using std::mutex, std::function;
30 
31 using namespace conscience_core::core_objects;
32 using namespace conscience_core::simulator;
34 
36 private:
37  CscPhysicsSimulator *physicSimulator = nullptr;
38  map<CscWorldElementId, const CscWorldEntity *> *entities = nullptr;
39  map<CscWorldElementId, function<void()>> onRemoveEntityCallbacks;
40  vector<CscWorldObject *> *objects = nullptr;
41  vector<CscWorldPlace *> *places = nullptr;
42  vector<CscWorldElement *> *otherElements = nullptr;
43  map<string, CscWorldImage *> *sceneImages = nullptr;
44 
45  CscGrid *sceneFloor = nullptr;
46  CscPoint3d *gnssReferencePosition = nullptr;
47 
48  mutex entitiesMutex;
49  mutex placesMutex;
50  mutable mutex objectsMutex;
51  mutex otherElementsMutex;
52  mutex imagesMutex;
53  mutex gnssPositionOperationMutex;
54 
55  inline static std::atomic<unsigned long long> lastId = 0;
56  unsigned long long id;
57 
58  unique_ptr<CscLogger> logger;
59 
60  int getObjectIndexByName(const string &name) const;
61  int getOtherElementIndexByName(const string &name) const;
62 
63  void doRemoveEntity(const CscWorldElementId &entityId);
64 
65 public:
66  CscEnvironmentSimulator(bool autoIncrement);
67  virtual ~CscEnvironmentSimulator();
68 
69  void clear();
70 
71  virtual vector<CscWorldObject *> getObjects(const function<bool(const CscWorldObject *)> filter = [](const CscWorldObject *) { return true; }) const;
72 
73  CscWorldElement *getElementByName(const string &nameIn);
74 
78  float *getConscienceSimulationWorldStatus(bool rotationsAsEuler = false);
79 
80  vector<CscPoint3d *> *getVertexFromStrategy(CscWorldElementId entityId, int strategy);
81  vector<CscPoint3d *> *getPatchFromStrategy(CscWorldElementId entityId, int strategy);
82 
83  void importObject(CscWorldObject *object);
84  void importObjects(vector<CscWorldObject *> *objects);
85  void importPlace(CscWorldPlace *place, bool removeOthers = true);
86  void importLine(CscWorldLine *line);
87  void importImage(CscWorldImage *sceneImage);
88  void removeOtherElementByName(const string &name);
89 
94  void importPointsAsObjects(vector<CscPoint3d *> *points);
95 
96  void importEntity(const CscWorldEntity *entity, bool requiresExternalInit = false, const optional<function<void()>> &onRemoved = {});
97  bool removeEntity(const CscWorldElementId &entityId);
98  virtual void clearEntities();
99  bool hasEntity(const CscWorldElementId &entityId);
100 
101  CscPhysicsSimulator *getPhysicSimulator() const;
102  void setFocusedObjectByIndex(int objectIndex);
103  CscWorldObject *getFocusedObjectCurrent() const;
104  int countObjects();
105  virtual void clearObjects();
107  CscWorldObject *getObjectById(const CscWorldElementId objectId) const;
111  const CscPoint3d *getObjectPositionInSimulator(const string &serialNumber) const;
112 
113  CscWorldObject *getObjectByModelId(int objectModelId);
114  virtual vector<CscWorldObject *> getObjectsByModelId(int objectModelId);
115 
120  CscWorldPlace *getPlace();
121  CscWorldPlace *getPlaceById(const CscWorldElementId &placeId);
122 
123  const vector<CscWorldPlace *> getPlaces(function<bool(const CscWorldPlace *)> filter = [](const CscWorldPlace *) { return true; });
124 
125  const CscWorldEntity *getEntity(const CscWorldElementId &entityId) const;
126  virtual vector<CscWorldEntity *> getEntities(const function<bool(const CscWorldEntity *)> filter = [](const CscWorldEntity *) { return true; });
127  virtual vector<string> getEntitySerialNumbers(const function<bool(const CscWorldEntity *)> filter = [](const CscWorldEntity *) { return true; });
128  const CscEntityModel *getEntityModel(const CscWorldElementId &entityId) const;
129 
130  const MemberState *getEntityMemberStateById(const CscWorldElementId &entityId, int id) const;
131  const MemberState *getEntityMemberState(const CscWorldElementId &entityId, const CscMember *member) const;
132  const MemberState *getEntityMemberStateByName(const CscWorldElementId &entityId, const string &memberName) const;
133 
134  const CscPoint3d *getEntityPosition(const CscWorldElementId &entityId) const;
135  CscPoint3dOriented getEntityPositionAndRotation(const CscWorldElementId &entityId) const;
140  CscPoint3d getEntityAcceleration(const CscWorldElementId &entityId) const;
141  pair<CscPoint3d, CscQuaternion> getEntityPositionAndRotationQuaternion(const CscWorldElementId &entityId) const;
142 
147  void doWithEntities(function<void(const map<CscWorldElementId, const CscWorldEntity *> &entities)> action);
148 
153  void doWithObjects(function<void(const vector<CscWorldObject *> &objects)> action);
154 
159  CscState *getEntityState(const CscWorldElementId &entityId) const;
160 
165  void forceState(const CscWorldElementId &entityId, CscState *aState, int memberIdForInputs, const bool applyPos[3], const bool applyRot[3], const bool applyAcc[3], optional<int> nbMaxIteration = {}, optional<int> maxLoopDurationMillis = {});
166  void playSequence(const CscWorldElementId &entityId, CscState *init, CscSequence *sequence, const map<int, CscPivotMovementType> &pivotMovementByPivotId, bool geneticAi = false, bool extrapolationRealTime = false);
167  void playState(const CscWorldElementId &entityId, CscState *state, int duration, int delay, bool relativeValues);
168 
169  void setAllPivotsToRelaxedMode(const CscWorldElementId &entityId);
174  void forceMemberValues(const CscWorldElementId &entityId, const CscMemberInputStatus *inputsValues, const bool applyPosition[3], const bool applyEuler[3], const bool applyAcceleration[3], optional<int> nbMaxIteration = {}, optional<int> maxLoopDurationMillis = {});
175  int moveMemberToStateFromMember(const CscWorldElementId &entityId, const CscMemberInputStatus *inputsValues, const bool applyPosition[3], const bool applyEuler[3], const bool applyAcceleration[3], int nbMaxIteration = 40, int tryNumber = 0);
176  float getJointHingeAngle(const CscWorldElementId &entityId, int jointIdIn) const;
177 
178  void updateMemberEulers(const CscWorldElementId &entityId, int memberId, double eulerX, double eulerY, double eulerZ);
179  void updateMemberPosition(const CscWorldElementId &entityId, int memberId, float posX, float posY, float posZ);
180 
181  void moveObjectToPosition(CscWorldElement *object, const CscPoint3d *targetPosition);
182  void moveObjectToRotation(CscWorldElement *object, const CscPoint3d *targetRotation);
183  void moveObjectToPositionAndRotation(CscWorldElement *object, const CscPoint3d *targetPosition, const CscPoint3d *targetRotation);
184 
185  virtual void clearPlaces();
186  void loadDefaultPlaceFloor();
187  void clearOtherElements();
188  CscGrid *getSceneFloor() const;
189 
190  void focusVisionIntoPosition(float posX, float posY, float posZ);
191 
192  CscWorldObject *getObjectByName(const string &name);
193  CscWorldObject *getObjectByPosition(CscPoint3d *position, float radius);
194  virtual void removeObjectById(CscWorldElementId objectId);
195  void removeObjectByName(const string &name);
196  void removeObjectsByModelId(int objectModelId);
197  void removeObjectsByTag(const string &searchedTag);
198  bool removePlaceById(const string &placeId);
199 
200  bool hasObjectWithModelId(int objectModelId);
201 
205  void dump(fs::path outPath = fs::path(string(CSC_DEFAULT_OUT_DIR) + "/envSim_" + to_string(nowMillis()) + ".png")) const;
206 
210  CscPoint3d *computeConsciencePositionFromGnssPosition(const CscPoint3d *gnssPosition, const string &projection);
214  CscPoint3d *computeGnssPositionFromConsciencePosition(const CscPoint3d *consciencePosition, const string &projection);
215 
219  vector<CscPoint3d *> *computeGnssPositionsFromConsciencePositions(vector<CscPoint3d *> *consciencePositions, const string &projection);
220 
224  void setGnssReferencePosition(CscPoint3d *gnssPoint);
225 
230  bool gnssReferencePositionIsSet();
231 
235  void computeGnssReferencePositionWithConsciencePosition(CscPoint3d *gnssPoint, CscPoint3d *consciencePosition, const string &projection);
236 };
237 
238 #endif /* CscEnvironmentSimulator_h */
CscWorldEntity
Definition: CscWorldEntity.h:19
conscience_core::core_objects::CscWorldImage
Definition: CscWorldImage.h:24
CscMember
Definition: CscMember.h:16
nlohmann::to_string
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
Definition: json.hpp:26470
CscWorldEntity.h
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::core_objects
Definition: CscEntityReflexion.h:33
CscWorldObject
Definition: CscWorldObject.h:26
conscience_core::simulator::lastId
static std::atomic< unsigned long long > lastId
Definition: CscPhysicsSimulator.cpp:60
conscience_core::core_objects::CscWorldLine
Definition: CscWorldLine.h:16
CscEntityModel
Definition: CscEntityModel.h:54
conscience_utils::nowMillis
unsigned long long nowMillis()
Definition: conscience_util.cpp:294
CscGrid
Definition: CscGrid.h:23
CscWorldImage.h
conscience_core::simulator::CscPhysicsSimulator::MemberState
Definition: CscPhysicsSimulator.h:79
MemberState
CscPhysicsSimulator::MemberState MemberState
Definition: CscEnvironmentSimulator.h:33
logger
static std::unique_ptr< CscLogger > logger
Definition: gltfHelpers.cpp:6
CscWorldObject.h
CscEnvironmentSimulator::currentFocusedObjectIndex
int currentFocusedObjectIndex
Definition: CscEnvironmentSimulator.h:106
conscience_core::simulator::CscPhysicsSimulator
Definition: CscPhysicsSimulator.h:77
CSC_DEFAULT_OUT_DIR
#define CSC_DEFAULT_OUT_DIR
Definition: CscCommon.h:22
CscPhysicsSimulator.h
CscState
Definition: CscState.h:24
CscWorldElementId
string CscWorldElementId
Definition: Command.h:15
CscGrid.h
nlohmann::detail::void
j template void())
Definition: json.hpp:4189
CscCommon.h
CscWorldElement
Definition: CscWorldElement.h:24
CscWorldLine.h
conscience_core::simulator
Definition: CscPhysicsSimulator.cpp:46
CscWorldPlace.h
CscEnvironmentSimulator
Definition: CscEnvironmentSimulator.h:35
CscWorldPlace
Definition: CscWorldPlace.h:43
CscEntityModel.h
conscience_core::axiomes::CscPoint3dOriented
Definition: Csc3dTypes.h:265
CscMemberInputStatus
Definition: CscMemberInputStatus.h:26
CscSequence
Definition: CscSequence.h:51