report constraint solver analytics data, currently for each island the number of solver iterations used and remaining residual error.
This commit is contained in:
@@ -2214,6 +2214,19 @@ B3_SHARED_API int b3GetStatusType(b3SharedMemoryStatusHandle statusHandle)
|
||||
return CMD_INVALID_STATUS;
|
||||
}
|
||||
|
||||
B3_SHARED_API int b3GetStatusForwardDynamicsAnalyticsData(b3SharedMemoryStatusHandle statusHandle, struct b3ForwardDynamicsAnalyticsArgs* analyticsData)
|
||||
{
|
||||
const SharedMemoryStatus* status = (const SharedMemoryStatus*)statusHandle;
|
||||
//b3Assert(status);
|
||||
if (status)
|
||||
{
|
||||
*analyticsData = status->m_forwardDynamicsAnalyticsArgs;
|
||||
return status->m_forwardDynamicsAnalyticsArgs.m_numIslands;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
B3_SHARED_API int b3GetStatusBodyIndices(b3SharedMemoryStatusHandle statusHandle, int* bodyIndicesOut, int bodyIndicesCapacity)
|
||||
{
|
||||
int numBodies = 0;
|
||||
|
||||
@@ -360,6 +360,9 @@ extern "C"
|
||||
B3_SHARED_API b3SharedMemoryCommandHandle b3InitStepSimulationCommand(b3PhysicsClientHandle physClient);
|
||||
B3_SHARED_API b3SharedMemoryCommandHandle b3InitStepSimulationCommand2(b3SharedMemoryCommandHandle commandHandle);
|
||||
|
||||
B3_SHARED_API int b3GetStatusForwardDynamicsAnalyticsData(b3SharedMemoryStatusHandle statusHandle, struct b3ForwardDynamicsAnalyticsArgs* analyticsData);
|
||||
|
||||
|
||||
B3_SHARED_API b3SharedMemoryCommandHandle b3InitResetSimulationCommand(b3PhysicsClientHandle physClient);
|
||||
B3_SHARED_API b3SharedMemoryCommandHandle b3InitResetSimulationCommand2(b3SharedMemoryCommandHandle commandHandle);
|
||||
|
||||
|
||||
@@ -7605,17 +7605,17 @@ bool PhysicsServerCommandProcessor::processForwardDynamicsCommand(const struct S
|
||||
}
|
||||
|
||||
btScalar deltaTimeScaled = m_data->m_physicsDeltaTime * simTimeScalingFactor;
|
||||
|
||||
m_data->m_dynamicsWorld->getSolverInfo().m_reportSolverAnalytics = true;
|
||||
int numSteps = 0;
|
||||
if (m_data->m_numSimulationSubSteps > 0)
|
||||
{
|
||||
numSteps = m_data->m_dynamicsWorld->stepSimulation(deltaTimeScaled, m_data->m_numSimulationSubSteps, m_data->m_physicsDeltaTime / m_data->m_numSimulationSubSteps);
|
||||
m_data->m_simulationTimestamp += deltaTimeScaled;
|
||||
m_data->m_simulationTimestamp += deltaTimeScaled;
|
||||
}
|
||||
else
|
||||
{
|
||||
numSteps = m_data->m_dynamicsWorld->stepSimulation(deltaTimeScaled, 0);
|
||||
m_data->m_simulationTimestamp += deltaTimeScaled;
|
||||
m_data->m_simulationTimestamp += deltaTimeScaled;
|
||||
}
|
||||
|
||||
if (numSteps > 0)
|
||||
@@ -7624,6 +7624,24 @@ bool PhysicsServerCommandProcessor::processForwardDynamicsCommand(const struct S
|
||||
}
|
||||
|
||||
SharedMemoryStatus& serverCmd = serverStatusOut;
|
||||
|
||||
serverCmd.m_forwardDynamicsAnalyticsArgs.m_numSteps = numSteps;
|
||||
|
||||
btAlignedObjectArray<btSolverAnalyticsData> islandAnalyticsData;
|
||||
|
||||
m_data->m_dynamicsWorld->getAnalyticsData(islandAnalyticsData);
|
||||
serverCmd.m_forwardDynamicsAnalyticsArgs.m_numIslands = islandAnalyticsData.size();
|
||||
int numIslands = btMin(islandAnalyticsData.size(), MAX_ISLANDS_ANALYTICS);
|
||||
|
||||
for (int i=0;i<numIslands;i++)
|
||||
{
|
||||
serverCmd.m_forwardDynamicsAnalyticsArgs.m_numSolverCalls = islandAnalyticsData[i].m_numSolverCalls;
|
||||
serverCmd.m_forwardDynamicsAnalyticsArgs.m_islandData[i].m_islandId = islandAnalyticsData[i].m_islandId;
|
||||
serverCmd.m_forwardDynamicsAnalyticsArgs.m_islandData[i].m_numBodies = islandAnalyticsData[i].m_numBodies;
|
||||
serverCmd.m_forwardDynamicsAnalyticsArgs.m_islandData[i].m_numIterationsUsed = islandAnalyticsData[i].m_numIterationsUsed;
|
||||
serverCmd.m_forwardDynamicsAnalyticsArgs.m_islandData[i].m_remainingLeastSquaresResidual = islandAnalyticsData[i].m_remainingLeastSquaresResidual;
|
||||
serverCmd.m_forwardDynamicsAnalyticsArgs.m_islandData[i].m_numContactManifolds = islandAnalyticsData[i].m_numContactManifolds;
|
||||
}
|
||||
serverCmd.m_type = CMD_STEP_FORWARD_SIMULATION_COMPLETED;
|
||||
|
||||
return hasStatus;
|
||||
|
||||
@@ -957,6 +957,8 @@ struct b3CreateUserShapeArgs
|
||||
b3CreateUserShapeData m_shapes[MAX_COMPOUND_COLLISION_SHAPES];
|
||||
};
|
||||
|
||||
|
||||
|
||||
struct b3CreateUserShapeResultArgs
|
||||
{
|
||||
int m_userShapeUniqueId;
|
||||
@@ -1180,6 +1182,7 @@ struct SharedMemoryStatus
|
||||
struct SyncUserDataArgs m_syncUserDataArgs;
|
||||
struct UserDataResponseArgs m_userDataResponseArgs;
|
||||
struct UserDataRequestArgs m_removeUserDataResponseArgs;
|
||||
struct b3ForwardDynamicsAnalyticsArgs m_forwardDynamicsAnalyticsArgs;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -931,6 +931,7 @@ struct b3PhysicsSimulationParameters
|
||||
int m_minimumSolverIslandSize;
|
||||
};
|
||||
|
||||
|
||||
enum eConstraintSolverTypes
|
||||
{
|
||||
eConstraintSolverLCP_SI = 1,
|
||||
@@ -941,6 +942,25 @@ enum eConstraintSolverTypes
|
||||
eConstraintSolverLCP_BLOCK_PGS,
|
||||
};
|
||||
|
||||
struct b3ForwardDynamicsAnalyticsIslandData
|
||||
{
|
||||
int m_islandId;
|
||||
int m_numBodies;
|
||||
int m_numContactManifolds;
|
||||
int m_numIterationsUsed;
|
||||
double m_remainingLeastSquaresResidual;
|
||||
};
|
||||
|
||||
#define MAX_ISLANDS_ANALYTICS 1024
|
||||
|
||||
struct b3ForwardDynamicsAnalyticsArgs
|
||||
{
|
||||
int m_numSteps;
|
||||
int m_numIslands;
|
||||
int m_numSolverCalls;
|
||||
struct b3ForwardDynamicsAnalyticsIslandData m_islandData[MAX_ISLANDS_ANALYTICS];
|
||||
};
|
||||
|
||||
enum eFileIOActions
|
||||
{
|
||||
eAddFileIOAction = 1024,//avoid collision with eFileIOTypes
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user