Conscience Core
CscPhysicsSimulator.h
Go to the documentation of this file.
1 #ifndef CSCPHYSICSSIMULATOR_H
2 #define CSCPHYSICSSIMULATOR_H
3 
4 #include "CscCommon.h"
5 
6 #include <functional>
7 
11 
12 #include <chrono>
13 #include <cstdlib>
14 #include <mutex>
15 #include <thread>
16 
17 #include <iterator>
18 
19 #include <ctime>
20 #include <iostream>
21 
26 #include "CoreObjects/CscState.h"
31 
32 #define FORCE_MEMBER_VALUES_DEFAULT_MAX_ITERATION_NUMBER 1000
33 #define FORCE_MEMBER_VALUES_DEFAULT_MAX_LOOP_DURATION_MILLIS 50
34 using std::runtime_error, std::recursive_mutex, std::vector, std::string, std::runtime_error, std::function, std::optional, std::thread, std::isnan;
35 
36 using namespace conscience_utils;
37 
38 
39 #pragma region forwardDefs
40 class btTypedConstraint;
41 class btHingeConstraint;
42 class btSliderConstraint;
43 class btRigidBody;
44 class btBroadphaseInterface;
45 class btCollisionDispatcher;
46 class btDiscreteDynamicsWorld;
47 class btClock;
48 class btDefaultCollisionConfiguration;
49 class btSequentialImpulseConstraintSolver;
50 class btFixedConstraint;
51 class btCollisionShape;
52 class btTransform;
53 #pragma endregion forwardDefs
54 
56 // Collision groups & masks
57 #define BIT(x) (1 << (x))
59  COL_NOTHING = 0, // Collide with nothing
60  COL_ROBOT_MEMBERS = BIT(1), // Collide with robot members
61  COL_FLOOR = BIT(2), // Collide with floor
62  COL_ENV_OBJ = BIT(3), // Collide with env objects
63  COL_ENV_PLACE = BIT(4) // Collide with env place
64 };
65 
67  WHEEL = 1,
68  COMPLEX = 2 };
69 
74 typedef function<void(const char *, double *, unsigned long, int, int, bool)> PlayStateListener;
75 
76 
78 public:
79  struct MemberState {
80  protected:
86  double rotationQuaternion[4];
88 
89  MemberState(CscPoint3d *position, CscPoint3d *euler, CscPoint3d *acceleration);
90 
91  public:
95  const double *const getRotationQuaternionArray() const;
96  CscQuaternion getRotationQuaternion() const;
97  const CscPoint3d *getPosition() const;
98  const CscPoint3d *getRotationEulerAsPoint() const;
99  const CscPoint3d *getAcceleration() const;
100  virtual ~MemberState();
101  };
102 
103  const unsigned long long id;
104 
105  typedef int EntityOutputId;
106 
108  public:
109  float value;
111  float speedMax;
112 
113  BaseEntityOutputPhysicsState(float value, float objectiveValue, float speedMax)
114  : value(value),
115  objectiveValue(objectiveValue),
116  speedMax(speedMax) {
117  }
118 
119  virtual ~BaseEntityOutputPhysicsState();
120  };
121 
123  btHingeConstraint *const bulletConstraint;
124  float limitMin;
125  float limitMax;
126  bool rotationX;
127  bool rotationY;
128  bool rotationZ;
129  float softness;
130  float bias;
131  float relaxation;
134  float maxImpulse;
135  float speedToReachTarget; // In radian per second
136 
137  PivotPhysicsState(btHingeConstraint *bulletConstraint, const CscMemberJoint *pivot)
138  : BaseEntityOutputPhysicsState(pivot->initialValPercent, pivot->initialValPercent, pivot->speedMax),
139  bulletConstraint(bulletConstraint),
140  limitMin(pivot->initialLimitMin),
141  limitMax(pivot->initialLimitMax),
142  rotationX(pivot->axeRotationX),
143  rotationY(pivot->axeRotationY),
144  rotationZ(pivot->axeRotationZ),
145  softness(pivot->softness),
146  bias(pivot->bias),
147  relaxation(pivot->relaxation),
148  isMotorDisabled(pivot->free),
149  percentSpeedMax(pivot->percentSpeedMax),
150  maxImpulse(pivot->maxImpulse),
151  speedToReachTarget(pivot->speedMax * pivot->percentSpeedMax / 100.0f) {
152  }
153  ~PivotPhysicsState() override;
154  btHingeConstraint *getBulletConstraint() const {
155  return bulletConstraint;
156  }
157  };
158 
160  btHingeConstraint *const bulletConstraint;
161  WheelPhysicsState(btHingeConstraint *bulletConstraint, const CscMemberWheel *wheel)
162  : BaseEntityOutputPhysicsState(wheel->initialValPercent, wheel->initialValPercent, wheel->speedMax),
163  bulletConstraint(bulletConstraint) {
164  }
165  ~WheelPhysicsState() override;
166  btHingeConstraint *getBulletConstraint() const {
167  return bulletConstraint;
168  }
169  };
170 
172  btHingeConstraint *const bulletConstraint;
173  PropellerPhysicsState(btHingeConstraint *bulletConstraint, const CscPropeller *propeller)
174  : BaseEntityOutputPhysicsState(propeller->initialValPercent, propeller->initialValPercent, propeller->speedMax),
175  bulletConstraint(bulletConstraint) {
176  }
177  ~PropellerPhysicsState() override;
178  btHingeConstraint *getBulletConstraint() const {
179  return bulletConstraint;
180  }
181  };
182 
184  btSliderConstraint *const bulletConstraint;
185  TranslationPhysicsState(btSliderConstraint *bulletConstraint, const CscTranslation *translation)
186  : BaseEntityOutputPhysicsState(translation->initialValPercent, translation->initialValPercent, translation->speedMax),
187  bulletConstraint(bulletConstraint) {
188  }
189  ~TranslationPhysicsState() override;
190  btSliderConstraint *getBulletConstraint() const {
191  return bulletConstraint;
192  }
193  };
194 
195  struct MemberPhysicsState : public MemberState {
196  btRigidBody *const body;
197 
198  unsigned long long nanCountsPosition = 0;
199  unsigned long long nanCountsRotation = 0;
200  unsigned long long nanCountsAcceleration = 0;
201 
202  MemberPhysicsState(btRigidBody *const body, const CscMember *member);
203  virtual ~MemberPhysicsState();
204 
205  btCollisionShape *getShape() const;
206 
207  void updatePosition(double x, double y, double z);
208  void updateRotationEuler(double x, double y, double z);
209  void updateAcceleration(double x, double y, double z);
210  void updateRotationQuaternion(double w, double x, double y, double z);
211  };
212 
217  public:
220  const CscEntityModel *const model;
221  float localGravity = -9.81;
222  bool initDone = false;
223 
224  unsigned long long refreshModelFromPhysicsSimulatorCount = 0;
225 
226  map<int, MemberPhysicsState *> membersByIndex;
227 
228  map<EntityOutputId, PivotPhysicsState *> pivots;
229  map<EntityOutputId, WheelPhysicsState *> wheels;
230  map<EntityOutputId, PropellerPhysicsState *> propellers;
231  map<EntityOutputId, TranslationPhysicsState *> translations;
232 
233  CscEntityPhysicsState(const CscWorldElementId &entityId, const CscWorldEntity *originalEntity, const CscEntityModel *model);
234  virtual ~CscEntityPhysicsState();
235  };
236 
237 private:
238  template <class TOutputState>
239  map<EntityOutputId, float> toValues(const map<EntityOutputId, TOutputState> &statesMap) const {
240  map<EntityOutputId, float> values;
241  for (auto it = statesMap.begin(); it != statesMap.end(); it++) {
242  values[it->first] = it->second->value;
243  }
244  return values;
245  }
246 
247  void initPlaceShapesAndBodies(CscWorldPlace *entityPlace);
248  void initObjectShapesAndBodiesSimple(CscWorldObject *object);
249  void initObjectShapesAndBodiesHullConvex(CscWorldObject *object);
250  void initObjectShapesAndBodiesHullConcave(CscWorldObject *object);
251  void initObjectShapesAndBodiesStatic(CscWorldObject *object);
252 
253  void initDynamicWorld();
254  void physicsThreadInit();
255 
256  void initEntityShapesAndBodies(CscEntityPhysicsState *entityPhysicsState, const CscPoint3dOriented *customPositionAndOrientation = nullptr);
257  void initEntityPivot(CscEntityPhysicsState *entityPhysicsState, const CscMemberJoint *currentJoint, int index);
258  void initEntityPivots(CscEntityPhysicsState *entityPhysicsState);
259  void initEntityTranslation(CscEntityPhysicsState *entityPhysicsState, const CscTranslation *currentTranslation, int index);
260  void initEntityTranslations(CscEntityPhysicsState *entityPhysicsState);
261  void initEntityWheels(CscEntityPhysicsState *entityPhysicsState);
262  void initEntityWheel(CscEntityPhysicsState *entityPhysicsState, const CscMemberWheel *currentWheel, int index);
263  void initEntityPropellers(CscEntityPhysicsState *entityPhysicsState);
264  void initEntityPropeller(CscEntityPhysicsState *entityPhysicsState, const CscPropeller *currentPropeller, int index);
265  void initEntityLense(CscEntityPhysicsState *entityPhysicsState);
266 
267  /*
268  Apply values of parameter state to each entityId’s mechanism (pivots, propellers, wheels and translations)
269  */
270  void applyOutputs(const CscWorldElementId &entityId, const CscState *outputsValues, bool pivots, bool propellers, bool wheels);
271  void applyInputsOnMember(const CscWorldElementId &entityId, const CscMemberInputStatus *inputsIn, bool applyPosition, bool applyRotation, bool applyAcceleration);
272  void applyStatePivots(const CscWorldElementId &entityId, const CscState *state);
273  void applyStatePropellers(const CscWorldElementId &entityId, const CscState *state);
274  void applyStateWheels(const CscWorldElementId &entityId, const CscState *state);
275 
276  void initObjectIntoPhysicsSimulator(CscWorldObject *object);
277  void initObjectShapesAndBodies(CscWorldObject *object);
278 
279  MemberPhysicsState *getMemberPhysicsState(const CscWorldElementId &entityId, int memberIndex) const {
280  bool memberHasState = entities.find(entityId) != entities.end() && entities.at(entityId)->membersByIndex.find(memberIndex) != entities.at(entityId)->membersByIndex.end();
281  ASSERT(entityId + " member state not found for index " + to_string(memberIndex), memberHasState);
282  if (!memberHasState) {
283  throw runtime_error("member state not found for index " + to_string(memberIndex));
284  }
285  return entities.at(entityId)->membersByIndex.at(memberIndex);
286  }
287 
288  inline btRigidBody *getMemberBody(const CscWorldElementId &entityId, int memberIndex) {
289  auto result = getMemberPhysicsState(entityId, memberIndex)->body;
290  return result;
291  }
292 
293  inline PivotPhysicsState *getMutablePivotState(const CscWorldElementId &entityId, int id) const {
294  bool pivotHasState = entities.find(entityId) != entities.end() && entities.at(entityId)->pivots.find(id) != entities.at(entityId)->pivots.end();
295  ASSERT("pivot state not found for id " + to_string(id), pivotHasState);
296  if (!pivotHasState) {
297  throw runtime_error("pivot state not found for id " + to_string(id));
298  }
299  return entities.at(entityId)->pivots.at(id);
300  }
301 
302  inline TranslationPhysicsState *getMutableTranslationState(const CscWorldElementId &entityId, int id) const {
303  bool translationHasState = entities.find(entityId) != entities.end() && entities.at(entityId)->translations.find(id) != entities.at(entityId)->translations.end();
304  ASSERT("translation state not found for id " + to_string(id), translationHasState);
305  if (!translationHasState) {
306  throw runtime_error("translation state not found for id " + to_string(id));
307  }
308  return entities.at(entityId)->translations.at(id);
309  }
310 
311  inline WheelPhysicsState *getMutableWheelState(const CscWorldElementId &entityId, int id) const {
312  bool wheelHasState = entities.find(entityId) != entities.end() && entities.at(entityId)->wheels.find(id) != entities.at(entityId)->wheels.end();
313  ASSERT("wheel state not found for id " + to_string(id), wheelHasState);
314  if (!wheelHasState) {
315  throw runtime_error("wheel state not found for id " + to_string(id));
316  }
317  return entities.at(entityId)->wheels.at(id);
318  }
319 
320  inline PropellerPhysicsState *getMutablePropellerState(const CscWorldElementId &entityId, int id) const {
321  bool propellerHasState = entities.find(entityId) != entities.end() && entities.at(entityId)->propellers.find(id) != entities.at(entityId)->propellers.end();
322  ASSERT("propeller state not found for id " + to_string(id), propellerHasState);
323  if (!propellerHasState) {
324  throw runtime_error("propeller state not found for id " + to_string(id));
325  }
326  return entities.at(entityId)->propellers.at(id);
327  }
328 
332  void refreshModelFromPhysicsSimulator();
333 
334  /*
335  * play a state with stepSimulationFutureVision with multi-substeps
336  */
337  void dividedStepSimulationFutureVision(unsigned umpteenthState, CscSequence *sequence, unsigned nbStateSubstep);
338 
339  inline CscEntityPhysicsState *getEntityState(const CscWorldElementId &entityId, bool assertFound = false) const {
340  auto entityMatch = entities.find(entityId);
341  if (entityMatch == entities.end()) {
342  if (assertFound) {
343  ASSERT("entity not found for id " + entityId, false);
344  logger->warn("entity not found for id " + entityId);
345  }
346  return nullptr;
347  }
348  return entityMatch->second;
349  }
350 
351  inline const CscEntityModel *getEntityModel(const CscWorldElementId &entityId, bool assertFound = false) const {
352  CscEntityPhysicsState *state = getEntityState(entityId, assertFound);
353  if (state == nullptr) {
354  return nullptr;
355  }
356  return state->model;
357  }
358 
359 protected:
360  float floorWidth = 6000.0; // 6000cm == 60 meters
361  float floorHeight = 25.4;
362  float floorLength = 6000.0; // 6000cm == 60 meters
363  float globalGravity = -9.81;
364 
365  // Physic simulator Bullets attributes
366  btBroadphaseInterface *m_broadphase;
367  btCollisionDispatcher *m_dispatcher;
368  btDefaultCollisionConfiguration *m_collisionConfiguration;
369  btSequentialImpulseConstraintSolver *m_solver;
370  thread *simulatorPhysicsThread = nullptr;
371  bool simulatorPhysicsThreadRunning = false;
372  bool simulatorPhysicsThreadStopped = true;
373 
374  // Default floor
375  btRigidBody *floorBody = nullptr;
376 
377  // World elements: 1) Entities
378  map<CscWorldElementId, CscEntityPhysicsState *> entities;
379 
380  // World elements: 2) Places
381  map<CscWorldElementId, btRigidBody *> placeBodies;
382 
383  // World elements: 3) Other (objects, ...)
384  vector<CscWorldObject *> environmentObjects;
385  map<CscWorldElementId, btRigidBody *> otherBodies;
386  map<CscWorldElementId, btCollisionShape *> otherShapes;
387 
388  btRigidBody *focusSphereBody = nullptr;
389  btRigidBody *focusBarBody = nullptr;
390 
391  float speedFactor = 1.0;
392 
393  void setMemberKinematicMode(const CscWorldElementId &entityId, int memberId, bool kinematicMode);
394  void memberApplyAcceleration(const CscWorldElementId &entityId, int bodyIndex, float accX, float accY, float accZ);
395  void clearAllForces(const CscWorldElementId &entityId);
396  void activateEntityPhysics(const CscWorldElementId &entityId);
397  bool samePosition(float x1, float y1, float z1, float x2, float y2, float z2, float epsilon);
398  bool sameEuler(float yaw1, float pitch1, float roll1, float yaw2, float pitch2, float roll2, float epsilon);
399  bool allMembersImmobile(const CscWorldElementId &entityId, float epsilon);
400 
401  map<int, float> getCurrentPropellers();
402  map<int, float> getCurrentWheels();
403  map<int, float> getCurrentTranslations();
404  map<int, float> getCurrentJoints();
405 
406  std::unique_ptr<CscLogger> logger;
407  recursive_mutex simulatorMutex;
408 
409  optional<PlayStateListener> onStatePlayedListener = {};
410 
411  string toDebugLogMemberInputs(const CscWorldElementId &entityId, int memberIndex);
412 
413  static CscMemberPhysicsModelingType definePhysicsModelingType(const CscMember *member);
414  // TODO seems like a duplicate of DaeParser::buildConvexHull => this should be one method in a helper
415  static void buildConvexHull(CscWorldElement *object);
416  static void buildConcaveHull(CscWorldElement *object, float alphaShapeValue);
417 
418  void removeAndDeleteBody(btRigidBody *);
419  void removeObjectByIndex(int index);
420 
421  void fireStatePlayed(const CscWorldElementId &entityId, const CscState *state, int duration = 0, int delay = 0, bool relativeValues = false);
422 
423 public:
424  const PivotPhysicsState *getPivotState(const CscWorldElementId &entityId, int id) const;
425  const PropellerPhysicsState *getPropellerState(const CscWorldElementId &entityId, int id) const;
426  const WheelPhysicsState *getWheelState(const CscWorldElementId &entityId, int id) const;
427  const TranslationPhysicsState *getTranslationState(const CscWorldElementId &entityId, int id) const;
428 
429  btDiscreteDynamicsWorld *m_dynamicsWorld = nullptr;
430 
431  // Constructor & Destructor
432  CscPhysicsSimulator(bool integratedPhysicsThread, float simulatorSpeed = 1.0);
433  virtual ~CscPhysicsSimulator();
434 
435  void initFloor();
436  void removeFloor();
437  void setFloorRotation(float yaw, float pitch, float roll);
438  void setFloorFriction(float val);
439 
440  // Consience AI attributes
443 
444  // Conscience Physics attributes
448  float simulatorSpeed; // 1.0 for normal speed, less than 1.0 to decelerate, more than 1.0 to accelerate
449 
450  btClock *clock = nullptr;
451  const float fixedTimeStep = 1.0 / 100.0; // 60 frames per second
452  const float minFPS = 16.6666666666f; // 60 frames per second == 1 frame every 0.0166666666666s == 1 frame every 16.6666666666ms
453 
457  bool isEntityPhysicsStateReady(const CscWorldElementId &entityId);
458 
459  void setEntityPhysicsInitDone(const CscWorldElementId &entityId);
463  bool isEntityPhysicsStateLoaded(const CscWorldElementId &entityId);
464 
465  void importEntity(const CscWorldEntity *entity, const CscPoint3dOriented *customPositionAndOrientation = nullptr, bool requiresExternalInit = false);
466  void importObjectIntoPhysicsSimulator(CscWorldObject *object);
467  void importPlaceIntoPhysicsSimulator(CscWorldPlace *place);
468  void importObjectsIntoPhysicsSimulator(vector<CscWorldObject *> *objects);
469 
470  void updateTranslation(const CscWorldElementId &entityId, int translationId, float val, bool relativeValues = false);
471  void updateWheel(const CscWorldElementId &entityId, int wheelId, float val, float cst = 1000.0, float speedCoef = 1.0);
472  void updateWheels(const CscWorldElementId &entityId, float val);
473  void updatePropeller(const CscWorldElementId &entityId, int propellerId, float val, float cst = 1000.0);
474  void updatePivot(const CscWorldElementId &entityId, int pivotId, float newValPercent, bool relativeValues = false);
479  void forceMemberValuesAndVerifyState(const CscWorldElementId &entityId, const CscMemberInputStatus *inputsValues, const bool applyPosition[3], const bool applyEuler[3], const bool applyAcceleration[3], optional<int> nbMaxIteration = {}, optional<int> maxLoopDurationMillis = {}, const CscState *verifyState = nullptr);
480 
484  int moveMemberToStateFromMember(const CscWorldElementId &entityId, const CscMemberInputStatus *inputsValues, const bool applyPosition[3], const bool applyEuler[3], const bool applyAcceleration[3], optional<int> nbMaxIteration = {}, optional<int> maxLoopDurationMillis = {}, int tryNumber = 0);
485  void moveMember(const CscWorldElementId &entityId, float *vals, int bodyIndex, int isTranslate);
486  void memberTeleportToOrigin(const CscWorldElementId &entityId, int bodyIndex, float posX, float posY, float posZ);
487  void memberTeleportToRotation(const CscWorldElementId &entityId, int bodyIndex, float yaw, float pitch, float roll);
488 
493  // https://conscience-robotics.atlassian.net/browse/CS-1470 we should not give access to call listener flag
494  void memberTeleportToPositionAndAngle(const CscWorldElementId &entityId, int memberId, const CscPoint3dOriented *target,
495  bool resetOutputsToInitialVals = false, optional<int> nbMaxIteration = {}, optional<int> maxLoopDurationMillis = {}, bool callPlayStateListener = false);
496 
500  void entityTeleport(const CscWorldElementId &entityId, const CscPoint3dOriented *target);
501 
506  // https://conscience-robotics.atlassian.net/browse/CS-1470 we should not give access to call listener flag
507  void forceState(const CscWorldElementId &entityId, const CscState *appliedState, int memberIdForInputs, const bool applyPos[3], const bool applyRot[3], const bool applyAcc[3], optional<int> nbMaxIteration = {}, optional<int> maxLoopDurationMillis = {}, bool callPlayStateListener = false);
508 
515  void playSequence(const CscWorldElementId &entityId, CscState *init, CscSequence *sequence, const map<int, CscPivotMovementType> &pivotMovementByPivotId, bool geneticAi = false, bool extrapolationRealTime = false);
516  void updateMemberPhysics(const CscWorldElementId &entityId, int itemId, float mass, float friction, float restitution, float linearDamping, float angularDamping);
517  void updatePivotPhysics(const CscWorldElementId &entityId, int id, float min, float max, float softness, float bias, float relaxation, float speedMax, float percentSpeedMax);
518  void updatePropellerPhysics(const CscWorldElementId &entityId, int id, float speedMax);
519  void updateWheelMaxSpeed(const CscWorldElementId &entityId, int wheelId, float newSpeedMax);
520  void updateTranslationPhysics(const CscWorldElementId &entityId, int translationId, float newMaxSpped);
521  void updateBehaviorMode(const CscWorldElementId &entityId, int modeId, int memberId);
522  void updateMemberEulers(const CscWorldElementId &entityId, int memberId, double eulerX, double eulerY, double eulerZ);
523  void updateMemberPosition(const CscWorldElementId &entityId, int memberId, float posX, float posY, float posZ);
524  void updatePivotSpeedMax(const CscWorldElementId &entityId, int id, float speedMax);
525 
526  void disableMembersCollisions(const CscWorldElementId &entityId);
527  void enableMembersCollisions(const CscWorldElementId &entityId);
528 
529  bool hadEntityReachedState(const CscWorldElementId &entityId, const CscState *objectiveState, float epsilon);
530 
531  float getJointHingeAngle(const CscWorldElementId &entityId, int jointIdIn) const;
532  vector<const CscMemberInputStatus *> *getCurrentInputs(const CscWorldElementId &entityId);
533 
538  virtual CscState *getCurrentState(const CscWorldElementId &entityId);
542  CscState *fillStateInputs(const CscWorldElementId &entityId, const CscState *incompleteState);
543 
544  void stepSimulationRealTime();
545  void stepSimulationFutureVision(int millisecondsFromNow, int nbSubSteps = 55);
546  void setGravity(float xIn, float yIn, float zIn);
547  void setEntityGravity(const CscWorldElementId &entityId, float xIn, float yIn, float zIn);
548 
550  return environmentObjects.size() > index ? environmentObjects.at(index) : nullptr;
551  }
552 
553  void setOnStatePlayedListener(PlayStateListener onStatePlayedListener) {
554  this->onStatePlayedListener = onStatePlayedListener;
555  }
556 
557  void setSimulatorSpeed(float speed) {
558  this->simulatorSpeed = speed;
559  }
560 
564  void setState(const CscWorldElementId &entityId, CscState *state, bool relativeValues = false, int duration = 200);
565 
570  void playState(const CscWorldElementId &entityId, CscState *state, int duration = 0, int delay = 0, bool relativeValues = false);
571 
572  void moveObjectToPosition(CscWorldElement *object, const CscPoint3d *targetPosition);
573  void moveObjectToRotation(CscWorldElement *object, const CscPoint3d *targetRotation);
574  void moveObjectToPositionAndRotation(CscWorldElement *object, const CscPoint3d *targetPosition, const CscPoint3d *targetRotation);
575 
576  vector<CscPoint3d *> *getEnvObjectShapesVertex(CscWorldElementId objectId);
577  int getEnvObjectShapesVertexCount(CscWorldElementId objectId);
578 
579  void removeEntity(const CscWorldElementId &entityId);
580 
581  void clearPlaces();
582  void clearObjects();
583 
584  void removeConscienceMemberFrontFocus();
585  CscPoint3dOriented *getFocusBarPoint();
586 
587  btFixedConstraint *visionCnt1 = NULL;
588  btHingeConstraint *visionCnt2 = NULL;
589  CscPoint3dOriented *getFocusSpherePoint();
590  void focusVisionIntoPosition(float posX, float posY, float posZ);
591 
592  void setAllPivotsToRelaxedMode(const CscWorldElementId &entityId);
593  void setAllPivotsMotorDisabled(const CscWorldElementId &entityId, bool enabled);
594 
595  void unitUpdatePivots();
596  void unitUpdateTranslations();
597 
598  void removeObjectById(CscWorldElementId objectId);
599  void removeObjectByName(string name);
600  void removePlaceById(string placeId);
601 
602  vector<CscPoint3d *> performRayScale(const CscPoint3d *position, const vector<const CscPoint3d *> &rayEnds, optional<int> collisionFilterGroup = {COL_ENV_PLACE | COL_FLOOR | COL_ROBOT_MEMBERS | COL_ENV_OBJ}, optional<int> collisionFilterMask = {COL_ENV_PLACE | COL_FLOOR | COL_ENV_OBJ});
603 
604  float getPivotLimitMin(const CscWorldElementId &entityId, int pivotId) const;
605  float getPivotLimitMax(const CscWorldElementId &entityId, int pivotId) const;
606  const MemberState *getMemberStateById(const CscWorldElementId &entityId, int id) const;
607  const MemberState *getMemberState(const CscWorldElementId &entityId, const CscMember *member) const;
608  const MemberState *getMemberStateByName(const CscWorldElementId &entityId, const string &memberName) const;
609 
613  string getPivotOtherMember(const CscWorldElementId &entityId, const string &memberName);
614 
639  vector<CscState *> dividingOneStateIntoSubStates(CscState *stateToDivide, CscState *currentState, int durationStateToDivide, int nbStateToDivide, float durationLastSubStep, const map<int, CscPivotMovementType> &pivotMovementByPivotId);
640 
661  CscSequence *dividingAllStatesOfOneSequenceIntoSubStates(CscSequence *sequenceToDivide, CscState *initialState, const map<int, CscPivotMovementType> &pivotMovementByPivotId);
662 
663  map<int, CscPoint3d *> getCenterOfMassOfAllMemberByMemberId(const CscWorldElementId &entityId);
664 
682  CscPoint3d *findCenterOfMass(const CscEntityModel *entityModel, map<int, CscPoint3d *> centerOfMassOfAllMemberByMemberId);
683 };
684 
685 }
686 
687 #endif
conscience_core::simulator::CscPhysicsSimulator::CscEntityPhysicsState
Definition: CscPhysicsSimulator.h:216
CscWorldEntity
Definition: CscWorldEntity.h:19
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
MemberState
CscPhysicsSimulator::MemberState MemberState
Definition: CscEntityReflexion.cpp:84
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::speedToReachTarget
float speedToReachTarget
Definition: CscPhysicsSimulator.h:135
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::rotationX
bool rotationX
Definition: CscPhysicsSimulator.h:126
conscience_core::simulator::COL_FLOOR
@ COL_FLOOR
Definition: CscPhysicsSimulator.h:61
conscience_core::simulator::BOX
@ BOX
Definition: CscPhysicsSimulator.h:66
CscMemberWheel
Definition: CscMemberWheel.h:18
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::simulator::CscPhysicsSimulator::PivotPhysicsState::maxImpulse
float maxImpulse
Definition: CscPhysicsSimulator.h:134
CscWorldElement.h
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::getBulletConstraint
btHingeConstraint * getBulletConstraint() const
Definition: CscPhysicsSimulator.h:154
conscience_core::simulator::CscPhysicsSimulator::CscEntityPhysicsState::model
const CscEntityModel *const model
Definition: CscPhysicsSimulator.h:220
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::limitMax
float limitMax
Definition: CscPhysicsSimulator.h:125
CscWorldObject
Definition: CscWorldObject.h:26
conscience_core::simulator::CscPhysicsSimulator::BaseEntityOutputPhysicsState::BaseEntityOutputPhysicsState
BaseEntityOutputPhysicsState(float value, float objectiveValue, float speedMax)
Definition: CscPhysicsSimulator.h:113
conscience_core::simulator::CscPhysicsSimulator::TranslationPhysicsState::TranslationPhysicsState
TranslationPhysicsState(btSliderConstraint *bulletConstraint, const CscTranslation *translation)
Definition: CscPhysicsSimulator.h:185
conscience_core::simulator::CscPhysicsSimulator::PropellerPhysicsState::bulletConstraint
btHingeConstraint *const bulletConstraint
Definition: CscPhysicsSimulator.h:172
conscience_core::simulator::CscPhysicsSimulator::logger
std::unique_ptr< CscLogger > logger
Definition: CscPhysicsSimulator.h:406
conscience_core::simulator::CscPhysicsSimulator::otherShapes
map< CscWorldElementId, btCollisionShape * > otherShapes
Definition: CscPhysicsSimulator.h:386
CscEntityModel
Definition: CscEntityModel.h:54
conscience_core::simulator::CscPhysicsSimulator::PropellerPhysicsState
Definition: CscPhysicsSimulator.h:171
conscience_core::simulator::CscPhysicsSimulator::TranslationPhysicsState
Definition: CscPhysicsSimulator.h:183
conscience_core::simulator::CscPhysicsSimulator::CscEntityPhysicsState::membersByIndex
map< int, MemberPhysicsState * > membersByIndex
Definition: CscPhysicsSimulator.h:226
conscience_core::simulator::COL_ROBOT_MEMBERS
@ COL_ROBOT_MEMBERS
Definition: CscPhysicsSimulator.h:60
conscience_core::simulator::CscPhysicsSimulator::CscEntityPhysicsState::originalEntity
const CscWorldEntity * originalEntity
Definition: CscPhysicsSimulator.h:219
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::percentSpeedMax
float percentSpeedMax
Definition: CscPhysicsSimulator.h:133
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::softness
float softness
Definition: CscPhysicsSimulator.h:129
conscience_core::simulator::CscPhysicsSimulator::placeBodies
map< CscWorldElementId, btRigidBody * > placeBodies
Definition: CscPhysicsSimulator.h:381
CscMember.h
conscience_core::simulator::CscMemberPhysicsModelingType
CscMemberPhysicsModelingType
Definition: CscPhysicsSimulator.h:66
conscience_core::simulator::CscPhysicsSimulator::MemberState::acceleration
CscPoint3d *const acceleration
Definition: CscPhysicsSimulator.h:87
conscience_core::simulator::CscPhysicsSimulator::precisionAction
int precisionAction
Definition: CscPhysicsSimulator.h:442
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::rotationY
bool rotationY
Definition: CscPhysicsSimulator.h:127
conscience_core::simulator::CscPhysicsSimulator::MemberState::position
CscPoint3d *const position
Definition: CscPhysicsSimulator.h:81
CscPropeller
Definition: CscPropeller.h:15
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::relaxation
float relaxation
Definition: CscPhysicsSimulator.h:131
conscience_core::simulator::COMPLEX
@ COMPLEX
Definition: CscPhysicsSimulator.h:68
CscMemberJoint
Definition: CscMemberJoint.h:20
conscience_core::simulator::CscPhysicsSimulator::getObjectByIndex
const CscWorldObject * getObjectByIndex(int index) const
Definition: CscPhysicsSimulator.h:549
conscience_core::simulator::CscPhysicsSimulator::TranslationPhysicsState::bulletConstraint
btSliderConstraint *const bulletConstraint
Definition: CscPhysicsSimulator.h:184
conscience_core::simulator::CollisionTypes
CollisionTypes
Definition: CscPhysicsSimulator.h:58
conscience_core::simulator::CscPhysicsSimulator::WheelPhysicsState::WheelPhysicsState
WheelPhysicsState(btHingeConstraint *bulletConstraint, const CscMemberWheel *wheel)
Definition: CscPhysicsSimulator.h:161
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::PivotPhysicsState
PivotPhysicsState(btHingeConstraint *bulletConstraint, const CscMemberJoint *pivot)
Definition: CscPhysicsSimulator.h:137
conscience_core::simulator::CscPhysicsSimulator::m_broadphase
btBroadphaseInterface * m_broadphase
Definition: CscPhysicsSimulator.h:366
conscience_core::simulator::CscPhysicsSimulator::MemberState
Definition: CscPhysicsSimulator.h:79
conscience_core::simulator::CscPhysicsSimulator::setOnStatePlayedListener
void setOnStatePlayedListener(PlayStateListener onStatePlayedListener)
Definition: CscPhysicsSimulator.h:553
logger
static std::unique_ptr< CscLogger > logger
Definition: gltfHelpers.cpp:6
CscSequence.h
conscience_core::simulator::CscPhysicsSimulator::entities
map< CscWorldElementId, CscEntityPhysicsState * > entities
Definition: CscPhysicsSimulator.h:378
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::limitMin
float limitMin
Definition: CscPhysicsSimulator.h:124
CscMemberInputPonderation.h
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::bias
float bias
Definition: CscPhysicsSimulator.h:130
conscience_core::simulator::CscPhysicsSimulator::CscEntityPhysicsState::translations
map< EntityOutputId, TranslationPhysicsState * > translations
Definition: CscPhysicsSimulator.h:231
CscWorldObject.h
conscience_core::simulator::CscPhysicsSimulator::TranslationPhysicsState::getBulletConstraint
btSliderConstraint * getBulletConstraint() const
Definition: CscPhysicsSimulator.h:190
conscience_core::simulator::CscPhysicsSimulator
Definition: CscPhysicsSimulator.h:77
conscience_core::simulator::CscPhysicsSimulator::WheelPhysicsState::getBulletConstraint
btHingeConstraint * getBulletConstraint() const
Definition: CscPhysicsSimulator.h:166
conscience_core::simulator::CscPhysicsSimulator::otherBodies
map< CscWorldElementId, btRigidBody * > otherBodies
Definition: CscPhysicsSimulator.h:385
conscience_core::simulator::CscPhysicsSimulator::CscEntityPhysicsState::id
const CscWorldElementId id
Definition: CscPhysicsSimulator.h:218
conscience_core::simulator::CscPhysicsSimulator::setSimulatorSpeed
void setSimulatorSpeed(float speed)
Definition: CscPhysicsSimulator.h:557
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::bulletConstraint
btHingeConstraint *const bulletConstraint
Definition: CscPhysicsSimulator.h:123
CscState
Definition: CscState.h:24
CscWorldElementId
string CscWorldElementId
Definition: Command.h:15
jwt::alphabet::index
uint32_t index(const std::array< char, 64 > &alphabet, char symbol)
Definition: base.h:91
nlohmann::detail::void
j template void())
Definition: json.hpp:4189
conscience_core::simulator::CscPhysicsSimulator::m_solver
btSequentialImpulseConstraintSolver * m_solver
Definition: CscPhysicsSimulator.h:369
conscience_core::simulator::PlayStateListener
function< void(const char *, double *, unsigned long, int, int, bool)> PlayStateListener
please see OnStatePlayed callback type for more info
Definition: CscPhysicsSimulator.h:74
conscience_core::simulator::CscPhysicsSimulator::integratedPhysicsThread
bool integratedPhysicsThread
Definition: CscPhysicsSimulator.h:445
CscCommon.h
conscience_core::simulator::CscPhysicsSimulator::MemberPhysicsState
Definition: CscPhysicsSimulator.h:195
CscTranslation
Definition: CscTranslation.h:16
conscience_core::simulator::COL_ENV_PLACE
@ COL_ENV_PLACE
Definition: CscPhysicsSimulator.h:63
CscWorldElement
Definition: CscWorldElement.h:23
conscience_core::simulator::CscPhysicsSimulator::m_dispatcher
btCollisionDispatcher * m_dispatcher
Definition: CscPhysicsSimulator.h:367
conscience_core::simulator::COL_NOTHING
@ COL_NOTHING
Definition: CscPhysicsSimulator.h:59
conscience_core::simulator::CscPhysicsSimulator::CscEntityPhysicsState::propellers
map< EntityOutputId, PropellerPhysicsState * > propellers
Definition: CscPhysicsSimulator.h:230
conscience_core::simulator::CscPhysicsSimulator::simulatorMutex
recursive_mutex simulatorMutex
Definition: CscPhysicsSimulator.h:407
conscience_core::simulator::CscPhysicsSimulator::id
const unsigned long long id
Definition: CscPhysicsSimulator.h:103
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::rotationZ
bool rotationZ
Definition: CscPhysicsSimulator.h:128
conscience_core::simulator::CscPhysicsSimulator::CscEntityPhysicsState::wheels
map< EntityOutputId, WheelPhysicsState * > wheels
Definition: CscPhysicsSimulator.h:229
conscience_core::simulator::CscPhysicsSimulator::curTimeInMicroseconds
long curTimeInMicroseconds
Definition: CscPhysicsSimulator.h:446
conscience_core::simulator::CscPhysicsSimulator::CscEntityPhysicsState::pivots
map< EntityOutputId, PivotPhysicsState * > pivots
Definition: CscPhysicsSimulator.h:228
CscMemberInputStatus.h
conscience_core::core_objects::exchange::buildConvexHull
void buildConvexHull(vector< const CscPoint3d * > &newPositions, vector< CscPoint3d * > &newNormals, vector< const CscPolygon * > &newPolygons)
Definition: hull.cpp:11
conscience_core::simulator::CscPhysicsSimulator::environmentObjects
vector< CscWorldObject * > environmentObjects
Definition: CscPhysicsSimulator.h:384
CscState.h
conscience_core::axiomes::CscQuaternion
Definition: Csc3dTypes.h:138
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState
Definition: CscPhysicsSimulator.h:122
CscMemberJoint.h
conscience_core::simulator::CscPhysicsSimulator::MemberState::rotationEuler
CscPoint3d *const rotationEuler
Definition: CscPhysicsSimulator.h:82
conscience_core::simulator::CscPhysicsSimulator::BaseEntityOutputPhysicsState::value
float value
Definition: CscPhysicsSimulator.h:109
conscience_utils
Definition: CscEntityReflexion.h:50
conscience_core::simulator::CscPhysicsSimulator::EntityOutputId
int EntityOutputId
Definition: CscPhysicsSimulator.h:105
conscience_core::simulator
Definition: CscPhysicsSimulator.cpp:92
CscWorldPlace.h
conscience_core::simulator::COL_ENV_OBJ
@ COL_ENV_OBJ
Definition: CscPhysicsSimulator.h:62
conscience_core::simulator::CscPhysicsSimulator::prevTimeInMicroseconds
long prevTimeInMicroseconds
Definition: CscPhysicsSimulator.h:447
conscience_core::simulator::CscPhysicsSimulator::BaseEntityOutputPhysicsState
Definition: CscPhysicsSimulator.h:107
CscWorldPlace
Definition: CscWorldPlace.h:34
conscience_core::simulator::WHEEL
@ WHEEL
Definition: CscPhysicsSimulator.h:67
CscEntityModel.h
ASSERT
#define ASSERT(MSG, EXPR)
Definition: conscience_util.h:43
conscience_core::axiomes::CscPoint3dOriented
Definition: Csc3dTypes.h:265
conscience_core::simulator::CscPhysicsSimulator::BaseEntityOutputPhysicsState::speedMax
float speedMax
Definition: CscPhysicsSimulator.h:111
f
double f
Definition: HybridAStar.cpp:190
conscience_core::simulator::CscPhysicsSimulator::precisionGyro
float precisionGyro
Definition: CscPhysicsSimulator.h:441
conscience_core::simulator::CscPhysicsSimulator::simulatorSpeed
float simulatorSpeed
Definition: CscPhysicsSimulator.h:448
CscMemberInputStatus
Definition: CscMemberInputStatus.h:26
conscience_core::simulator::CscPhysicsSimulator::PropellerPhysicsState::getBulletConstraint
btHingeConstraint * getBulletConstraint() const
Definition: CscPhysicsSimulator.h:178
conscience_core::simulator::CscPhysicsSimulator::WheelPhysicsState
Definition: CscPhysicsSimulator.h:159
BIT
#define BIT(x)
Definition: CscPhysicsSimulator.h:57
CscPropeller.h
conscience_core::simulator::CscPhysicsSimulator::MemberPhysicsState::body
btRigidBody *const body
Definition: CscPhysicsSimulator.h:196
conscience_core::simulator::CscPhysicsSimulator::WheelPhysicsState::bulletConstraint
btHingeConstraint *const bulletConstraint
Definition: CscPhysicsSimulator.h:160
conscience_core::simulator::CscPhysicsSimulator::m_collisionConfiguration
btDefaultCollisionConfiguration * m_collisionConfiguration
Definition: CscPhysicsSimulator.h:368
conscience_core::simulator::CscPhysicsSimulator::PivotPhysicsState::isMotorDisabled
bool isMotorDisabled
Definition: CscPhysicsSimulator.h:132
conscience_core::simulator::CscPhysicsSimulator::PropellerPhysicsState::PropellerPhysicsState
PropellerPhysicsState(btHingeConstraint *bulletConstraint, const CscPropeller *propeller)
Definition: CscPhysicsSimulator.h:173
CscSequence
Definition: CscSequence.h:51
conscience_core::simulator::CscPhysicsSimulator::BaseEntityOutputPhysicsState::objectiveValue
float objectiveValue
Definition: CscPhysicsSimulator.h:110