#include "ConvertGRPCBullet.h" #include "SharedMemory/PhysicsClientC_API.h" #include "SharedMemory/SharedMemoryCommands.h" #include #include #include #include #include #include #include "SharedMemory/grpc/proto/pybullet.grpc.pb.h" #include "LinearMath/btMinMax.h" #define ALLOW_GRPC_COMMAND_CONVERSION #define ALLOW_GRPC_STATUS_CONVERSION using grpc::Server; using grpc::ServerAsyncResponseWriter; using grpc::ServerBuilder; using grpc::ServerCompletionQueue; using grpc::ServerContext; using grpc::Status; using pybullet_grpc::PyBulletCommand; using pybullet_grpc::PyBulletStatus; pybullet_grpc::PyBulletCommand* convertBulletToGRPCCommand(const struct SharedMemoryCommand& clientCmd, pybullet_grpc::PyBulletCommand& grpcCommand) { pybullet_grpc::PyBulletCommand* grpcCmdPtr = 0; grpcCommand.set_commandtype(clientCmd.m_type); switch (clientCmd.m_type) { case CMD_RESET_SIMULATION: { grpcCmdPtr = &grpcCommand; break; } case CMD_REQUEST_KEYBOARD_EVENTS_DATA: { grpcCmdPtr = &grpcCommand; break; } case CMD_USER_CONSTRAINT: { grpcCmdPtr = &grpcCommand; ::pybullet_grpc::UserConstraintCommand* con = grpcCommand.mutable_userconstraintcommand(); con->set_updateflags(clientCmd.m_updateFlags); con->mutable_childframe()->mutable_origin()->set_x(clientCmd.m_userConstraintArguments.m_childFrame[0]); con->mutable_childframe()->mutable_origin()->set_y(clientCmd.m_userConstraintArguments.m_childFrame[1]); con->mutable_childframe()->mutable_origin()->set_z(clientCmd.m_userConstraintArguments.m_childFrame[2]); con->mutable_childframe()->mutable_orientation()->set_x(clientCmd.m_userConstraintArguments.m_childFrame[3]); con->mutable_childframe()->mutable_orientation()->set_y(clientCmd.m_userConstraintArguments.m_childFrame[4]); con->mutable_childframe()->mutable_orientation()->set_z(clientCmd.m_userConstraintArguments.m_childFrame[5]); con->mutable_childframe()->mutable_orientation()->set_w(clientCmd.m_userConstraintArguments.m_childFrame[6]); con->mutable_parentframe()->mutable_origin()->set_x(clientCmd.m_userConstraintArguments.m_parentFrame[0]); con->mutable_parentframe()->mutable_origin()->set_y(clientCmd.m_userConstraintArguments.m_parentFrame[1]); con->mutable_parentframe()->mutable_origin()->set_z(clientCmd.m_userConstraintArguments.m_parentFrame[2]); con->mutable_parentframe()->mutable_orientation()->set_x(clientCmd.m_userConstraintArguments.m_parentFrame[3]); con->mutable_parentframe()->mutable_orientation()->set_y(clientCmd.m_userConstraintArguments.m_parentFrame[4]); con->mutable_parentframe()->mutable_orientation()->set_z(clientCmd.m_userConstraintArguments.m_parentFrame[5]); con->mutable_parentframe()->mutable_orientation()->set_w(clientCmd.m_userConstraintArguments.m_parentFrame[6]); con->mutable_jointaxis()->set_x(clientCmd.m_userConstraintArguments.m_jointAxis[0]); con->mutable_jointaxis()->set_y(clientCmd.m_userConstraintArguments.m_jointAxis[1]); con->mutable_jointaxis()->set_z(clientCmd.m_userConstraintArguments.m_jointAxis[2]); con->set_childbodyindex(clientCmd.m_userConstraintArguments.m_childBodyIndex); con->set_childjointindex(clientCmd.m_userConstraintArguments.m_childJointIndex); con->set_parentbodyindex(clientCmd.m_userConstraintArguments.m_parentBodyIndex); con->set_parentjointindex(clientCmd.m_userConstraintArguments.m_parentJointIndex); con->set_jointtype(clientCmd.m_userConstraintArguments.m_jointType); if (clientCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_MAX_FORCE) { con->set_maxappliedforce(clientCmd.m_userConstraintArguments.m_maxAppliedForce); } if (clientCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_GEAR_RATIO) { con->set_gearratio(clientCmd.m_userConstraintArguments.m_gearRatio); } if (clientCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_GEAR_AUX_LINK) { con->set_gearauxlink(clientCmd.m_userConstraintArguments.m_gearAuxLink); } if (clientCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_RELATIVE_POSITION_TARGET) { con->set_relativepositiontarget(clientCmd.m_userConstraintArguments.m_relativePositionTarget); } if (clientCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_ERP) { con->set_erp(clientCmd.m_userConstraintArguments.m_erp); } con->set_userconstraintuniqueid(-1); break; } case CMD_STEP_FORWARD_SIMULATION: { grpcCmdPtr = &grpcCommand; break; } case CMD_LOAD_URDF: { ::pybullet_grpc::LoadUrdfCommand* urdfCmd = grpcCommand.mutable_loadurdfcommand(); grpcCmdPtr = &grpcCommand; urdfCmd->set_filename(clientCmd.m_urdfArguments.m_urdfFileName); if (clientCmd.m_updateFlags & URDF_ARGS_INITIAL_POSITION) { urdfCmd->mutable_initialposition()->set_x(clientCmd.m_urdfArguments.m_initialPosition[0]); urdfCmd->mutable_initialposition()->set_y(clientCmd.m_urdfArguments.m_initialPosition[1]); urdfCmd->mutable_initialposition()->set_z(clientCmd.m_urdfArguments.m_initialPosition[2]); } if (clientCmd.m_updateFlags & URDF_ARGS_INITIAL_ORIENTATION) { urdfCmd->mutable_initialorientation()->set_x(clientCmd.m_urdfArguments.m_initialOrientation[0]); urdfCmd->mutable_initialorientation()->set_y(clientCmd.m_urdfArguments.m_initialOrientation[1]); urdfCmd->mutable_initialorientation()->set_z(clientCmd.m_urdfArguments.m_initialOrientation[2]); urdfCmd->mutable_initialorientation()->set_w(clientCmd.m_urdfArguments.m_initialOrientation[3]); } if (clientCmd.m_updateFlags & URDF_ARGS_USE_MULTIBODY) { urdfCmd->set_usemultibody(clientCmd.m_urdfArguments.m_useMultiBody); } if (clientCmd.m_updateFlags & URDF_ARGS_USE_FIXED_BASE) { urdfCmd->set_usefixedbase(clientCmd.m_urdfArguments.m_useFixedBase); } if (clientCmd.m_updateFlags & URDF_ARGS_USE_GLOBAL_SCALING) { urdfCmd->set_globalscaling(clientCmd.m_urdfArguments.m_globalScaling); } if (clientCmd.m_updateFlags & URDF_ARGS_HAS_CUSTOM_URDF_FLAGS) { urdfCmd->set_flags(clientCmd.m_urdfArguments.m_urdfFlags); } break; } case CMD_INIT_POSE: { grpcCmdPtr = &grpcCommand; ::pybullet_grpc::InitPoseCommand* pose = grpcCommand.mutable_initposecommand(); { pose->set_bodyuniqueid(clientCmd.m_initPoseArgs.m_bodyUniqueId); pose->set_updateflags(clientCmd.m_updateFlags); int maxQ = 0; for (int q = 0; q < MAX_DEGREE_OF_FREEDOM; q++) { if (clientCmd.m_initPoseArgs.m_hasInitialStateQ[q]) { maxQ = q + 1; } if (clientCmd.m_initPoseArgs.m_hasInitialStateQdot[q]) { maxQ = q + 1; } } for (int q = 0; q < maxQ; q++) { pose->add_hasinitialstateq(clientCmd.m_initPoseArgs.m_hasInitialStateQ[q]); pose->add_hasinitialstateqdot(clientCmd.m_initPoseArgs.m_hasInitialStateQdot[q]); pose->add_initialstateq(clientCmd.m_initPoseArgs.m_initialStateQ[q]); pose->add_initialstateqdot(clientCmd.m_initPoseArgs.m_initialStateQdot[q]); } } break; } case CMD_REQUEST_ACTUAL_STATE: { grpcCmdPtr = &grpcCommand; ::pybullet_grpc::RequestActualStateCommand* grpcCmd = grpcCommand.mutable_requestactualstatecommand(); grpcCmd->set_bodyuniqueid(clientCmd.m_requestActualStateInformationCommandArgument.m_bodyUniqueId); if (clientCmd.m_updateFlags & ACTUAL_STATE_COMPUTE_FORWARD_KINEMATICS) { grpcCmd->set_computeforwardkinematics(true); } if (clientCmd.m_updateFlags & ACTUAL_STATE_COMPUTE_LINKVELOCITY) { grpcCmd->set_computelinkvelocities(true); } break; } case CMD_SEND_DESIRED_STATE: { ::pybullet_grpc::JointMotorControlCommand* motor = grpcCommand.mutable_jointmotorcontrolcommand(); motor->set_bodyuniqueid(clientCmd.m_sendDesiredStateCommandArgument.m_bodyUniqueId); motor->set_controlmode(clientCmd.m_sendDesiredStateCommandArgument.m_controlMode); motor->set_updateflags(clientCmd.m_updateFlags); int maxQ = 0; for (int q = 0; q < MAX_DEGREE_OF_FREEDOM; q++) { if (clientCmd.m_sendDesiredStateCommandArgument.m_hasDesiredStateFlags[q]) { maxQ = q + 1; } } for (int q = 0; q < maxQ; q++) { motor->add_desiredstateq(clientCmd.m_sendDesiredStateCommandArgument.m_desiredStateQ[q]); motor->add_desiredstateqdot(clientCmd.m_sendDesiredStateCommandArgument.m_desiredStateQdot[q]); motor->add_desiredstateforcetorque(clientCmd.m_sendDesiredStateCommandArgument.m_desiredStateForceTorque[q]); motor->add_kd(clientCmd.m_sendDesiredStateCommandArgument.m_Kp[q]); motor->add_kp(clientCmd.m_sendDesiredStateCommandArgument.m_Kp[q]); motor->add_maxvelocity(clientCmd.m_sendDesiredStateCommandArgument.m_rhsClamp[q]); motor->add_hasdesiredstateflags(clientCmd.m_sendDesiredStateCommandArgument.m_hasDesiredStateFlags[q]); } grpcCmdPtr = &grpcCommand; //b3JointControlCommandInit2Internal break; } case CMD_SEND_PHYSICS_SIMULATION_PARAMETERS: { grpcCmdPtr = &grpcCommand; ::pybullet_grpc::PhysicsSimulationParametersCommand* grpcCmd = grpcCommand.mutable_setphysicssimulationparameterscommand(); grpcCmd->set_updateflags(clientCmd.m_updateFlags); ::pybullet_grpc::PhysicsSimulationParameters* params = grpcCmd->mutable_params(); if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_DELTA_TIME) { params->set_deltatime(clientCmd.m_physSimParamArgs.m_deltaTime); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_GRAVITY) { ::pybullet_grpc::vec3* grav = params->mutable_gravityacceleration(); grav->set_x(clientCmd.m_physSimParamArgs.m_gravityAcceleration[0]); grav->set_y(clientCmd.m_physSimParamArgs.m_gravityAcceleration[1]); grav->set_z(clientCmd.m_physSimParamArgs.m_gravityAcceleration[2]); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_NUM_SOLVER_ITERATIONS) { params->set_numsolveriterations(clientCmd.m_physSimParamArgs.m_numSolverIterations); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_NUM_SIMULATION_SUB_STEPS) { params->set_numsimulationsubsteps(clientCmd.m_physSimParamArgs.m_numSimulationSubSteps); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_REAL_TIME_SIMULATION) { params->set_userealtimesimulation(clientCmd.m_physSimParamArgs.m_useRealTimeSimulation); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_DEFAULT_CONTACT_ERP) { params->set_defaultcontacterp(clientCmd.m_physSimParamArgs.m_defaultContactERP); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_INTERNAL_SIMULATION_FLAGS) { params->set_internalsimflags(clientCmd.m_physSimParamArgs.m_internalSimFlags); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_USE_SPLIT_IMPULSE) { params->set_usesplitimpulse(clientCmd.m_physSimParamArgs.m_useSplitImpulse); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_SPLIT_IMPULSE_PENETRATION_THRESHOLD) { params->set_splitimpulsepenetrationthreshold(clientCmd.m_physSimParamArgs.m_splitImpulsePenetrationThreshold); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_COLLISION_FILTER_MODE) { params->set_collisionfiltermode(clientCmd.m_physSimParamArgs.m_collisionFilterMode); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_CONTACT_BREAKING_THRESHOLD) { params->set_contactbreakingthreshold(clientCmd.m_physSimParamArgs.m_contactBreakingThreshold); } if (clientCmd.m_updateFlags & SIM_PARAM_ENABLE_CONE_FRICTION) { params->set_enableconefriction(clientCmd.m_physSimParamArgs.m_enableConeFriction); } if (clientCmd.m_updateFlags & SIM_PARAM_ENABLE_FILE_CACHING) { params->set_enablefilecaching(clientCmd.m_physSimParamArgs.m_enableFileCaching); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_RESTITUTION_VELOCITY_THRESHOLD) { params->set_restitutionvelocitythreshold(clientCmd.m_physSimParamArgs.m_restitutionVelocityThreshold); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_DEFAULT_NON_CONTACT_ERP) { params->set_defaultnoncontacterp(clientCmd.m_physSimParamArgs.m_defaultNonContactERP); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_DEFAULT_FRICTION_ERP) { params->set_frictionerp(clientCmd.m_physSimParamArgs.m_frictionERP); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_DETERMINISTIC_OVERLAPPING_PAIRS) { params->set_deterministicoverlappingpairs(clientCmd.m_physSimParamArgs.m_deterministicOverlappingPairs); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_CCD_ALLOWED_PENETRATION) { params->set_allowedccdpenetration(clientCmd.m_physSimParamArgs.m_allowedCcdPenetration); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_JOINT_FEEDBACK_MODE) { params->set_jointfeedbackmode(clientCmd.m_physSimParamArgs.m_jointFeedbackMode); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_DEFAULT_GLOBAL_CFM) { params->set_defaultglobalcfm(clientCmd.m_physSimParamArgs.m_defaultGlobalCFM); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_DEFAULT_FRICTION_CFM) { params->set_frictioncfm(clientCmd.m_physSimParamArgs.m_frictionCFM); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_SOLVER_RESIDULAL_THRESHOLD) { params->set_solverresidualthreshold(clientCmd.m_physSimParamArgs.m_solverResidualThreshold); } if (clientCmd.m_updateFlags & SIM_PARAM_UPDATE_CONTACT_SLOP) { params->set_contactslop(clientCmd.m_physSimParamArgs.m_contactSlop); } if (clientCmd.m_updateFlags & SIM_PARAM_ENABLE_SAT) { params->set_enablesat(clientCmd.m_physSimParamArgs.m_enableSAT); } if (clientCmd.m_updateFlags & SIM_PARAM_CONSTRAINT_SOLVER_TYPE) { params->set_constraintsolvertype(clientCmd.m_physSimParamArgs.m_constraintSolverType); } if (clientCmd.m_updateFlags & SIM_PARAM_CONSTRAINT_MIN_SOLVER_ISLAND_SIZE) { params->set_minimumsolverislandsize(clientCmd.m_physSimParamArgs.m_minimumSolverIslandSize); } break; } case CMD_REQUEST_BODY_INFO: { grpcCmdPtr = &grpcCommand; ::pybullet_grpc::RequestBodyInfoCommand* grpcCmd = grpcCommand.mutable_requestbodyinfocommand(); grpcCmd->set_bodyuniqueid(clientCmd.m_sdfRequestInfoArgs.m_bodyUniqueId); break; } case CMD_REQUEST_PHYSICS_SIMULATION_PARAMETERS: { grpcCmdPtr = &grpcCommand; break; } case CMD_SYNC_BODY_INFO: { grpcCmdPtr = &grpcCommand; break; } case CMD_REQUEST_INTERNAL_DATA: { grpcCmdPtr = &grpcCommand; break; } case CMD_CONFIGURE_OPENGL_VISUALIZER: { grpcCmdPtr = &grpcCommand; ::pybullet_grpc::ConfigureOpenGLVisualizerCommand* vizCmd = grpcCommand.mutable_configureopenglvisualizercommand(); vizCmd->set_updateflags(clientCmd.m_updateFlags); vizCmd->set_cameradistance(clientCmd.m_configureOpenGLVisualizerArguments.m_cameraDistance); vizCmd->set_camerapitch(clientCmd.m_configureOpenGLVisualizerArguments.m_cameraPitch); vizCmd->set_camerayaw(clientCmd.m_configureOpenGLVisualizerArguments.m_cameraYaw); vizCmd->set_setflag(clientCmd.m_configureOpenGLVisualizerArguments.m_setFlag); vizCmd->set_setenabled(clientCmd.m_configureOpenGLVisualizerArguments.m_setEnabled); ::pybullet_grpc::vec3* targetPos = vizCmd->mutable_cameratargetposition(); targetPos->set_x(clientCmd.m_configureOpenGLVisualizerArguments.m_cameraTargetPosition[0]); targetPos->set_y(clientCmd.m_configureOpenGLVisualizerArguments.m_cameraTargetPosition[1]); targetPos->set_z(clientCmd.m_configureOpenGLVisualizerArguments.m_cameraTargetPosition[2]); break; } case CMD_REQUEST_CAMERA_IMAGE_DATA: { grpcCmdPtr = &grpcCommand; ::pybullet_grpc::RequestCameraImageCommand* cam = grpcCommand.mutable_requestcameraimagecommand(); cam->set_updateflags(clientCmd.m_updateFlags); cam->set_startpixelindex(clientCmd.m_requestPixelDataArguments.m_startPixelIndex); if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_PIXEL_WIDTH_HEIGHT) { cam->set_pixelwidth(clientCmd.m_requestPixelDataArguments.m_pixelWidth); cam->set_pixelheight(clientCmd.m_requestPixelDataArguments.m_pixelHeight); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_SPECULAR_COEFF) { cam->set_lightspecularcoeff(clientCmd.m_requestPixelDataArguments.m_lightSpecularCoeff); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_HAS_FLAGS) { cam->set_cameraflags(clientCmd.m_requestPixelDataArguments.m_flags); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_SHADOW) { cam->set_hasshadow(clientCmd.m_requestPixelDataArguments.m_hasShadow); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_AMBIENT_COEFF) { cam->set_lightambientcoeff(clientCmd.m_requestPixelDataArguments.m_lightAmbientCoeff); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_DIFFUSE_COEFF) { cam->set_lightdiffusecoeff(clientCmd.m_requestPixelDataArguments.m_lightDiffuseCoeff); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_LIGHT_DISTANCE) { cam->set_lightdistance(clientCmd.m_requestPixelDataArguments.m_lightDistance); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_LIGHT_COLOR) { ::pybullet_grpc::vec3* lightColor = cam->mutable_lightcolor(); lightColor->set_x(clientCmd.m_requestPixelDataArguments.m_lightColor[0]); lightColor->set_y(clientCmd.m_requestPixelDataArguments.m_lightColor[1]); lightColor->set_z(clientCmd.m_requestPixelDataArguments.m_lightColor[2]); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_LIGHT_DIRECTION) { ::pybullet_grpc::vec3* lightDir = cam->mutable_lightdirection(); lightDir->set_x(clientCmd.m_requestPixelDataArguments.m_lightDirection[0]); lightDir->set_y(clientCmd.m_requestPixelDataArguments.m_lightDirection[1]); lightDir->set_z(clientCmd.m_requestPixelDataArguments.m_lightDirection[2]); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_HAS_CAMERA_MATRICES) { ::pybullet_grpc::matrix4x4* projMat = cam->mutable_projectionmatrix(); ::pybullet_grpc::matrix4x4* viewMat = cam->mutable_viewmatrix(); for (int i = 0; i < 16; i++) { projMat->add_elems(clientCmd.m_requestPixelDataArguments.m_projectionMatrix[i]); viewMat->add_elems(clientCmd.m_requestPixelDataArguments.m_viewMatrix[i]); } } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_HAS_PROJECTIVE_TEXTURE_MATRICES) { ::pybullet_grpc::matrix4x4* projectiveProjMat = cam->mutable_projectivetextureprojectionmatrix(); ::pybullet_grpc::matrix4x4* projectiveViewMat = cam->mutable_projectivetextureviewmatrix(); for (int i = 0; i < 16; i++) { projectiveProjMat->add_elems(clientCmd.m_requestPixelDataArguments.m_projectiveTextureProjectionMatrix[i]); projectiveViewMat->add_elems(clientCmd.m_requestPixelDataArguments.m_projectiveTextureViewMatrix[i]); } } break; } default: { //printf("convertBulletToGRPCCommand: Unknown command\n"); //assert(0); } }; if (0 == grpcCmdPtr) { grpcCmdPtr = &grpcCommand; //printf("Warning: slow fallback of convertBulletToGRPCCommand (%d)", clientCmd.m_type); //convert an unknown command as binary blob int sz = sizeof(SharedMemoryCommand); if (sz > 0) { grpcCommand.add_unknowncommandbinaryblob((const char*)&clientCmd, sz); } } btAssert(grpcCmdPtr); return grpcCmdPtr; } SharedMemoryCommand* convertGRPCToBulletCommand(const PyBulletCommand& grpcCommand, SharedMemoryCommand& cmd) { SharedMemoryCommand* cmdPtr = 0; cmd.m_type = grpcCommand.commandtype(); if (cmd.m_type == CMD_INVALID) { //derive it from the contents instead if (grpcCommand.has_changedynamicscommand()) { cmd.m_type = CMD_CHANGE_DYNAMICS_INFO; } if (grpcCommand.has_resetsimulationcommand()) { cmd.m_type = CMD_RESET_SIMULATION; } if (grpcCommand.has_loadurdfcommand()) { cmd.m_type = CMD_LOAD_URDF; } if (grpcCommand.has_loadsdfcommand()) { cmd.m_type = CMD_LOAD_SDF; } if (grpcCommand.has_loadmjcfcommand()) { cmd.m_type = CMD_LOAD_MJCF; } if (grpcCommand.has_changedynamicscommand()) { cmd.m_type = CMD_CHANGE_DYNAMICS_INFO; } if (grpcCommand.has_getdynamicscommand()) { cmd.m_type = CMD_GET_DYNAMICS_INFO; } if (grpcCommand.has_initposecommand()) { cmd.m_type = CMD_INIT_POSE; } if (grpcCommand.has_requestactualstatecommand()) { cmd.m_type = CMD_REQUEST_ACTUAL_STATE; } if (grpcCommand.has_stepsimulationcommand()) { cmd.m_type = CMD_STEP_FORWARD_SIMULATION; } } int sz = grpcCommand.unknowncommandbinaryblob_size(); if (sz) { if (sz == 1) { const char* data = grpcCommand.unknowncommandbinaryblob().Get(0).c_str(); int numBytes = grpcCommand.unknowncommandbinaryblob().Get(0).size(); btAssert(sizeof(SharedMemoryCommand) == numBytes); if (sizeof(SharedMemoryCommand) == numBytes) { memcpy(&cmd, data, numBytes); } //printf("slow fallback on command type %d\n", cmd.m_type); } else { printf("Error: Ignore unexpected unknowncommandbinaryblob\n"); } cmdPtr = &cmd; } if (cmdPtr == 0) { switch (cmd.m_type) { case CMD_RESET_SIMULATION: { cmdPtr = &cmd; break; } case CMD_REQUEST_KEYBOARD_EVENTS_DATA: { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; b3RequestKeyboardEventsCommandInit2(commandHandle); break; } case CMD_USER_CONSTRAINT: { SharedMemoryCommand& clientCmd = cmd; cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; const ::pybullet_grpc::UserConstraintCommand* con = &grpcCommand.userconstraintcommand(); clientCmd.m_updateFlags = con->updateflags(); clientCmd.m_userConstraintArguments.m_childFrame[0] = con->childframe().origin().x(); clientCmd.m_userConstraintArguments.m_childFrame[1] = con->childframe().origin().y(); clientCmd.m_userConstraintArguments.m_childFrame[2] = con->childframe().origin().z(); clientCmd.m_userConstraintArguments.m_childFrame[3] = con->childframe().orientation().x(); clientCmd.m_userConstraintArguments.m_childFrame[4] = con->childframe().orientation().y(); clientCmd.m_userConstraintArguments.m_childFrame[5] = con->childframe().orientation().z(); clientCmd.m_userConstraintArguments.m_childFrame[6] = con->childframe().orientation().w(); clientCmd.m_userConstraintArguments.m_parentFrame[0] = con->parentframe().origin().x(); clientCmd.m_userConstraintArguments.m_parentFrame[1] = con->parentframe().origin().y(); clientCmd.m_userConstraintArguments.m_parentFrame[2] = con->parentframe().origin().z(); clientCmd.m_userConstraintArguments.m_parentFrame[3] = con->parentframe().orientation().x(); clientCmd.m_userConstraintArguments.m_parentFrame[4] = con->parentframe().orientation().y(); clientCmd.m_userConstraintArguments.m_parentFrame[5] = con->parentframe().orientation().z(); clientCmd.m_userConstraintArguments.m_parentFrame[6] = con->parentframe().orientation().w(); clientCmd.m_userConstraintArguments.m_jointAxis[0] = con->jointaxis().x(); clientCmd.m_userConstraintArguments.m_jointAxis[1] = con->jointaxis().y(); clientCmd.m_userConstraintArguments.m_jointAxis[2] = con->jointaxis().z(); clientCmd.m_userConstraintArguments.m_childBodyIndex = con->childbodyindex(); clientCmd.m_userConstraintArguments.m_childJointIndex = con->childjointindex(); clientCmd.m_userConstraintArguments.m_parentBodyIndex = con->parentbodyindex(); clientCmd.m_userConstraintArguments.m_parentJointIndex = con->parentjointindex(); clientCmd.m_userConstraintArguments.m_jointType = con->jointtype(); if (clientCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_MAX_FORCE) { clientCmd.m_userConstraintArguments.m_maxAppliedForce = con->maxappliedforce(); } if (clientCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_GEAR_RATIO) { clientCmd.m_userConstraintArguments.m_gearRatio = con->gearratio(); } if (clientCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_GEAR_AUX_LINK) { clientCmd.m_userConstraintArguments.m_gearAuxLink = con->gearauxlink(); } if (clientCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_RELATIVE_POSITION_TARGET) { clientCmd.m_userConstraintArguments.m_relativePositionTarget = con->relativepositiontarget(); } if (clientCmd.m_updateFlags & USER_CONSTRAINT_CHANGE_ERP) { clientCmd.m_userConstraintArguments.m_erp = con->erp(); } break; } case CMD_STEP_FORWARD_SIMULATION: { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; b3InitStepSimulationCommand2(commandHandle); break; } case CMD_LOAD_URDF: { btAssert(grpcCommand.has_loadurdfcommand()); if (grpcCommand.has_loadurdfcommand()) { const ::pybullet_grpc::LoadUrdfCommand& grpcCmd = grpcCommand.loadurdfcommand(); std::string fileName = grpcCmd.filename(); if (fileName.length()) { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; b3LoadUrdfCommandInit2(commandHandle, fileName.c_str()); if (grpcCmd.has_initialposition()) { const ::pybullet_grpc::vec3& pos = grpcCmd.initialposition(); b3LoadUrdfCommandSetStartPosition(commandHandle, pos.x(), pos.y(), pos.z()); } if (grpcCmd.has_initialorientation()) { const ::pybullet_grpc::quat4& orn = grpcCmd.initialorientation(); b3LoadUrdfCommandSetStartOrientation(commandHandle, orn.x(), orn.y(), orn.z(), orn.w()); } if (grpcCmd.hasUseMultiBody_case() == ::pybullet_grpc::LoadUrdfCommand::HasUseMultiBodyCase::kUseMultiBody) { b3LoadUrdfCommandSetUseMultiBody(commandHandle, grpcCmd.usemultibody()); } if (grpcCmd.hasGlobalScaling_case() == ::pybullet_grpc::LoadUrdfCommand::HasGlobalScalingCase::kGlobalScaling) { b3LoadUrdfCommandSetGlobalScaling(commandHandle, grpcCmd.globalscaling()); } if (grpcCmd.hasUseFixedBase_case() == ::pybullet_grpc::LoadUrdfCommand::HasUseFixedBaseCase::kUseFixedBase) { b3LoadUrdfCommandSetUseFixedBase(commandHandle, grpcCmd.usefixedbase()); } if (grpcCmd.flags()) { b3LoadUrdfCommandSetFlags(commandHandle, grpcCmd.flags()); } } } break; } case CMD_INIT_POSE: { btAssert(grpcCommand.has_initposecommand()); if (grpcCommand.has_initposecommand()) { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; const ::pybullet_grpc::InitPoseCommand& grpcCmd = grpcCommand.initposecommand(); b3CreatePoseCommandInit2(commandHandle, grpcCmd.bodyuniqueid()); cmd.m_updateFlags = grpcCmd.updateflags(); double initialQ[MAX_DEGREE_OF_FREEDOM] = {0}; double initialQdot[MAX_DEGREE_OF_FREEDOM] = {0}; int hasInitialQ[MAX_DEGREE_OF_FREEDOM] = {0}; int hasInitialQdot[MAX_DEGREE_OF_FREEDOM] = {0}; if (grpcCmd.initialstateq_size() == grpcCmd.hasinitialstateq_size()) { int numInitial = btMin(grpcCmd.initialstateq_size(), MAX_DEGREE_OF_FREEDOM); for (int i = 0; i < numInitial; i++) { initialQ[i] = grpcCmd.initialstateq(i); hasInitialQ[i] = grpcCmd.hasinitialstateq(i); } if (numInitial) { b3CreatePoseCommandSetQ(commandHandle, numInitial, initialQ, hasInitialQ); } } else { printf("Error: if (grpcCmd.initialstateq_size() != grpcCmd.hasinitialstateq_size())\n"); } if (grpcCmd.initialstateqdot_size() == grpcCmd.hasinitialstateqdot_size()) { int numInitial = btMin(grpcCmd.initialstateqdot_size(), MAX_DEGREE_OF_FREEDOM); for (int i = 0; i < numInitial; i++) { initialQdot[i] = grpcCmd.initialstateqdot(i); hasInitialQdot[i] = grpcCmd.hasinitialstateqdot(i); } if (numInitial) { b3CreatePoseCommandSetQdots(commandHandle, numInitial, initialQdot, hasInitialQdot); } } else { printf("Error: (grpcCmd.initialstateqdot_size() != grpcCmd.hasinitialstateqdot_size())\n"); } } break; } case CMD_REQUEST_ACTUAL_STATE: { btAssert(grpcCommand.has_requestactualstatecommand()); if (grpcCommand.has_requestactualstatecommand()) { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; const ::pybullet_grpc::RequestActualStateCommand& grpcCmd = grpcCommand.requestactualstatecommand(); b3RequestActualStateCommandInit2(commandHandle, grpcCmd.bodyuniqueid()); if (grpcCmd.computeforwardkinematics()) { b3RequestActualStateCommandComputeForwardKinematics(commandHandle, grpcCmd.computeforwardkinematics()); } if (grpcCmd.computelinkvelocities()) { b3RequestActualStateCommandComputeLinkVelocity(commandHandle, grpcCmd.computelinkvelocities()); } } break; } case CMD_SEND_DESIRED_STATE: { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; const ::pybullet_grpc::JointMotorControlCommand* motor = &grpcCommand.jointmotorcontrolcommand(); b3JointControlCommandInit2Internal(commandHandle, motor->bodyuniqueid(), motor->controlmode()); int maxQ = motor->hasdesiredstateflags_size(); for (int q = 0; q < maxQ; q++) { if (motor->hasdesiredstateflags(q) & SIM_DESIRED_STATE_HAS_Q) { b3JointControlSetDesiredPosition(commandHandle, q, motor->desiredstateq(q)); } if (motor->hasdesiredstateflags(q) & SIM_DESIRED_STATE_HAS_QDOT) { b3JointControlSetDesiredVelocity(commandHandle, q, motor->desiredstateqdot(q)); } if (motor->hasdesiredstateflags(q) & SIM_DESIRED_STATE_HAS_KD) { b3JointControlSetKd(commandHandle, q, motor->kd(q)); } if (motor->hasdesiredstateflags(q) & SIM_DESIRED_STATE_HAS_KP) { b3JointControlSetKd(commandHandle, q, motor->kp(q)); } if (motor->hasdesiredstateflags(q) & SIM_DESIRED_STATE_HAS_MAX_FORCE) { b3JointControlSetMaximumForce(commandHandle, q, motor->desiredstateforcetorque(q)); } if (motor->hasdesiredstateflags(q) & SIM_DESIRED_STATE_HAS_RHS_CLAMP) { b3JointControlSetMaximumVelocity(commandHandle, q, motor->maxvelocity(q)); } } //b3JointControlCommandInit2Internal break; } case CMD_SEND_PHYSICS_SIMULATION_PARAMETERS: { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; b3InitPhysicsParamCommand2(commandHandle); int updateFlags = grpcCommand.setphysicssimulationparameterscommand().updateflags(); const ::pybullet_grpc::PhysicsSimulationParameters* params = &grpcCommand.setphysicssimulationparameterscommand().params(); if (updateFlags & SIM_PARAM_UPDATE_DELTA_TIME) { b3PhysicsParamSetTimeStep(commandHandle, params->deltatime()); } if (updateFlags & SIM_PARAM_UPDATE_GRAVITY) { const ::pybullet_grpc::vec3* grav = ¶ms->gravityacceleration(); b3PhysicsParamSetGravity(commandHandle, grav->x(), grav->y(), grav->z()); } if (updateFlags & SIM_PARAM_UPDATE_NUM_SOLVER_ITERATIONS) { b3PhysicsParamSetNumSolverIterations(commandHandle, params->numsolveriterations()); } if (updateFlags & SIM_PARAM_UPDATE_NUM_SIMULATION_SUB_STEPS) { b3PhysicsParamSetNumSubSteps(commandHandle, params->numsimulationsubsteps()); } if (updateFlags & SIM_PARAM_UPDATE_REAL_TIME_SIMULATION) { b3PhysicsParamSetRealTimeSimulation(commandHandle, params->userealtimesimulation()); } if (updateFlags & SIM_PARAM_UPDATE_DEFAULT_CONTACT_ERP) { b3PhysicsParamSetDefaultContactERP(commandHandle, params->defaultcontacterp()); } if (updateFlags & SIM_PARAM_UPDATE_INTERNAL_SIMULATION_FLAGS) { b3PhysicsParamSetInternalSimFlags(commandHandle, params->internalsimflags()); } if (updateFlags & SIM_PARAM_UPDATE_USE_SPLIT_IMPULSE) { b3PhysicsParamSetUseSplitImpulse(commandHandle, params->usesplitimpulse()); } if (updateFlags & SIM_PARAM_UPDATE_SPLIT_IMPULSE_PENETRATION_THRESHOLD) { b3PhysicsParamSetSplitImpulsePenetrationThreshold(commandHandle, params->splitimpulsepenetrationthreshold()); } if (updateFlags & SIM_PARAM_UPDATE_COLLISION_FILTER_MODE) { b3PhysicsParamSetCollisionFilterMode(commandHandle, params->collisionfiltermode()); } if (updateFlags & SIM_PARAM_UPDATE_CONTACT_BREAKING_THRESHOLD) { b3PhysicsParamSetContactBreakingThreshold(commandHandle, params->contactbreakingthreshold()); } if (updateFlags & SIM_PARAM_ENABLE_CONE_FRICTION) { b3PhysicsParamSetEnableConeFriction(commandHandle, params->enableconefriction()); } if (updateFlags & SIM_PARAM_ENABLE_FILE_CACHING) { b3PhysicsParamSetEnableFileCaching(commandHandle, params->enablefilecaching()); } if (updateFlags & SIM_PARAM_UPDATE_RESTITUTION_VELOCITY_THRESHOLD) { b3PhysicsParamSetRestitutionVelocityThreshold(commandHandle, params->restitutionvelocitythreshold()); } if (updateFlags & SIM_PARAM_UPDATE_DEFAULT_NON_CONTACT_ERP) { b3PhysicsParamSetDefaultNonContactERP(commandHandle, params->defaultnoncontacterp()); } if (updateFlags & SIM_PARAM_UPDATE_DEFAULT_FRICTION_ERP) { b3PhysicsParamSetDefaultFrictionERP(commandHandle, params->frictionerp()); } if (updateFlags & SIM_PARAM_UPDATE_DETERMINISTIC_OVERLAPPING_PAIRS) { b3PhysicsParameterSetDeterministicOverlappingPairs(commandHandle, params->deterministicoverlappingpairs()); } if (updateFlags & SIM_PARAM_UPDATE_CCD_ALLOWED_PENETRATION) { b3PhysicsParameterSetAllowedCcdPenetration(commandHandle, params->allowedccdpenetration()); } if (updateFlags & SIM_PARAM_UPDATE_JOINT_FEEDBACK_MODE) { b3PhysicsParameterSetJointFeedbackMode(commandHandle, params->jointfeedbackmode()); } if (updateFlags & SIM_PARAM_UPDATE_DEFAULT_GLOBAL_CFM) { b3PhysicsParamSetDefaultGlobalCFM(commandHandle, params->defaultglobalcfm()); } if (updateFlags & SIM_PARAM_UPDATE_DEFAULT_FRICTION_CFM) { b3PhysicsParamSetDefaultFrictionCFM(commandHandle, params->frictioncfm()); } if (updateFlags & SIM_PARAM_UPDATE_SOLVER_RESIDULAL_THRESHOLD) { b3PhysicsParamSetSolverResidualThreshold(commandHandle, params->solverresidualthreshold()); } if (updateFlags & SIM_PARAM_UPDATE_CONTACT_SLOP) { b3PhysicsParamSetContactSlop(commandHandle, params->contactslop()); } if (updateFlags & SIM_PARAM_ENABLE_SAT) { b3PhysicsParameterSetEnableSAT(commandHandle, params->enablesat()); } if (updateFlags & SIM_PARAM_CONSTRAINT_SOLVER_TYPE) { b3PhysicsParameterSetConstraintSolverType(commandHandle, params->constraintsolvertype()); } if (updateFlags & SIM_PARAM_CONSTRAINT_MIN_SOLVER_ISLAND_SIZE) { b3PhysicsParameterSetMinimumSolverIslandSize(commandHandle, params->minimumsolverislandsize()); } break; } case CMD_REQUEST_BODY_INFO: { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; cmd.m_sdfRequestInfoArgs.m_bodyUniqueId = grpcCommand.requestbodyinfocommand().bodyuniqueid(); break; } case CMD_REQUEST_PHYSICS_SIMULATION_PARAMETERS: { cmdPtr = &cmd; break; } case CMD_SYNC_BODY_INFO: { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; break; } case CMD_REQUEST_INTERNAL_DATA: { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; break; } case CMD_CONFIGURE_OPENGL_VISUALIZER: { btAssert(grpcCommand.has_configureopenglvisualizercommand()); if (grpcCommand.has_configureopenglvisualizercommand()) { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; const ::pybullet_grpc::ConfigureOpenGLVisualizerCommand& grpcCmd = grpcCommand.configureopenglvisualizercommand(); b3InitConfigureOpenGLVisualizer2(commandHandle); cmd.m_updateFlags = grpcCmd.updateflags(); cmd.m_configureOpenGLVisualizerArguments.m_cameraDistance = grpcCmd.cameradistance(); cmd.m_configureOpenGLVisualizerArguments.m_cameraPitch = grpcCmd.camerapitch(); cmd.m_configureOpenGLVisualizerArguments.m_cameraYaw = grpcCmd.camerayaw(); cmd.m_configureOpenGLVisualizerArguments.m_cameraTargetPosition[0] = grpcCmd.cameratargetposition().x(); cmd.m_configureOpenGLVisualizerArguments.m_cameraTargetPosition[1] = grpcCmd.cameratargetposition().y(); cmd.m_configureOpenGLVisualizerArguments.m_cameraTargetPosition[2] = grpcCmd.cameratargetposition().z(); cmd.m_configureOpenGLVisualizerArguments.m_setEnabled = grpcCmd.setenabled(); cmd.m_configureOpenGLVisualizerArguments.m_setFlag = grpcCmd.setflag(); } break; } case CMD_REQUEST_CAMERA_IMAGE_DATA: { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; SharedMemoryCommand& clientCmd = cmd; const ::pybullet_grpc::RequestCameraImageCommand* cam = &grpcCommand.requestcameraimagecommand(); b3InitRequestCameraImage2(commandHandle); clientCmd.m_updateFlags = cam->updateflags(); clientCmd.m_requestPixelDataArguments.m_startPixelIndex = cam->startpixelindex(); if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_PIXEL_WIDTH_HEIGHT) { clientCmd.m_requestPixelDataArguments.m_pixelWidth = cam->pixelwidth(); clientCmd.m_requestPixelDataArguments.m_pixelHeight = cam->pixelheight(); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_SPECULAR_COEFF) { clientCmd.m_requestPixelDataArguments.m_lightSpecularCoeff = cam->lightspecularcoeff(); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_HAS_FLAGS) { clientCmd.m_requestPixelDataArguments.m_flags = cam->cameraflags(); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_SHADOW) { clientCmd.m_requestPixelDataArguments.m_hasShadow = cam->hasshadow(); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_AMBIENT_COEFF) { clientCmd.m_requestPixelDataArguments.m_lightAmbientCoeff = cam->lightambientcoeff(); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_DIFFUSE_COEFF) { clientCmd.m_requestPixelDataArguments.m_lightDiffuseCoeff = cam->lightdiffusecoeff(); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_LIGHT_DISTANCE) { clientCmd.m_requestPixelDataArguments.m_lightDistance = cam->lightdistance(); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_LIGHT_COLOR) { const ::pybullet_grpc::vec3* lightColor = &cam->lightcolor(); clientCmd.m_requestPixelDataArguments.m_lightColor[0] = lightColor->x(); clientCmd.m_requestPixelDataArguments.m_lightColor[1] = lightColor->y(); clientCmd.m_requestPixelDataArguments.m_lightColor[2] = lightColor->z(); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_SET_LIGHT_DIRECTION) { const ::pybullet_grpc::vec3* lightDir = &cam->lightdirection(); clientCmd.m_requestPixelDataArguments.m_lightDirection[0] = lightDir->x(); clientCmd.m_requestPixelDataArguments.m_lightDirection[1] = lightDir->y(); clientCmd.m_requestPixelDataArguments.m_lightDirection[2] = lightDir->z(); } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_HAS_CAMERA_MATRICES) { const ::pybullet_grpc::matrix4x4* projMat = &cam->projectionmatrix(); const ::pybullet_grpc::matrix4x4* viewMat = &cam->viewmatrix(); for (int i = 0; i < 16; i++) { clientCmd.m_requestPixelDataArguments.m_projectionMatrix[i] = projMat->elems(i); clientCmd.m_requestPixelDataArguments.m_viewMatrix[i] = viewMat->elems(i); } } if (clientCmd.m_updateFlags & REQUEST_PIXEL_ARGS_HAS_PROJECTIVE_TEXTURE_MATRICES) { const ::pybullet_grpc::matrix4x4* projectiveProjMat = &cam->projectivetextureprojectionmatrix(); const ::pybullet_grpc::matrix4x4* projectiveViewMat = &cam->projectivetextureviewmatrix(); for (int i = 0; i < 16; i++) { clientCmd.m_requestPixelDataArguments.m_projectiveTextureProjectionMatrix[i] = projectiveProjMat->elems(i); clientCmd.m_requestPixelDataArguments.m_projectiveTextureViewMatrix[i] = projectiveViewMat->elems(i); } } break; } #ifdef ALLOW_GRPC_COMMAND_CONVERSION case CMD_LOAD_SDF: { btAssert(grpcCommand.has_loadsdfcommand()); if (grpcCommand.has_loadsdfcommand()) { const ::pybullet_grpc::LoadSdfCommand& grpcCmd = grpcCommand.loadsdfcommand(); std::string fileName = grpcCmd.filename(); if (fileName.length()) { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; b3LoadSdfCommandInit2(commandHandle, fileName.c_str()); if (grpcCmd.hasUseMultiBody_case() == ::pybullet_grpc::LoadSdfCommand::HasUseMultiBodyCase::kUseMultiBody) { b3LoadSdfCommandSetUseMultiBody(commandHandle, grpcCmd.usemultibody()); } if (grpcCmd.hasGlobalScaling_case() == ::pybullet_grpc::LoadSdfCommand::HasGlobalScalingCase::kGlobalScaling) { b3LoadSdfCommandSetUseGlobalScaling(commandHandle, grpcCmd.globalscaling()); } } } break; } case CMD_LOAD_MJCF: { btAssert(grpcCommand.has_loadmjcfcommand()); if (grpcCommand.has_loadmjcfcommand()) { const pybullet_grpc::LoadMjcfCommand& grpcCmd = grpcCommand.loadmjcfcommand(); std::string fileName = grpcCmd.filename(); if (fileName.length()) { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; b3LoadMJCFCommandInit2(commandHandle, fileName.c_str()); if (grpcCmd.flags()) { b3LoadMJCFCommandSetFlags(commandHandle, grpcCmd.flags()); } } } break; } case CMD_CHANGE_DYNAMICS_INFO: { btAssert(grpcCommand.has_changedynamicscommand()); if (grpcCommand.has_changedynamicscommand()) { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; const ::pybullet_grpc::ChangeDynamicsCommand& grpcCmd = grpcCommand.changedynamicscommand(); int bodyUniqueId = grpcCmd.bodyuniqueid(); int linkIndex = grpcCmd.linkindex(); b3InitChangeDynamicsInfo2(commandHandle); if (grpcCmd.hasMass_case() == ::pybullet_grpc::ChangeDynamicsCommand::HasMassCase::kMass) { b3ChangeDynamicsInfoSetMass(commandHandle, bodyUniqueId, linkIndex, grpcCmd.mass()); } if (grpcCmd.hasLateralFriction_case() == ::pybullet_grpc::ChangeDynamicsCommand::HasLateralFrictionCase::kLateralFriction) { b3ChangeDynamicsInfoSetLateralFriction(commandHandle, bodyUniqueId, linkIndex, grpcCmd.lateralfriction()); } if (grpcCmd.hasSpinningFriction_case() == ::pybullet_grpc::ChangeDynamicsCommand::HasSpinningFrictionCase::kSpinningFriction) { b3ChangeDynamicsInfoSetSpinningFriction(commandHandle, bodyUniqueId, linkIndex, grpcCmd.spinningfriction()); } if (grpcCmd.hasRollingFriction_case() == ::pybullet_grpc::ChangeDynamicsCommand::HasRollingFrictionCase::kRollingFriction) { b3ChangeDynamicsInfoSetRollingFriction(commandHandle, bodyUniqueId, linkIndex, grpcCmd.rollingfriction()); } if (grpcCmd.hasRestitution_case() == ::pybullet_grpc::ChangeDynamicsCommand::HasRestitutionCase::kRestitution) { b3ChangeDynamicsInfoSetRestitution(commandHandle, bodyUniqueId, linkIndex, grpcCmd.restitution()); } if (grpcCmd.haslinearDamping_case() == ::pybullet_grpc::ChangeDynamicsCommand::HaslinearDampingCase::kLinearDamping) { b3ChangeDynamicsInfoSetLinearDamping(commandHandle, bodyUniqueId, grpcCmd.lineardamping()); } if (grpcCmd.hasangularDamping_case() == ::pybullet_grpc::ChangeDynamicsCommand::HasangularDampingCase::kAngularDamping) { b3ChangeDynamicsInfoSetAngularDamping(commandHandle, bodyUniqueId, grpcCmd.angulardamping()); } bool hasContactDamping = grpcCmd.hasContactDamping_case() == ::pybullet_grpc::ChangeDynamicsCommand::HasContactDampingCase::kContactDamping; bool hasContactStiffness = grpcCmd.hasContactStiffness_case() == ::pybullet_grpc::ChangeDynamicsCommand::HasContactStiffnessCase::kContactStiffness; if (hasContactDamping && hasContactStiffness) { b3ChangeDynamicsInfoSetContactStiffnessAndDamping(commandHandle, bodyUniqueId, linkIndex, grpcCmd.contactstiffness(), grpcCmd.contactdamping()); } if (grpcCmd.hasLocalInertiaDiagonal_case() == ::pybullet_grpc::ChangeDynamicsCommand::HasLocalInertiaDiagonalCase::kLocalInertiaDiagonal) { double localInertiaDiag[3] = {grpcCmd.localinertiadiagonal().x(), grpcCmd.localinertiadiagonal().y(), grpcCmd.localinertiadiagonal().z()}; b3ChangeDynamicsInfoSetLocalInertiaDiagonal(commandHandle, bodyUniqueId, linkIndex, localInertiaDiag); } if (grpcCmd.hasFrictionAnchor_case() == ::pybullet_grpc::ChangeDynamicsCommand::HasFrictionAnchorCase::kFrictionAnchor) { b3ChangeDynamicsInfoSetFrictionAnchor(commandHandle, bodyUniqueId, linkIndex, grpcCmd.frictionanchor()); } if (grpcCmd.hasccdSweptSphereRadius_case() == ::pybullet_grpc::ChangeDynamicsCommand::HasccdSweptSphereRadiusCase::kCcdSweptSphereRadius) { b3ChangeDynamicsInfoSetCcdSweptSphereRadius(commandHandle, bodyUniqueId, linkIndex, grpcCmd.ccdsweptsphereradius()); } if (grpcCmd.hasContactProcessingThreshold_case() == ::pybullet_grpc::ChangeDynamicsCommand::HasContactProcessingThresholdCase::kContactProcessingThreshold) { b3ChangeDynamicsInfoSetContactProcessingThreshold(commandHandle, bodyUniqueId, linkIndex, grpcCmd.contactprocessingthreshold()); } if (grpcCmd.hasActivationState_case() == ::pybullet_grpc::ChangeDynamicsCommand::HasActivationStateCase::kActivationState) { b3ChangeDynamicsInfoSetActivationState(commandHandle, bodyUniqueId, grpcCmd.activationstate()); } } break; } case CMD_GET_DYNAMICS_INFO: { btAssert(grpcCommand.has_getdynamicscommand()); if (grpcCommand.has_getdynamicscommand()) { cmdPtr = &cmd; b3SharedMemoryCommandHandle commandHandle = (b3SharedMemoryCommandHandle)cmdPtr; const ::pybullet_grpc::GetDynamicsCommand& grpcCmd = grpcCommand.getdynamicscommand(); b3GetDynamicsInfoCommandInit2(commandHandle, grpcCmd.bodyuniqueid(), grpcCmd.linkindex()); } break; } #endif //ALLOW_GRPC_COMMAND_CONVERSION default: { printf("unknown convertGRPCToBulletCommand"); assert(0); } } } if (0 == cmdPtr) { printf("Error converting convertGRPCToBulletCommand"); } btAssert(cmdPtr); return cmdPtr; } bool convertGRPCToStatus(const PyBulletStatus& grpcReply, SharedMemoryStatus& serverStatus, char* bufferServerToClient, int bufferSizeInBytes) { bool converted = false; serverStatus.m_type = grpcReply.statustype(); int sz = grpcReply.binaryblob().size(); if (sz > 0) { if (sz == 1) { const char* data = grpcReply.binaryblob().Get(0).c_str(); int numBytes = grpcReply.binaryblob().Get(0).size(); //printf("copied binary blob of %d bytes\n", numBytes); memcpy(bufferServerToClient, data, numBytes); serverStatus.m_numDataStreamBytes = numBytes; } else { printf("Ignore unexpected binary blobs\n"); } } #ifdef ALLOW_GRPC_STATUS_CONVERSION switch (grpcReply.statustype()) { case CMD_ACTUAL_STATE_UPDATE_COMPLETED: { converted = true; const ::pybullet_grpc::SendActualStateStatus* stat = &grpcReply.actualstatestatus(); serverStatus.m_sendActualStateArgs.m_bodyUniqueId = stat->bodyuniqueid(); int numLinks = stat->numlinks(); serverStatus.m_sendActualStateArgs.m_numLinks = numLinks; int numDegreeOfFreedomQ = stat->numdegreeoffreedomq(); int numDegreeOfFreedomU = stat->numdegreeoffreedomu(); serverStatus.m_sendActualStateArgs.m_numDegreeOfFreedomQ = numDegreeOfFreedomQ; serverStatus.m_sendActualStateArgs.m_numDegreeOfFreedomU = numDegreeOfFreedomU; serverStatus.m_sendActualStateArgs.m_stateDetails = (SendActualStateSharedMemoryStorage*)bufferServerToClient; for (int i = 0; i < numDegreeOfFreedomQ; i++) { serverStatus.m_sendActualStateArgs.m_stateDetails->m_actualStateQ[i] = stat->actualstateq(i); } for (int i = 0; i < numDegreeOfFreedomU; i++) { serverStatus.m_sendActualStateArgs.m_stateDetails->m_actualStateQdot[i] = stat->actualstateqdot(i); } for (int i = 0; i < 7; i++) { serverStatus.m_sendActualStateArgs.m_rootLocalInertialFrame[i] = stat->rootlocalinertialframe(i); } for (int i = 0; i < numLinks * 7; i++) { serverStatus.m_sendActualStateArgs.m_stateDetails->m_linkLocalInertialFrames[i] = stat->linklocalinertialframes(i); } for (int i = 0; i < numLinks * 6; i++) { serverStatus.m_sendActualStateArgs.m_stateDetails->m_jointReactionForces[i] = stat->jointreactionforces(i); } for (int i = 0; i < numLinks; i++) { serverStatus.m_sendActualStateArgs.m_stateDetails->m_jointMotorForce[i] = stat->jointmotorforce(i); } for (int i = 0; i < numLinks * 7; i++) { serverStatus.m_sendActualStateArgs.m_stateDetails->m_linkState[i] = stat->linkstate(i); } for (int i = 0; i < numLinks * 6; i++) { serverStatus.m_sendActualStateArgs.m_stateDetails->m_linkWorldVelocities[i] = stat->linkworldvelocities(i); } break; } case CMD_REQUEST_KEYBOARD_EVENTS_DATA_COMPLETED: { converted = true; const ::pybullet_grpc::KeyboardEventsStatus* keys = &grpcReply.keyboardeventsstatus(); serverStatus.m_sendKeyboardEvents.m_numKeyboardEvents = keys->keyboardevents_size(); for (int i = 0; i < serverStatus.m_sendKeyboardEvents.m_numKeyboardEvents; i++) { const ::pybullet_grpc::KeyboardEvent* key = &keys->keyboardevents(i); serverStatus.m_sendKeyboardEvents.m_keyboardEvents[i].m_keyCode = key->keycode(); serverStatus.m_sendKeyboardEvents.m_keyboardEvents[i].m_keyState = key->keystate(); } break; } case CMD_REQUEST_PHYSICS_SIMULATION_PARAMETERS_COMPLETED: { const ::pybullet_grpc::PhysicsSimulationParameters* params = &grpcReply.requestphysicssimulationparametersstatus(); serverStatus.m_simulationParameterResultArgs.m_allowedCcdPenetration = params->allowedccdpenetration(); serverStatus.m_simulationParameterResultArgs.m_collisionFilterMode = params->collisionfiltermode(); serverStatus.m_simulationParameterResultArgs.m_constraintSolverType = params->constraintsolvertype(); serverStatus.m_simulationParameterResultArgs.m_contactBreakingThreshold = params->contactbreakingthreshold(); serverStatus.m_simulationParameterResultArgs.m_contactSlop = params->contactslop(); serverStatus.m_simulationParameterResultArgs.m_defaultContactERP = params->defaultcontacterp(); serverStatus.m_simulationParameterResultArgs.m_defaultGlobalCFM = params->defaultglobalcfm(); serverStatus.m_simulationParameterResultArgs.m_defaultNonContactERP = params->defaultnoncontacterp(); serverStatus.m_simulationParameterResultArgs.m_deltaTime = params->deltatime(); serverStatus.m_simulationParameterResultArgs.m_deterministicOverlappingPairs = params->deterministicoverlappingpairs(); serverStatus.m_simulationParameterResultArgs.m_enableConeFriction = params->enableconefriction(); serverStatus.m_simulationParameterResultArgs.m_enableFileCaching = params->enablefilecaching(); serverStatus.m_simulationParameterResultArgs.m_enableSAT = params->enablesat(); serverStatus.m_simulationParameterResultArgs.m_frictionCFM = params->frictioncfm(); serverStatus.m_simulationParameterResultArgs.m_frictionERP = params->frictionerp(); serverStatus.m_simulationParameterResultArgs.m_gravityAcceleration[0] = params->gravityacceleration().x(); serverStatus.m_simulationParameterResultArgs.m_gravityAcceleration[1] = params->gravityacceleration().y(); serverStatus.m_simulationParameterResultArgs.m_gravityAcceleration[2] = params->gravityacceleration().z(); serverStatus.m_simulationParameterResultArgs.m_internalSimFlags = params->internalsimflags(); serverStatus.m_simulationParameterResultArgs.m_jointFeedbackMode = params->jointfeedbackmode(); serverStatus.m_simulationParameterResultArgs.m_minimumSolverIslandSize = params->minimumsolverislandsize(); serverStatus.m_simulationParameterResultArgs.m_numSimulationSubSteps = params->numsimulationsubsteps(); serverStatus.m_simulationParameterResultArgs.m_numSolverIterations = params->numsolveriterations(); serverStatus.m_simulationParameterResultArgs.m_restitutionVelocityThreshold = params->restitutionvelocitythreshold(); serverStatus.m_simulationParameterResultArgs.m_solverResidualThreshold = params->solverresidualthreshold(); serverStatus.m_simulationParameterResultArgs.m_splitImpulsePenetrationThreshold = params->splitimpulsepenetrationthreshold(); serverStatus.m_simulationParameterResultArgs.m_useRealTimeSimulation = params->userealtimesimulation(); serverStatus.m_simulationParameterResultArgs.m_useSplitImpulse = params->usesplitimpulse(); converted = true; break; } case CMD_BODY_INFO_COMPLETED: { converted = true; serverStatus.m_dataStreamArguments.m_bodyUniqueId = grpcReply.requestbodyinfostatus().bodyuniqueid(); serverStatus.m_dataStreamArguments.m_bodyName[0] = 0; serverStatus.m_dataStreamArguments.m_bulletFileName[0] = 0; if (grpcReply.requestbodyinfostatus().bodyname().length()) { strcpy(serverStatus.m_dataStreamArguments.m_bodyName, grpcReply.requestbodyinfostatus().bodyname().c_str()); } break; } case CMD_SYNC_BODY_INFO_COMPLETED: { serverStatus.m_sdfLoadedArgs.m_numBodies = grpcReply.syncbodiesstatus().bodyuniqueids_size(); for (int i = 0; i < serverStatus.m_sdfLoadedArgs.m_numBodies; i++) { serverStatus.m_sdfLoadedArgs.m_bodyUniqueIds[i] = grpcReply.syncbodiesstatus().bodyuniqueids(i); } serverStatus.m_sdfLoadedArgs.m_numUserConstraints = grpcReply.syncbodiesstatus().userconstraintuniqueids_size(); for (int i = 0; i < serverStatus.m_sdfLoadedArgs.m_numUserConstraints; i++) { serverStatus.m_sdfLoadedArgs.m_userConstraintUniqueIds[i] = grpcReply.syncbodiesstatus().userconstraintuniqueids(i); } converted = true; break; } case CMD_CLIENT_COMMAND_COMPLETED: { converted = true; break; } case CMD_REQUEST_INTERNAL_DATA_COMPLETED: { converted = true; break; } case CMD_URDF_LOADING_COMPLETED: { converted = true; serverStatus.m_dataStreamArguments.m_bodyUniqueId = grpcReply.urdfstatus().bodyuniqueid(); if (grpcReply.urdfstatus().bodyname().length() > 0 && grpcReply.urdfstatus().bodyname().length() < (MAX_FILENAME_LENGTH - 1)) { strcpy(serverStatus.m_dataStreamArguments.m_bodyName, grpcReply.urdfstatus().bodyname().c_str()); } else { serverStatus.m_dataStreamArguments.m_bodyName[0] = 0; } if (grpcReply.urdfstatus().filename().length() > 0 && grpcReply.urdfstatus().filename().length() < (MAX_FILENAME_LENGTH - 1)) { strcpy(serverStatus.m_dataStreamArguments.m_bulletFileName, grpcReply.urdfstatus().filename().c_str()); } else { serverStatus.m_dataStreamArguments.m_bulletFileName[0] = 0; } break; } case CMD_SDF_LOADING_COMPLETED: { converted = true; const ::pybullet_grpc::SdfLoadedStatus* stat = &grpcReply.sdfstatus(); int numBodies = stat->bodyuniqueids_size(); if (numBodies > MAX_SDF_BODIES) { printf("SDF exceeds body capacity: %d > %d", numBodies, MAX_SDF_BODIES); } serverStatus.m_sdfLoadedArgs.m_numBodies = numBodies; for (int i = 0; i < numBodies; i++) { serverStatus.m_sdfLoadedArgs.m_bodyUniqueIds[i] = stat->bodyuniqueids(i); } break; } case CMD_DESIRED_STATE_RECEIVED_COMPLETED: { converted = true; break; } case CMD_USER_CONSTRAINT_COMPLETED: { const ::pybullet_grpc::UserConstraintStatus* con = &grpcReply.userconstraintstatus(); serverStatus.m_userConstraintResultArgs.m_userConstraintUniqueId = con->userconstraintuniqueid(); serverStatus.m_userConstraintResultArgs.m_maxAppliedForce = con->maxappliedforce(); converted = true; break; } case CMD_STEP_FORWARD_SIMULATION_COMPLETED: { converted = true; break; } case CMD_RESET_SIMULATION_COMPLETED: { converted = true; break; } case CMD_CAMERA_IMAGE_COMPLETED: { converted = true; const ::pybullet_grpc::RequestCameraImageStatus* cam = &grpcReply.requestcameraimagestatus(); serverStatus.m_sendPixelDataArguments.m_imageWidth = cam->imagewidth(); serverStatus.m_sendPixelDataArguments.m_imageHeight = cam->imageheight(); serverStatus.m_sendPixelDataArguments.m_numPixelsCopied = cam->numpixelscopied(); serverStatus.m_sendPixelDataArguments.m_numRemainingPixels = cam->numremainingpixels(); serverStatus.m_sendPixelDataArguments.m_startingPixelIndex = cam->startingpixelindex(); break; } case CMD_GET_DYNAMICS_INFO_COMPLETED: { converted = true; const ::pybullet_grpc::GetDynamicsStatus* stat = &grpcReply.getdynamicsstatus(); serverStatus.m_dynamicsInfo.m_mass = stat->mass(); serverStatus.m_dynamicsInfo.m_lateralFrictionCoeff = stat->lateralfriction(); serverStatus.m_dynamicsInfo.m_spinningFrictionCoeff = stat->spinningfriction(); serverStatus.m_dynamicsInfo.m_rollingFrictionCoeff = stat->rollingfriction(); serverStatus.m_dynamicsInfo.m_restitution = stat->restitution(); serverStatus.m_dynamicsInfo.m_linearDamping = stat->lineardamping(); serverStatus.m_dynamicsInfo.m_angularDamping = stat->angulardamping(); serverStatus.m_dynamicsInfo.m_contactStiffness = stat->contactstiffness(); serverStatus.m_dynamicsInfo.m_contactDamping = stat->contactdamping(); serverStatus.m_dynamicsInfo.m_localInertialDiagonal[0] = stat->localinertiadiagonal().x(); serverStatus.m_dynamicsInfo.m_localInertialDiagonal[1] = stat->localinertiadiagonal().y(); serverStatus.m_dynamicsInfo.m_localInertialDiagonal[2] = stat->localinertiadiagonal().z(); serverStatus.m_dynamicsInfo.m_frictionAnchor = stat->frictionanchor(); serverStatus.m_dynamicsInfo.m_ccdSweptSphereRadius = stat->ccdsweptsphereradius(); serverStatus.m_dynamicsInfo.m_contactProcessingThreshold = stat->contactprocessingthreshold(); serverStatus.m_dynamicsInfo.m_activationState = stat->activationstate(); break; } default: { #endif //ALLOW_GRPC_STATUS_CONVERSION if (grpcReply.unknownstatusbinaryblob_size() > 0) { if (grpcReply.unknownstatusbinaryblob_size() == 1) { //printf("convertStatusToGRPC: slow fallback status (%d), slow fallback", grpcReply.statustype()); const char* data = grpcReply.unknownstatusbinaryblob().Get(0).c_str(); int numBytes = grpcReply.unknownstatusbinaryblob().Get(0).size(); btAssert(sizeof(SharedMemoryStatus) == numBytes); if (sizeof(SharedMemoryStatus) == numBytes) { memcpy(&serverStatus, data, numBytes); } //printf("slow fallback on command type %d\n", serverStatus.m_type); btAssert(grpcReply.statustype() == serverStatus.m_type); converted = true; } else { printf("unexpected unknownstatusbinaryblob_size\n"); } } else { printf("unknown status and no slow fallback in convertStatusToGRPC %d\n", grpcReply.statustype()); } #ifdef ALLOW_GRPC_STATUS_CONVERSION } }; #endif //ALLOW_GRPC_STATUS_CONVERSION return converted; } bool convertStatusToGRPC(const SharedMemoryStatus& serverStatus, char* bufferServerToClient, int bufferSizeInBytes, PyBulletStatus& grpcReply) { bool converted = false; grpcReply.set_statustype(serverStatus.m_type); if (serverStatus.m_numDataStreamBytes) { grpcReply.add_binaryblob(bufferServerToClient, serverStatus.m_numDataStreamBytes); } #ifdef ALLOW_GRPC_STATUS_CONVERSION switch (serverStatus.m_type) { case CMD_REQUEST_KEYBOARD_EVENTS_DATA_COMPLETED: { converted = true; ::pybullet_grpc::KeyboardEventsStatus* keys = grpcReply.mutable_keyboardeventsstatus(); for (int i = 0; i < serverStatus.m_sendKeyboardEvents.m_numKeyboardEvents; i++) { ::pybullet_grpc::KeyboardEvent* key = keys->add_keyboardevents(); key->set_keycode(serverStatus.m_sendKeyboardEvents.m_keyboardEvents[i].m_keyCode); key->set_keystate(serverStatus.m_sendKeyboardEvents.m_keyboardEvents[i].m_keyState); } break; } case CMD_REQUEST_PHYSICS_SIMULATION_PARAMETERS_COMPLETED: { ::pybullet_grpc::PhysicsSimulationParameters* params = grpcReply.mutable_requestphysicssimulationparametersstatus(); params->set_allowedccdpenetration(serverStatus.m_simulationParameterResultArgs.m_allowedCcdPenetration); params->set_collisionfiltermode(serverStatus.m_simulationParameterResultArgs.m_collisionFilterMode); params->set_constraintsolvertype(serverStatus.m_simulationParameterResultArgs.m_constraintSolverType); params->set_contactbreakingthreshold(serverStatus.m_simulationParameterResultArgs.m_contactBreakingThreshold); params->set_contactslop(serverStatus.m_simulationParameterResultArgs.m_contactSlop); params->set_defaultcontacterp(serverStatus.m_simulationParameterResultArgs.m_defaultContactERP); params->set_defaultglobalcfm(serverStatus.m_simulationParameterResultArgs.m_defaultGlobalCFM); params->set_defaultnoncontacterp(serverStatus.m_simulationParameterResultArgs.m_defaultNonContactERP); params->set_deltatime(serverStatus.m_simulationParameterResultArgs.m_deltaTime); params->set_deterministicoverlappingpairs(serverStatus.m_simulationParameterResultArgs.m_deterministicOverlappingPairs); params->set_enableconefriction(serverStatus.m_simulationParameterResultArgs.m_enableConeFriction); params->set_enablefilecaching(serverStatus.m_simulationParameterResultArgs.m_enableFileCaching); params->set_enablesat(serverStatus.m_simulationParameterResultArgs.m_enableSAT); params->set_frictioncfm(serverStatus.m_simulationParameterResultArgs.m_frictionCFM); params->set_frictionerp(serverStatus.m_simulationParameterResultArgs.m_frictionERP); ::pybullet_grpc::vec3* grav = params->mutable_gravityacceleration(); grav->set_x(serverStatus.m_simulationParameterResultArgs.m_gravityAcceleration[0]); grav->set_y(serverStatus.m_simulationParameterResultArgs.m_gravityAcceleration[1]); grav->set_z(serverStatus.m_simulationParameterResultArgs.m_gravityAcceleration[2]); params->set_internalsimflags(serverStatus.m_simulationParameterResultArgs.m_internalSimFlags); params->set_jointfeedbackmode(serverStatus.m_simulationParameterResultArgs.m_jointFeedbackMode); params->set_minimumsolverislandsize(serverStatus.m_simulationParameterResultArgs.m_minimumSolverIslandSize); params->set_numsimulationsubsteps(serverStatus.m_simulationParameterResultArgs.m_numSimulationSubSteps); params->set_numsolveriterations(serverStatus.m_simulationParameterResultArgs.m_numSolverIterations); params->set_restitutionvelocitythreshold(serverStatus.m_simulationParameterResultArgs.m_restitutionVelocityThreshold); params->set_solverresidualthreshold(serverStatus.m_simulationParameterResultArgs.m_solverResidualThreshold); params->set_splitimpulsepenetrationthreshold(serverStatus.m_simulationParameterResultArgs.m_splitImpulsePenetrationThreshold); params->set_userealtimesimulation(serverStatus.m_simulationParameterResultArgs.m_useRealTimeSimulation); params->set_usesplitimpulse(serverStatus.m_simulationParameterResultArgs.m_useSplitImpulse); converted = true; break; } case CMD_BODY_INFO_COMPLETED: { converted = true; ::pybullet_grpc::RequestBodyInfoStatus* stat = grpcReply.mutable_requestbodyinfostatus(); stat->set_bodyuniqueid(serverStatus.m_dataStreamArguments.m_bodyUniqueId); stat->set_bodyname(serverStatus.m_dataStreamArguments.m_bodyName); break; } case CMD_SYNC_BODY_INFO_COMPLETED: { ::pybullet_grpc::SyncBodiesStatus* stat = grpcReply.mutable_syncbodiesstatus(); for (int i = 0; i < serverStatus.m_sdfLoadedArgs.m_numBodies; i++) { stat->add_bodyuniqueids(serverStatus.m_sdfLoadedArgs.m_bodyUniqueIds[i]); } for (int i = 0; i < serverStatus.m_sdfLoadedArgs.m_numUserConstraints; i++) { stat->add_userconstraintuniqueids(serverStatus.m_sdfLoadedArgs.m_userConstraintUniqueIds[i]); } converted = true; break; } case CMD_REQUEST_INTERNAL_DATA_COMPLETED: { converted = true; break; } case CMD_URDF_LOADING_COMPLETED: { converted = true; ::pybullet_grpc::LoadUrdfStatus* stat = grpcReply.mutable_urdfstatus(); b3SharedMemoryStatusHandle statusHandle = (b3SharedMemoryStatusHandle)&serverStatus; int objectUniqueId = b3GetStatusBodyIndex(statusHandle); stat->set_bodyuniqueid(objectUniqueId); break; } case CMD_SDF_LOADING_COMPLETED: { converted = true; int bodyIndicesOut[MAX_SDF_BODIES]; ::pybullet_grpc::SdfLoadedStatus* stat = grpcReply.mutable_sdfstatus(); b3SharedMemoryStatusHandle statusHandle = (b3SharedMemoryStatusHandle)&serverStatus; int numBodies = b3GetStatusBodyIndices(statusHandle, bodyIndicesOut, MAX_SDF_BODIES); if (numBodies > MAX_SDF_BODIES) { printf("SDF exceeds body capacity: %d > %d", numBodies, MAX_SDF_BODIES); } for (int i = 0; i < numBodies; i++) { stat->add_bodyuniqueids(bodyIndicesOut[i]); } break; } case CMD_MJCF_LOADING_COMPLETED: { converted = true; int bodyIndicesOut[MAX_SDF_BODIES]; ::pybullet_grpc::MjcfLoadedStatus* stat = grpcReply.mutable_mjcfstatus(); b3SharedMemoryStatusHandle statusHandle = (b3SharedMemoryStatusHandle)&serverStatus; int numBodies = b3GetStatusBodyIndices(statusHandle, bodyIndicesOut, MAX_SDF_BODIES); if (numBodies > MAX_SDF_BODIES) { printf("MJCF exceeds body capacity: %d > %d", numBodies, MAX_SDF_BODIES); } for (int i = 0; i < numBodies; i++) { stat->add_bodyuniqueids(bodyIndicesOut[i]); } break; } case CMD_GET_DYNAMICS_INFO_COMPLETED: { converted = true; b3DynamicsInfo info; b3SharedMemoryStatusHandle statusHandle = (b3SharedMemoryStatusHandle)&serverStatus; if (b3GetDynamicsInfo(statusHandle, &info)) { ::pybullet_grpc::GetDynamicsStatus* stat = grpcReply.mutable_getdynamicsstatus(); stat->set_mass(info.m_mass); stat->set_lateralfriction(info.m_lateralFrictionCoeff); stat->set_spinningfriction(info.m_spinningFrictionCoeff); stat->set_rollingfriction(info.m_rollingFrictionCoeff); stat->set_restitution(info.m_restitution); stat->set_lineardamping(info.m_linearDamping); stat->set_angulardamping(info.m_angularDamping); stat->set_contactstiffness(info.m_contactStiffness); stat->set_contactdamping(info.m_contactDamping); pybullet_grpc::vec3* localInertia = stat->mutable_localinertiadiagonal(); localInertia->set_x(info.m_localInertialDiagonal[0]); localInertia->set_y(info.m_localInertialDiagonal[1]); localInertia->set_z(info.m_localInertialDiagonal[2]); stat->set_frictionanchor(info.m_frictionAnchor); stat->set_ccdsweptsphereradius(info.m_ccdSweptSphereRadius); stat->set_contactprocessingthreshold(info.m_contactProcessingThreshold); stat->set_activationstate(info.m_activationState); } break; } case CMD_ACTUAL_STATE_UPDATE_COMPLETED: { converted = true; SharedMemoryStatus* status = (SharedMemoryStatus*)&serverStatus; status->m_sendActualStateArgs.m_stateDetails = (SendActualStateSharedMemoryStorage*)bufferServerToClient; b3SharedMemoryStatusHandle statusHandle = (b3SharedMemoryStatusHandle)status; int bodyUniqueId; int numLinks; int numDegreeOfFreedomQ; int numDegreeOfFreedomU; const double* rootLocalInertialFramePtr = 0; const double* actualStateQptr = 0; const double* actualStateQdotPtr = 0; const double* jointReactionForcesPtr = 0; const double* linkLocalInertialFrames = 0; const double* jointMotorForces = 0; const double* linkStates = 0; const double* linkWorldVelocities = 0; if (b3GetStatusActualState2( statusHandle, &bodyUniqueId, &numLinks, &numDegreeOfFreedomQ, &numDegreeOfFreedomU, &rootLocalInertialFramePtr, &actualStateQptr, &actualStateQdotPtr, &jointReactionForcesPtr, &linkLocalInertialFrames, &jointMotorForces, &linkStates, &linkWorldVelocities)) { ::pybullet_grpc::SendActualStateStatus* stat = grpcReply.mutable_actualstatestatus(); stat->set_bodyuniqueid(bodyUniqueId); stat->set_numlinks(numLinks); stat->set_numdegreeoffreedomq(numDegreeOfFreedomQ); stat->set_numdegreeoffreedomu(numDegreeOfFreedomU); for (int i = 0; i < numDegreeOfFreedomQ; i++) { stat->add_actualstateq(actualStateQptr[i]); } for (int i = 0; i < numDegreeOfFreedomU; i++) { stat->add_actualstateqdot(actualStateQdotPtr[i]); } for (int i = 0; i < 7; i++) { stat->add_rootlocalinertialframe(rootLocalInertialFramePtr[i]); } for (int i = 0; i < numLinks * 7; i++) { stat->add_linklocalinertialframes(linkLocalInertialFrames[i]); } for (int i = 0; i < numLinks * 6; i++) { stat->add_jointreactionforces(jointReactionForcesPtr[i]); } for (int i = 0; i < numLinks; i++) { stat->add_jointmotorforce(jointMotorForces[i]); } for (int i = 0; i < numLinks * 7; i++) { stat->add_linkstate(linkStates[i]); } for (int i = 0; i < numLinks * 6; i++) { stat->add_linkworldvelocities(linkWorldVelocities[i]); } } break; } case CMD_CLIENT_COMMAND_COMPLETED: { converted = true; //no action needed? break; } case CMD_DESIRED_STATE_RECEIVED_COMPLETED: { converted = true; break; } case CMD_USER_CONSTRAINT_COMPLETED: { ::pybullet_grpc::UserConstraintStatus* con = grpcReply.mutable_userconstraintstatus(); con->set_userconstraintuniqueid(serverStatus.m_userConstraintResultArgs.m_userConstraintUniqueId); con->set_maxappliedforce(serverStatus.m_userConstraintResultArgs.m_maxAppliedForce); converted = true; break; } case CMD_STEP_FORWARD_SIMULATION_COMPLETED: { converted = true; break; } case CMD_RESET_SIMULATION_COMPLETED: { converted = true; break; } case CMD_CAMERA_IMAGE_COMPLETED: { converted = true; ::pybullet_grpc::RequestCameraImageStatus* cam = grpcReply.mutable_requestcameraimagestatus(); cam->set_imagewidth(serverStatus.m_sendPixelDataArguments.m_imageWidth); cam->set_imageheight(serverStatus.m_sendPixelDataArguments.m_imageHeight); cam->set_numpixelscopied(serverStatus.m_sendPixelDataArguments.m_numPixelsCopied); cam->set_numremainingpixels(serverStatus.m_sendPixelDataArguments.m_numRemainingPixels); cam->set_startingpixelindex(serverStatus.m_sendPixelDataArguments.m_startingPixelIndex); break; } /* case CMD_USER_CONSTRAINT_INFO_COMPLETED: { } case CMD_USER_CONSTRAINT_REQUEST_STATE_COMPLETED: { } */ default: { #endif //ALLOW_GRPC_STATUS_CONVERSION \ //printf("convertStatusToGRPC: unknown status (%d), slow fallback", serverStatus.m_type); int sz = sizeof(SharedMemoryStatus); grpcReply.add_unknownstatusbinaryblob((const char*)&serverStatus, sz); converted = true; #ifdef ALLOW_GRPC_STATUS_CONVERSION } } #endif //ALLOW_GRPC_STATUS_CONVERSION return converted; }