Merge remote-tracking branch 'bp/master'

This commit is contained in:
Erwin Coumans
2017-05-09 11:57:53 -07:00
10 changed files with 235 additions and 52 deletions

View File

@@ -1208,46 +1208,71 @@ int b3GetNumJoints(b3PhysicsClientHandle physClient, int bodyId)
return cl->getNumJoints(bodyId); return cl->getNumJoints(bodyId);
} }
int b3GetJointInfo(b3PhysicsClientHandle physClient, int bodyIndex, int jointIndex, struct b3JointInfo* info) int b3GetJointInfo(b3PhysicsClientHandle physClient, int bodyIndex, int jointIndex, struct b3JointInfo* info)
{ {
PhysicsClient* cl = (PhysicsClient* ) physClient; PhysicsClient* cl = (PhysicsClient* ) physClient;
return cl->getJointInfo(bodyIndex, jointIndex, *info); return cl->getJointInfo(bodyIndex, jointIndex, *info);
} }
b3SharedMemoryCommandHandle b3InitResetDynamicInfo(b3PhysicsClientHandle physClient) b3SharedMemoryCommandHandle b3GetDynamicsInfoCommandInit(b3PhysicsClientHandle physClient, int bodyUniqueId, int linkIndex)
{ {
PhysicsClient* cl = (PhysicsClient* ) physClient; PhysicsClient* cl = (PhysicsClient* ) physClient;
b3Assert(cl); b3Assert(cl);
b3Assert(cl->canSubmitCommand()); b3Assert(cl->canSubmitCommand());
struct SharedMemoryCommand* command = cl->getAvailableSharedMemoryCommand(); struct SharedMemoryCommand* command = cl->getAvailableSharedMemoryCommand();
b3Assert(command); b3Assert(command);
command->m_type = CMD_RESET_DYNAMIC_INFO; command->m_type = CMD_GET_DYNAMICS_INFO;
command->m_getDynamicsInfoArgs.m_bodyUniqueId = bodyUniqueId;
command->m_getDynamicsInfoArgs.m_linkIndex = linkIndex;
return (b3SharedMemoryCommandHandle) command;
}
int b3GetDynamicsInfo(b3SharedMemoryStatusHandle statusHandle, struct b3DynamicsInfo* info)
{
const SharedMemoryStatus* status = (const SharedMemoryStatus* ) statusHandle;
const b3DynamicsInfo &dynamicsInfo = status->m_dynamicsInfo;
btAssert(status->m_type == CMD_GET_DYNAMICS_INFO);
if (status->m_type != CMD_GET_DYNAMICS_INFO_COMPLETED)
return false;
info->m_mass = dynamicsInfo.m_mass;
info->m_lateralFrictionCoeff = dynamicsInfo.m_lateralFrictionCoeff;
return true;
}
b3SharedMemoryCommandHandle b3InitChangeDynamicsInfo(b3PhysicsClientHandle physClient)
{
PhysicsClient* cl = (PhysicsClient* ) physClient;
b3Assert(cl);
b3Assert(cl->canSubmitCommand());
struct SharedMemoryCommand* command = cl->getAvailableSharedMemoryCommand();
b3Assert(command);
command->m_type = CMD_CHANGE_DYNAMICS_INFO;
command->m_updateFlags = 0; command->m_updateFlags = 0;
return (b3SharedMemoryCommandHandle) command; return (b3SharedMemoryCommandHandle) command;
} }
int b3ResetDynamicInfoSetMass(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double mass) int b3ChangeDynamicsInfoSetMass(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double mass)
{ {
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle; struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
b3Assert(command->m_type == CMD_RESET_DYNAMIC_INFO); b3Assert(command->m_type == CMD_CHANGE_DYNAMICS_INFO);
b3Assert(mass > 0); b3Assert(mass > 0);
command->m_resetDynamicInfoArgs.m_bodyUniqueId = bodyUniqueId; command->m_changeDynamicsInfoArgs.m_bodyUniqueId = bodyUniqueId;
command->m_resetDynamicInfoArgs.m_linkIndex = linkIndex; command->m_changeDynamicsInfoArgs.m_linkIndex = linkIndex;
command->m_resetDynamicInfoArgs.m_mass = mass; command->m_changeDynamicsInfoArgs.m_mass = mass;
command->m_updateFlags |= RESET_DYNAMIC_INFO_SET_MASS; command->m_updateFlags |= CHANGE_DYNAMICS_INFO_SET_MASS;
return 0; return 0;
} }
int b3ResetDynamicInfoSetLateralFriction(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double lateralFriction) int b3ChangeDynamicsInfoSetLateralFriction(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double lateralFriction)
{ {
struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle; struct SharedMemoryCommand* command = (struct SharedMemoryCommand*) commandHandle;
b3Assert(command->m_type == CMD_RESET_DYNAMIC_INFO); b3Assert(command->m_type == CMD_CHANGE_DYNAMICS_INFO);
command->m_resetDynamicInfoArgs.m_bodyUniqueId = bodyUniqueId; command->m_changeDynamicsInfoArgs.m_bodyUniqueId = bodyUniqueId;
command->m_resetDynamicInfoArgs.m_linkIndex = linkIndex; command->m_changeDynamicsInfoArgs.m_linkIndex = linkIndex;
command->m_resetDynamicInfoArgs.m_lateralFriction = lateralFriction; command->m_changeDynamicsInfoArgs.m_lateralFriction = lateralFriction;
command->m_updateFlags |= RESET_DYNAMIC_INFO_SET_LATERAL_FRICTION; command->m_updateFlags |= CHANGE_DYNAMICS_INFO_SET_LATERAL_FRICTION;
return 0; return 0;
} }

