From d465e1eea5cfcdfa639cdcfc7741a82bd417cb30 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Mon, 23 Jan 2017 16:45:18 -0800 Subject: [PATCH] add capsule support in urdf parser (non-standard extension), capsule.urdf fix btCapsuleShape (X,Y,Z) margin issue fix uninitialized variables in TinyRenderer: m_hasLightDistance, m_hasLightAmbientCoeff, m_hasLightDiffuseCoeff, m_hasLightSpecularCoeff pybullet/shared memory API 'getClosestPoints' / b3InitClosestDistanceQuery, only report contacts equal/smaller distance than given --- data/capsule.urdf | 23 ++++++++++++ .../ImportURDFDemo/BulletUrdfImporter.cpp | 10 ++++++ .../Importers/ImportURDFDemo/UrdfParser.cpp | 15 +++++++- .../PhysicsServerCommandProcessor.cpp | 35 ++++++++++--------- .../TinyRendererVisualShapeConverter.cpp | 12 ++++++- .../CollisionShapes/btCapsuleShape.cpp | 14 +++++--- 6 files changed, 87 insertions(+), 22 deletions(-) create mode 100644 data/capsule.urdf diff --git a/data/capsule.urdf b/data/capsule.urdf new file mode 100644 index 000000000..ade401a61 --- /dev/null +++ b/data/capsule.urdf @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/Importers/ImportURDFDemo/BulletUrdfImporter.cpp b/examples/Importers/ImportURDFDemo/BulletUrdfImporter.cpp index 970613294..32281da3e 100644 --- a/examples/Importers/ImportURDFDemo/BulletUrdfImporter.cpp +++ b/examples/Importers/ImportURDFDemo/BulletUrdfImporter.cpp @@ -455,6 +455,16 @@ btCollisionShape* convertURDFToCollisionShape(const UrdfCollision* collision, co switch (collision->m_geometry.m_type) { + case URDF_GEOM_CAPSULE: + { + btScalar radius = collision->m_geometry.m_capsuleRadius; + btScalar height = btScalar(2.f)*collision->m_geometry.m_capsuleHalfHeight; + btCapsuleShapeZ* capsuleShape = new btCapsuleShapeZ(radius,height); + shape = capsuleShape; + shape ->setMargin(gUrdfDefaultCollisionMargin); + break; + } + case URDF_GEOM_CYLINDER: { btScalar cylRadius = collision->m_geometry.m_cylinderRadius; diff --git a/examples/Importers/ImportURDFDemo/UrdfParser.cpp b/examples/Importers/ImportURDFDemo/UrdfParser.cpp index 9f06dbfa0..db8f3c498 100644 --- a/examples/Importers/ImportURDFDemo/UrdfParser.cpp +++ b/examples/Importers/ImportURDFDemo/UrdfParser.cpp @@ -380,7 +380,20 @@ bool UrdfParser::parseGeometry(UrdfGeometry& geom, TiXmlElement* g, ErrorLogger* geom.m_cylinderLength = urdfLexicalCast(shape->Attribute("length")); } - + else if (type_name == "capsule") + { + geom.m_type = URDF_GEOM_CAPSULE; + if (!shape->Attribute("length") || + !shape->Attribute("radius")) + { + logger->reportError("Capsule shape must have both length and radius attributes"); + return false; + } + geom.m_hasFromTo = false; + geom.m_capsuleRadius = urdfLexicalCast(shape->Attribute("radius")); + geom.m_capsuleHalfHeight = btScalar(0.5)*urdfLexicalCast(shape->Attribute("length")); + + } else if (type_name == "mesh") { geom.m_type = URDF_GEOM_MESH; diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp index 1ab731551..060959330 100644 --- a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp +++ b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp @@ -3358,25 +3358,28 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm virtual btScalar addSingleResult(btManifoldPoint& cp, const btCollisionObjectWrapper* colObj0Wrap, int partId0, int index0, const btCollisionObjectWrapper* colObj1Wrap, int partId1, int index1) { - b3ContactPointData pt; - pt.m_bodyUniqueIdA = m_bodyUniqueIdA; - pt.m_bodyUniqueIdB = m_bodyUniqueIdB; - const btManifoldPoint& srcPt = cp; - pt.m_contactDistance = srcPt.getDistance(); - pt.m_contactFlags = 0; - pt.m_linkIndexA = m_linkIndexA; - pt.m_linkIndexB = m_linkIndexB; - for (int j = 0; j < 3; j++) + if (cp.m_distance1<=m_closestDistanceThreshold) { - pt.m_contactNormalOnBInWS[j] = srcPt.m_normalWorldOnB[j]; - pt.m_positionOnAInWS[j] = srcPt.getPositionWorldOnA()[j]; - pt.m_positionOnBInWS[j] = srcPt.getPositionWorldOnB()[j]; + b3ContactPointData pt; + pt.m_bodyUniqueIdA = m_bodyUniqueIdA; + pt.m_bodyUniqueIdB = m_bodyUniqueIdB; + const btManifoldPoint& srcPt = cp; + pt.m_contactDistance = srcPt.getDistance(); + pt.m_contactFlags = 0; + pt.m_linkIndexA = m_linkIndexA; + pt.m_linkIndexB = m_linkIndexB; + for (int j = 0; j < 3; j++) + { + pt.m_contactNormalOnBInWS[j] = srcPt.m_normalWorldOnB[j]; + pt.m_positionOnAInWS[j] = srcPt.getPositionWorldOnA()[j]; + pt.m_positionOnBInWS[j] = srcPt.getPositionWorldOnB()[j]; + } + pt.m_normalForce = srcPt.getAppliedImpulse() / m_deltaTime; + // pt.m_linearFrictionForce = srcPt.m_appliedImpulseLateral1; + m_cachedContactPoints.push_back(pt); } - pt.m_normalForce = srcPt.getAppliedImpulse() / m_deltaTime; - // pt.m_linearFrictionForce = srcPt.m_appliedImpulseLateral1; - m_cachedContactPoints.push_back(pt); - return 1; + } }; diff --git a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp index 4fdd9f1f2..13d616be6 100644 --- a/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp +++ b/examples/SharedMemory/TinyRendererVisualShapeConverter.cpp @@ -94,9 +94,19 @@ struct TinyRendererVisualShapeConverterInternalData m_swWidth(START_WIDTH), m_swHeight(START_HEIGHT), m_rgbColorBuffer(START_WIDTH,START_HEIGHT,TGAImage::RGB), + m_lightDirection(btVector3(-5,200,-40)), m_hasLightDirection(false), + m_lightColor(btVector3(1.0,1.0,1.0)), m_hasLightColor(false), - m_hasShadow(false) + m_lightDistance(2.0), + m_hasLightDistance(false), + m_lightAmbientCoeff(0.6), + m_hasLightAmbientCoeff(false), + m_lightDiffuseCoeff(0.35), + m_hasLightDiffuseCoeff(false), + m_lightSpecularCoeff(0.05), + m_hasLightSpecularCoeff(false), + m_hasShadow(false) { m_depthBuffer.resize(m_swWidth*m_swHeight); m_shadowBuffer.resize(m_swWidth*m_swHeight); diff --git a/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp b/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp index 864df26e9..89522d7b8 100644 --- a/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp +++ b/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp @@ -19,8 +19,10 @@ subject to the following restrictions: #include "BulletCollision/CollisionShapes/btCollisionMargin.h" #include "LinearMath/btQuaternion.h" -btCapsuleShape::btCapsuleShape(btScalar radius, btScalar height) : btConvexInternalShape () +btCapsuleShape::btCapsuleShape(btScalar orgRadius, btScalar height) : btConvexInternalShape () { + m_collisionMargin = orgRadius; + btScalar radius = 0.f; m_shapeType = CAPSULE_SHAPE_PROXYTYPE; m_upAxis = 1; m_implicitShapeDimensions.setValue(radius,0.5f*height,radius); @@ -133,7 +135,7 @@ void btCapsuleShape::calculateLocalInertia(btScalar mass,btVector3& inertia) con btVector3 halfExtents(radius,radius,radius); halfExtents[getUpAxis()]+=getHalfHeight(); - btScalar margin = CONVEX_DISTANCE_MARGIN; + btScalar margin = m_collisionMargin; btScalar lx=btScalar(2.)*(halfExtents[0]+margin); btScalar ly=btScalar(2.)*(halfExtents[1]+margin); @@ -149,8 +151,10 @@ void btCapsuleShape::calculateLocalInertia(btScalar mass,btVector3& inertia) con } -btCapsuleShapeX::btCapsuleShapeX(btScalar radius,btScalar height) +btCapsuleShapeX::btCapsuleShapeX(btScalar orgRadius,btScalar height) { + m_collisionMargin = orgRadius; + btScalar radius = 0.f; m_upAxis = 0; m_implicitShapeDimensions.setValue(0.5f*height, radius,radius); } @@ -160,8 +164,10 @@ btCapsuleShapeX::btCapsuleShapeX(btScalar radius,btScalar height) -btCapsuleShapeZ::btCapsuleShapeZ(btScalar radius,btScalar height) +btCapsuleShapeZ::btCapsuleShapeZ(btScalar orgRadius,btScalar height) { + m_collisionMargin = orgRadius; + btScalar radius = 0.f; m_upAxis = 2; m_implicitShapeDimensions.setValue(radius,radius,0.5f*height); }