40 m_phDefaultContactProcessingThreshold(BT_LARGE_FLOAT),
57 btCollisionObject* obj =
59 btRigidBody* body = btRigidBody::upcast(obj);
60 if (body && body->getMotionState())
62 delete body->getMotionState();
112 new btSoftBodyRigidBodyCollisionConfiguration();
127 btSequentialImpulseConstraintSolver* sol =
128 new btSequentialImpulseConstraintSolver;
133 new btSoftRigidDynamicsWorld(
171 if(sensor->
body.isInWorld())
180 const btTransform& startTransform,
181 btCollisionShape* shape)
184 btAssert((!shape || shape->getShapeType() != INVALID_SHAPE_PROXYTYPE));
188 bool isDynamic = (mass != 0.f);
190 btVector3 localInertia(0,0,0);
192 shape->calculateLocalInertia(mass,localInertia);
198 btDefaultMotionState* myMotionState =
199 new btDefaultMotionState(startTransform);
201 btRigidBody::btRigidBodyConstructionInfo cInfo(
208 new btRigidBody(cInfo);
210 body->setContactProcessingThreshold(
222 btCollisionShape* shape ) {
224 if( shape->isConvex() ) {
226 const btConvexShape* convexShape =
227 static_cast<const btConvexShape*
>(shape);
228 btShapeHull hull(convexShape);
230 if(hull.buildHull(convexShape->getMargin())) {
232 btSoftBody *body = btSoftBodyHelpers::CreateFromConvexHull(
235 body->setTotalMass(mass,
true);
253 return body->getWorldTransform();
261 return body->getWorldTransform();
268 CENSNonCollidingTable::iterator it = _non_colliding_table.begin();
269 for(;it != _non_colliding_table.end(); ++it)
275 (
void (*)(btBroadphasePair&, btCollisionDispatcher&,
294 btCollisionDispatcher& dispatcher,
const btDispatcherInfo& dispatchInfo) {
296 btCollisionObject *proxy0 = (btCollisionObject *)(collisionPair.m_pProxy0->m_clientObject);
297 btCollisionObject *proxy1 = (btCollisionObject *)(collisionPair.m_pProxy1->m_clientObject);
302 CENSNonCollidingTable::iterator it = nct.begin();
303 for(;it != nct.end(); ++it)
305 bool enabled = it->second;
308 btCollisionObject *ncb0 = it->first.first;
309 btCollisionObject *ncb1 = it->first.second;
311 if( (ncb0 == proxy0) and (ncb1 == proxy1) or
312 (ncb0 == proxy1) and (ncb1 == proxy0) )
321 dispatcher.defaultNearCallback(collisionPair, dispatcher, dispatchInfo);
337 float kp ,
float ki ,
float kd ,
float dt ) {
340 if (getLowerLimit() < getUpperLimit())
342 if (targetAngle < getLowerLimit())
343 targetAngle = getLowerLimit();
344 else if (targetAngle > getUpperLimit())
345 targetAngle = getUpperLimit();
348 btScalar curAngle = getHingeAngle(
349 m_rbA.getCenterOfMassTransform(),
350 m_rbB.getCenterOfMassTransform());
353 static btScalar prev_error = 0;
354 static btScalar integral = 0;
357 btScalar error = targetAngle - curAngle;
358 integral += error*dt;
359 btScalar derivative = (error - prev_error)/dt;
362 btScalar torque = kp*error +ki*integral + kd*derivative;
366 m_rbA.getCenterOfMassTransform().getBasis() *
367 getAFrame().getBasis().getColumn(2);
370 (getRigidBodyA().computeAngularImpulseDenominator(axisA) +
371 getRigidBodyB().computeAngularImpulseDenominator(axisA));
374 float velocity = torque/kHinge;
375 enableAngularMotor(
true, velocity, getMaxMotorImpulse() );
389 btScalar lowerLimit = getTranslationalLimitMotor()->m_lowerLimit[0];
390 btScalar upperLimit = getTranslationalLimitMotor()->m_upperLimit[0];
391 if (lowerLimit < upperLimit)
393 if (targetPos < lowerLimit)
394 targetPos = lowerLimit;
395 else if (targetPos > upperLimit)
396 targetPos = upperLimit;
400 calculateTransforms();
401 btScalar curPos = getRelativePivotPosition(0);
403 btScalar dPos = targetPos - curPos;
404 btScalar velocity = dPos / dt;
406 getTranslationalLimitMotor()->m_enableMotor[0] =
true;
407 getTranslationalLimitMotor()->m_targetVelocity = btVector3(-velocity,0,0);
416 float kp ,
float ki,
float kd ,
float dt ) {
419 btScalar lowerLimit = getTranslationalLimitMotor()->m_lowerLimit[0];
420 btScalar upperLimit = getTranslationalLimitMotor()->m_upperLimit[0];
421 if (lowerLimit < upperLimit)
423 if (targetPos < lowerLimit)
424 targetPos = lowerLimit;
425 else if (targetPos > upperLimit)
426 targetPos = upperLimit;
429 calculateTransforms();
430 btScalar curPos = getRelativePivotPosition(0);
432 static btScalar prev_error = 0;
433 static btScalar integral = 0;
436 btScalar error = targetPos - curPos;
437 integral += error*dt;
438 btScalar derivative = (error - prev_error)/dt;
441 btScalar force = kp*error +ki*integral + kd*derivative;
445 float velocity = -force ;
447 getTranslationalLimitMotor()->m_enableMotor[0] =
true;
448 getTranslationalLimitMotor()->m_targetVelocity = btVector3(velocity,0,0);
btSoftBodyWorldInfo m_phSoftBodyWorldInfo
Computational Embodied Neuroscience Simulator library.
btSoftRigidDynamicsWorld * m_phDynamicsWorld
static CENSNonCollidingTable m_phNonCollidingTable
CENSParameterManager m_phParameterManager
void addParameter(std::string parname, std::string &par)
virtual void initObjects()
btScalar m_phDefaultContactProcessingThreshold
btAlignedObjectArray< btCollisionShape * > m_phCollisionShapes
btCollisionDispatcher * m_phDispatcher
virtual void initCENSPhysics()
btAlignedObjectArray< CENSTouchSensor * > m_phTouchSensors
void internalTickCallback(btDynamicsWorld *world, btScalar timestep)
btBroadphaseInterface * m_phBroadphase
btRigidBody & body
The body the sensor is monitoring.
virtual void cens_physics_step()
virtual btSoftBody * localCreateSoftBody(float mass, btCollisionShape *shape)
btConstraintSolver * m_phSolver
virtual CENSTouchSensor * addTouchSensor(btRigidBody *body)
void collisionFilteringCallback(btBroadphasePair &collisionPair, btCollisionDispatcher &dispatcher, const btDispatcherInfo &dispatchInfo)
virtual btRigidBody * localCreateRigidBody(float mass, const btTransform &startTransform, btCollisionShape *shape)
static std::map< CENSHingeConstraint *, float > angles
btDefaultCollisionConfiguration * m_phCollisionConfiguration
void setMotorTarget(float targetPos, float dt=.05)
void setPDMotorTarget(float targetPos, float kp=3, float ki=0, float kd=.5, float dt=.05)
static const char * physics_params_filename
void setPDMotorTarget(float targetAngle, float kp=3, float ki=0, float kd=.5, float dt=.05)
btTransform & getTransformFromBody(btRigidBody *body)
virtual void setCollisionFilter(CENSNonCollidingTable _non_colliding_table)
friend void collisionFilteringCallback(btBroadphasePair &collisionPair, btCollisionDispatcher &dispatcher, const btDispatcherInfo &dispatchInfo)
std::map< CENSNCPair, bool > CENSNonCollidingTable
static std::map< CENSSliderConstraint *, float > positions