View File

@@ -77,12 +77,13 @@ int b3GetNumJoints(b3PhysicsClientHandle physClient, int bodyIndex);
///given a body and joint index, return the joint information. See b3JointInfo in SharedMemoryPublic.h ///given a body and joint index, return the joint information. See b3JointInfo in SharedMemoryPublic.h
int b3GetJointInfo(b3PhysicsClientHandle physClient, int bodyIndex, int jointIndex, struct b3JointInfo* info); int b3GetJointInfo(b3PhysicsClientHandle physClient, int bodyIndex, int jointIndex, struct b3JointInfo* info);
///given a body unique id and link index, return the dynamic information. See b3DynamicInfo in SharedMemoryPublic.h b3SharedMemoryCommandHandle b3GetDynamicsInfoCommandInit(b3PhysicsClientHandle physClient, int bodyUniqueId, int linkIndex);
int b3GetDynamicInfo(b3PhysicsClientHandle physClient, int bodyUniqueId, int linkIndex, struct b3DynamicInfo* info); ///given a body unique id and link index, return the dynamics information. See b3DynamicsInfo in SharedMemoryPublic.h
int b3GetDynamicsInfo(b3SharedMemoryStatusHandle statusHandle, struct b3DynamicsInfo* info);
b3SharedMemoryCommandHandle b3InitResetDynamicInfo(b3PhysicsClientHandle physClient); b3SharedMemoryCommandHandle b3InitChangeDynamicsInfo(b3PhysicsClientHandle physClient);
int b3ResetDynamicInfoSetMass(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double mass); int b3ChangeDynamicsInfoSetMass(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double mass);
int b3ResetDynamicInfoSetLateralFriction(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double lateralFriction); int b3ChangeDynamicsInfoSetLateralFriction(b3SharedMemoryCommandHandle commandHandle, int bodyUniqueId, int linkIndex, double lateralFriction);
b3SharedMemoryCommandHandle b3InitCreateUserConstraintCommand(b3PhysicsClientHandle physClient, int parentBodyIndex, int parentJointIndex, int childBodyIndex, int childJointIndex, struct b3JointInfo* info); b3SharedMemoryCommandHandle b3InitCreateUserConstraintCommand(b3PhysicsClientHandle physClient, int parentBodyIndex, int parentJointIndex, int childBodyIndex, int childJointIndex, struct b3JointInfo* info);

View File

