From 22b48098910234c6665b8217d2df12d62924e799 Mon Sep 17 00:00:00 2001 From: erwincoumans Date: Wed, 10 Jan 2018 11:16:50 -0800 Subject: [PATCH] leave m_useGlobalVelocities to false, until enabled, for backward compatibility use URDF_GLOBAL_VELOCITIES_MB flag in PyBullet loadURDF. fix robot_bases.py due to new fields in getJointInfo. backward compabitibility: BulletMJCFImporter, keep creating btMultiSphereShape for MJCF capsules with fromto, instead of shifted btCapsuleShapeZ, unless if CUF_USE_IMPLICIT_CYLINDER is used. --- data/multibody.bullet | Bin 14844 -> 18948 bytes .../ImportMJCFDemo/BulletMJCFImporter.cpp | 79 ++++++++++-------- .../ImportMJCFDemo/BulletMJCFImporter.h | 2 +- .../ImportMJCFDemo/ImportMJCFSetup.cpp | 3 +- .../Importers/ImportURDFDemo/URDF2Bullet.cpp | 4 +- .../Importers/ImportURDFDemo/URDF2Bullet.h | 2 +- .../PhysicsServerCommandProcessor.cpp | 2 +- examples/SharedMemory/SharedMemoryPublic.h | 2 +- .../pybullet/gym/pybullet_envs/robot_bases.py | 10 ++- examples/pybullet/pybullet.c | 2 +- .../Featherstone/btMultiBody.cpp | 2 +- 11 files changed, 61 insertions(+), 47 deletions(-) diff --git a/data/multibody.bullet b/data/multibody.bullet index 36a570fe5a04bd111ec97f0c66bc662453c49996..8d5019a7856d6654931c82c45f2ed89c0508bded 100644 GIT binary patch delta 6732 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 BM&|$k delta 4393 zcmcJR2~-sK9mjtoOJ)Rj6n9lTgB7C26BHzJEFhjiMZg2%g@_`8O8|{W;^Gz2rl~q6 z5tFngrj4ylYf5TuT16XE6OY!mQF584N7}S$lhhohwteRFpWQ7BmFmlTo%cTTzkbK} zf6TFYxAw0ZU)Ic=obd%qhOJ6S9+N#gC%a5UIs_O>slncco*t1p&)$ZH^lkO^sdRDe z%T#^m&gP^mR8K_nfTQQmo=sEry$yxAho4sK(T+ z?7}L_TLR=$YSt5)%hz3B`TSK~-d5@8Y;(2Whm>O?85u!`i908yZLhCSxtO1BOH}cc zq|Cg`!jWMj;nWo~K=lW%rGe6)=&7os1Z}xmw_A%*Q_*<3&E0ei)2}BN-foAJ0A_s~*J=BovEtNy$b-j?2WN#^;trp|MXE9jH8byd@rLnDqROxb;Gl5==k?DksE14H`R zTfXGVD9TR^w<82B0)>A8IZ&+@xosQc zn1Dl!gNjnEc1*=pZMBQR#jhzVt}b01Q(0Q+tzHw+=XNRE*x{LjK9M6^{Ux@ot|2GG z-PKn zM>r;fC$Q;8w*K+pJ-CqS5%`b4m8}i1(p_fE^2qt~f|jbZpW2K*6a0O39?KmSYYhsU zrHniIMXP`e^bcDY9nri$g=alA2;1WyTK@hS*B5#Z zoo7Zy%Siic+G3+>_LP#^E{dJ#zZT`Wh}dq*C#X4ilm}UH&cWq3pHan7JKMa!ONOfZ zubcO06TYD0;3*wsjqm(L6t8o?AF>DkC&lV>A=%S1irl@l&5bMFjp2>m`rW4W zD)FwUEiS3et@f6b*3>Lpv9zG9y0oUuTd}w?`PQCV^3sypf;Cm8jVA}3 ziVPd)t+aNGC~V9h8Lo9Ks4iYnv&36nX+0UA6kbr6JAOf{B_X*H~YwXhEEh5LvUCkfYy?jpL2=uV(($&58sWVkCN_aSr5K|t~$yZ*Z>=06KsYpa6fE?de{cr;mas}0KNhb!dGF3 zt$eg}_aS9Hs8Y$QgBsWX8(|Y{hAnVEY=wH*2HTz z5IhWzz#iBI4X_s;g~wQ#$Hnjw*dVY$V1vL0feiv11U3SJ)h6G;3>@+_9FVcd8YAC= zZ`()7AqVOI4m<L0=p@z74AZPGU7h)*&C27wOA#7sH3Q= z6ELweu`{tVL+mE;dYT}=z~?;qehI%4pDw?a$qY;k3>XX;3>frJk-_Z?h2sIIEBGg2viBJ=v zCPGbwng}%!YW@$QIc>I-{ePK#I1Oi@WlyKJ*;4~M13LpdBgAeRTQ`<7;*?L|Q(|0U zRpMki>*9aRK0(l@_*~(O=3x9Y_y=62HC@7IaDsEKXR~{764ZN6(;U(P5+x6VT=^&W zFijT+ec@U@Ehj(A{{CC&*R=w?oMHs}I?@*bkRo-@)K|bo>4t959eO}C^n_l}8~Q+B=m)n#4D^RD!2pOQK^)u$17Q%Xmf8Gr zM#*3;N^XZCh#3mQupiF&f)U(CLOdkU89|xI=f5`(;3ynMLt?-wiE<1i!yPad+Z23K zDbpYwJhU?)lX{lsu+k>>=50HL)}4@}6(XmjOw~HdG$KsLG8fbbZwBLe^yO0)z)YA0 ziBg0X_3@f5vsv#s+6*bw@}!7;xr=?6tId>o+8mir>;>2_1f`@H7D0)R+hQn%CE6@m zs@)~g(nZQNQAe72HiYtb|o?53GhYu$JHZb#Sj1FZWTd z*XEL=GdcL$F5^}X%b@})?ZEt%Q2G<;B;XeSYVCwNNpzCvB+*HtlSB_mk`PETkF|7* s58-u)*g)cqOs)tKn`{wk75MFnlld&L8l1~u0)sA`oH+5%LBe9~b7{lRRR910 diff --git a/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.cpp b/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.cpp index c81ec21fc..07d4fd26b 100644 --- a/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.cpp +++ b/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.cpp @@ -7,6 +7,7 @@ #include "../../Utils/b3ResourcePath.h" #include #include +#include "../ImportURDFDemo/URDF2Bullet.h" #include "../ImportURDFDemo/UrdfParser.h" #include "../ImportURDFDemo/urdfStringSplit.h" #include "../ImportURDFDemo/urdfLexicalCast.h" @@ -190,10 +191,13 @@ struct BulletMJCFImporterInternalData btAlignedObjectArray m_allocatedCollisionShapes; mutable btAlignedObjectArray m_allocatedMeshInterfaces; + int m_flags; + BulletMJCFImporterInternalData() :m_inertiaFromGeom(true), m_activeModel(-1), - m_activeBodyUniqueId(-1) + m_activeBodyUniqueId(-1), + m_flags(0) { m_pathPrefix[0] = 0; } @@ -1370,11 +1374,12 @@ struct BulletMJCFImporterInternalData }; -BulletMJCFImporter::BulletMJCFImporter(struct GUIHelperInterface* helper, LinkVisualShapesConverter* customConverter) +BulletMJCFImporter::BulletMJCFImporter(struct GUIHelperInterface* helper, LinkVisualShapesConverter* customConverter, int flags) { m_data = new BulletMJCFImporterInternalData(); m_data->m_guiHelper = helper; m_data->m_customVisualShapesConverter = customConverter; + m_data->m_flags = flags; } BulletMJCFImporter::~BulletMJCFImporter() @@ -1897,43 +1902,45 @@ class btCompoundShape* BulletMJCFImporter::convertLinkCollisionShapes( int linkI { if (col->m_geometry.m_hasFromTo) { -#if 0 - btVector3 f = col->m_geometry.m_capsuleFrom; - btVector3 t = col->m_geometry.m_capsuleTo; - btVector3 fromto[2] = {f,t}; - btScalar radii[2] = {btScalar(col->m_geometry.m_capsuleRadius) - ,btScalar(col->m_geometry.m_capsuleRadius)}; - - btMultiSphereShape* ms = new btMultiSphereShape(fromto,radii,2); - childShape = ms; -#else - btVector3 f = col->m_geometry.m_capsuleFrom; - btVector3 t = col->m_geometry.m_capsuleTo; - - //compute the local 'fromto' transform - btVector3 localPosition = btScalar(0.5)*(t+f); - btQuaternion localOrn; - localOrn = btQuaternion::getIdentity(); - - btVector3 diff = t-f; - btScalar lenSqr = diff.length2(); - btScalar height = 0.f; - - if (lenSqr > SIMD_EPSILON) + if (m_data->m_flags&CUF_USE_IMPLICIT_CYLINDER) { - height = btSqrt(lenSqr); - btVector3 ax = diff / height; + btVector3 f = col->m_geometry.m_capsuleFrom; + btVector3 t = col->m_geometry.m_capsuleTo; + + //compute the local 'fromto' transform + btVector3 localPosition = btScalar(0.5)*(t+f); + btQuaternion localOrn; + localOrn = btQuaternion::getIdentity(); - btVector3 zAxis(0,0,1); - localOrn = shortestArcQuat(zAxis,ax); + btVector3 diff = t-f; + btScalar lenSqr = diff.length2(); + btScalar height = 0.f; + + if (lenSqr > SIMD_EPSILON) + { + height = btSqrt(lenSqr); + btVector3 ax = diff / height; + + btVector3 zAxis(0,0,1); + localOrn = shortestArcQuat(zAxis,ax); + } + btCapsuleShapeZ* capsule= new btCapsuleShapeZ(col->m_geometry.m_capsuleRadius,height); + + btCompoundShape* compound = new btCompoundShape(); + btTransform localTransform(localOrn,localPosition); + compound->addChildShape(localTransform,capsule); + childShape = compound; + } else + { + btVector3 f = col->m_geometry.m_capsuleFrom; + btVector3 t = col->m_geometry.m_capsuleTo; + btVector3 fromto[2] = {f,t}; + btScalar radii[2] = {btScalar(col->m_geometry.m_capsuleRadius) + ,btScalar(col->m_geometry.m_capsuleRadius)}; + + btMultiSphereShape* ms = new btMultiSphereShape(fromto,radii,2); + childShape = ms; } - btCapsuleShapeZ* capsule= new btCapsuleShapeZ(col->m_geometry.m_capsuleRadius,height); - - btCompoundShape* compound = new btCompoundShape(); - btTransform localTransform(localOrn,localPosition); - compound->addChildShape(localTransform,capsule); - childShape = compound; -#endif } else { btCapsuleShapeZ* cap = new btCapsuleShapeZ(col->m_geometry.m_capsuleRadius, diff --git a/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.h b/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.h index 05e5dc2fe..39be50898 100644 --- a/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.h +++ b/examples/Importers/ImportMJCFDemo/BulletMJCFImporter.h @@ -19,7 +19,7 @@ class BulletMJCFImporter : public URDFImporterInterface struct BulletMJCFImporterInternalData* m_data; public: - BulletMJCFImporter(struct GUIHelperInterface* helper, LinkVisualShapesConverter* customConverter); + BulletMJCFImporter(struct GUIHelperInterface* helper, LinkVisualShapesConverter* customConverter, int flags); virtual ~BulletMJCFImporter(); virtual bool parseMJCFString(const char* xmlString, MJCFErrorLogger* logger); diff --git a/examples/Importers/ImportMJCFDemo/ImportMJCFSetup.cpp b/examples/Importers/ImportMJCFDemo/ImportMJCFSetup.cpp index e224e7efe..53a30ea57 100644 --- a/examples/Importers/ImportMJCFDemo/ImportMJCFSetup.cpp +++ b/examples/Importers/ImportMJCFDemo/ImportMJCFSetup.cpp @@ -216,7 +216,8 @@ void ImportMJCFSetup::initPhysics() m_guiHelper->getParameterInterface()->registerSliderFloatParameter(slider); } - BulletMJCFImporter importer(m_guiHelper, 0); + int flags=0; + BulletMJCFImporter importer(m_guiHelper, 0,flags); MyMJCFLogger logger; bool result = importer.loadMJCF(m_fileName,&logger); if (result) diff --git a/examples/Importers/ImportURDFDemo/URDF2Bullet.cpp b/examples/Importers/ImportURDFDemo/URDF2Bullet.cpp index d06460347..5382682a2 100644 --- a/examples/Importers/ImportURDFDemo/URDF2Bullet.cpp +++ b/examples/Importers/ImportURDFDemo/URDF2Bullet.cpp @@ -344,9 +344,9 @@ void ConvertURDF2BulletInternal( bool isFixedBase = (mass==0);//todo: figure out when base is fixed int totalNumJoints = cache.m_totalNumJoints1; cache.m_bulletMultiBody = creation.allocateMultiBody(urdfLinkIndex, totalNumJoints,mass, localInertiaDiagonal, isFixedBase, canSleep); - if (flags & CUF_NO_GLOBAL_VELOCITIES_MB) + if (flags & CUF_GLOBAL_VELOCITIES_MB) { - cache.m_bulletMultiBody->useGlobalVelocities(false); + cache.m_bulletMultiBody->useGlobalVelocities(true); } if (flags & CUF_USE_MJCF) { diff --git a/examples/Importers/ImportURDFDemo/URDF2Bullet.h b/examples/Importers/ImportURDFDemo/URDF2Bullet.h index 40c8803c5..abc4f3573 100644 --- a/examples/Importers/ImportURDFDemo/URDF2Bullet.h +++ b/examples/Importers/ImportURDFDemo/URDF2Bullet.h @@ -24,7 +24,7 @@ enum ConvertURDFFlags { CUF_USE_SELF_COLLISION_EXCLUDE_ALL_PARENTS=32, CUF_RESERVED=64, CUF_USE_IMPLICIT_CYLINDER=128, - CUF_NO_GLOBAL_VELOCITIES_MB=256, + CUF_GLOBAL_VELOCITIES_MB=256, }; void ConvertURDF2Bullet(const URDFImporterInterface& u2b, diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp index 670ae1ac9..e76c4bc3d 100644 --- a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp +++ b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp @@ -2704,7 +2704,7 @@ bool PhysicsServerCommandProcessor::loadMjcf(const char* fileName, char* bufferS m_data->m_sdfRecentLoadedBodies.clear(); - BulletMJCFImporter u2b(m_data->m_guiHelper, &m_data->m_visualConverter); + BulletMJCFImporter u2b(m_data->m_guiHelper, &m_data->m_visualConverter, flags); bool useFixedBase = false; MyMJCFLogger2 logger; diff --git a/examples/SharedMemory/SharedMemoryPublic.h b/examples/SharedMemory/SharedMemoryPublic.h index 9761519b7..05a81c8c1 100644 --- a/examples/SharedMemory/SharedMemoryPublic.h +++ b/examples/SharedMemory/SharedMemoryPublic.h @@ -673,7 +673,7 @@ enum eURDF_Flags URDF_USE_SELF_COLLISION_EXCLUDE_ALL_PARENTS=32, URDF_RESERVED=64, URDF_USE_IMPLICIT_CYLINDER =128, - URDF_NO_GLOBAL_VELOCITIES_MB =256, + URDF_GLOBAL_VELOCITIES_MB =256, }; enum eUrdfGeomTypes //sync with UrdfParser UrdfGeomTypes diff --git a/examples/pybullet/gym/pybullet_envs/robot_bases.py b/examples/pybullet/gym/pybullet_envs/robot_bases.py index d5b83017c..eb8ca3aad 100644 --- a/examples/pybullet/gym/pybullet_envs/robot_bases.py +++ b/examples/pybullet/gym/pybullet_envs/robot_bases.py @@ -55,7 +55,9 @@ class MJCFBasedRobot: parts[part_name] = BodyPart(part_name, bodies, i, -1) for j in range(p.getNumJoints(bodies[i])): p.setJointMotorControl2(bodies[i],j,p.POSITION_CONTROL,positionGain=0.1,velocityGain=0.1,force=0) - _,joint_name,_,_,_,_,_,_,_,_,_,_,part_name = p.getJointInfo(bodies[i], j) + jointInfo = p.getJointInfo(bodies[i], j) + joint_name=jointInfo[1] + part_name=jointInfo[12] joint_name = joint_name.decode("utf8") part_name = part_name.decode("utf8") @@ -172,7 +174,11 @@ class Joint: self.bodyIndex = bodyIndex self.jointIndex = jointIndex self.joint_name = joint_name - _,_,_,_,_,_,_,_,self.lowerLimit, self.upperLimit,_,_,_ = p.getJointInfo(self.bodies[self.bodyIndex], self.jointIndex) + + jointInfo = p.getJointInfo(self.bodies[self.bodyIndex], self.jointIndex) + self.lowerLimit = jointInfo[8] + self.upperLimit = jointInfo[9] + self.power_coeff = 0 def set_state(self, x, vx): diff --git a/examples/pybullet/pybullet.c b/examples/pybullet/pybullet.c index 6d5124de4..c719bda5c 100644 --- a/examples/pybullet/pybullet.c +++ b/examples/pybullet/pybullet.c @@ -8817,7 +8817,7 @@ initpybullet(void) PyModule_AddIntConstant(m, "URDF_USE_INERTIA_FROM_FILE", URDF_USE_INERTIA_FROM_FILE); PyModule_AddIntConstant(m, "URDF_USE_IMPLICIT_CYLINDER", URDF_USE_IMPLICIT_CYLINDER); - PyModule_AddIntConstant(m, "URDF_NO_GLOBAL_VELOCITIES_MB", URDF_NO_GLOBAL_VELOCITIES_MB); + PyModule_AddIntConstant(m, "URDF_GLOBAL_VELOCITIES_MB", URDF_GLOBAL_VELOCITIES_MB); PyModule_AddIntConstant(m, "URDF_USE_SELF_COLLISION", URDF_USE_SELF_COLLISION); PyModule_AddIntConstant(m, "URDF_USE_SELF_COLLISION_EXCLUDE_PARENT", URDF_USE_SELF_COLLISION_EXCLUDE_PARENT); diff --git a/src/BulletDynamics/Featherstone/btMultiBody.cpp b/src/BulletDynamics/Featherstone/btMultiBody.cpp index a750f033d..6571822c9 100644 --- a/src/BulletDynamics/Featherstone/btMultiBody.cpp +++ b/src/BulletDynamics/Featherstone/btMultiBody.cpp @@ -122,7 +122,7 @@ btMultiBody::btMultiBody(int n_links, m_dofCount(0), m_posVarCnt(0), m_useRK4(false), - m_useGlobalVelocities(true), + m_useGlobalVelocities(false), m_internalNeedsJointFeedback(false) { m_cachedInertiaTopLeft.setValue(0,0,0,0,0,0,0,0,0);