From 285ac286fab427063899c0f9416b05d3699dac11 Mon Sep 17 00:00:00 2001 From: erwincoumans Date: Thu, 9 Jul 2015 14:04:58 -0700 Subject: [PATCH] some work towards streaming Bullet data over shared memory for client/server --- build3/premake4.lua | 1 + data/slope.bullet | Bin 0 -> 76600 bytes .../RollingFrictionDemo.cpp | 47 +++--- examples/SharedMemory/PhysicsClient.cpp | 146 +++++++++++------- examples/SharedMemory/PhysicsServer.cpp | 41 +++++ examples/SharedMemory/SharedMemoryCommands.h | 10 ++ examples/SharedMemory/SharedMemoryInterface.h | 3 + examples/SharedMemory/premake4.lua | 2 + .../Bullet2FileLoader/autogenerated/bullet2.h | 6 +- src/LinearMath/btSerializer.h | 2 +- 10 files changed, 179 insertions(+), 79 deletions(-) create mode 100644 data/slope.bullet diff --git a/build3/premake4.lua b/build3/premake4.lua index 80107caa6..59f4f12c7 100644 --- a/build3/premake4.lua +++ b/build3/premake4.lua @@ -152,6 +152,7 @@ if not _OPTIONS["ios"] then include "../examples/OpenGLWindow" include "../examples/SharedMemory" include "../examples/ThirdPartyLibs/Gwen" + include "../Extras" include "../examples/HelloWorld" include "../examples/BasicDemo" diff --git a/data/slope.bullet b/data/slope.bullet new file mode 100644 index 0000000000000000000000000000000000000000..e766f6af839898f84c75b8f3f2254bfd9a964298 GIT binary patch literal 76600 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 F{{h4IoDu*4 literal 0 HcmV?d00001 diff --git a/examples/RollingFrictionDemo/RollingFrictionDemo.cpp b/examples/RollingFrictionDemo/RollingFrictionDemo.cpp index afc3956ec..8dbdec8d9 100644 --- a/examples/RollingFrictionDemo/RollingFrictionDemo.cpp +++ b/examples/RollingFrictionDemo/RollingFrictionDemo.cpp @@ -75,7 +75,7 @@ public: void RollingFrictionDemo::initPhysics() { - m_guiHelper->setUpAxis(1); + m_guiHelper->setUpAxis(2); ///collision configuration contains default setup for memory, collision setup @@ -93,23 +93,22 @@ void RollingFrictionDemo::initPhysics() m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); // m_dynamicsWorld->getSolverInfo().m_singleAxisRollingFrictionThreshold = 0.f;//faster but lower quality - m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + m_dynamicsWorld->setGravity(btVector3(0,0,-10)); m_guiHelper->createPhysicsDebugDrawer(m_dynamicsWorld); { ///create a few basic rigid bodies - btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(20.),btScalar(50.),btScalar(10.))); + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(10.),btScalar(5.),btScalar(25.))); - // btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); m_collisionShapes.push_back(groundShape); btTransform groundTransform; groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-50,0)); - groundTransform.setRotation(btQuaternion(btVector3(0,0,1),SIMD_PI*0.03)); + groundTransform.setOrigin(btVector3(0,0,-28)); + groundTransform.setRotation(btQuaternion(btVector3(0,1,0),SIMD_PI*0.03)); //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: btScalar mass(0.); @@ -133,13 +132,13 @@ void RollingFrictionDemo::initPhysics() { ///create a few basic rigid bodies - btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(100.),btScalar(50.),btScalar(100.))); + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(100.),btScalar(100.),btScalar(50.))); m_collisionShapes.push_back(groundShape); btTransform groundTransform; groundTransform.setIdentity(); - groundTransform.setOrigin(btVector3(0,-54,0)); + groundTransform.setOrigin(btVector3(0,0,-54)); //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: btScalar mass(0.); @@ -165,16 +164,16 @@ void RollingFrictionDemo::initPhysics() // Re-using the same collision is better for memory usage and performance #define NUM_SHAPES 10 btCollisionShape* colShapes[NUM_SHAPES] = { - new btSphereShape(btScalar(1.)), - new btCapsuleShape(0.5,1), - new btCapsuleShapeX(0.5,1), - new btCapsuleShapeZ(0.5,1), - new btConeShape(0.5,1), - new btConeShapeX(0.5,1), - new btConeShapeZ(0.5,1), - new btCylinderShape(btVector3(0.5,1,0.5)), - new btCylinderShapeX(btVector3(1,0.5,0.5)), - new btCylinderShapeZ(btVector3(0.5,0.5,1)), + new btSphereShape(btScalar(0.5)), + new btCapsuleShape(0.25,0.5), + new btCapsuleShapeX(0.25,0.5), + new btCapsuleShapeZ(0.25,0.5), + new btConeShape(0.25,0.5), + new btConeShapeX(0.25,0.5), + new btConeShapeZ(0.25,0.5), + new btCylinderShape(btVector3(0.25,0.5,0.25)), + new btCylinderShapeX(btVector3(0.5,0.25,0.25)), + new btCylinderShapeZ(btVector3(0.25,0.25,0.5)), }; for (int i=0;iautogenerateGraphicsObjects(m_dynamicsWorld); - + btSerializer* s = new btDefaultSerializer; + m_dynamicsWorld->serialize(s); + FILE* f = fopen("slope.bullet","wb"); + fwrite(s->getBufferPointer(),s->getCurrentBufferSize(),1,f); + fclose(f); } diff --git a/examples/SharedMemory/PhysicsClient.cpp b/examples/SharedMemory/PhysicsClient.cpp index 8aeae62f7..ee8549a01 100644 --- a/examples/SharedMemory/PhysicsClient.cpp +++ b/examples/SharedMemory/PhysicsClient.cpp @@ -6,7 +6,7 @@ #include "Win32SharedMemory.h" #include "SharedMemoryCommon.h" #include "../CommonInterfaces/CommonParameterInterface.h" - +#include "../Utils/b3ResourcePath.h" class PhysicsClient : public SharedMemoryCommon { @@ -24,6 +24,8 @@ protected: void createClientCommand(); + void createButton(const char* name, int id, bool isTrigger ); + public: PhysicsClient(GUIHelperInterface* helper); @@ -57,23 +59,13 @@ void MyCallback(int buttonId, bool buttonState, void* userPtr) switch (buttonId) { case CMD_LOAD_URDF: - { - cl->submitCommand(CMD_LOAD_URDF); - break; - } + case CMD_CREATE_BOX_COLLISION_SHAPE: case CMD_REQUEST_ACTUAL_STATE: - { - cl->submitCommand(CMD_REQUEST_ACTUAL_STATE); - break; - } case CMD_STEP_FORWARD_SIMULATION: - { - cl->submitCommand(CMD_STEP_FORWARD_SIMULATION); - break; - } case CMD_SHUTDOWN: + case CMD_SEND_BULLET_DATA_STREAM: { - cl->submitCommand(CMD_SHUTDOWN); + cl->submitCommand(buttonId); break; } @@ -116,50 +108,26 @@ PhysicsClient::~PhysicsClient() delete m_sharedMemory; } - +void PhysicsClient::createButton(const char* name, int buttonId, bool isTrigger ) +{ + ButtonParams button(name,buttonId, isTrigger); + button.m_callback = MyCallback; + button.m_userPointer = this; + m_guiHelper->getParameterInterface()->registerButtonParameter(button); +} void PhysicsClient::initPhysics() { if (m_guiHelper && m_guiHelper->getParameterInterface()) { - { - bool isTrigger = false; - ButtonParams button("Load URDF",CMD_LOAD_URDF, isTrigger); - button.m_callback = MyCallback; - button.m_userPointer = this; - m_guiHelper->getParameterInterface()->registerButtonParameter(button); - } - - { - bool isTrigger = false; - ButtonParams button("Step Sim",CMD_STEP_FORWARD_SIMULATION, isTrigger); - button.m_callback = MyCallback; - button.m_userPointer = this; - m_guiHelper->getParameterInterface()->registerButtonParameter(button); - } - - { - bool isTrigger = false; - ButtonParams button("Get State",CMD_REQUEST_ACTUAL_STATE, isTrigger); - button.m_callback = MyCallback; - button.m_userPointer = this; - m_guiHelper->getParameterInterface()->registerButtonParameter(button); - } + bool isTrigger = false; - { - bool isTrigger = false; - ButtonParams button("Send Desired State",CMD_SEND_DESIRED_STATE, isTrigger); - button.m_callback = MyCallback; - button.m_userPointer = this; - m_guiHelper->getParameterInterface()->registerButtonParameter(button); - } + createButton("Load URDF",CMD_LOAD_URDF, isTrigger); + createButton("Step Sim",CMD_STEP_FORWARD_SIMULATION, isTrigger); + createButton("Send Bullet Stream",CMD_SEND_BULLET_DATA_STREAM, isTrigger); + createButton("Get State",CMD_REQUEST_ACTUAL_STATE, isTrigger); + createButton("Send Desired State",CMD_SEND_DESIRED_STATE, isTrigger); + createButton("Create Box Collider",CMD_CREATE_BOX_COLLISION_SHAPE,isTrigger); - { - bool isTrigger = false; - ButtonParams button("Shut Down",CMD_SHUTDOWN, isTrigger); - button.m_callback = MyCallback; - button.m_userPointer = this; - m_guiHelper->getParameterInterface()->registerButtonParameter(button); - } } else { m_userCommandRequests.push_back(CMD_LOAD_URDF); @@ -167,7 +135,7 @@ void PhysicsClient::initPhysics() //m_userCommandRequests.push_back(CMD_SEND_DESIRED_STATE); m_userCommandRequests.push_back(CMD_REQUEST_ACTUAL_STATE); //m_userCommandRequests.push_back(CMD_SET_JOINT_FEEDBACK); - //m_userCommandRequests.push_back(CMD_CREATE_BOX_COLLISION_SHAPE); + m_userCommandRequests.push_back(CMD_CREATE_BOX_COLLISION_SHAPE); //m_userCommandRequests.push_back(CMD_CREATE_RIGID_BODY); m_userCommandRequests.push_back(CMD_STEP_FORWARD_SIMULATION); m_userCommandRequests.push_back(CMD_REQUEST_ACTUAL_STATE); @@ -225,6 +193,17 @@ void PhysicsClient::processServerCommands() m_serverLoadUrdfOK = false; break; } + + case CMD_BULLET_DATA_STREAM_RECEIVED_COMPLETED: + { + break; + } + case CMD_BULLET_DATA_STREAM_RECEIVED_FAILED: + { + break; + } + + case CMD_ACTUAL_STATE_UPDATE_COMPLETED: { b3Printf("Received actual state\n"); @@ -312,6 +291,67 @@ void PhysicsClient::createClientCommand() { b3Warning("Server already loaded URDF, no client command submitted\n"); } + break; + } + case CMD_CREATE_BOX_COLLISION_SHAPE: + { + if (m_serverLoadUrdfOK) + { + b3Printf("Requesting create box collision shape\n"); + m_testBlock1->m_clientCommands[0].m_type =CMD_CREATE_BOX_COLLISION_SHAPE; + m_testBlock1->m_numClientCommands++; + } else + { + b3Warning("No URDF loaded\n"); + } + break; + } + case CMD_SEND_BULLET_DATA_STREAM: + { + b3Printf("Sending a Bullet Data Stream\n"); + ///The idea is to pass a stream of chunks from client to server + ///over shared memory. The server will process it + ///Initially we will just copy an entire .bullet file into shared + ///memory but we can also send individual chunks one at a time + ///so it becomes a streaming solution + ///In addition, we can make a separate API to create those chunks + ///if needed, instead of using a 3d modeler or the Bullet SDK btSerializer + + char relativeFileName[1024]; + const char* fileName = "slope.bullet"; + bool fileFound = b3ResourcePath::findResourcePath(fileName,relativeFileName,1024); + if (fileFound) + { + FILE *fp = fopen(relativeFileName, "rb"); + if (fp) + { + fseek(fp, 0L, SEEK_END); + int mFileLen = ftell(fp); + fseek(fp, 0L, SEEK_SET); + if (mFileLenm_bulletStreamDataClientToServer, mFileLen, 1, fp); + + fclose(fp); + + m_testBlock1->m_clientCommands[0].m_type =CMD_SEND_BULLET_DATA_STREAM; + m_testBlock1->m_clientCommands[0].m_dataStreamArguments.m_streamChunkLength = mFileLen; + m_testBlock1->m_numClientCommands++; + b3Printf("Send bullet data stream command\n"); + } else + { + b3Warning("Bullet file size (%d) exceeds of streaming memory chunk size (%d)\n", mFileLen,SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE); + } + } else + { + b3Warning("Cannot open file %s\n", relativeFileName); + } + } else + { + b3Warning("Cannot find file %s\n", fileName); + } + break; } case CMD_REQUEST_ACTUAL_STATE: diff --git a/examples/SharedMemory/PhysicsServer.cpp b/examples/SharedMemory/PhysicsServer.cpp index 83b660afb..b0fb3c68d 100644 --- a/examples/SharedMemory/PhysicsServer.cpp +++ b/examples/SharedMemory/PhysicsServer.cpp @@ -7,6 +7,7 @@ #include "../Importers/ImportURDFDemo/BulletUrdfImporter.h" #include "../Importers/ImportURDFDemo/MyMultiBodyCreator.h" #include "../Importers/ImportURDFDemo/URDF2Bullet.h" +#include "../Extras/Serialize/BulletWorldImporter/btBulletWorldImporter.h" #include "SharedMemoryCommon.h" @@ -17,6 +18,8 @@ class PhysicsServer : public SharedMemoryCommon SharedMemoryExampleData* m_testBlock1; btAlignedObjectArray m_jointFeedbacks; + btAlignedObjectArray m_worldImporters; + bool m_wantsShutdown; public: @@ -196,6 +199,29 @@ void PhysicsServer::stepSimulation(float deltaTime) //consume the command switch (clientCmd.m_type) { + case CMD_SEND_BULLET_DATA_STREAM: + { + b3Printf("Processed CMD_SEND_BULLET_DATA_STREAM length %d",clientCmd.m_dataStreamArguments.m_streamChunkLength); + + btBulletWorldImporter* worldImporter = new btBulletWorldImporter(m_dynamicsWorld); + this->m_worldImporters.push_back(worldImporter); + bool completedOk = worldImporter->loadFileFromMemory(m_testBlock1->m_bulletStreamDataClientToServer,clientCmd.m_dataStreamArguments.m_streamChunkLength); + + m_guiHelper->autogenerateGraphicsObjects(m_dynamicsWorld); + + SharedMemoryCommand& serverCmd =m_testBlock1->m_serverCommands[0]; + + if (completedOk) + { + serverCmd.m_type =CMD_BULLET_DATA_STREAM_RECEIVED_COMPLETED; + } else + { + serverCmd.m_type =CMD_BULLET_DATA_STREAM_RECEIVED_FAILED; + + } + m_testBlock1->m_numServerCommands++; + break; + } case CMD_LOAD_URDF: { b3Printf("Processed CMD_LOAD_URDF:%s",clientCmd.m_urdfArguments.m_urdfFileName); @@ -330,6 +356,21 @@ void PhysicsServer::stepSimulation(float deltaTime) wantsShutdown = true; break; } + case CMD_CREATE_BOX_COLLISION_SHAPE: + { + btVector3 halfExtents(30,30,1); + btTransform startTrans; + startTrans.setIdentity(); + startTrans.setOrigin(btVector3(0,0,-4)); + btCollisionShape* shape = createBoxShape(halfExtents); + btScalar mass = 0.f; + createRigidBody(mass,startTrans,shape); + this->m_guiHelper->autogenerateGraphicsObjects(this->m_dynamicsWorld); + SharedMemoryCommand& serverCmd =m_testBlock1->m_serverCommands[0]; + serverCmd.m_type =CMD_STEP_FORWARD_SIMULATION_COMPLETED; + m_testBlock1->m_numServerCommands++; + break; + } default: { b3Error("Unsupported command encountered"); diff --git a/examples/SharedMemory/SharedMemoryCommands.h b/examples/SharedMemory/SharedMemoryCommands.h index 6c80570ba..a0a950618 100644 --- a/examples/SharedMemory/SharedMemoryCommands.h +++ b/examples/SharedMemory/SharedMemoryCommands.h @@ -8,6 +8,8 @@ enum SharedMemoryServerCommand { CMD_URDF_LOADING_COMPLETED, CMD_URDF_LOADING_FAILED, + CMD_BULLET_DATA_STREAM_RECEIVED_COMPLETED, + CMD_BULLET_DATA_STREAM_RECEIVED_FAILED, CMD_BOX_COLLISION_SHAPE_CREATION_COMPLETED, CMD_RIGID_BODY_CREATION_COMPLETED, CMD_SET_JOINT_FEEDBACK_COMPLETED, @@ -20,6 +22,7 @@ enum SharedMemoryServerCommand enum SharedMemoryClientCommand { CMD_LOAD_URDF, + CMD_SEND_BULLET_DATA_STREAM, CMD_CREATE_BOX_COLLISION_SHAPE, CMD_DELETE_BOX_COLLISION_SHAPE, CMD_CREATE_RIGID_BODY, @@ -45,6 +48,12 @@ struct UrdfArgs bool m_useFixedBase; }; + +struct BulletDataStreamArgs +{ + int m_streamChunkLength; +}; + struct SetJointFeedbackArgs { int m_bodyUniqueId; @@ -96,6 +105,7 @@ struct SharedMemoryCommand union { UrdfArgs m_urdfArguments; + BulletDataStreamArgs m_dataStreamArguments; StepSimulationArgs m_stepSimulationArguments; SendDesiredStateArgs m_sendDesiredQandUStateCommandArgument; RequestActualStateArgs m_requestActualStateInformationCommandArgument; diff --git a/examples/SharedMemory/SharedMemoryInterface.h b/examples/SharedMemory/SharedMemoryInterface.h index 6a31a6e94..e8e34b3d6 100644 --- a/examples/SharedMemory/SharedMemoryInterface.h +++ b/examples/SharedMemory/SharedMemoryInterface.h @@ -4,6 +4,7 @@ #define SHARED_MEMORY_KEY 12347 #define SHARED_MEMORY_MAGIC_NUMBER 64738 #define SHARED_MEMORY_MAX_COMMANDS 64 +#define SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE (256*1024) #include "SharedMemoryCommands.h" @@ -31,6 +32,8 @@ struct SharedMemoryExampleData double m_actualStateQdot[MAX_DEGREE_OF_FREEDOM]; double m_actualStateSensors[MAX_NUM_SENSORS];//these are force sensors and IMU information + char m_bulletStreamDataClientToServer[SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE]; + char m_bulletStreamDataServerToClient[SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE]; }; #define SHARED_MEMORY_SIZE sizeof(SharedMemoryExampleData) diff --git a/examples/SharedMemory/premake4.lua b/examples/SharedMemory/premake4.lua index 2d9f28cc1..b0f10c9b8 100644 --- a/examples/SharedMemory/premake4.lua +++ b/examples/SharedMemory/premake4.lua @@ -33,6 +33,8 @@ files { "../Importers/ImportURDFDemo/URDF2Bullet.cpp", "../Importers/ImportURDFDemo/URDF2Bullet.h", "../Utils/b3ResourcePath.cpp", + "../../Extras/Serialize/BulletWorldImporter/*", + "../../Extras/Serialize/BulletFileLoader/*", "../Importers/ImportURDFDemo/URDFImporterInterface.h", "../Importers/ImportURDFDemo/URDFJointTypes.h", "../Importers/ImportObjDemo/Wavefront2GLInstanceGraphicsShape.cpp", diff --git a/src/Bullet3Serialize/Bullet2FileLoader/autogenerated/bullet2.h b/src/Bullet3Serialize/Bullet2FileLoader/autogenerated/bullet2.h index 6db7b4a91..a6b57b1a1 100644 --- a/src/Bullet3Serialize/Bullet2FileLoader/autogenerated/bullet2.h +++ b/src/Bullet3Serialize/Bullet2FileLoader/autogenerated/bullet2.h @@ -17,8 +17,8 @@ * 3. This notice may not be removed or altered from any source distribution. */ // Auto generated from Bullet/Extras/HeaderGenerator/bulletGenerate.py -#ifndef __BULLET_H__ -#define __BULLET_H__ +#ifndef __BULLET2_H__ +#define __BULLET2_H__ namespace Bullet3SerializeBullet2 { // put an empty struct in the case @@ -1050,4 +1050,4 @@ typedef struct bInvalidHandle { } -#endif//__BULLET_H__ \ No newline at end of file +#endif//__BULLET2_H__ \ No newline at end of file diff --git a/src/LinearMath/btSerializer.h b/src/LinearMath/btSerializer.h index 7366a240e..7a8f59af9 100644 --- a/src/LinearMath/btSerializer.h +++ b/src/LinearMath/btSerializer.h @@ -206,7 +206,7 @@ protected: - void writeDNA() + virtual void writeDNA() { btChunk* dnaChunk = allocate(m_dnaLength,1); memcpy(dnaChunk->m_oldPtr,m_dna,m_dnaLength);