@@ -53,6 +53,9 @@ protected:
int m_canvasRGBIndex; int m_canvasRGBIndex;
int m_canvasDepthIndex; int m_canvasDepthIndex;
int m_canvasSegMaskIndex; int m_canvasSegMaskIndex;
btScalar m_lightPos[3];
btScalar m_specularCoeff;
void createButton(const char* name, int id, bool isTrigger ); void createButton(const char* name, int id, bool isTrigger );
@@ -278,6 +281,12 @@ void PhysicsClientExample::prepareAndSubmitCommand(int commandId)
b3RequestCameraImageSetCameraMatrices(commandHandle, viewMatrix,projectionMatrix); b3RequestCameraImageSetCameraMatrices(commandHandle, viewMatrix,projectionMatrix);
b3RequestCameraImageSetPixelResolution(commandHandle, camVisualizerWidth,camVisualizerHeight); b3RequestCameraImageSetPixelResolution(commandHandle, camVisualizerWidth,camVisualizerHeight);
float lightPos[3];
lightPos[0] = m_lightPos[0];
lightPos[1] = m_lightPos[1];
lightPos[2] = m_lightPos[2];
b3RequestCameraImageSetLightDirection(commandHandle, lightPos);
b3RequestCameraImageSetLightSpecularCoeff(commandHandle, m_specularCoeff);
b3SubmitClientCommand(m_physicsClientHandle, commandHandle); b3SubmitClientCommand(m_physicsClientHandle, commandHandle);
break; break;
} }
@@ -522,6 +531,7 @@ m_canvas(0),
m_canvasRGBIndex(-1), m_canvasRGBIndex(-1),
m_canvasDepthIndex(-1), m_canvasDepthIndex(-1),
m_canvasSegMaskIndex(-1), m_canvasSegMaskIndex(-1),
m_specularCoeff(1.0),
m_numMotors(0), m_numMotors(0),
m_options(options), m_options(options),
m_isOptionalServerConnected(false) m_isOptionalServerConnected(false)
@@ -660,6 +670,29 @@ void PhysicsClientExample::createButtons()
} }
} }
} }
{
SliderParams sliderLightPosX("light source position x",&m_lightPos[0]);
SliderParams sliderLightPosY("light source position y",&m_lightPos[1]);
SliderParams sliderLightPosZ("light source position z",&m_lightPos[2]);
SliderParams sliderSpecularCoeff("specular coefficient",&m_specularCoeff);
sliderLightPosX.m_minVal=-1.5;
sliderLightPosX.m_maxVal=1.5;
sliderLightPosY.m_minVal=-1.5;
sliderLightPosY.m_maxVal=1.5;
sliderLightPosZ.m_minVal=-1.5;
sliderLightPosZ.m_maxVal=1.5;
sliderSpecularCoeff.m_minVal=0;
sliderSpecularCoeff.m_maxVal=5.0;
if (m_guiHelper && m_guiHelper->getParameterInterface())
{
m_guiHelper->getParameterInterface()->registerSliderFloatParameter(sliderLightPosX);
m_guiHelper->getParameterInterface()->registerSliderFloatParameter(sliderLightPosY);
m_guiHelper->getParameterInterface()->registerSliderFloatParameter(sliderLightPosZ);
m_guiHelper->getParameterInterface()->registerSliderFloatParameter(sliderSpecularCoeff);
}
}
} }
} }
@@ -684,6 +717,10 @@ void PhysicsClientExample::initPhysics()
m_selectedBody = -1; m_selectedBody = -1;
m_prevSelectedBody = -1; m_prevSelectedBody = -1;
m_lightPos[0] = 1.0;
m_lightPos[1] = 1.0;
m_lightPos[2] = 1.0;
{ {
m_canvas = m_guiHelper->get2dCanvasInterface(); m_canvas = m_guiHelper->get2dCanvasInterface();

View File

@@ -1039,6 +1039,15 @@ const SharedMemoryStatus* PhysicsClientSharedMemory::processServerStatus() {
b3Warning("Removing body failed"); b3Warning("Removing body failed");
break; break;
} }
case CMD_GET_DYNAMICS_INFO_COMPLETED:
{
break;
}
case CMD_GET_DYNAMICS_INFO_FAILED:
{
b3Warning("Request dynamics info failed");
break;
}
default: { default: {
b3Error("Unknown server status %d\n", serverCmd.m_type); b3Error("Unknown server status %d\n", serverCmd.m_type);
btAssert(0); btAssert(0);

View File

@@ -3898,15 +3898,15 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
break; break;
}; };
case CMD_RESET_DYNAMIC_INFO: case CMD_CHANGE_DYNAMICS_INFO:
{ {
BT_PROFILE("CMD_RESET_DYNAMIC_INFO"); BT_PROFILE("CMD_CHANGE_DYNAMICS_INFO");
if (clientCmd.m_updateFlags & RESET_DYNAMIC_INFO_SET_MASS) if (clientCmd.m_updateFlags & CHANGE_DYNAMICS_INFO_SET_MASS)
{ {
int bodyUniqueId = clientCmd.m_resetDynamicInfoArgs.m_bodyUniqueId; int bodyUniqueId = clientCmd.m_changeDynamicsInfoArgs.m_bodyUniqueId;
int linkIndex = clientCmd.m_resetDynamicInfoArgs.m_linkIndex; int linkIndex = clientCmd.m_changeDynamicsInfoArgs.m_linkIndex;
double mass = clientCmd.m_resetDynamicInfoArgs.m_mass; double mass = clientCmd.m_changeDynamicsInfoArgs.m_mass;
btAssert(bodyUniqueId >= 0); btAssert(bodyUniqueId >= 0);
btAssert(linkIndex >= -1); btAssert(linkIndex >= -1);
@@ -3925,11 +3925,11 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
} }
} }
if (clientCmd.m_updateFlags & RESET_DYNAMIC_INFO_SET_LATERAL_FRICTION) if (clientCmd.m_updateFlags & CHANGE_DYNAMICS_INFO_SET_LATERAL_FRICTION)
{ {
int bodyUniqueId = clientCmd.m_resetDynamicInfoArgs.m_bodyUniqueId; int bodyUniqueId = clientCmd.m_changeDynamicsInfoArgs.m_bodyUniqueId;
int linkIndex = clientCmd.m_resetDynamicInfoArgs.m_linkIndex; int linkIndex = clientCmd.m_changeDynamicsInfoArgs.m_linkIndex;
double lateralFriction = clientCmd.m_resetDynamicInfoArgs.m_lateralFriction; double lateralFriction = clientCmd.m_changeDynamicsInfoArgs.m_lateralFriction;
btAssert(bodyUniqueId >= 0); btAssert(bodyUniqueId >= 0);
btAssert(linkIndex >= -1); btAssert(linkIndex >= -1);
@@ -3955,6 +3955,38 @@ bool PhysicsServerCommandProcessor::processCommand(const struct SharedMemoryComm
break; break;
}; };
case CMD_GET_DYNAMICS_INFO:
{
int bodyUniqueId = clientCmd.m_getDynamicsInfoArgs.m_bodyUniqueId;
int linkIndex = clientCmd.m_getDynamicsInfoArgs.m_linkIndex;
InteralBodyData* body = m_data->m_bodyHandles.getHandle(bodyUniqueId);
if (body && body->m_multiBody)
{
SharedMemoryStatus& serverCmd = serverStatusOut;
serverCmd.m_type = CMD_GET_DYNAMICS_INFO_COMPLETED;
btMultiBody* mb = body->m_multiBody;
if (linkIndex == -1)
{
serverCmd.m_dynamicsInfo.m_mass = mb->getBaseMass();
serverCmd.m_dynamicsInfo.m_lateralFrictionCoeff = mb->getBaseCollider()->getFriction();
}
else
{
serverCmd.m_dynamicsInfo.m_mass = mb->getLinkMass(linkIndex);
serverCmd.m_dynamicsInfo.m_lateralFrictionCoeff = mb->getLinkCollider(linkIndex)->getFriction();
}
hasStatus = true;
}
else
{
b3Warning("The dynamic info requested is not available");
SharedMemoryStatus& serverCmd = serverStatusOut;
serverCmd.m_type = CMD_GET_DYNAMICS_INFO_FAILED;
hasStatus = true;
}
break;
}
case CMD_SEND_PHYSICS_SIMULATION_PARAMETERS: case CMD_SEND_PHYSICS_SIMULATION_PARAMETERS:
{ {
BT_PROFILE("CMD_SEND_PHYSICS_SIMULATION_PARAMETERS"); BT_PROFILE("CMD_SEND_PHYSICS_SIMULATION_PARAMETERS");

View File

@@ -106,14 +106,14 @@ struct BulletDataStreamArgs
char m_bodyName[MAX_FILENAME_LENGTH]; char m_bodyName[MAX_FILENAME_LENGTH];
}; };
enum EnumResetDynamicInfoFlags enum EnumChangeDynamicsInfoFlags
{ {
RESET_DYNAMIC_INFO_SET_MASS=1, CHANGE_DYNAMICS_INFO_SET_MASS=1,
RESET_DYNAMIC_INFO_SET_COM=2, CHANGE_DYNAMICS_INFO_SET_COM=2,
RESET_DYNAMIC_INFO_SET_LATERAL_FRICTION=4, CHANGE_DYNAMICS_INFO_SET_LATERAL_FRICTION=4,
}; };
struct ResetDynamicInfoArgs struct ChangeDynamicsInfoArgs
{ {
int m_bodyUniqueId; int m_bodyUniqueId;
int m_linkIndex; int m_linkIndex;
@@ -122,6 +122,12 @@ struct ResetDynamicInfoArgs
double m_lateralFriction; double m_lateralFriction;
}; };
struct GetDynamicsInfoArgs
{
int m_bodyUniqueId;
int m_linkIndex;
};
struct SetJointFeedbackArgs struct SetJointFeedbackArgs
{ {
int m_bodyUniqueId; int m_bodyUniqueId;
@@ -738,7 +744,8 @@ struct SharedMemoryCommand
struct MjcfArgs m_mjcfArguments; struct MjcfArgs m_mjcfArguments;
struct FileArgs m_fileArguments; struct FileArgs m_fileArguments;
struct SdfRequestInfoArgs m_sdfRequestInfoArgs; struct SdfRequestInfoArgs m_sdfRequestInfoArgs;
struct ResetDynamicInfoArgs m_resetDynamicInfoArgs; struct ChangeDynamicsInfoArgs m_changeDynamicsInfoArgs;
struct GetDynamicsInfoArgs m_getDynamicsInfoArgs;
struct InitPoseArgs m_initPoseArgs; struct InitPoseArgs m_initPoseArgs;
struct SendPhysicsSimulationParameters m_physSimParamArgs; struct SendPhysicsSimulationParameters m_physSimParamArgs;
struct BulletDataStreamArgs m_dataStreamArguments; struct BulletDataStreamArgs m_dataStreamArguments;
@@ -832,6 +839,7 @@ struct SharedMemoryStatus
struct StateLoggingResultArgs m_stateLoggingResultArgs; struct StateLoggingResultArgs m_stateLoggingResultArgs;
struct b3OpenGLVisualizerCameraInfo m_visualizerCameraResultArgs; struct b3OpenGLVisualizerCameraInfo m_visualizerCameraResultArgs;
struct b3ObjectArgs m_removeObjectArgs; struct b3ObjectArgs m_removeObjectArgs;
struct b3DynamicsInfo m_dynamicsInfo;
}; };
}; };

