Computational Embodied Neuroscience Simulator  1.1
3D simulation library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends
cens_physics.h
Go to the documentation of this file.
1 // Computational Embodied Neuroscience Simulator (CENS) Library
2 // Copyright (c) 2010 Francesco Mannella
3 //
4 // cens_physics.h
5 // Copyright (c) 2010 Francesco Mannella
6 //
7 // This file is part of CENS library.
8 //
9 // CENS library is free software: you can redistribute it and/or modify
10 // it under the terms of the GNU General Public License as published by
11 // the Free Software Foundation, either version 3 of the License, or
12 // (at your option) any later version.
13 //
14 // CENS library is distributed in the hope that it will be useful,
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 // GNU General Public License for more details.
18 //
19 // You should have received a copy of the GNU General Public License
20 // along with CENS library. If not, see <http://www.gnu.org/licenses/>.
21 
22 #ifndef CENS_PHYSICS_H
23 #define CENS_PHYSICS_H
24 
25 #include <vector>
26 #include <map>
27 #include <string>
28 
29 
30 // linear algebra
31 #include <Eigen/Core>
32 #include <Eigen/Geometry>
33 using namespace Eigen;
34 
35 // bullet
36 #include <btBulletDynamicsCommon.h>
37 #include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h"
38 #include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h"
39 #include "BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h"
40 #include "BulletSoftBody/btSoftRigidDynamicsWorld.h"
41 #include "BulletSoftBody/btSoftBody.h"
42 #include "BulletSoftBody/btSoftBodyHelpers.h"
43 #include "BulletCollision/CollisionShapes/btConvexHullShape.h"
44 #include "BulletCollision/CollisionShapes/btShapeHull.h"
45 #include "BulletDynamics/Vehicle/btRaycastVehicle.h"
46 #include "BulletDynamics/Vehicle/btVehicleRaycaster.h"
47 #include "BulletDynamics/Vehicle/btWheelInfo.h"
48 
49 // parameter managing
50 #include "cens_parameter_manager.h"
51 static const char* physics_params_filename = "physics_parameters";
52 
54 class btSoftSoftCollisionAlgorithm;
55 
57 class btSoftRididCollisionAlgorithm;
58 
59 namespace cens {
60 
65 
66 
68 
69  // TYPEDEFS
70 
72  typedef std::pair<btCollisionObject *, btCollisionObject * > CENSNCPair;
73 
77  typedef std::map< CENSNCPair , bool > CENSNonCollidingTable;
78 
80 
81  // STRUCTURES
82 
87  : public btCollisionWorld::ContactResultCallback
88  {
89 
90  CENSTouchSensor(btRigidBody& tgtBody, CENSNonCollidingTable &_table)
91  : btCollisionWorld::ContactResultCallback(), body(tgtBody), table(_table), touched(false) { }
92 
93  btRigidBody& body;
94  CENSNonCollidingTable &table;
95  bool touched;
96  std::vector<btVector3> position;
97  std::vector<btScalar> pressures;
98 
99  bool isTouched()
100  {
101  bool res = touched;
102  touched = false;
103  pressures.clear();
104  position.clear();
105  return res;
106  }
107 
108  btScalar getPressure()
109  {
110  btScalar res = 0.0;
111 
112  for(int i=0; i<pressures.size(); i++)
113  {
114  res += pressures[i]/pressures.size();
115  }
116  return res;
117  }
118 
119  virtual bool needsCollision(btBroadphaseProxy* proxy) const
120  {
121  // superclass will check m_collisionFilterGroup and m_collisionFilterMask
122  if(!btCollisionWorld::ContactResultCallback::needsCollision(proxy))
123  return false;
124 
125  btCollisionObject *proxy0 = dynamic_cast<btCollisionObject *>(&body);
126  btCollisionObject *proxy1 = static_cast<btCollisionObject*>(proxy->m_clientObject);
127 
128  // CENS filters
129  CENSNonCollidingTable::iterator it = table.begin();
130  for(;it != table.end(); ++it)
131  {
132  bool enabled = it->second;
133  if(not enabled)
134  {
135  btCollisionObject *ncb0 = it->first.first;
136  btCollisionObject *ncb1 = it->first.second;
137 
138  if( (ncb0 == proxy0) and (ncb1 == proxy1) or
139  (ncb0 == proxy1) and (ncb1 == proxy0) )
140  return false;
141  }
142  }
143 
144  // if passed filters, may also want to avoid contacts between constraints
145  return body.checkCollideWithOverride(
146  static_cast<btCollisionObject*>(proxy->m_clientObject));
147  }
148 
150  virtual btScalar addSingleResult(btManifoldPoint& cp,
151  const btCollisionObjectWrapper* colObj0,int partId0,int index0,
152  const btCollisionObjectWrapper* colObj1,int partId1,int index1)
153  {
154 
155  touched = false;
156 
157  const btRigidBody * body0 = dynamic_cast<const btRigidBody *>(colObj0->m_collisionObject);
158  const btRigidBody * body1 = dynamic_cast<const btRigidBody *>(colObj1->m_collisionObject);
159 
160  btScalar mass0 = (body0->getInvMass()>0) ? 1./body0->getInvMass() : 0;
161  btScalar mass1 = (body1->getInvMass()>0) ? 1./body1->getInvMass() : 0;
162 
163  btScalar masses = mass0 + mass1;
164  btScalar rest = body0->getRestitution()*body1->getRestitution();
165  btVector3 normal = cp.m_normalWorldOnB;
166  btVector3 vel0 = body0->getVelocityInLocalPoint(cp.getPositionWorldOnA());
167  btVector3 vel1 = body1->getVelocityInLocalPoint(cp.getPositionWorldOnB());
168  vel0 = ((mass0 - rest*mass1)*vel0 +mass1*(1 + rest)*vel1)/masses;
169  vel1 = ((mass1 - rest*mass0)*vel1 +mass0*(1 + rest)*vel0)/masses;
170 
171  // we subtract the velocities projected on the surface normal
172  btScalar pressure = ((normal.dot(vel0)/normal.dot(normal))*normal -
173  (normal.dot(vel1)/normal.dot(normal))*normal ).length();
174 
175  if(body0==&body)
176  {
177  position.push_back(cp.m_localPointA);
178  pressures.push_back( pressure );
179  touched = true;
180  } else if(body1==&body)
181  {
182  position.push_back(cp.m_localPointB);
183  pressures.push_back(cp.getDistance());
184  touched = true;
185  }
186 
187  return 0;
188  }
189 
190  };
191 
193 
194 
203  class CENSPhysics {
204 
205  public:
206 
207  CENSPhysics();
208 
209  virtual ~CENSPhysics();
210 
214  virtual void initCENSPhysics();
215 
220  virtual void cens_physics_step( );
221 
226  virtual void initObjects() {};
227 
232  virtual btDynamicsWorld * getDynamicsWorld() { return m_phDynamicsWorld; }
233 
238  virtual btCollisionDispatcher * getDispatcher() { return m_phDispatcher; }
239 
240 
253  virtual btRigidBody* localCreateRigidBody(
254  float mass,
255  const btTransform& startTransform,
256  btCollisionShape* shape );
257 
268  virtual btSoftBody* localCreateSoftBody(
269  float mass,
270  btCollisionShape* shape );
271 
277  virtual void setCollisionFilter(
278  CENSNonCollidingTable _non_colliding_table );
279 
280 
285  virtual CENSTouchSensor *addTouchSensor(btRigidBody *body);
286 
288 
289  btScalar getStep() { return m_phStep; };
290  btScalar getSubstep() { return m_phSubstep; };
291  Vector3f getGravity() { return m_phGravity; };
292 
293  protected:
294 
295  // FRIENDS
300  friend void collisionFilteringCallback(
301  btBroadphasePair& collisionPair,
302  btCollisionDispatcher& dispatcher,
303  const btDispatcherInfo& dispatchInfo);
304 
309  friend void internalTickCallback(
310  btDynamicsWorld *world,
311  btScalar timestep);
312 
313  // METHODS
315  btTransform &getTransformFromBody(btRigidBody *body);
317  btTransform &getTransformFromBody(btSoftBody *body);
318 
319  // MEMBERS
320 
322  btSoftRigidDynamicsWorld* m_phDynamicsWorld;
323 
325  btAlignedObjectArray<btCollisionShape*> m_phCollisionShapes;
326 
328  btAlignedObjectArray<CENSTouchSensor *> m_phTouchSensors;
329 
330  // non colliding bodies
331  static CENSNonCollidingTable m_phNonCollidingTable;
332 
333  // bullet related variables
334  btAlignedObjectArray<btSoftSoftCollisionAlgorithm*> m_phSoftSoftCollisionAlgorithms;
335  btAlignedObjectArray<btSoftRididCollisionAlgorithm*> m_phSoftRigidCollisionAlgorithms;
336  btSoftBodyWorldInfo m_phSoftBodyWorldInfo;
337  btBroadphaseInterface* m_phBroadphase;
338  btCollisionDispatcher* m_phDispatcher;
339  btConstraintSolver* m_phSolver;
340  btDefaultCollisionConfiguration* m_phCollisionConfiguration;
342  Vector3f m_phGravity;
343  double m_phStep;
344  double m_phSubstep;
345 
348 
349  };
350 
352 
357  void collisionFilteringCallback(btBroadphasePair& collisionPair,
358  btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo);
359 
361 
362  void internalTickCallback(btDynamicsWorld *world, btScalar timestep);
363 
365 
374  class CENSHingeConstraint : public btHingeConstraint {
375 
376  public:
377 
379  btRigidBody &rbA, btRigidBody &rbB, const btVector3 &pivotInA,
380  const btVector3 &pivotInB, btVector3 &axisInA, btVector3 &axisInB,
381  bool useReferenceFrameA=false):
382  btHingeConstraint(rbA,rbB,pivotInA,pivotInB,axisInA,axisInB,useReferenceFrameA) {
383  angles[this]=0;
384  };
385 
387  btRigidBody &rbA, const btVector3 &pivotInA, btVector3 &axisInA,
388  bool useReferenceFrameA=false):
389  btHingeConstraint(rbA,pivotInA,axisInA,useReferenceFrameA) {
390  angles[this]=0;
391  };
392 
394  btRigidBody &rbA, btRigidBody &rbB, const btTransform &rbAFrame,
395  const btTransform &rbBFrame, bool useReferenceFrameA=false):
396  btHingeConstraint(rbA,rbB,rbAFrame,rbBFrame,useReferenceFrameA) {
397  angles[this]=0;
398  };
399 
401  btRigidBody &rbA, const btTransform &rbAFrame,
402  bool useReferenceFrameA=false):
403  btHingeConstraint(rbA,rbAFrame,useReferenceFrameA) {
404  angles[this]=0;
405  };
406 
415  void setPDMotorTarget(float targetAngle,
416  float kp = 3, float ki = 0, float kd = .5, float dt = .05 );
417 
418  private:
419  static std::map<CENSHingeConstraint *, float> angles;
420 
421  };
422 
423 
424 
426 
435  class CENSSliderConstraint : public btGeneric6DofConstraint {
436 
437  public:
438 
440  btRigidBody &rbA, btRigidBody &rbB, const btTransform &rbAFrame,
441  const btTransform &rbBFrame, bool useReferenceFrameA=false):
442  btGeneric6DofConstraint(rbA,rbB,rbAFrame,rbBFrame,useReferenceFrameA) {
443  positions[this]=0;
444  };
445 
446  void setMotorTarget(float targetPos, float dt = .05 );
447 
448 
457  void setPDMotorTarget(float targetPos,
458  float kp = 3, float ki = 0, float kd = .5, float dt = .05 );
459 
460  private:
461  static std::map<CENSSliderConstraint *, float> positions;
462 
463  };
464 
465 
466 
467 }
468 
469 #endif // CENS_PHYSICS_H
A custom HingeConstraint Class.
Definition: cens_physics.h:374
btSoftBodyWorldInfo m_phSoftBodyWorldInfo
Definition: cens_physics.h:336
Computational Embodied Neuroscience Simulator library.
Definition: cens_engine.cpp:29
btSoftRigidDynamicsWorld * m_phDynamicsWorld
Definition: cens_physics.h:322
virtual btDynamicsWorld * getDynamicsWorld()
Definition: cens_physics.h:232
static CENSNonCollidingTable m_phNonCollidingTable
Definition: cens_physics.h:331
CENSParameterManager m_phParameterManager
Definition: cens_physics.h:347
virtual void initObjects()
Definition: cens_physics.h:226
btScalar m_phDefaultContactProcessingThreshold
Definition: cens_physics.h:341
btAlignedObjectArray< btCollisionShape * > m_phCollisionShapes
Definition: cens_physics.h:325
CENSHingeConstraint(btRigidBody &rbA, btRigidBody &rbB, const btTransform &rbAFrame, const btTransform &rbBFrame, bool useReferenceFrameA=false)
Definition: cens_physics.h:393
btCollisionDispatcher * m_phDispatcher
Definition: cens_physics.h:338
Vector3f m_phGravity
Definition: cens_physics.h:342
std::vector< btScalar > pressures
touch pressures
Definition: cens_physics.h:97
btAlignedObjectArray< CENSTouchSensor * > m_phTouchSensors
Definition: cens_physics.h:328
bool touched
touched by another body
Definition: cens_physics.h:95
An interface to the bullet physics library.
Definition: cens_physics.h:203
void internalTickCallback(btDynamicsWorld *world, btScalar timestep)
btBroadphaseInterface * m_phBroadphase
Definition: cens_physics.h:337
Vector3f getGravity()
Definition: cens_physics.h:291
virtual btScalar addSingleResult(btManifoldPoint &cp, const btCollisionObjectWrapper *colObj0, int partId0, int index0, const btCollisionObjectWrapper *colObj1, int partId1, int index1)
Called with each contact for your own processing.
Definition: cens_physics.h:150
btRigidBody & body
The body the sensor is monitoring.
Definition: cens_physics.h:93
std::pair< btCollisionObject *, btCollisionObject * > CENSNCPair
Definition: cens_physics.h:72
CENSNonCollidingTable & table
non-colliding table
Definition: cens_physics.h:94
btAlignedObjectArray< btSoftRididCollisionAlgorithm * > m_phSoftRigidCollisionAlgorithms
Definition: cens_physics.h:335
virtual bool needsCollision(btBroadphaseProxy *proxy) const
Definition: cens_physics.h:119
btConstraintSolver * m_phSolver
Definition: cens_physics.h:339
btScalar getStep()
Definition: cens_physics.h:289
void collisionFilteringCallback(btBroadphasePair &collisionPair, btCollisionDispatcher &dispatcher, const btDispatcherInfo &dispatchInfo)
CENSSliderConstraint(btRigidBody &rbA, btRigidBody &rbB, const btTransform &rbAFrame, const btTransform &rbBFrame, bool useReferenceFrameA=false)
Definition: cens_physics.h:439
Manager of parameters' initializarion.
A custom SliderConstraint Class.
Definition: cens_physics.h:435
std::vector< btVector3 > position
touch positions in the body space
Definition: cens_physics.h:96
static std::map< CENSHingeConstraint *, float > angles
Definition: cens_physics.h:419
CENSHingeConstraint(btRigidBody &rbA, const btVector3 &pivotInA, btVector3 &axisInA, bool useReferenceFrameA=false)
Definition: cens_physics.h:386
btDefaultCollisionConfiguration * m_phCollisionConfiguration
Definition: cens_physics.h:340
virtual btCollisionDispatcher * getDispatcher()
Definition: cens_physics.h:238
static const char * physics_params_filename
Definition: cens_physics.h:51
btScalar getSubstep()
Definition: cens_physics.h:290
CENSTouchSensor(btRigidBody &tgtBody, CENSNonCollidingTable &_table)
Definition: cens_physics.h:90
CENSHingeConstraint(btRigidBody &rbA, const btTransform &rbAFrame, bool useReferenceFrameA=false)
Definition: cens_physics.h:400
CENSHingeConstraint(btRigidBody &rbA, btRigidBody &rbB, const btVector3 &pivotInA, const btVector3 &pivotInB, btVector3 &axisInA, btVector3 &axisInB, bool useReferenceFrameA=false)
Definition: cens_physics.h:378
btAlignedObjectArray< btSoftSoftCollisionAlgorithm * > m_phSoftSoftCollisionAlgorithms
Definition: cens_physics.h:334
std::map< CENSNCPair, bool > CENSNonCollidingTable
Definition: cens_physics.h:77
static std::map< CENSSliderConstraint *, float > positions
Definition: cens_physics.h:461