summaryrefslogtreecommitdiff
path: root/examples/pybullet/pybullet.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/pybullet/pybullet.c')
-rw-r--r--examples/pybullet/pybullet.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/examples/pybullet/pybullet.c b/examples/pybullet/pybullet.c
index 0df3f14da..9946da3cf 100644
--- a/examples/pybullet/pybullet.c
+++ b/examples/pybullet/pybullet.c
@@ -330,6 +330,28 @@ static PyObject* pybullet_stepSimulation(PyObject* self, PyObject* args, PyObjec
statusHandle = b3SubmitClientCommandAndWaitStatus(
sm, b3InitStepSimulationCommand(sm));
statusType = b3GetStatusType(statusHandle);
+
+ if (statusType == CMD_STEP_FORWARD_SIMULATION_COMPLETED)
+ {
+ struct b3ForwardDynamicsAnalyticsArgs analyticsData;
+ int numIslands = 0;
+ int i;
+ numIslands = b3GetStatusForwardDynamicsAnalyticsData(statusHandle, &analyticsData);
+
+ PyObject* pyAnalyticsData = PyTuple_New(numIslands);
+ for (i=0;i<numIslands;i++)
+ {
+ int numFields = 4;
+ PyObject* pyIslandData = PyTuple_New(numFields);
+ PyTuple_SetItem(pyIslandData, 0, PyLong_FromLong(analyticsData.m_islandData[i].m_islandId));
+ PyTuple_SetItem(pyIslandData, 1, PyLong_FromLong(analyticsData.m_islandData[i].m_numBodies));
+ PyTuple_SetItem(pyIslandData, 2, PyLong_FromLong(analyticsData.m_islandData[i].m_numIterationsUsed));
+ PyTuple_SetItem(pyIslandData, 3, PyFloat_FromDouble(analyticsData.m_islandData[i].m_remainingLeastSquaresResidual));
+ PyTuple_SetItem(pyAnalyticsData, i, pyIslandData);
+ }
+
+ return pyAnalyticsData;
+ }
}
}
@@ -1545,8 +1567,9 @@ static PyObject* pybullet_setPhysicsEngineParameter(PyObject* self, PyObject* ar
double globalCFM = -1;
int minimumSolverIslandSize = -1;
-
+ int reportSolverAnalytics = -1;
int physicsClientId = 0;
+
static char* kwlist[] = {"fixedTimeStep",
"numSolverIterations",
"useSplitImpulse",
@@ -1570,10 +1593,12 @@ static PyObject* pybullet_setPhysicsEngineParameter(PyObject* self, PyObject* ar
"constraintSolverType",
"globalCFM",
"minimumSolverIslandSize",
+ "reportSolverAnalytics",
"physicsClientId", NULL};
- if (!PyArg_ParseTupleAndKeywords(args, keywds, "|diidiidiiddddiididdiidii", kwlist, &fixedTimeStep, &numSolverIterations, &useSplitImpulse, &splitImpulsePenetrationThreshold, &numSubSteps,
- &collisionFilterMode, &contactBreakingThreshold, &maxNumCmdPer1ms, &enableFileCaching, &restitutionVelocityThreshold, &erp, &contactERP, &frictionERP, &enableConeFriction, &deterministicOverlappingPairs, &allowedCcdPenetration, &jointFeedbackMode, &solverResidualThreshold, &contactSlop, &enableSAT, &constraintSolverType, &globalCFM, &minimumSolverIslandSize, &physicsClientId))
+ if (!PyArg_ParseTupleAndKeywords(args, keywds, "|diidiidiiddddiididdiidiii", kwlist, &fixedTimeStep, &numSolverIterations, &useSplitImpulse, &splitImpulsePenetrationThreshold, &numSubSteps,
+ &collisionFilterMode, &contactBreakingThreshold, &maxNumCmdPer1ms, &enableFileCaching, &restitutionVelocityThreshold, &erp, &contactERP, &frictionERP, &enableConeFriction, &deterministicOverlappingPairs, &allowedCcdPenetration, &jointFeedbackMode, &solverResidualThreshold, &contactSlop, &enableSAT, &constraintSolverType, &globalCFM, &minimumSolverIslandSize,
+ &reportSolverAnalytics, &physicsClientId))
{
return NULL;
}
@@ -1690,6 +1715,10 @@ static PyObject* pybullet_setPhysicsEngineParameter(PyObject* self, PyObject* ar
{
b3PhysicsParamSetDefaultGlobalCFM(command, globalCFM);
}
+ if (reportSolverAnalytics >= 0)
+ {
+ b3PhysicsParamSetSolverAnalytics(command, reportSolverAnalytics);
+ }
statusHandle = b3SubmitClientCommandAndWaitStatus(sm, command);
}