View File

@@ -56,7 +56,8 @@ enum EnumSharedMemoryClientCommand
CMD_REQUEST_KEYBOARD_EVENTS_DATA, CMD_REQUEST_KEYBOARD_EVENTS_DATA,
CMD_REQUEST_OPENGL_VISUALIZER_CAMERA, CMD_REQUEST_OPENGL_VISUALIZER_CAMERA,
CMD_REMOVE_BODY, CMD_REMOVE_BODY,
CMD_RESET_DYNAMIC_INFO, CMD_CHANGE_DYNAMICS_INFO,
CMD_GET_DYNAMICS_INFO,
CMD_PROFILE_TIMING, CMD_PROFILE_TIMING,
//don't go beyond this command! //don't go beyond this command!
CMD_MAX_CLIENT_COMMANDS, CMD_MAX_CLIENT_COMMANDS,
@@ -141,6 +142,8 @@ enum EnumSharedMemoryServerStatus
CMD_REQUEST_OPENGL_VISUALIZER_CAMERA_COMPLETED, CMD_REQUEST_OPENGL_VISUALIZER_CAMERA_COMPLETED,
CMD_REMOVE_BODY_COMPLETED, CMD_REMOVE_BODY_COMPLETED,
CMD_REMOVE_BODY_FAILED, CMD_REMOVE_BODY_FAILED,
CMD_GET_DYNAMICS_INFO_COMPLETED,
CMD_GET_DYNAMICS_INFO_FAILED,
//don't go beyond 'CMD_MAX_SERVER_COMMANDS! //don't go beyond 'CMD_MAX_SERVER_COMMANDS!
CMD_MAX_SERVER_COMMANDS CMD_MAX_SERVER_COMMANDS
}; };
@@ -220,10 +223,11 @@ struct b3BodyInfo
const char* m_bodyName; // for btRigidBody, it does not have a base, but can still have a body name from urdf const char* m_bodyName; // for btRigidBody, it does not have a base, but can still have a body name from urdf
}; };
struct b3DynamicInfo struct b3DynamicsInfo
{ {
double m_mass; double m_mass;
double m_localInertialPosition[3]; double m_localInertialPosition[3];
double m_lateralFrictionCoeff;
}; };
// copied from btMultiBodyLink.h // copied from btMultiBodyLink.h

