123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506 |
- #ifndef SHARED_MEMORY_COMMANDS_H
- #define SHARED_MEMORY_COMMANDS_H
- //this is a very experimental draft of commands. We will iterate on this API (commands, arguments etc)
- #include "SharedMemoryPublic.h"
- #ifdef __GNUC__
- #include <stdint.h>
- typedef int32_t smInt32_t;
- typedef int64_t smInt64_t;
- typedef uint32_t smUint32_t;
- typedef uint64_t smUint64_t;
- #elif defined(_MSC_VER)
- typedef __int32 smInt32_t;
- typedef __int64 smInt64_t;
- typedef unsigned __int32 smUint32_t;
- typedef unsigned __int64 smUint64_t;
- #else
- typedef int smInt32_t;
- typedef long long int smInt64_t;
- typedef unsigned int smUint32_t;
- typedef unsigned long long int smUint64_t;
- #endif
- #define SHARED_MEMORY_MAX_STREAM_CHUNK_SIZE (256*1024)
- #define SHARED_MEMORY_SERVER_TEST_C
- #define MAX_DEGREE_OF_FREEDOM 128
- #define MAX_NUM_SENSORS 256
- #define MAX_URDF_FILENAME_LENGTH 1024
- #define MAX_SDF_FILENAME_LENGTH 1024
- #define MAX_FILENAME_LENGTH MAX_URDF_FILENAME_LENGTH
- #define MAX_NUM_LINKS MAX_DEGREE_OF_FREEDOM
- #define MAX_SDF_BODIES 500
- struct TmpFloat3
- {
- float m_x;
- float m_y;
- float m_z;
- };
- #ifdef _WIN32
- __inline
- #else
- inline
- #endif
- TmpFloat3 CreateTmpFloat3(float x, float y, float z)
- {
- TmpFloat3 tmp;
- tmp.m_x = x;
- tmp.m_y = y;
- tmp.m_z = z;
- return tmp;
- }
- enum EnumSdfArgsUpdateFlags
- {
- SDF_ARGS_FILE_NAME=1,
- };
- struct SdfArgs
- {
- char m_sdfFileName[MAX_URDF_FILENAME_LENGTH];
- int m_useMultiBody;
- };
- enum EnumUrdfArgsUpdateFlags
- {
- URDF_ARGS_FILE_NAME=1,
- URDF_ARGS_INITIAL_POSITION=2,
- URDF_ARGS_INITIAL_ORIENTATION=4,
- URDF_ARGS_USE_MULTIBODY=8,
- URDF_ARGS_USE_FIXED_BASE=16,
- };
- struct UrdfArgs
- {
- char m_urdfFileName[MAX_URDF_FILENAME_LENGTH];
- double m_initialPosition[3];
- double m_initialOrientation[4];
- int m_useMultiBody;
- int m_useFixedBase;
- };
- struct BulletDataStreamArgs
- {
- char m_bulletFileName[MAX_FILENAME_LENGTH];
- int m_streamChunkLength;
- int m_bodyUniqueId;
- };
- struct SetJointFeedbackArgs
- {
- int m_bodyUniqueId;
- int m_linkId;
- int m_isEnabled;
- };
- enum EnumInitPoseFlags
- {
- INIT_POSE_HAS_INITIAL_POSITION=1,
- INIT_POSE_HAS_INITIAL_ORIENTATION=2,
- INIT_POSE_HAS_JOINT_STATE=4
- };
- ///InitPoseArgs is mainly to initialize (teleport) the robot in a particular position
- ///No motors or controls are needed to initialize the pose. It is similar to
- ///moving a robot to a starting place, while it is switched off. It is only called
- ///at the start of a robot control session. All velocities and control forces are cleared to zero.
- struct InitPoseArgs
- {
- int m_bodyUniqueId;
- int m_hasInitialStateQ[MAX_DEGREE_OF_FREEDOM];
- double m_initialStateQ[MAX_DEGREE_OF_FREEDOM];
- };
- struct RequestDebugLinesArgs
- {
- int m_debugMode;
- int m_startingLineIndex;
- };
- struct RequestPixelDataArgs
- {
- float m_viewMatrix[16];
- float m_projectionMatrix[16];
- int m_startPixelIndex;
- int m_pixelWidth;
- int m_pixelHeight;
- };
- enum EnumRequestPixelDataUpdateFlags
- {
- REQUEST_PIXEL_ARGS_HAS_CAMERA_MATRICES=1,
- REQUEST_PIXEL_ARGS_SET_PIXEL_WIDTH_HEIGHT=4,
- //don't exceed (1<<15), because this enum is shared with EnumRenderer in SharedMemoryPublic.h
-
- };
- struct RequestContactDataArgs
- {
- int m_startingContactPointIndex;
- int m_objectAIndexFilter;
- int m_objectBIndexFilter;
- };
- struct SendDebugLinesArgs
- {
- int m_startingLineIndex;
- int m_numDebugLines;
- int m_numRemainingDebugLines;
- };
- struct SendPixelDataArgs
- {
- int m_imageWidth;
- int m_imageHeight;
- int m_startingPixelIndex;
- int m_numPixelsCopied;
- int m_numRemainingPixels;
- };
- struct PickBodyArgs
- {
- double m_rayFromWorld[3];
- double m_rayToWorld[3];
- };
- ///Controlling a robot involves sending the desired state to its joint motor controllers.
- ///The control mode determines the state variables used for motor control.
- struct SendDesiredStateArgs
- {
- int m_bodyUniqueId;
- int m_controlMode;
- //PD parameters in case m_controlMode == CONTROL_MODE_POSITION_VELOCITY_PD
- double m_Kp[MAX_DEGREE_OF_FREEDOM];//indexed by degree of freedom, 6 for base, and then the dofs for each link
- double m_Kd[MAX_DEGREE_OF_FREEDOM];//indexed by degree of freedom, 6 for base, and then the dofs for each link
- int m_hasDesiredStateFlags[MAX_DEGREE_OF_FREEDOM];
-
- //desired state is only written by the client, read-only access by server is expected
- //m_desiredStateQ is indexed by position variables,
- //starting with 3 base position variables, 4 base orientation variables (quaternion), then link position variables
- double m_desiredStateQ[MAX_DEGREE_OF_FREEDOM];
-
- //m_desiredStateQdot is index by velocity degrees of freedom, 3 linear and 3 angular variables for the base and then link velocity variables
- double m_desiredStateQdot[MAX_DEGREE_OF_FREEDOM];
-
- //m_desiredStateForceTorque is either the actual applied force/torque (in CONTROL_MODE_TORQUE) or
- //or the maximum applied force/torque for the PD/motor/constraint to reach the desired velocity in CONTROL_MODE_VELOCITY and CONTROL_MODE_POSITION_VELOCITY_PD mode
- //indexed by degree of freedom, 6 dof base, and then dofs for each link
- double m_desiredStateForceTorque[MAX_DEGREE_OF_FREEDOM];
-
- };
- enum EnumSimDesiredStateUpdateFlags
- {
- SIM_DESIRED_STATE_HAS_Q=1,
- SIM_DESIRED_STATE_HAS_QDOT=2,
- SIM_DESIRED_STATE_HAS_KD=4,
- SIM_DESIRED_STATE_HAS_KP=8,
- SIM_DESIRED_STATE_HAS_MAX_FORCE=16,
- };
- enum EnumSimParamUpdateFlags
- {
- SIM_PARAM_UPDATE_DELTA_TIME=1,
- SIM_PARAM_UPDATE_GRAVITY=2,
- SIM_PARAM_UPDATE_NUM_SOLVER_ITERATIONS=4,
- SIM_PARAM_UPDATE_NUM_SIMULATION_SUB_STEPS=8,
- SIM_PARAM_UPDATE_REAL_TIME_SIMULATION = 16,
- SIM_PARAM_UPDATE_DEFAULT_CONTACT_ERP=32
- };
- ///Controlling a robot involves sending the desired state to its joint motor controllers.
- ///The control mode determines the state variables used for motor control.
- struct SendPhysicsSimulationParameters
- {
- double m_deltaTime;
- double m_gravityAcceleration[3];
- int m_numSimulationSubSteps;
- int m_numSolverIterations;
- bool m_allowRealTimeSimulation;
- double m_defaultContactERP;
- };
- struct RequestActualStateArgs
- {
- int m_bodyUniqueId;
- };
- struct SendActualStateArgs
- {
- int m_bodyUniqueId;
- int m_numDegreeOfFreedomQ;
- int m_numDegreeOfFreedomU;
- double m_rootLocalInertialFrame[7];
-
- //actual state is only written by the server, read-only access by client is expected
- double m_actualStateQ[MAX_DEGREE_OF_FREEDOM];
- double m_actualStateQdot[MAX_DEGREE_OF_FREEDOM];
- //measured 6DOF force/torque sensors: force[x,y,z] and torque[x,y,z]
- double m_jointReactionForces[6*MAX_DEGREE_OF_FREEDOM];
- double m_jointMotorForce[MAX_DEGREE_OF_FREEDOM];
-
- double m_linkState[7*MAX_NUM_LINKS];
- double m_linkLocalInertialFrames[7*MAX_NUM_LINKS];
- };
- enum EnumSensorTypes
- {
- SENSOR_FORCE_TORQUE=1,
- SENSOR_IMU=2,
- };
- struct CreateSensorArgs
- {
- int m_bodyUniqueId;
- int m_numJointSensorChanges;
- int m_sensorType[MAX_DEGREE_OF_FREEDOM];
-
- ///todo: clean up the duplication, make sure no-one else is using those members directly (use C-API header instead)
- int m_jointIndex[MAX_DEGREE_OF_FREEDOM];
- int m_enableJointForceSensor[MAX_DEGREE_OF_FREEDOM];
- int m_linkIndex[MAX_DEGREE_OF_FREEDOM];
- int m_enableSensor[MAX_DEGREE_OF_FREEDOM];
-
- };
- typedef struct SharedMemoryCommand SharedMemoryCommand_t;
- enum EnumBoxShapeFlags
- {
- BOX_SHAPE_HAS_INITIAL_POSITION=1,
- BOX_SHAPE_HAS_INITIAL_ORIENTATION=2,
- BOX_SHAPE_HAS_HALF_EXTENTS=4,
- BOX_SHAPE_HAS_MASS=8,
- BOX_SHAPE_HAS_COLLISION_SHAPE_TYPE=16,
- BOX_SHAPE_HAS_COLOR=32,
- };
- ///This command will be replaced to allow arbitrary collision shape types
- struct CreateBoxShapeArgs
- {
- double m_halfExtentsX;
- double m_halfExtentsY;
- double m_halfExtentsZ;
- double m_mass;
- int m_collisionShapeType;//see SharedMemoryPublic.h
- double m_initialPosition[3];
- double m_initialOrientation[4];
- double m_colorRGBA[4];
- };
- struct SdfLoadedArgs
- {
- int m_numBodies;
- int m_bodyUniqueIds[MAX_SDF_BODIES];
-
- ///@todo(erwincoumans) load cameras, lights etc
- //int m_numCameras;
- //int m_numLights;
- };
- struct SdfRequestInfoArgs
- {
- int m_bodyUniqueId;
- };
- ///flags for b3ApplyExternalTorque and b3ApplyExternalForce
- enum EnumExternalForcePrivateFlags
- {
- // EF_LINK_FRAME=1,
- // EF_WORLD_FRAME=2,
- EF_TORQUE=4,
- EF_FORCE=8,
- };
- struct ExternalForceArgs
- {
- int m_numForcesAndTorques;
- int m_bodyUniqueIds[MAX_SDF_BODIES];
- int m_linkIds[MAX_SDF_BODIES];
- double m_forcesAndTorques[3*MAX_SDF_BODIES];
- double m_positions[3*MAX_SDF_BODIES];
- int m_forceFlags[MAX_SDF_BODIES];
- };
- enum EnumSdfRequestInfoFlags
- {
- SDF_REQUEST_INFO_BODY=1,
- //SDF_REQUEST_INFO_CAMERA=2,
- };
- struct CalculateInverseDynamicsArgs
- {
- int m_bodyUniqueId;
- double m_jointPositionsQ[MAX_DEGREE_OF_FREEDOM];
- double m_jointVelocitiesQdot[MAX_DEGREE_OF_FREEDOM];
- double m_jointAccelerations[MAX_DEGREE_OF_FREEDOM];
- };
- struct CalculateInverseDynamicsResultArgs
- {
- int m_bodyUniqueId;
- int m_dofCount;
- double m_jointForces[MAX_DEGREE_OF_FREEDOM];
- };
- struct CalculateJacobianArgs
- {
- int m_bodyUniqueId;
- int m_linkIndex;
- double m_localPosition[3];
- double m_jointPositionsQ[MAX_DEGREE_OF_FREEDOM];
- double m_jointVelocitiesQdot[MAX_DEGREE_OF_FREEDOM];
- double m_jointAccelerations[MAX_DEGREE_OF_FREEDOM];
- };
- struct CalculateJacobianResultArgs
- {
- int m_dofCount;
- double m_linearJacobian[3*MAX_DEGREE_OF_FREEDOM];
- double m_angularJacobian[3*MAX_DEGREE_OF_FREEDOM];
- };
- enum EnumCalculateInverseKinematicsFlags
- {
- IK_HAS_TARGET_POSITION=1,
- IK_HAS_TARGET_ORIENTATION=2,
- IK_HAS_NULL_SPACE_VELOCITY=4,
- //IK_HAS_CURRENT_JOINT_POSITIONS=8,//not used yet
- };
- struct CalculateInverseKinematicsArgs
- {
- int m_bodyUniqueId;
- // double m_jointPositionsQ[MAX_DEGREE_OF_FREEDOM];
- double m_targetPosition[3];
- double m_targetOrientation[4];//orientation represented as quaternion, x,y,z,w
- int m_endEffectorLinkIndex;
- double m_lowerLimit[MAX_DEGREE_OF_FREEDOM];
- double m_upperLimit[MAX_DEGREE_OF_FREEDOM];
- double m_jointRange[MAX_DEGREE_OF_FREEDOM];
- double m_restPose[MAX_DEGREE_OF_FREEDOM];
- };
- struct CalculateInverseKinematicsResultArgs
- {
- int m_bodyUniqueId;
- int m_dofCount;
- double m_jointPositions[MAX_DEGREE_OF_FREEDOM];
- };
- struct CreateJointArgs
- {
- int m_parentBodyIndex;
- int m_parentJointIndex;
- int m_childBodyIndex;
- int m_childJointIndex;
- double m_parentFrame[7];
- double m_childFrame[7];
- double m_jointAxis[3];
- int m_jointType;
- };
- struct SharedMemoryCommand
- {
- int m_type;
- smUint64_t m_timeStamp;
- int m_sequenceNumber;
-
- //m_updateFlags is a bit fields to tell which parameters need updating
- //for example m_updateFlags = SIM_PARAM_UPDATE_DELTA_TIME | SIM_PARAM_UPDATE_NUM_SOLVER_ITERATIONS;
- int m_updateFlags;
- union
- {
- struct UrdfArgs m_urdfArguments;
- struct SdfArgs m_sdfArguments;
- struct SdfRequestInfoArgs m_sdfRequestInfoArgs;
- struct InitPoseArgs m_initPoseArgs;
- struct SendPhysicsSimulationParameters m_physSimParamArgs;
- struct BulletDataStreamArgs m_dataStreamArguments;
- struct SendDesiredStateArgs m_sendDesiredStateCommandArgument;
- struct RequestActualStateArgs m_requestActualStateInformationCommandArgument;
- struct CreateSensorArgs m_createSensorArguments;
- struct CreateBoxShapeArgs m_createBoxShapeArguments;
- struct RequestDebugLinesArgs m_requestDebugLinesArguments;
- struct RequestPixelDataArgs m_requestPixelDataArguments;
- struct PickBodyArgs m_pickBodyArguments;
- struct ExternalForceArgs m_externalForceArguments;
- struct CalculateInverseDynamicsArgs m_calculateInverseDynamicsArguments;
- struct CalculateJacobianArgs m_calculateJacobianArguments;
- struct CreateJointArgs m_createJointArguments;
- struct RequestContactDataArgs m_requestContactPointArguments;
- struct CalculateInverseKinematicsArgs m_calculateInverseKinematicsArguments;
- };
- };
- struct RigidBodyCreateArgs
- {
- int m_bodyUniqueId;
- };
- struct SendContactDataArgs
- {
- int m_startingContactPointIndex;
- int m_numContactPointsCopied;
- int m_numRemainingContactPoints;
- };
- struct SharedMemoryStatus
- {
- int m_type;
-
- smUint64_t m_timeStamp;
- int m_sequenceNumber;
-
- union
- {
- struct BulletDataStreamArgs m_dataStreamArguments;
- struct SdfLoadedArgs m_sdfLoadedArgs;
- struct SendActualStateArgs m_sendActualStateArgs;
- struct SendDebugLinesArgs m_sendDebugLinesArgs;
- struct SendPixelDataArgs m_sendPixelDataArguments;
- struct RigidBodyCreateArgs m_rigidBodyCreateArgs;
- struct CalculateInverseDynamicsResultArgs m_inverseDynamicsResultArgs;
- struct CalculateJacobianResultArgs m_jacobianResultArgs;
- struct SendContactDataArgs m_sendContactPointArgs;
- struct CalculateInverseKinematicsResultArgs m_inverseKinematicsResultArgs;
- };
- };
- typedef struct SharedMemoryStatus SharedMemoryStatus_t;
- #endif //SHARED_MEMORY_COMMANDS_H
|