From 7441515c0ed7e1005c85184ab614f3b77ad3a471 Mon Sep 17 00:00:00 2001 From: Erwin Coumans Date: Mon, 19 Jun 2017 13:15:05 -0700 Subject: [PATCH] Preliminary version of pybullet.createMultiBody including links connected to parent by a joint. See createMultiBodyLinks.py example. --- examples/SharedMemory/PhysicsClientC_API.cpp | 28 +++--- examples/SharedMemory/PhysicsClientC_API.h | 2 + .../PhysicsServerCommandProcessor.cpp | 85 +++++++++++++++++-- examples/SharedMemory/SharedMemoryCommands.h | 1 - .../pybullet/examples/createMultiBodyLinks.py | 57 +++++++++++++ examples/pybullet/pybullet.c | 33 +++++-- 6 files changed, 181 insertions(+), 25 deletions(-) create mode 100644 examples/pybullet/examples/createMultiBodyLinks.py diff --git a/examples/SharedMemory/PhysicsClientC_API.cpp b/examples/SharedMemory/PhysicsClientC_API.cpp index dde3d2ed8..84f856467 100644 --- a/examples/SharedMemory/PhysicsClientC_API.cpp +++ b/examples/SharedMemory/PhysicsClientC_API.cpp @@ -993,6 +993,12 @@ int b3CreateMultiBodyBase(b3SharedMemoryCommandHandle commandHandle, double mass command->m_createMultiBodyArgs.m_linkVisualShapeUniqueIds[baseLinkIndex] = visualShapeUniqueId; command->m_createMultiBodyArgs.m_linkMasses[baseLinkIndex] = mass; + + command->m_createMultiBodyArgs.m_linkParentIndices[baseLinkIndex] = -2;//no parent + command->m_createMultiBodyArgs.m_linkJointAxis[baseLinkIndex+0]=0; + command->m_createMultiBodyArgs.m_linkJointAxis[baseLinkIndex+1]=0; + command->m_createMultiBodyArgs.m_linkJointAxis[baseLinkIndex+2]=0; + command->m_createMultiBodyArgs.m_linkJointTypes[baseLinkIndex]=-1; command->m_createMultiBodyArgs.m_numLinks++; } return numLinks; @@ -1004,6 +1010,8 @@ int b3CreateMultiBodyLink(b3SharedMemoryCommandHandle commandHandle, double link double linkVisualShapeIndex, double linkPosition[3], double linkOrientation[4], + double linkInertialFramePosition[3], + double linkInertialFrameOrientation[4], int linkParentIndex, int linkJointType, double linkJointAxis[3]) @@ -1033,23 +1041,23 @@ int b3CreateMultiBodyLink(b3SharedMemoryCommandHandle commandHandle, double link command->m_createMultiBodyArgs.m_linkInertias[linkIndex*3+2] = linkMass; - command->m_createMultiBodyArgs.m_linkInertialFramePositions[linkIndex*3+0] = 0; - command->m_createMultiBodyArgs.m_linkInertialFramePositions[linkIndex*3+1] = 0; - command->m_createMultiBodyArgs.m_linkInertialFramePositions[linkIndex*3+2] = 0; + command->m_createMultiBodyArgs.m_linkInertialFramePositions[linkIndex*3+0] = linkInertialFramePosition[0]; + command->m_createMultiBodyArgs.m_linkInertialFramePositions[linkIndex*3+1] = linkInertialFramePosition[1]; + command->m_createMultiBodyArgs.m_linkInertialFramePositions[linkIndex*3+2] = linkInertialFramePosition[2]; - command->m_createMultiBodyArgs.m_linkInertialFrameOrientations[linkIndex*4+0] = 0; - command->m_createMultiBodyArgs.m_linkInertialFrameOrientations[linkIndex*4+1] = 0; - command->m_createMultiBodyArgs.m_linkInertialFrameOrientations[linkIndex*4+2] = 0; - command->m_createMultiBodyArgs.m_linkInertialFrameOrientations[linkIndex*4+3] = 1; + command->m_createMultiBodyArgs.m_linkInertialFrameOrientations[linkIndex*4+0] = linkInertialFrameOrientation[0]; + command->m_createMultiBodyArgs.m_linkInertialFrameOrientations[linkIndex*4+1] = linkInertialFrameOrientation[1]; + command->m_createMultiBodyArgs.m_linkInertialFrameOrientations[linkIndex*4+2] = linkInertialFrameOrientation[2]; + command->m_createMultiBodyArgs.m_linkInertialFrameOrientations[linkIndex*4+3] = linkInertialFrameOrientation[3]; command->m_createMultiBodyArgs.m_linkCollisionShapeUniqueIds[linkIndex]= linkCollisionShapeIndex; command->m_createMultiBodyArgs.m_linkVisualShapeUniqueIds[linkIndex] = linkVisualShapeIndex; command->m_createMultiBodyArgs.m_linkParentIndices[linkIndex] = linkParentIndex; command->m_createMultiBodyArgs.m_linkJointTypes[linkIndex] = linkJointType; - command->m_createMultiBodyArgs.m_linkJointAxis[0] = linkJointAxis[0]; - command->m_createMultiBodyArgs.m_linkJointAxis[1] = linkJointAxis[1]; - command->m_createMultiBodyArgs.m_linkJointAxis[2] = linkJointAxis[2]; + command->m_createMultiBodyArgs.m_linkJointAxis[3*linkIndex+0] = linkJointAxis[0]; + command->m_createMultiBodyArgs.m_linkJointAxis[3*linkIndex+1] = linkJointAxis[1]; + command->m_createMultiBodyArgs.m_linkJointAxis[3*linkIndex+2] = linkJointAxis[2]; command->m_createMultiBodyArgs.m_linkMasses[linkIndex] = linkMass; command->m_createMultiBodyArgs.m_numLinks++; diff --git a/examples/SharedMemory/PhysicsClientC_API.h b/examples/SharedMemory/PhysicsClientC_API.h index 24a3ddd77..9b32a0daf 100644 --- a/examples/SharedMemory/PhysicsClientC_API.h +++ b/examples/SharedMemory/PhysicsClientC_API.h @@ -348,6 +348,8 @@ int b3CreateMultiBodyLink(b3SharedMemoryCommandHandle commandHandle, double link double linkVisualShapeIndex, double linkPosition[3], double linkOrientation[4], + double linkInertialFramePosition[3], + double linkInertialFrameOrientation[4], int linkParentIndex, int linkJointType, double linkJointAxis[3]); diff --git a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp index ee0412a9b..d3a62ec52 100644 --- a/examples/SharedMemory/PhysicsServerCommandProcessor.cpp +++ b/examples/SharedMemory/PhysicsServerCommandProcessor.cpp @@ -1547,7 +1547,11 @@ struct ProgrammaticUrdfInterface : public URDFImporterInterface ///pure virtual interfaces, precondition is a valid linkIndex (you can assert/terminate if the linkIndex is out of range) virtual std::string getLinkName(int linkIndex) const { - return "link"; + std::string linkName = "link"; + char numstr[21]; // enough to hold all numbers up to 64-bits + sprintf(numstr, "%d", linkIndex); + linkName = linkName + numstr; + return linkName; } //various derived class in internal source code break with new pure virtual methods, so provide some default implementation @@ -1587,8 +1591,11 @@ struct ProgrammaticUrdfInterface : public URDFImporterInterface virtual std::string getJointName(int linkIndex) const { - b3Assert(0); - return "joint"; + std::string jointName = "joint"; + char numstr[21]; // enough to hold all numbers up to 64-bits + sprintf(numstr, "%d", linkIndex); + jointName = jointName + numstr; + return jointName; } //fill mass and inertial data. If inertial data is missing, please initialize mass, inertia to sensitive values, and inertialFrame to identity. @@ -1623,7 +1630,7 @@ struct ProgrammaticUrdfInterface : public URDFImporterInterface { for (int i=0;i0) { @@ -5233,6 +5250,10 @@ static PyObject* pybullet_createMultiBody(PyObject* self, PyObject* args, PyObje Py_DECREF(seqLinkJointTypes); if (seqLinkJoinAxis) Py_DECREF(seqLinkJoinAxis); + if (seqLinkInertialFramePositions) + Py_DECREF(seqLinkInertialFramePositions); + if (seqLinkInertialFrameOrientations) + Py_DECREF(seqLinkInertialFrameOrientations); PyErr_SetString(SpamError, "All link arrays need to be same size."); return NULL;