View File

@@ -167,8 +167,12 @@ Vec2f Model::uv(int iface, int nthvert) {
} }
float Model::specular(Vec2f uvf) { float Model::specular(Vec2f uvf) {
Vec2i uv(uvf[0]*specularmap_.get_width(), uvf[1]*specularmap_.get_height()); if (specularmap_.get_width() && specularmap_.get_height())
return specularmap_.get(uv[0], uv[1])[0]/1.f; {
Vec2i uv(uvf[0]*specularmap_.get_width(), uvf[1]*specularmap_.get_height());
return specularmap_.get(uv[0], uv[1])[0]/1.f;
}
return 2.0;
} }
Vec3f Model::normal(int iface, int nthvert) { Vec3f Model::normal(int iface, int nthvert) {

View File

@@ -3,18 +3,21 @@ import time
import math import math
p.connect(p.GUI) p.connect(p.GUI)
planeId = p.loadURDF(fileName="plane.urdf",baseOrientation=[0.25882,0,0,0.96593])
p.loadURDF(fileName="plane.urdf",baseOrientation=[0.25882,0,0,0.96593])
p.loadURDF(fileName="cube.urdf",baseOrientation=[0.25882,0,0,0.96593],basePosition=[0,0,2]) p.loadURDF(fileName="cube.urdf",baseOrientation=[0.25882,0,0,0.96593],basePosition=[0,0,2])
p.loadURDF(fileName="cube.urdf",baseOrientation=[0,0,0,1],basePosition=[0,0,4]) cubeId = p.loadURDF(fileName="cube.urdf",baseOrientation=[0,0,0,1],basePosition=[0,0,4])
p.resetDynamicInfo(bodyUniqueId=2,linkIndex=-1,mass=0.1) p.changeDynamicsInfo(bodyUniqueId=2,linkIndex=-1,mass=0.1)
#p.resetDynamicInfo(bodyUniqueId=2,linkIndex=-1,mass=100.0) #p.changeDynamicsInfo(bodyUniqueId=2,linkIndex=-1,mass=100.0)
p.setGravity(0,0,-10) p.setGravity(0,0,-10)
p.setRealTimeSimulation(0) p.setRealTimeSimulation(0)
t=0 t=0
while 1: while 1:
t=t+1 t=t+1
if t > 400: if t > 400:
p.resetDynamicInfo(bodyUniqueId=0,linkIndex=-1,lateralFriction=0.01) p.changeDynamicsInfo(bodyUniqueId=0,linkIndex=-1,lateralFriction=0.01)
mass1,frictionCoeff1=p.getDynamicsInfo(bodyUniqueId=planeId,linkIndex=-1)
mass2,frictionCoeff2=p.getDynamicsInfo(bodyUniqueId=cubeId,linkIndex=-1)
print mass1,frictionCoeff1
print mass2,frictionCoeff2
time.sleep(.01) time.sleep(.01)
p.stepSimulation() p.stepSimulation()

View File

@@ -604,7 +604,7 @@ static PyObject* pybullet_loadMJCF(PyObject* self, PyObject* args, PyObject* key
return pylist; return pylist;
} }
static PyObject* pybullet_resetDynamicInfo(PyObject* self, PyObject* args, PyObject* keywds) static PyObject* pybullet_changeDynamicsInfo(PyObject* self, PyObject* args, PyObject* keywds)
{ {
int bodyUniqueId = -1; int bodyUniqueId = -1;
int linkIndex = -2; int linkIndex = -2;
@@ -627,17 +627,17 @@ static PyObject* pybullet_resetDynamicInfo(PyObject* self, PyObject* args, PyObj
} }
{ {
b3SharedMemoryCommandHandle command = b3InitResetDynamicInfo(sm); b3SharedMemoryCommandHandle command = b3InitChangeDynamicsInfo(sm);
b3SharedMemoryStatusHandle statusHandle; b3SharedMemoryStatusHandle statusHandle;
if (mass >= 0) if (mass >= 0)
{ {
b3ResetDynamicInfoSetMass(command, bodyUniqueId, linkIndex, mass); b3ChangeDynamicsInfoSetMass(command, bodyUniqueId, linkIndex, mass);
} }
if (lateralFriction >= 0) if (lateralFriction >= 0)
{ {
b3ResetDynamicInfoSetLateralFriction(command, bodyUniqueId, linkIndex, lateralFriction); b3ChangeDynamicsInfoSetLateralFriction(command, bodyUniqueId, linkIndex, lateralFriction);
} }
statusHandle = b3SubmitClientCommandAndWaitStatus(sm, command); statusHandle = b3SubmitClientCommandAndWaitStatus(sm, command);
@@ -647,6 +647,63 @@ static PyObject* pybullet_resetDynamicInfo(PyObject* self, PyObject* args, PyObj
return Py_None; return Py_None;
} }
static PyObject* pybullet_getDynamicsInfo(PyObject* self, PyObject* args, PyObject* keywds)
{
{
int bodyUniqueId = -1;
int linkIndex = -2;
b3PhysicsClientHandle sm = 0;
int physicsClientId = 0;
static char* kwlist[] = {"bodyUniqueId", "linkIndex", "physicsClientId", NULL};
if (!PyArg_ParseTupleAndKeywords(args, keywds, "ii|i", kwlist, &bodyUniqueId, &linkIndex, &physicsClientId))
{
return NULL;
}
sm = getPhysicsClient(physicsClientId);
if (sm == 0)
{
PyErr_SetString(SpamError, "Not connected to physics server.");
return NULL;
}
{
int status_type = 0;
b3SharedMemoryCommandHandle cmd_handle;
b3SharedMemoryStatusHandle status_handle;
if (bodyUniqueId < 0)
{
PyErr_SetString(SpamError, "getDynamicsInfo failed; invalid bodyUniqueId");
return NULL;
}
if (linkIndex < -1)
{
PyErr_SetString(SpamError, "getDynamicsInfo failed; invalid linkIndex");
return NULL;
}
cmd_handle = b3GetDynamicsInfoCommandInit(sm, bodyUniqueId, linkIndex);
status_handle = b3SubmitClientCommandAndWaitStatus(sm, cmd_handle);
status_type = b3GetStatusType(status_handle);
if (status_type != CMD_GET_DYNAMICS_INFO_COMPLETED)
{
PyErr_SetString(SpamError, "getDynamicsInfo failed; invalid return status");
return NULL;
}
struct b3DynamicsInfo info;
if (b3GetDynamicsInfo(status_handle, &info))
{
PyObject* pyDynamicsInfo = PyTuple_New(2);
PyTuple_SetItem(pyDynamicsInfo, 0, PyFloat_FromDouble(info.m_mass));
PyTuple_SetItem(pyDynamicsInfo, 1, PyFloat_FromDouble(info.m_lateralFrictionCoeff));
return pyDynamicsInfo;
}
}
}
PyErr_SetString(SpamError, "Couldn't get dynamics info");
return NULL;
}
static PyObject* pybullet_setPhysicsEngineParameter(PyObject* self, PyObject* args, PyObject* keywds) static PyObject* pybullet_setPhysicsEngineParameter(PyObject* self, PyObject* args, PyObject* keywds)
{ {
double fixedTimeStep = -1; double fixedTimeStep = -1;
@@ -5850,8 +5907,11 @@ static PyMethodDef SpamMethods[] = {
"Reset the state (position, velocity etc) for a joint on a body " "Reset the state (position, velocity etc) for a joint on a body "
"instantaneously, not through physics simulation."}, "instantaneously, not through physics simulation."},
{"resetDynamicInfo", (PyCFunction)pybullet_resetDynamicInfo, METH_VARARGS | METH_KEYWORDS, {"changeDynamicsInfo", (PyCFunction)pybullet_changeDynamicsInfo, METH_VARARGS | METH_KEYWORDS,
"Reset dynamic information such as mass, lateral friction coefficient."}, "change dynamics information such as mass, lateral friction coefficient."},
{"getDynamicsInfo", (PyCFunction)pybullet_getDynamicsInfo, METH_VARARGS | METH_KEYWORDS,
"Get dynamics information such as mass, lateral friction coefficient."},
{"setJointMotorControl", (PyCFunction)pybullet_setJointMotorControl, METH_VARARGS, {"setJointMotorControl", (PyCFunction)pybullet_setJointMotorControl, METH_VARARGS,
"This (obsolete) method cannot select non-zero physicsClientId, use setJointMotorControl2 instead." "This (obsolete) method cannot select non-zero physicsClientId, use setJointMotorControl2 instead."