22 #ifndef CENS_PHYSICS_H
23 #define CENS_PHYSICS_H
32 #include <Eigen/Geometry>
33 using namespace Eigen;
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"
54 class btSoftSoftCollisionAlgorithm;
57 class btSoftRididCollisionAlgorithm;
72 typedef std::pair<btCollisionObject *, btCollisionObject * >
CENSNCPair;
87 :
public btCollisionWorld::ContactResultCallback
91 : btCollisionWorld::ContactResultCallback(), body(tgtBody), table(_table), touched(false) { }
112 for(
int i=0; i<pressures.size(); i++)
114 res += pressures[i]/pressures.size();
122 if(!btCollisionWorld::ContactResultCallback::needsCollision(proxy))
125 btCollisionObject *proxy0 =
dynamic_cast<btCollisionObject *
>(&body);
126 btCollisionObject *proxy1 =
static_cast<btCollisionObject*
>(proxy->m_clientObject);
129 CENSNonCollidingTable::iterator it = table.begin();
130 for(;it != table.end(); ++it)
132 bool enabled = it->second;
135 btCollisionObject *ncb0 = it->first.first;
136 btCollisionObject *ncb1 = it->first.second;
138 if( (ncb0 == proxy0) and (ncb1 == proxy1) or
139 (ncb0 == proxy1) and (ncb1 == proxy0) )
145 return body.checkCollideWithOverride(
146 static_cast<btCollisionObject*>(proxy->m_clientObject));
151 const btCollisionObjectWrapper* colObj0,
int partId0,
int index0,
152 const btCollisionObjectWrapper* colObj1,
int partId1,
int index1)
157 const btRigidBody * body0 =
dynamic_cast<const btRigidBody *
>(colObj0->m_collisionObject);
158 const btRigidBody * body1 =
dynamic_cast<const btRigidBody *
>(colObj1->m_collisionObject);
160 btScalar mass0 = (body0->getInvMass()>0) ? 1./body0->getInvMass() : 0;
161 btScalar mass1 = (body1->getInvMass()>0) ? 1./body1->getInvMass() : 0;
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;
172 btScalar pressure = ((normal.dot(vel0)/normal.dot(normal))*normal -
173 (normal.dot(vel1)/normal.dot(normal))*normal ).length();
177 position.push_back(cp.m_localPointA);
178 pressures.push_back( pressure );
180 }
else if(body1==&body)
182 position.push_back(cp.m_localPointB);
183 pressures.push_back(cp.getDistance());
214 virtual void initCENSPhysics();
220 virtual void cens_physics_step( );
253 virtual btRigidBody* localCreateRigidBody(
255 const btTransform& startTransform,
256 btCollisionShape* shape );
268 virtual btSoftBody* localCreateSoftBody(
270 btCollisionShape* shape );
277 virtual void setCollisionFilter(
278 CENSNonCollidingTable _non_colliding_table );
301 btBroadphasePair& collisionPair,
302 btCollisionDispatcher& dispatcher,
303 const btDispatcherInfo& dispatchInfo);
310 btDynamicsWorld *world,
315 btTransform &getTransformFromBody(btRigidBody *body);
317 btTransform &getTransformFromBody(btSoftBody *body);
358 btCollisionDispatcher& dispatcher,
const btDispatcherInfo& dispatchInfo);
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) {
387 btRigidBody &rbA,
const btVector3 &pivotInA, btVector3 &axisInA,
388 bool useReferenceFrameA=
false):
389 btHingeConstraint(rbA,pivotInA,axisInA,useReferenceFrameA) {
394 btRigidBody &rbA, btRigidBody &rbB,
const btTransform &rbAFrame,
395 const btTransform &rbBFrame,
bool useReferenceFrameA=
false):
396 btHingeConstraint(rbA,rbB,rbAFrame,rbBFrame,useReferenceFrameA) {
401 btRigidBody &rbA,
const btTransform &rbAFrame,
402 bool useReferenceFrameA=
false):
403 btHingeConstraint(rbA,rbAFrame,useReferenceFrameA) {
415 void setPDMotorTarget(
float targetAngle,
416 float kp = 3,
float ki = 0,
float kd = .5,
float dt = .05 );
419 static std::map<CENSHingeConstraint *, float>
angles;
440 btRigidBody &rbA, btRigidBody &rbB,
const btTransform &rbAFrame,
441 const btTransform &rbBFrame,
bool useReferenceFrameA=
false):
442 btGeneric6DofConstraint(rbA,rbB,rbAFrame,rbBFrame,useReferenceFrameA) {
446 void setMotorTarget(
float targetPos,
float dt = .05 );
457 void setPDMotorTarget(
float targetPos,
458 float kp = 3,
float ki = 0,
float kd = .5,
float dt = .05 );
461 static std::map<CENSSliderConstraint *, float>
positions;
469 #endif // CENS_PHYSICS_H
A custom HingeConstraint Class.
btSoftBodyWorldInfo m_phSoftBodyWorldInfo
Computational Embodied Neuroscience Simulator library.
btSoftRigidDynamicsWorld * m_phDynamicsWorld
virtual btDynamicsWorld * getDynamicsWorld()
static CENSNonCollidingTable m_phNonCollidingTable
CENSParameterManager m_phParameterManager
virtual void initObjects()
btScalar m_phDefaultContactProcessingThreshold
btAlignedObjectArray< btCollisionShape * > m_phCollisionShapes
CENSHingeConstraint(btRigidBody &rbA, btRigidBody &rbB, const btTransform &rbAFrame, const btTransform &rbBFrame, bool useReferenceFrameA=false)
btCollisionDispatcher * m_phDispatcher
std::vector< btScalar > pressures
touch pressures
btAlignedObjectArray< CENSTouchSensor * > m_phTouchSensors
bool touched
touched by another body
An interface to the bullet physics library.
void internalTickCallback(btDynamicsWorld *world, btScalar timestep)
btBroadphaseInterface * m_phBroadphase
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.
btRigidBody & body
The body the sensor is monitoring.
std::pair< btCollisionObject *, btCollisionObject * > CENSNCPair
CENSNonCollidingTable & table
non-colliding table
btAlignedObjectArray< btSoftRididCollisionAlgorithm * > m_phSoftRigidCollisionAlgorithms
virtual bool needsCollision(btBroadphaseProxy *proxy) const
btConstraintSolver * m_phSolver
void collisionFilteringCallback(btBroadphasePair &collisionPair, btCollisionDispatcher &dispatcher, const btDispatcherInfo &dispatchInfo)
CENSSliderConstraint(btRigidBody &rbA, btRigidBody &rbB, const btTransform &rbAFrame, const btTransform &rbBFrame, bool useReferenceFrameA=false)
Manager of parameters' initializarion.
A custom SliderConstraint Class.
std::vector< btVector3 > position
touch positions in the body space
static std::map< CENSHingeConstraint *, float > angles
CENSHingeConstraint(btRigidBody &rbA, const btVector3 &pivotInA, btVector3 &axisInA, bool useReferenceFrameA=false)
btDefaultCollisionConfiguration * m_phCollisionConfiguration
virtual btCollisionDispatcher * getDispatcher()
static const char * physics_params_filename
CENSTouchSensor(btRigidBody &tgtBody, CENSNonCollidingTable &_table)
CENSHingeConstraint(btRigidBody &rbA, const btTransform &rbAFrame, bool useReferenceFrameA=false)
CENSHingeConstraint(btRigidBody &rbA, btRigidBody &rbB, const btVector3 &pivotInA, const btVector3 &pivotInB, btVector3 &axisInA, btVector3 &axisInB, bool useReferenceFrameA=false)
btAlignedObjectArray< btSoftSoftCollisionAlgorithm * > m_phSoftSoftCollisionAlgorithms
std::map< CENSNCPair, bool > CENSNonCollidingTable
static std::map< CENSSliderConstraint *, float > positions