329ed193ac
PiperOrigin-RevId: 562832747 Change-Id: I0532624cee31e089a47426305d885687eb0fc5c5
2593 lines
138 KiB
C
2593 lines
138 KiB
C
// Copyright 2022 DeepMind Technologies Limited
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
// DO NOT EDIT. THIS FILE IS AUTOMATICALLY GENERATED.
|
|
// Error: C reference not found
|
|
// NOLINTBEGIN
|
|
|
|
typedef enum mjtState_ { // state elements
|
|
mjSTATE_TIME = 1<<0, // time
|
|
mjSTATE_QPOS = 1<<1, // position
|
|
mjSTATE_QVEL = 1<<2, // velocity
|
|
mjSTATE_ACT = 1<<3, // actuator activation
|
|
mjSTATE_WARMSTART = 1<<4, // acceleration used for warmstart
|
|
mjSTATE_CTRL = 1<<5, // control
|
|
mjSTATE_QFRC_APPLIED = 1<<6, // applied generalized force
|
|
mjSTATE_XFRC_APPLIED = 1<<7, // applied Cartesian force/torque
|
|
mjSTATE_MOCAP_POS = 1<<8, // positions of mocap bodies
|
|
mjSTATE_MOCAP_QUAT = 1<<9, // orientations of mocap bodies
|
|
mjSTATE_USERDATA = 1<<10, // user data
|
|
mjSTATE_PLUGIN = 1<<11, // plugin state
|
|
|
|
mjNSTATE = 12, // number of state elements
|
|
|
|
// convenience values for commonly used state specifications
|
|
mjSTATE_PHYSICS = mjSTATE_QPOS | mjSTATE_QVEL | mjSTATE_ACT,
|
|
mjSTATE_FULLPHYSICS = mjSTATE_PHYSICS | mjSTATE_TIME | mjSTATE_PLUGIN,
|
|
mjSTATE_USER = mjSTATE_CTRL | mjSTATE_QFRC_APPLIED | mjSTATE_XFRC_APPLIED |
|
|
mjSTATE_MOCAP_POS | mjSTATE_MOCAP_QUAT | mjSTATE_USERDATA,
|
|
mjSTATE_INTEGRATION = mjSTATE_FULLPHYSICS | mjSTATE_USER | mjSTATE_WARMSTART
|
|
} mjtState;
|
|
typedef enum mjtWarning_ { // warning types
|
|
mjWARN_INERTIA = 0, // (near) singular inertia matrix
|
|
mjWARN_CONTACTFULL, // too many contacts in contact list
|
|
mjWARN_CNSTRFULL, // too many constraints
|
|
mjWARN_VGEOMFULL, // too many visual geoms
|
|
mjWARN_BADQPOS, // bad number in qpos
|
|
mjWARN_BADQVEL, // bad number in qvel
|
|
mjWARN_BADQACC, // bad number in qacc
|
|
mjWARN_BADCTRL, // bad number in ctrl
|
|
|
|
mjNWARNING // number of warnings
|
|
} mjtWarning;
|
|
typedef enum mjtTimer_ { // internal timers
|
|
// main api
|
|
mjTIMER_STEP = 0, // step
|
|
mjTIMER_FORWARD, // forward
|
|
mjTIMER_INVERSE, // inverse
|
|
|
|
// breakdown of step/forward
|
|
mjTIMER_POSITION, // fwdPosition
|
|
mjTIMER_VELOCITY, // fwdVelocity
|
|
mjTIMER_ACTUATION, // fwdActuation
|
|
mjTIMER_ACCELERATION, // fwdAcceleration
|
|
mjTIMER_CONSTRAINT, // fwdConstraint
|
|
|
|
// breakdown of fwdPosition
|
|
mjTIMER_POS_KINEMATICS, // kinematics, com, tendon, transmission
|
|
mjTIMER_POS_INERTIA, // inertia computations
|
|
mjTIMER_POS_COLLISION, // collision detection
|
|
mjTIMER_POS_MAKE, // make constraints
|
|
mjTIMER_POS_PROJECT, // project constraints
|
|
|
|
mjNTIMER // number of timers
|
|
} mjtTimer;
|
|
struct mjContact_ { // result of collision detection functions
|
|
// contact parameters set by geom-specific collision detector
|
|
mjtNum dist; // distance between nearest points; neg: penetration
|
|
mjtNum pos[3]; // position of contact point: midpoint between geoms
|
|
mjtNum frame[9]; // normal is in [0-2]
|
|
|
|
// contact parameters set by mj_collideGeoms
|
|
mjtNum includemargin; // include if dist<includemargin=margin-gap
|
|
mjtNum friction[5]; // tangent1, 2, spin, roll1, 2
|
|
mjtNum solref[mjNREF]; // constraint solver reference, normal direction
|
|
mjtNum solreffriction[mjNREF]; // constraint solver reference, friction directions
|
|
mjtNum solimp[mjNIMP]; // constraint solver impedance
|
|
|
|
// internal storage used by solver
|
|
mjtNum mu; // friction of regularized cone, set by mj_makeConstraint
|
|
mjtNum H[36]; // cone Hessian, set by mj_updateConstraint
|
|
|
|
// contact descriptors set by mj_collideGeoms
|
|
int dim; // contact space dimensionality: 1, 3, 4 or 6
|
|
int geom1; // id of geom 1
|
|
int geom2; // id of geom 2
|
|
|
|
// flag set by mj_instantianteEquality
|
|
int exclude; // 0: include, 1: in gap, 2: fused, 3: no dofs
|
|
|
|
// address computed by mj_instantiateContact
|
|
int efc_address; // address in efc; -1: not included
|
|
};
|
|
typedef struct mjContact_ mjContact;
|
|
struct mjWarningStat_ { // warning statistics
|
|
int lastinfo; // info from last warning
|
|
int number; // how many times was warning raised
|
|
};
|
|
typedef struct mjWarningStat_ mjWarningStat;
|
|
struct mjTimerStat_ { // timer statistics
|
|
mjtNum duration; // cumulative duration
|
|
int number; // how many times was timer called
|
|
};
|
|
typedef struct mjTimerStat_ mjTimerStat;
|
|
struct mjSolverStat_ { // per-iteration solver statistics
|
|
mjtNum improvement; // cost reduction, scaled by 1/trace(M(qpos0))
|
|
mjtNum gradient; // gradient norm (primal only, scaled)
|
|
mjtNum lineslope; // slope in linesearch
|
|
int nactive; // number of active constraints
|
|
int nchange; // number of constraint state changes
|
|
int neval; // number of cost evaluations in line search
|
|
int nupdate; // number of Cholesky updates in line search
|
|
};
|
|
typedef struct mjSolverStat_ mjSolverStat;
|
|
struct mjData_ {
|
|
// constant sizes
|
|
size_t narena; // size of the arena in bytes (inclusive of the stack)
|
|
size_t nbuffer; // size of main buffer in bytes
|
|
int nplugin; // number of plugin instances
|
|
|
|
// stack pointer
|
|
size_t pstack; // first available mjtNum address in stack
|
|
size_t pbase; // value of pstack when mj_markStack was last called
|
|
|
|
// arena pointer
|
|
size_t parena; // first available byte in arena
|
|
|
|
// memory utilization stats
|
|
size_t maxuse_stack; // maximum stack allocation
|
|
size_t maxuse_arena; // maximum arena allocation
|
|
int maxuse_con; // maximum number of contacts
|
|
int maxuse_efc; // maximum number of scalar constraints
|
|
|
|
// diagnostics
|
|
mjWarningStat warning[mjNWARNING]; // warning statistics
|
|
mjTimerStat timer[mjNTIMER]; // timer statistics
|
|
|
|
// solver statistics
|
|
mjSolverStat solver[mjNSOLVER]; // solver statistics per iteration
|
|
int solver_iter; // number of solver iterations
|
|
int solver_nnz; // number of non-zeros in Hessian or efc_AR
|
|
mjtNum solver_fwdinv[2]; // forward-inverse comparison: qfrc, efc
|
|
|
|
// collision statistics
|
|
int nbodypair_broad; // number of body pairs in collision according to the broad-phase
|
|
int nbodypair_narrow; // number of body pairs actually in collision in the narrow-phase
|
|
int ngeompair_mid; // number of geom pairs in collision according to the mid-phase
|
|
int ngeompair_narrow; // number of geom pairs actually in collision in the narrow-phase
|
|
|
|
// variable sizes
|
|
int ne; // number of equality constraints
|
|
int nf; // number of friction constraints
|
|
int nl; // number of limit constraints
|
|
int nefc; // number of constraints
|
|
int nnzJ; // number of non-zeros in constraint Jacobian
|
|
int ncon; // number of detected contacts
|
|
int nisland; // number of detected constraint islands
|
|
|
|
// global properties
|
|
mjtNum time; // simulation time
|
|
mjtNum energy[2]; // potential, kinetic energy
|
|
|
|
//-------------------- end of info header
|
|
|
|
// buffers
|
|
void* buffer; // main buffer; all pointers point in it (nbuffer bytes)
|
|
void* arena; // arena+stack buffer (nstack*sizeof(mjtNum) bytes)
|
|
|
|
//-------------------- main inputs and outputs of the computation
|
|
|
|
// state
|
|
mjtNum* qpos; // position (nq x 1)
|
|
mjtNum* qvel; // velocity (nv x 1)
|
|
mjtNum* act; // actuator activation (na x 1)
|
|
mjtNum* qacc_warmstart; // acceleration used for warmstart (nv x 1)
|
|
mjtNum* plugin_state; // plugin state (npluginstate x 1)
|
|
|
|
// control
|
|
mjtNum* ctrl; // control (nu x 1)
|
|
mjtNum* qfrc_applied; // applied generalized force (nv x 1)
|
|
mjtNum* xfrc_applied; // applied Cartesian force/torque (nbody x 6)
|
|
|
|
// mocap data
|
|
mjtNum* mocap_pos; // positions of mocap bodies (nmocap x 3)
|
|
mjtNum* mocap_quat; // orientations of mocap bodies (nmocap x 4)
|
|
|
|
// dynamics
|
|
mjtNum* qacc; // acceleration (nv x 1)
|
|
mjtNum* act_dot; // time-derivative of actuator activation (na x 1)
|
|
|
|
// user data
|
|
mjtNum* userdata; // user data, not touched by engine (nuserdata x 1)
|
|
|
|
// sensors
|
|
mjtNum* sensordata; // sensor data array (nsensordata x 1)
|
|
|
|
// plugins
|
|
int* plugin; // copy of m->plugin, required for deletion (nplugin x 1)
|
|
uintptr_t* plugin_data; // pointer to plugin-managed data structure (nplugin x 1)
|
|
|
|
//-------------------- POSITION dependent
|
|
|
|
// computed by mj_fwdPosition/mj_kinematics
|
|
mjtNum* xpos; // Cartesian position of body frame (nbody x 3)
|
|
mjtNum* xquat; // Cartesian orientation of body frame (nbody x 4)
|
|
mjtNum* xmat; // Cartesian orientation of body frame (nbody x 9)
|
|
mjtNum* xipos; // Cartesian position of body com (nbody x 3)
|
|
mjtNum* ximat; // Cartesian orientation of body inertia (nbody x 9)
|
|
mjtNum* xanchor; // Cartesian position of joint anchor (njnt x 3)
|
|
mjtNum* xaxis; // Cartesian joint axis (njnt x 3)
|
|
mjtNum* geom_xpos; // Cartesian geom position (ngeom x 3)
|
|
mjtNum* geom_xmat; // Cartesian geom orientation (ngeom x 9)
|
|
mjtNum* site_xpos; // Cartesian site position (nsite x 3)
|
|
mjtNum* site_xmat; // Cartesian site orientation (nsite x 9)
|
|
mjtNum* cam_xpos; // Cartesian camera position (ncam x 3)
|
|
mjtNum* cam_xmat; // Cartesian camera orientation (ncam x 9)
|
|
mjtNum* light_xpos; // Cartesian light position (nlight x 3)
|
|
mjtNum* light_xdir; // Cartesian light direction (nlight x 3)
|
|
|
|
// computed by mj_fwdPosition/mj_comPos
|
|
mjtNum* subtree_com; // center of mass of each subtree (nbody x 3)
|
|
mjtNum* cdof; // com-based motion axis of each dof (nv x 6)
|
|
mjtNum* cinert; // com-based body inertia and mass (nbody x 10)
|
|
|
|
// computed by mj_fwdPosition/mj_tendon
|
|
int* ten_wrapadr; // start address of tendon's path (ntendon x 1)
|
|
int* ten_wrapnum; // number of wrap points in path (ntendon x 1)
|
|
int* ten_J_rownnz; // number of non-zeros in Jacobian row (ntendon x 1)
|
|
int* ten_J_rowadr; // row start address in colind array (ntendon x 1)
|
|
int* ten_J_colind; // column indices in sparse Jacobian (ntendon x nv)
|
|
mjtNum* ten_length; // tendon lengths (ntendon x 1)
|
|
mjtNum* ten_J; // tendon Jacobian (ntendon x nv)
|
|
int* wrap_obj; // geom id; -1: site; -2: pulley (nwrap*2 x 1)
|
|
mjtNum* wrap_xpos; // Cartesian 3D points in all path (nwrap*2 x 3)
|
|
|
|
// computed by mj_fwdPosition/mj_transmission
|
|
mjtNum* actuator_length; // actuator lengths (nu x 1)
|
|
mjtNum* actuator_moment; // actuator moments (nu x nv)
|
|
|
|
// computed by mj_fwdPosition/mj_crb
|
|
mjtNum* crb; // com-based composite inertia and mass (nbody x 10)
|
|
mjtNum* qM; // total inertia (sparse) (nM x 1)
|
|
|
|
// computed by mj_fwdPosition/mj_factorM
|
|
mjtNum* qLD; // L'*D*L factorization of M (sparse) (nM x 1)
|
|
mjtNum* qLDiagInv; // 1/diag(D) (nv x 1)
|
|
mjtNum* qLDiagSqrtInv; // 1/sqrt(diag(D)) (nv x 1)
|
|
|
|
// computed by mj_collisionTree
|
|
mjtByte* bvh_active; // volume has been added to collisions (nbvh x 1)
|
|
|
|
//-------------------- POSITION, VELOCITY dependent
|
|
|
|
// computed by mj_fwdVelocity
|
|
mjtNum* ten_velocity; // tendon velocities (ntendon x 1)
|
|
mjtNum* actuator_velocity; // actuator velocities (nu x 1)
|
|
|
|
// computed by mj_fwdVelocity/mj_comVel
|
|
mjtNum* cvel; // com-based velocity [3D rot; 3D tran] (nbody x 6)
|
|
mjtNum* cdof_dot; // time-derivative of cdof (nv x 6)
|
|
|
|
// computed by mj_fwdVelocity/mj_rne (without acceleration)
|
|
mjtNum* qfrc_bias; // C(qpos,qvel) (nv x 1)
|
|
|
|
// computed by mj_fwdVelocity/mj_passive
|
|
mjtNum* qfrc_passive; // passive force (nv x 1)
|
|
|
|
// computed by mj_sensorVel/mj_subtreeVel if needed
|
|
mjtNum* subtree_linvel; // linear velocity of subtree com (nbody x 3)
|
|
mjtNum* subtree_angmom; // angular momentum about subtree com (nbody x 3)
|
|
|
|
// computed by mj_Euler or mj_implicit
|
|
mjtNum* qH; // L'*D*L factorization of modified M (nM x 1)
|
|
mjtNum* qHDiagInv; // 1/diag(D) of modified M (nv x 1)
|
|
|
|
// computed by mj_resetData
|
|
int* D_rownnz; // non-zeros in each row (nv x 1)
|
|
int* D_rowadr; // address of each row in D_colind (nv x 1)
|
|
int* D_colind; // column indices of non-zeros (nD x 1)
|
|
int* B_rownnz; // non-zeros in each row (nbody x 1)
|
|
int* B_rowadr; // address of each row in B_colind (nbody x 1)
|
|
int* B_colind; // column indices of non-zeros (nB x 1)
|
|
|
|
// computed by mj_implicit/mj_derivative
|
|
mjtNum* qDeriv; // d (passive + actuator - bias) / d qvel (nD x 1)
|
|
|
|
// computed by mj_implicit/mju_factorLUSparse
|
|
mjtNum* qLU; // sparse LU of (qM - dt*qDeriv) (nD x 1)
|
|
|
|
//-------------------- POSITION, VELOCITY, CONTROL/ACCELERATION dependent
|
|
|
|
// computed by mj_fwdActuation
|
|
mjtNum* actuator_force; // actuator force in actuation space (nu x 1)
|
|
mjtNum* qfrc_actuator; // actuator force (nv x 1)
|
|
|
|
// computed by mj_fwdAcceleration
|
|
mjtNum* qfrc_smooth; // net unconstrained force (nv x 1)
|
|
mjtNum* qacc_smooth; // unconstrained acceleration (nv x 1)
|
|
|
|
// computed by mj_fwdConstraint/mj_inverse
|
|
mjtNum* qfrc_constraint; // constraint force (nv x 1)
|
|
|
|
// computed by mj_inverse
|
|
mjtNum* qfrc_inverse; // net external force; should equal: (nv x 1)
|
|
// qfrc_applied + J'*xfrc_applied + qfrc_actuator
|
|
|
|
// computed by mj_sensorAcc/mj_rnePostConstraint if needed; rotation:translation format
|
|
mjtNum* cacc; // com-based acceleration (nbody x 6)
|
|
mjtNum* cfrc_int; // com-based interaction force with parent (nbody x 6)
|
|
mjtNum* cfrc_ext; // com-based external force on body (nbody x 6)
|
|
|
|
//-------------------- arena-allocated: POSITION dependent
|
|
|
|
// computed by mj_collision
|
|
mjContact* contact; // list of all detected contacts (ncon x 1)
|
|
|
|
// computed by mj_makeConstraint
|
|
int* efc_type; // constraint type (mjtConstraint) (nefc x 1)
|
|
int* efc_id; // id of object of specified type (nefc x 1)
|
|
int* efc_J_rownnz; // number of non-zeros in constraint Jacobian row (nefc x 1)
|
|
int* efc_J_rowadr; // row start address in colind array (nefc x 1)
|
|
int* efc_J_rowsuper; // number of subsequent rows in supernode (nefc x 1)
|
|
int* efc_J_colind; // column indices in constraint Jacobian (nnzJ x 1)
|
|
int* efc_JT_rownnz; // number of non-zeros in constraint Jacobian row T (nv x 1)
|
|
int* efc_JT_rowadr; // row start address in colind array T (nv x 1)
|
|
int* efc_JT_rowsuper; // number of subsequent rows in supernode T (nv x 1)
|
|
int* efc_JT_colind; // column indices in constraint Jacobian T (nnzJ x 1)
|
|
mjtNum* efc_J; // constraint Jacobian (nnzJ x 1)
|
|
mjtNum* efc_JT; // constraint Jacobian transposed (nnzJ x 1)
|
|
mjtNum* efc_pos; // constraint position (equality, contact) (nefc x 1)
|
|
mjtNum* efc_margin; // inclusion margin (contact) (nefc x 1)
|
|
mjtNum* efc_frictionloss; // frictionloss (friction) (nefc x 1)
|
|
mjtNum* efc_diagApprox; // approximation to diagonal of A (nefc x 1)
|
|
mjtNum* efc_KBIP; // stiffness, damping, impedance, imp' (nefc x 4)
|
|
mjtNum* efc_D; // constraint mass (nefc x 1)
|
|
mjtNum* efc_R; // inverse constraint mass (nefc x 1)
|
|
int* tendon_efcadr; // first efc address involving tendon; -1: none (ntendon x 1)
|
|
|
|
// computed by mj_island
|
|
int* dof_island; // island id of this dof; -1: none (nv x 1)
|
|
int* island_dofnum; // number of dofs in island (nisland x 1)
|
|
int* island_dofadr; // start address in island_dofind (nisland x 1)
|
|
int* island_dofind; // island dof indices; -1: none (nv x 1)
|
|
int* dof_islandind; // dof island indices; -1: none (nv x 1)
|
|
int* efc_island; // island id of this constraint (nefc x 1)
|
|
int* island_efcnum; // number of constraints in island (nisland x 1)
|
|
int* island_efcadr; // start address in island_efcind (nisland x 1)
|
|
int* island_efcind; // island constraint indices (nefc x 1)
|
|
|
|
// computed by mj_projectConstraint (dual solver)
|
|
int* efc_AR_rownnz; // number of non-zeros in AR (nefc x 1)
|
|
int* efc_AR_rowadr; // row start address in colind array (nefc x 1)
|
|
int* efc_AR_colind; // column indices in sparse AR (nefc x nefc)
|
|
mjtNum* efc_AR; // J*inv(M)*J' + R (nefc x nefc)
|
|
|
|
//-------------------- arena-allocated: POSITION, VELOCITY dependent
|
|
|
|
// computed by mj_fwdVelocity/mj_referenceConstraint
|
|
mjtNum* efc_vel; // velocity in constraint space: J*qvel (nefc x 1)
|
|
mjtNum* efc_aref; // reference pseudo-acceleration (nefc x 1)
|
|
|
|
//-------------------- arena-allocated: POSITION, VELOCITY, CONTROL/ACCELERATION dependent
|
|
|
|
// computed by mj_fwdConstraint/mj_inverse
|
|
mjtNum* efc_b; // linear cost term: J*qacc_smooth - aref (nefc x 1)
|
|
mjtNum* efc_force; // constraint force in constraint space (nefc x 1)
|
|
int* efc_state; // constraint state (mjtConstraintState) (nefc x 1)
|
|
|
|
// ThreadPool for multithreaded operations
|
|
uintptr_t threadpool;
|
|
};
|
|
typedef struct mjData_ mjData;
|
|
typedef enum mjtDisableBit_ { // disable default feature bitflags
|
|
mjDSBL_CONSTRAINT = 1<<0, // entire constraint solver
|
|
mjDSBL_EQUALITY = 1<<1, // equality constraints
|
|
mjDSBL_FRICTIONLOSS = 1<<2, // joint and tendon frictionloss constraints
|
|
mjDSBL_LIMIT = 1<<3, // joint and tendon limit constraints
|
|
mjDSBL_CONTACT = 1<<4, // contact constraints
|
|
mjDSBL_PASSIVE = 1<<5, // passive forces
|
|
mjDSBL_GRAVITY = 1<<6, // gravitational forces
|
|
mjDSBL_CLAMPCTRL = 1<<7, // clamp control to specified range
|
|
mjDSBL_WARMSTART = 1<<8, // warmstart constraint solver
|
|
mjDSBL_FILTERPARENT = 1<<9, // remove collisions with parent body
|
|
mjDSBL_ACTUATION = 1<<10, // apply actuation forces
|
|
mjDSBL_REFSAFE = 1<<11, // integrator safety: make ref[0]>=2*timestep
|
|
mjDSBL_SENSOR = 1<<12, // sensors
|
|
mjDSBL_MIDPHASE = 1<<13, // mid-phase collision filtering
|
|
mjDSBL_EULERDAMP = 1<<14, // implicit integration of joint damping in Euler integrator
|
|
|
|
mjNDISABLE = 15 // number of disable flags
|
|
} mjtDisableBit;
|
|
typedef enum mjtEnableBit_ { // enable optional feature bitflags
|
|
mjENBL_OVERRIDE = 1<<0, // override contact parameters
|
|
mjENBL_ENERGY = 1<<1, // energy computation
|
|
mjENBL_FWDINV = 1<<2, // record solver statistics
|
|
mjENBL_INVDISCRETE = 1<<3, // discrete-time inverse dynamics
|
|
mjENBL_SENSORNOISE = 1<<4, // add noise to sensor data
|
|
// experimental features:
|
|
mjENBL_MULTICCD = 1<<5, // multi-point convex collision detection
|
|
mjENBL_ISLAND = 1<<6, // constraint island discovery
|
|
|
|
mjNENABLE = 7 // number of enable flags
|
|
} mjtEnableBit;
|
|
typedef enum mjtJoint_ { // type of degree of freedom
|
|
mjJNT_FREE = 0, // global position and orientation (quat) (7)
|
|
mjJNT_BALL, // orientation (quat) relative to parent (4)
|
|
mjJNT_SLIDE, // sliding distance along body-fixed axis (1)
|
|
mjJNT_HINGE // rotation angle (rad) around body-fixed axis (1)
|
|
} mjtJoint;
|
|
typedef enum mjtGeom_ { // type of geometric shape
|
|
// regular geom types
|
|
mjGEOM_PLANE = 0, // plane
|
|
mjGEOM_HFIELD, // height field
|
|
mjGEOM_SPHERE, // sphere
|
|
mjGEOM_CAPSULE, // capsule
|
|
mjGEOM_ELLIPSOID, // ellipsoid
|
|
mjGEOM_CYLINDER, // cylinder
|
|
mjGEOM_BOX, // box
|
|
mjGEOM_MESH, // mesh
|
|
mjGEOM_SDF, // signed distance field
|
|
|
|
mjNGEOMTYPES, // number of regular geom types
|
|
|
|
// rendering-only geom types: not used in mjModel, not counted in mjNGEOMTYPES
|
|
mjGEOM_ARROW = 100, // arrow
|
|
mjGEOM_ARROW1, // arrow without wedges
|
|
mjGEOM_ARROW2, // arrow in both directions
|
|
mjGEOM_LINE, // line
|
|
mjGEOM_SKIN, // skin
|
|
mjGEOM_LABEL, // text label
|
|
|
|
mjGEOM_NONE = 1001 // missing geom type
|
|
} mjtGeom;
|
|
typedef enum mjtCamLight_ { // tracking mode for camera and light
|
|
mjCAMLIGHT_FIXED = 0, // pos and rot fixed in body
|
|
mjCAMLIGHT_TRACK, // pos tracks body, rot fixed in global
|
|
mjCAMLIGHT_TRACKCOM, // pos tracks subtree com, rot fixed in body
|
|
mjCAMLIGHT_TARGETBODY, // pos fixed in body, rot tracks target body
|
|
mjCAMLIGHT_TARGETBODYCOM // pos fixed in body, rot tracks target subtree com
|
|
} mjtCamLight;
|
|
typedef enum mjtTexture_ { // type of texture
|
|
mjTEXTURE_2D = 0, // 2d texture, suitable for planes and hfields
|
|
mjTEXTURE_CUBE, // cube texture, suitable for all other geom types
|
|
mjTEXTURE_SKYBOX // cube texture used as skybox
|
|
} mjtTexture;
|
|
typedef enum mjtIntegrator_ { // integrator mode
|
|
mjINT_EULER = 0, // semi-implicit Euler
|
|
mjINT_RK4, // 4th-order Runge Kutta
|
|
mjINT_IMPLICIT, // implicit in velocity
|
|
mjINT_IMPLICITFAST // implicit in velocity, no rne derivative
|
|
} mjtIntegrator;
|
|
typedef enum mjtCollision_ { // collision mode for selecting geom pairs
|
|
mjCOL_ALL = 0, // test precomputed and dynamic pairs
|
|
mjCOL_PAIR, // test predefined pairs only
|
|
mjCOL_DYNAMIC // test dynamic pairs only
|
|
} mjtCollision;
|
|
typedef enum mjtCone_ { // type of friction cone
|
|
mjCONE_PYRAMIDAL = 0, // pyramidal
|
|
mjCONE_ELLIPTIC // elliptic
|
|
} mjtCone;
|
|
typedef enum mjtJacobian_ { // type of constraint Jacobian
|
|
mjJAC_DENSE = 0, // dense
|
|
mjJAC_SPARSE, // sparse
|
|
mjJAC_AUTO // dense if nv<60, sparse otherwise
|
|
} mjtJacobian;
|
|
typedef enum mjtSolver_ { // constraint solver algorithm
|
|
mjSOL_PGS = 0, // PGS (dual)
|
|
mjSOL_CG, // CG (primal)
|
|
mjSOL_NEWTON // Newton (primal)
|
|
} mjtSolver;
|
|
typedef enum mjtEq_ { // type of equality constraint
|
|
mjEQ_CONNECT = 0, // connect two bodies at a point (ball joint)
|
|
mjEQ_WELD, // fix relative position and orientation of two bodies
|
|
mjEQ_JOINT, // couple the values of two scalar joints with cubic
|
|
mjEQ_TENDON, // couple the lengths of two tendons with cubic
|
|
mjEQ_DISTANCE // unsupported, will cause an error if used
|
|
} mjtEq;
|
|
typedef enum mjtWrap_ { // type of tendon wrap object
|
|
mjWRAP_NONE = 0, // null object
|
|
mjWRAP_JOINT, // constant moment arm
|
|
mjWRAP_PULLEY, // pulley used to split tendon
|
|
mjWRAP_SITE, // pass through site
|
|
mjWRAP_SPHERE, // wrap around sphere
|
|
mjWRAP_CYLINDER // wrap around (infinite) cylinder
|
|
} mjtWrap;
|
|
typedef enum mjtTrn_ { // type of actuator transmission
|
|
mjTRN_JOINT = 0, // force on joint
|
|
mjTRN_JOINTINPARENT, // force on joint, expressed in parent frame
|
|
mjTRN_SLIDERCRANK, // force via slider-crank linkage
|
|
mjTRN_TENDON, // force on tendon
|
|
mjTRN_SITE, // force on site
|
|
mjTRN_BODY, // adhesion force on a body's geoms
|
|
|
|
mjTRN_UNDEFINED = 1000 // undefined transmission type
|
|
} mjtTrn;
|
|
typedef enum mjtDyn_ { // type of actuator dynamics
|
|
mjDYN_NONE = 0, // no internal dynamics; ctrl specifies force
|
|
mjDYN_INTEGRATOR, // integrator: da/dt = u
|
|
mjDYN_FILTER, // linear filter: da/dt = (u-a) / tau
|
|
mjDYN_FILTEREXACT, // linear filter: da/dt = (u-a) / tau, with exact integration
|
|
mjDYN_MUSCLE, // piece-wise linear filter with two time constants
|
|
mjDYN_USER // user-defined dynamics type
|
|
} mjtDyn;
|
|
typedef enum mjtGain_ { // type of actuator gain
|
|
mjGAIN_FIXED = 0, // fixed gain
|
|
mjGAIN_AFFINE, // const + kp*length + kv*velocity
|
|
mjGAIN_MUSCLE, // muscle FLV curve computed by mju_muscleGain()
|
|
mjGAIN_USER // user-defined gain type
|
|
} mjtGain;
|
|
typedef enum mjtBias_ { // type of actuator bias
|
|
mjBIAS_NONE = 0, // no bias
|
|
mjBIAS_AFFINE, // const + kp*length + kv*velocity
|
|
mjBIAS_MUSCLE, // muscle passive force computed by mju_muscleBias()
|
|
mjBIAS_USER // user-defined bias type
|
|
} mjtBias;
|
|
typedef enum mjtObj_ { // type of MujoCo object
|
|
mjOBJ_UNKNOWN = 0, // unknown object type
|
|
mjOBJ_BODY, // body
|
|
mjOBJ_XBODY, // body, used to access regular frame instead of i-frame
|
|
mjOBJ_JOINT, // joint
|
|
mjOBJ_DOF, // dof
|
|
mjOBJ_GEOM, // geom
|
|
mjOBJ_SITE, // site
|
|
mjOBJ_CAMERA, // camera
|
|
mjOBJ_LIGHT, // light
|
|
mjOBJ_MESH, // mesh
|
|
mjOBJ_SKIN, // skin
|
|
mjOBJ_HFIELD, // heightfield
|
|
mjOBJ_TEXTURE, // texture
|
|
mjOBJ_MATERIAL, // material for rendering
|
|
mjOBJ_PAIR, // geom pair to include
|
|
mjOBJ_EXCLUDE, // body pair to exclude
|
|
mjOBJ_EQUALITY, // equality constraint
|
|
mjOBJ_TENDON, // tendon
|
|
mjOBJ_ACTUATOR, // actuator
|
|
mjOBJ_SENSOR, // sensor
|
|
mjOBJ_NUMERIC, // numeric
|
|
mjOBJ_TEXT, // text
|
|
mjOBJ_TUPLE, // tuple
|
|
mjOBJ_KEY, // keyframe
|
|
mjOBJ_PLUGIN // plugin instance
|
|
} mjtObj;
|
|
typedef enum mjtConstraint_ { // type of constraint
|
|
mjCNSTR_EQUALITY = 0, // equality constraint
|
|
mjCNSTR_FRICTION_DOF, // dof friction
|
|
mjCNSTR_FRICTION_TENDON, // tendon friction
|
|
mjCNSTR_LIMIT_JOINT, // joint limit
|
|
mjCNSTR_LIMIT_TENDON, // tendon limit
|
|
mjCNSTR_CONTACT_FRICTIONLESS, // frictionless contact
|
|
mjCNSTR_CONTACT_PYRAMIDAL, // frictional contact, pyramidal friction cone
|
|
mjCNSTR_CONTACT_ELLIPTIC // frictional contact, elliptic friction cone
|
|
} mjtConstraint;
|
|
typedef enum mjtConstraintState_ { // constraint state
|
|
mjCNSTRSTATE_SATISFIED = 0, // constraint satisfied, zero cost (limit, contact)
|
|
mjCNSTRSTATE_QUADRATIC, // quadratic cost (equality, friction, limit, contact)
|
|
mjCNSTRSTATE_LINEARNEG, // linear cost, negative side (friction)
|
|
mjCNSTRSTATE_LINEARPOS, // linear cost, positive side (friction)
|
|
mjCNSTRSTATE_CONE // squared distance to cone cost (elliptic contact)
|
|
} mjtConstraintState;
|
|
typedef enum mjtSensor_ { // type of sensor
|
|
// common robotic sensors, attached to a site
|
|
mjSENS_TOUCH = 0, // scalar contact normal forces summed over sensor zone
|
|
mjSENS_ACCELEROMETER, // 3D linear acceleration, in local frame
|
|
mjSENS_VELOCIMETER, // 3D linear velocity, in local frame
|
|
mjSENS_GYRO, // 3D angular velocity, in local frame
|
|
mjSENS_FORCE, // 3D force between site's body and its parent body
|
|
mjSENS_TORQUE, // 3D torque between site's body and its parent body
|
|
mjSENS_MAGNETOMETER, // 3D magnetometer
|
|
mjSENS_RANGEFINDER, // scalar distance to nearest geom or site along z-axis
|
|
|
|
// sensors related to scalar joints, tendons, actuators
|
|
mjSENS_JOINTPOS, // scalar joint position (hinge and slide only)
|
|
mjSENS_JOINTVEL, // scalar joint velocity (hinge and slide only)
|
|
mjSENS_TENDONPOS, // scalar tendon position
|
|
mjSENS_TENDONVEL, // scalar tendon velocity
|
|
mjSENS_ACTUATORPOS, // scalar actuator position
|
|
mjSENS_ACTUATORVEL, // scalar actuator velocity
|
|
mjSENS_ACTUATORFRC, // scalar actuator force
|
|
mjSENS_JOINTACTFRC, // scalar actuator force, measured at the joint
|
|
|
|
// sensors related to ball joints
|
|
mjSENS_BALLQUAT, // 4D ball joint quaternion
|
|
mjSENS_BALLANGVEL, // 3D ball joint angular velocity
|
|
|
|
// joint and tendon limit sensors, in constraint space
|
|
mjSENS_JOINTLIMITPOS, // joint limit distance-margin
|
|
mjSENS_JOINTLIMITVEL, // joint limit velocity
|
|
mjSENS_JOINTLIMITFRC, // joint limit force
|
|
mjSENS_TENDONLIMITPOS, // tendon limit distance-margin
|
|
mjSENS_TENDONLIMITVEL, // tendon limit velocity
|
|
mjSENS_TENDONLIMITFRC, // tendon limit force
|
|
|
|
// sensors attached to an object with spatial frame: (x)body, geom, site, camera
|
|
mjSENS_FRAMEPOS, // 3D position
|
|
mjSENS_FRAMEQUAT, // 4D unit quaternion orientation
|
|
mjSENS_FRAMEXAXIS, // 3D unit vector: x-axis of object's frame
|
|
mjSENS_FRAMEYAXIS, // 3D unit vector: y-axis of object's frame
|
|
mjSENS_FRAMEZAXIS, // 3D unit vector: z-axis of object's frame
|
|
mjSENS_FRAMELINVEL, // 3D linear velocity
|
|
mjSENS_FRAMEANGVEL, // 3D angular velocity
|
|
mjSENS_FRAMELINACC, // 3D linear acceleration
|
|
mjSENS_FRAMEANGACC, // 3D angular acceleration
|
|
|
|
// sensors related to kinematic subtrees; attached to a body (which is the subtree root)
|
|
mjSENS_SUBTREECOM, // 3D center of mass of subtree
|
|
mjSENS_SUBTREELINVEL, // 3D linear velocity of subtree
|
|
mjSENS_SUBTREEANGMOM, // 3D angular momentum of subtree
|
|
|
|
// global sensors
|
|
mjSENS_CLOCK, // simulation time
|
|
|
|
// plugin-controlled sensors
|
|
mjSENS_PLUGIN, // plugin-controlled
|
|
|
|
// user-defined sensor
|
|
mjSENS_USER // sensor data provided by mjcb_sensor callback
|
|
} mjtSensor;
|
|
typedef enum mjtStage_ { // computation stage
|
|
mjSTAGE_NONE = 0, // no computations
|
|
mjSTAGE_POS, // position-dependent computations
|
|
mjSTAGE_VEL, // velocity-dependent computations
|
|
mjSTAGE_ACC // acceleration/force-dependent computations
|
|
} mjtStage;
|
|
typedef enum mjtDataType_ { // data type for sensors
|
|
mjDATATYPE_REAL = 0, // real values, no constraints
|
|
mjDATATYPE_POSITIVE, // positive values; 0 or negative: inactive
|
|
mjDATATYPE_AXIS, // 3D unit vector
|
|
mjDATATYPE_QUATERNION // unit quaternion
|
|
} mjtDataType;
|
|
typedef enum mjtLRMode_ { // mode for actuator length range computation
|
|
mjLRMODE_NONE = 0, // do not process any actuators
|
|
mjLRMODE_MUSCLE, // process muscle actuators
|
|
mjLRMODE_MUSCLEUSER, // process muscle and user actuators
|
|
mjLRMODE_ALL // process all actuators
|
|
} mjtLRMode;
|
|
struct mjLROpt_ { // options for mj_setLengthRange()
|
|
// flags
|
|
int mode; // which actuators to process (mjtLRMode)
|
|
int useexisting; // use existing length range if available
|
|
int uselimit; // use joint and tendon limits if available
|
|
|
|
// algorithm parameters
|
|
mjtNum accel; // target acceleration used to compute force
|
|
mjtNum maxforce; // maximum force; 0: no limit
|
|
mjtNum timeconst; // time constant for velocity reduction; min 0.01
|
|
mjtNum timestep; // simulation timestep; 0: use mjOption.timestep
|
|
mjtNum inttotal; // total simulation time interval
|
|
mjtNum interval; // evaluation time interval (at the end)
|
|
mjtNum tolrange; // convergence tolerance (relative to range)
|
|
};
|
|
typedef struct mjLROpt_ mjLROpt;
|
|
struct mjVFS_ { // virtual file system for loading from memory
|
|
int nfile; // number of files present
|
|
char filename[mjMAXVFS][mjMAXVFSNAME]; // file name without path
|
|
size_t filesize[mjMAXVFS]; // file size in bytes
|
|
void* filedata[mjMAXVFS]; // buffer with file data
|
|
};
|
|
typedef struct mjVFS_ mjVFS;
|
|
struct mjOption_ { // physics options
|
|
// timing parameters
|
|
mjtNum timestep; // timestep
|
|
mjtNum apirate; // update rate for remote API (Hz)
|
|
|
|
// solver parameters
|
|
mjtNum impratio; // ratio of friction-to-normal contact impedance
|
|
mjtNum tolerance; // main solver tolerance
|
|
mjtNum noslip_tolerance; // noslip solver tolerance
|
|
mjtNum mpr_tolerance; // MPR solver tolerance
|
|
|
|
// physical constants
|
|
mjtNum gravity[3]; // gravitational acceleration
|
|
mjtNum wind[3]; // wind (for lift, drag and viscosity)
|
|
mjtNum magnetic[3]; // global magnetic flux
|
|
mjtNum density; // density of medium
|
|
mjtNum viscosity; // viscosity of medium
|
|
|
|
// override contact solver parameters (if enabled)
|
|
mjtNum o_margin; // margin
|
|
mjtNum o_solref[mjNREF]; // solref
|
|
mjtNum o_solimp[mjNIMP]; // solimp
|
|
|
|
// discrete settings
|
|
int integrator; // integration mode (mjtIntegrator)
|
|
int collision; // collision mode (mjtCollision)
|
|
int cone; // type of friction cone (mjtCone)
|
|
int jacobian; // type of Jacobian (mjtJacobian)
|
|
int solver; // solver algorithm (mjtSolver)
|
|
int iterations; // maximum number of main solver iterations
|
|
int noslip_iterations; // maximum number of noslip solver iterations
|
|
int mpr_iterations; // maximum number of MPR solver iterations
|
|
int disableflags; // bit flags for disabling standard features
|
|
int enableflags; // bit flags for enabling optional features
|
|
|
|
// sdf collision settings
|
|
int sdf_initpoints; // number of starting points for gradient descent
|
|
int sdf_iterations; // max number of iterations for gradient descent
|
|
};
|
|
typedef struct mjOption_ mjOption;
|
|
struct mjVisual_ { // visualization options
|
|
struct { // global parameters
|
|
float fovy; // y-field of view for free camera (degrees)
|
|
float ipd; // inter-pupilary distance for free camera
|
|
float azimuth; // initial azimuth of free camera (degrees)
|
|
float elevation; // initial elevation of free camera (degrees)
|
|
float linewidth; // line width for wireframe and ray rendering
|
|
float glow; // glow coefficient for selected body
|
|
float realtime; // initial real-time factor (1: real time)
|
|
int offwidth; // width of offscreen buffer
|
|
int offheight; // height of offscreen buffer
|
|
int ellipsoidinertia; // geom for inertia visualization (0: box, 1: ellipsoid)
|
|
} global;
|
|
|
|
struct { // rendering quality
|
|
int shadowsize; // size of shadowmap texture
|
|
int offsamples; // number of multisamples for offscreen rendering
|
|
int numslices; // number of slices for builtin geom drawing
|
|
int numstacks; // number of stacks for builtin geom drawing
|
|
int numquads; // number of quads for box rendering
|
|
} quality;
|
|
|
|
struct { // head light
|
|
float ambient[3]; // ambient rgb (alpha=1)
|
|
float diffuse[3]; // diffuse rgb (alpha=1)
|
|
float specular[3]; // specular rgb (alpha=1)
|
|
int active; // is headlight active
|
|
} headlight;
|
|
|
|
struct { // mapping
|
|
float stiffness; // mouse perturbation stiffness (space->force)
|
|
float stiffnessrot; // mouse perturbation stiffness (space->torque)
|
|
float force; // from force units to space units
|
|
float torque; // from torque units to space units
|
|
float alpha; // scale geom alphas when transparency is enabled
|
|
float fogstart; // OpenGL fog starts at fogstart * mjModel.stat.extent
|
|
float fogend; // OpenGL fog ends at fogend * mjModel.stat.extent
|
|
float znear; // near clipping plane = znear * mjModel.stat.extent
|
|
float zfar; // far clipping plane = zfar * mjModel.stat.extent
|
|
float haze; // haze ratio
|
|
float shadowclip; // directional light: shadowclip * mjModel.stat.extent
|
|
float shadowscale; // spot light: shadowscale * light.cutoff
|
|
float actuatortendon; // scale tendon width
|
|
} map;
|
|
|
|
struct { // scale of decor elements relative to mean body size
|
|
float forcewidth; // width of force arrow
|
|
float contactwidth; // contact width
|
|
float contactheight; // contact height
|
|
float connect; // autoconnect capsule width
|
|
float com; // com radius
|
|
float camera; // camera object
|
|
float light; // light object
|
|
float selectpoint; // selection point
|
|
float jointlength; // joint length
|
|
float jointwidth; // joint width
|
|
float actuatorlength; // actuator length
|
|
float actuatorwidth; // actuator width
|
|
float framelength; // bodyframe axis length
|
|
float framewidth; // bodyframe axis width
|
|
float constraint; // constraint width
|
|
float slidercrank; // slidercrank width
|
|
} scale;
|
|
|
|
struct { // color of decor elements
|
|
float fog[4]; // fog
|
|
float haze[4]; // haze
|
|
float force[4]; // external force
|
|
float inertia[4]; // inertia box
|
|
float joint[4]; // joint
|
|
float actuator[4]; // actuator, neutral
|
|
float actuatornegative[4]; // actuator, negative limit
|
|
float actuatorpositive[4]; // actuator, positive limit
|
|
float com[4]; // center of mass
|
|
float camera[4]; // camera object
|
|
float light[4]; // light object
|
|
float selectpoint[4]; // selection point
|
|
float connect[4]; // auto connect
|
|
float contactpoint[4]; // contact point
|
|
float contactforce[4]; // contact force
|
|
float contactfriction[4]; // contact friction force
|
|
float contacttorque[4]; // contact torque
|
|
float contactgap[4]; // contact point in gap
|
|
float rangefinder[4]; // rangefinder ray
|
|
float constraint[4]; // constraint
|
|
float slidercrank[4]; // slidercrank
|
|
float crankbroken[4]; // used when crank must be stretched/broken
|
|
} rgba;
|
|
};
|
|
typedef struct mjVisual_ mjVisual;
|
|
struct mjStatistic_ { // model statistics (in qpos0)
|
|
mjtNum meaninertia; // mean diagonal inertia
|
|
mjtNum meanmass; // mean body mass
|
|
mjtNum meansize; // mean body size
|
|
mjtNum extent; // spatial extent
|
|
mjtNum center[3]; // center of model
|
|
};
|
|
typedef struct mjStatistic_ mjStatistic;
|
|
struct mjModel_ {
|
|
// ------------------------------- sizes
|
|
|
|
// sizes needed at mjModel construction
|
|
int nq; // number of generalized coordinates = dim(qpos)
|
|
int nv; // number of degrees of freedom = dim(qvel)
|
|
int nu; // number of actuators/controls = dim(ctrl)
|
|
int na; // number of activation states = dim(act)
|
|
int nbody; // number of bodies
|
|
int nbvh; // number of bounding volumes in all bodies
|
|
int njnt; // number of joints
|
|
int ngeom; // number of geoms
|
|
int nsite; // number of sites
|
|
int ncam; // number of cameras
|
|
int nlight; // number of lights
|
|
int nmesh; // number of meshes
|
|
int nmeshvert; // number of vertices in all meshes
|
|
int nmeshnormal; // number of normals in all meshes
|
|
int nmeshtexcoord; // number of texcoords in all meshes
|
|
int nmeshface; // number of triangular faces in all meshes
|
|
int nmeshgraph; // number of ints in mesh auxiliary data
|
|
int nskin; // number of skins
|
|
int nskinvert; // number of vertices in all skins
|
|
int nskintexvert; // number of vertiex with texcoords in all skins
|
|
int nskinface; // number of triangular faces in all skins
|
|
int nskinbone; // number of bones in all skins
|
|
int nskinbonevert; // number of vertices in all skin bones
|
|
int nhfield; // number of heightfields
|
|
int nhfielddata; // number of data points in all heightfields
|
|
int ntex; // number of textures
|
|
int ntexdata; // number of bytes in texture rgb data
|
|
int nmat; // number of materials
|
|
int npair; // number of predefined geom pairs
|
|
int nexclude; // number of excluded geom pairs
|
|
int neq; // number of equality constraints
|
|
int ntendon; // number of tendons
|
|
int nwrap; // number of wrap objects in all tendon paths
|
|
int nsensor; // number of sensors
|
|
int nnumeric; // number of numeric custom fields
|
|
int nnumericdata; // number of mjtNums in all numeric fields
|
|
int ntext; // number of text custom fields
|
|
int ntextdata; // number of mjtBytes in all text fields
|
|
int ntuple; // number of tuple custom fields
|
|
int ntupledata; // number of objects in all tuple fields
|
|
int nkey; // number of keyframes
|
|
int nmocap; // number of mocap bodies
|
|
int nplugin; // number of plugin instances
|
|
int npluginattr; // number of chars in all plugin config attributes
|
|
int nuser_body; // number of mjtNums in body_user
|
|
int nuser_jnt; // number of mjtNums in jnt_user
|
|
int nuser_geom; // number of mjtNums in geom_user
|
|
int nuser_site; // number of mjtNums in site_user
|
|
int nuser_cam; // number of mjtNums in cam_user
|
|
int nuser_tendon; // number of mjtNums in tendon_user
|
|
int nuser_actuator; // number of mjtNums in actuator_user
|
|
int nuser_sensor; // number of mjtNums in sensor_user
|
|
int nnames; // number of chars in all names
|
|
int nnames_map; // number of slots in the names hash map
|
|
|
|
// sizes set after mjModel construction (only affect mjData)
|
|
int nM; // number of non-zeros in sparse inertia matrix
|
|
int nD; // number of non-zeros in sparse dof-dof matrix
|
|
int nB; // number of non-zeros in sparse body-dof matrix
|
|
int ntree; // number of kinematic trees under world body
|
|
int nemax; // number of potential equality-constraint rows
|
|
int njmax; // number of available rows in constraint Jacobian
|
|
int nconmax; // number of potential contacts in contact list
|
|
int nuserdata; // number of extra fields in mjData
|
|
int nsensordata; // number of fields in sensor data vector
|
|
int npluginstate; // number of fields in plugin state vector
|
|
|
|
size_t narena; // number of bytes in the mjData arena (inclusive of stack)
|
|
size_t nbuffer; // number of bytes in buffer
|
|
|
|
// ------------------------------- options and statistics
|
|
|
|
mjOption opt; // physics options
|
|
mjVisual vis; // visualization options
|
|
mjStatistic stat; // model statistics
|
|
|
|
// ------------------------------- buffers
|
|
|
|
// main buffer
|
|
void* buffer; // main buffer; all pointers point in it (nbuffer)
|
|
|
|
// default generalized coordinates
|
|
mjtNum* qpos0; // qpos values at default pose (nq x 1)
|
|
mjtNum* qpos_spring; // reference pose for springs (nq x 1)
|
|
|
|
// bodies
|
|
int* body_parentid; // id of body's parent (nbody x 1)
|
|
int* body_rootid; // id of root above body (nbody x 1)
|
|
int* body_weldid; // id of body that this body is welded to (nbody x 1)
|
|
int* body_mocapid; // id of mocap data; -1: none (nbody x 1)
|
|
int* body_jntnum; // number of joints for this body (nbody x 1)
|
|
int* body_jntadr; // start addr of joints; -1: no joints (nbody x 1)
|
|
int* body_dofnum; // number of motion degrees of freedom (nbody x 1)
|
|
int* body_dofadr; // start addr of dofs; -1: no dofs (nbody x 1)
|
|
int* body_treeid; // id of body's kinematic tree; -1: static (nbody x 1)
|
|
int* body_geomnum; // number of geoms (nbody x 1)
|
|
int* body_geomadr; // start addr of geoms; -1: no geoms (nbody x 1)
|
|
mjtByte* body_simple; // body is simple (has diagonal M) (nbody x 1)
|
|
mjtByte* body_sameframe; // inertial frame is same as body frame (nbody x 1)
|
|
mjtNum* body_pos; // position offset rel. to parent body (nbody x 3)
|
|
mjtNum* body_quat; // orientation offset rel. to parent body (nbody x 4)
|
|
mjtNum* body_ipos; // local position of center of mass (nbody x 3)
|
|
mjtNum* body_iquat; // local orientation of inertia ellipsoid (nbody x 4)
|
|
mjtNum* body_mass; // mass (nbody x 1)
|
|
mjtNum* body_subtreemass; // mass of subtree starting at this body (nbody x 1)
|
|
mjtNum* body_inertia; // diagonal inertia in ipos/iquat frame (nbody x 3)
|
|
mjtNum* body_invweight0; // mean inv inert in qpos0 (trn, rot) (nbody x 2)
|
|
mjtNum* body_gravcomp; // antigravity force, units of body weight (nbody x 1)
|
|
mjtNum* body_user; // user data (nbody x nuser_body)
|
|
int* body_plugin; // plugin instance id; -1: not in use (nbody x 1)
|
|
int* body_bvhadr; // address of bvh root (nbody x 1)
|
|
int* body_bvhnum; // number of bounding volumes (nbody x 1)
|
|
|
|
// bounding volume hierarchy
|
|
int* bvh_depth; // depth in the bounding volume hierarchy (nbvh x 1)
|
|
int* bvh_child; // left and right children in tree (nbvh x 2)
|
|
int* bvh_geomid; // geom id of the node; -1: non-leaf (nbvh x 1)
|
|
mjtNum* bvh_aabb; // bounding box of node (center, size) (nbvh x 6)
|
|
|
|
// joints
|
|
int* jnt_type; // type of joint (mjtJoint) (njnt x 1)
|
|
int* jnt_qposadr; // start addr in 'qpos' for joint's data (njnt x 1)
|
|
int* jnt_dofadr; // start addr in 'qvel' for joint's data (njnt x 1)
|
|
int* jnt_bodyid; // id of joint's body (njnt x 1)
|
|
int* jnt_group; // group for visibility (njnt x 1)
|
|
mjtByte* jnt_limited; // does joint have limits (njnt x 1)
|
|
mjtByte* jnt_actfrclimited; // does joint have actuator force limits (njnt x 1)
|
|
mjtNum* jnt_solref; // constraint solver reference: limit (njnt x mjNREF)
|
|
mjtNum* jnt_solimp; // constraint solver impedance: limit (njnt x mjNIMP)
|
|
mjtNum* jnt_pos; // local anchor position (njnt x 3)
|
|
mjtNum* jnt_axis; // local joint axis (njnt x 3)
|
|
mjtNum* jnt_stiffness; // stiffness coefficient (njnt x 1)
|
|
mjtNum* jnt_range; // joint limits (njnt x 2)
|
|
mjtNum* jnt_actfrcrange; // range of total actuator force (njnt x 2)
|
|
mjtNum* jnt_margin; // min distance for limit detection (njnt x 1)
|
|
mjtNum* jnt_user; // user data (njnt x nuser_jnt)
|
|
|
|
// dofs
|
|
int* dof_bodyid; // id of dof's body (nv x 1)
|
|
int* dof_jntid; // id of dof's joint (nv x 1)
|
|
int* dof_parentid; // id of dof's parent; -1: none (nv x 1)
|
|
int* dof_treeid; // id of dof's kinematic tree (nv x 1)
|
|
int* dof_Madr; // dof address in M-diagonal (nv x 1)
|
|
int* dof_simplenum; // number of consecutive simple dofs (nv x 1)
|
|
mjtNum* dof_solref; // constraint solver reference:frictionloss (nv x mjNREF)
|
|
mjtNum* dof_solimp; // constraint solver impedance:frictionloss (nv x mjNIMP)
|
|
mjtNum* dof_frictionloss; // dof friction loss (nv x 1)
|
|
mjtNum* dof_armature; // dof armature inertia/mass (nv x 1)
|
|
mjtNum* dof_damping; // damping coefficient (nv x 1)
|
|
mjtNum* dof_invweight0; // diag. inverse inertia in qpos0 (nv x 1)
|
|
mjtNum* dof_M0; // diag. inertia in qpos0 (nv x 1)
|
|
|
|
// geoms
|
|
int* geom_type; // geometric type (mjtGeom) (ngeom x 1)
|
|
int* geom_contype; // geom contact type (ngeom x 1)
|
|
int* geom_conaffinity; // geom contact affinity (ngeom x 1)
|
|
int* geom_condim; // contact dimensionality (1, 3, 4, 6) (ngeom x 1)
|
|
int* geom_bodyid; // id of geom's body (ngeom x 1)
|
|
int* geom_dataid; // id of geom's mesh/hfield; -1: none (ngeom x 1)
|
|
int* geom_matid; // material id for rendering; -1: none (ngeom x 1)
|
|
int* geom_group; // group for visibility (ngeom x 1)
|
|
int* geom_priority; // geom contact priority (ngeom x 1)
|
|
int* geom_plugin; // plugin instance id; -1: not in use (ngeom x 1)
|
|
mjtByte* geom_sameframe; // same as body frame (1) or iframe (2) (ngeom x 1)
|
|
mjtNum* geom_solmix; // mixing coef for solref/imp in geom pair (ngeom x 1)
|
|
mjtNum* geom_solref; // constraint solver reference: contact (ngeom x mjNREF)
|
|
mjtNum* geom_solimp; // constraint solver impedance: contact (ngeom x mjNIMP)
|
|
mjtNum* geom_size; // geom-specific size parameters (ngeom x 3)
|
|
mjtNum* geom_aabb; // bounding box, (center, size) (ngeom x 6)
|
|
mjtNum* geom_rbound; // radius of bounding sphere (ngeom x 1)
|
|
mjtNum* geom_pos; // local position offset rel. to body (ngeom x 3)
|
|
mjtNum* geom_quat; // local orientation offset rel. to body (ngeom x 4)
|
|
mjtNum* geom_friction; // friction for (slide, spin, roll) (ngeom x 3)
|
|
mjtNum* geom_margin; // detect contact if dist<margin (ngeom x 1)
|
|
mjtNum* geom_gap; // include in solver if dist<margin-gap (ngeom x 1)
|
|
mjtNum* geom_fluid; // fluid interaction parameters (ngeom x mjNFLUID)
|
|
mjtNum* geom_user; // user data (ngeom x nuser_geom)
|
|
float* geom_rgba; // rgba when material is omitted (ngeom x 4)
|
|
|
|
// sites
|
|
int* site_type; // geom type for rendering (mjtGeom) (nsite x 1)
|
|
int* site_bodyid; // id of site's body (nsite x 1)
|
|
int* site_matid; // material id for rendering; -1: none (nsite x 1)
|
|
int* site_group; // group for visibility (nsite x 1)
|
|
mjtByte* site_sameframe; // same as body frame (1) or iframe (2) (nsite x 1)
|
|
mjtNum* site_size; // geom size for rendering (nsite x 3)
|
|
mjtNum* site_pos; // local position offset rel. to body (nsite x 3)
|
|
mjtNum* site_quat; // local orientation offset rel. to body (nsite x 4)
|
|
mjtNum* site_user; // user data (nsite x nuser_site)
|
|
float* site_rgba; // rgba when material is omitted (nsite x 4)
|
|
|
|
// cameras
|
|
int* cam_mode; // camera tracking mode (mjtCamLight) (ncam x 1)
|
|
int* cam_bodyid; // id of camera's body (ncam x 1)
|
|
int* cam_targetbodyid; // id of targeted body; -1: none (ncam x 1)
|
|
mjtNum* cam_pos; // position rel. to body frame (ncam x 3)
|
|
mjtNum* cam_quat; // orientation rel. to body frame (ncam x 4)
|
|
mjtNum* cam_poscom0; // global position rel. to sub-com in qpos0 (ncam x 3)
|
|
mjtNum* cam_pos0; // global position rel. to body in qpos0 (ncam x 3)
|
|
mjtNum* cam_mat0; // global orientation in qpos0 (ncam x 9)
|
|
mjtNum* cam_fovy; // y-field of view (deg) (ncam x 1)
|
|
mjtNum* cam_ipd; // inter-pupilary distance (ncam x 1)
|
|
mjtNum* cam_user; // user data (ncam x nuser_cam)
|
|
|
|
// lights
|
|
int* light_mode; // light tracking mode (mjtCamLight) (nlight x 1)
|
|
int* light_bodyid; // id of light's body (nlight x 1)
|
|
int* light_targetbodyid; // id of targeted body; -1: none (nlight x 1)
|
|
mjtByte* light_directional; // directional light (nlight x 1)
|
|
mjtByte* light_castshadow; // does light cast shadows (nlight x 1)
|
|
mjtByte* light_active; // is light on (nlight x 1)
|
|
mjtNum* light_pos; // position rel. to body frame (nlight x 3)
|
|
mjtNum* light_dir; // direction rel. to body frame (nlight x 3)
|
|
mjtNum* light_poscom0; // global position rel. to sub-com in qpos0 (nlight x 3)
|
|
mjtNum* light_pos0; // global position rel. to body in qpos0 (nlight x 3)
|
|
mjtNum* light_dir0; // global direction in qpos0 (nlight x 3)
|
|
float* light_attenuation; // OpenGL attenuation (quadratic model) (nlight x 3)
|
|
float* light_cutoff; // OpenGL cutoff (nlight x 1)
|
|
float* light_exponent; // OpenGL exponent (nlight x 1)
|
|
float* light_ambient; // ambient rgb (alpha=1) (nlight x 3)
|
|
float* light_diffuse; // diffuse rgb (alpha=1) (nlight x 3)
|
|
float* light_specular; // specular rgb (alpha=1) (nlight x 3)
|
|
|
|
// meshes
|
|
int* mesh_vertadr; // first vertex address (nmesh x 1)
|
|
int* mesh_vertnum; // number of vertices (nmesh x 1)
|
|
int* mesh_faceadr; // first face address (nmesh x 1)
|
|
int* mesh_facenum; // number of faces (nmesh x 1)
|
|
int* mesh_bvhadr; // address of bvh root (nmesh x 1)
|
|
int* mesh_bvhnum; // number of bvh (nmesh x 1)
|
|
int* mesh_normaladr; // first normal address (nmesh x 1)
|
|
int* mesh_normalnum; // number of normals (nmesh x 1)
|
|
int* mesh_texcoordadr; // texcoord data address; -1: no texcoord (nmesh x 1)
|
|
int* mesh_texcoordnum; // number of texcoord (nmesh x 1)
|
|
int* mesh_graphadr; // graph data address; -1: no graph (nmesh x 1)
|
|
float* mesh_vert; // vertex positions for all meshes (nmeshvert x 3)
|
|
float* mesh_normal; // normals for all meshes (nmeshnormal x 3)
|
|
float* mesh_texcoord; // vertex texcoords for all meshes (nmeshtexcoord x 2)
|
|
int* mesh_face; // vertex face data (nmeshface x 3)
|
|
int* mesh_facenormal; // normal face data (nmeshface x 3)
|
|
int* mesh_facetexcoord; // texture face data (nmeshface x 3)
|
|
int* mesh_graph; // convex graph data (nmeshgraph x 1)
|
|
|
|
// skins
|
|
int* skin_matid; // skin material id; -1: none (nskin x 1)
|
|
int* skin_group; // group for visibility (nskin x 1)
|
|
float* skin_rgba; // skin rgba (nskin x 4)
|
|
float* skin_inflate; // inflate skin in normal direction (nskin x 1)
|
|
int* skin_vertadr; // first vertex address (nskin x 1)
|
|
int* skin_vertnum; // number of vertices (nskin x 1)
|
|
int* skin_texcoordadr; // texcoord data address; -1: no texcoord (nskin x 1)
|
|
int* skin_faceadr; // first face address (nskin x 1)
|
|
int* skin_facenum; // number of faces (nskin x 1)
|
|
int* skin_boneadr; // first bone in skin (nskin x 1)
|
|
int* skin_bonenum; // number of bones in skin (nskin x 1)
|
|
float* skin_vert; // vertex positions for all skin meshes (nskinvert x 3)
|
|
float* skin_texcoord; // vertex texcoords for all skin meshes (nskintexvert x 2)
|
|
int* skin_face; // triangle faces for all skin meshes (nskinface x 3)
|
|
int* skin_bonevertadr; // first vertex in each bone (nskinbone x 1)
|
|
int* skin_bonevertnum; // number of vertices in each bone (nskinbone x 1)
|
|
float* skin_bonebindpos; // bind pos of each bone (nskinbone x 3)
|
|
float* skin_bonebindquat; // bind quat of each bone (nskinbone x 4)
|
|
int* skin_bonebodyid; // body id of each bone (nskinbone x 1)
|
|
int* skin_bonevertid; // mesh ids of vertices in each bone (nskinbonevert x 1)
|
|
float* skin_bonevertweight; // weights of vertices in each bone (nskinbonevert x 1)
|
|
|
|
// height fields
|
|
mjtNum* hfield_size; // (x, y, z_top, z_bottom) (nhfield x 4)
|
|
int* hfield_nrow; // number of rows in grid (nhfield x 1)
|
|
int* hfield_ncol; // number of columns in grid (nhfield x 1)
|
|
int* hfield_adr; // address in hfield_data (nhfield x 1)
|
|
float* hfield_data; // elevation data (nhfielddata x 1)
|
|
|
|
// textures
|
|
int* tex_type; // texture type (mjtTexture) (ntex x 1)
|
|
int* tex_height; // number of rows in texture image (ntex x 1)
|
|
int* tex_width; // number of columns in texture image (ntex x 1)
|
|
int* tex_adr; // address in rgb (ntex x 1)
|
|
mjtByte* tex_rgb; // rgb (alpha = 1) (ntexdata x 1)
|
|
|
|
// materials
|
|
int* mat_texid; // texture id; -1: none (nmat x 1)
|
|
mjtByte* mat_texuniform; // make texture cube uniform (nmat x 1)
|
|
float* mat_texrepeat; // texture repetition for 2d mapping (nmat x 2)
|
|
float* mat_emission; // emission (x rgb) (nmat x 1)
|
|
float* mat_specular; // specular (x white) (nmat x 1)
|
|
float* mat_shininess; // shininess coef (nmat x 1)
|
|
float* mat_reflectance; // reflectance (0: disable) (nmat x 1)
|
|
float* mat_rgba; // rgba (nmat x 4)
|
|
|
|
// predefined geom pairs for collision detection; has precedence over exclude
|
|
int* pair_dim; // contact dimensionality (npair x 1)
|
|
int* pair_geom1; // id of geom1 (npair x 1)
|
|
int* pair_geom2; // id of geom2 (npair x 1)
|
|
int* pair_signature; // (body1+1) << 16 + body2+1 (npair x 1)
|
|
mjtNum* pair_solref; // solver reference: contact normal (npair x mjNREF)
|
|
mjtNum* pair_solreffriction; // solver reference: contact friction (npair x mjNREF)
|
|
mjtNum* pair_solimp; // solver impedance: contact (npair x mjNIMP)
|
|
mjtNum* pair_margin; // detect contact if dist<margin (npair x 1)
|
|
mjtNum* pair_gap; // include in solver if dist<margin-gap (npair x 1)
|
|
mjtNum* pair_friction; // tangent1, 2, spin, roll1, 2 (npair x 5)
|
|
|
|
// excluded body pairs for collision detection
|
|
int* exclude_signature; // (body1+1) << 16 + body2+1 (nexclude x 1)
|
|
|
|
// equality constraints
|
|
int* eq_type; // constraint type (mjtEq) (neq x 1)
|
|
int* eq_obj1id; // id of object 1 (neq x 1)
|
|
int* eq_obj2id; // id of object 2 (neq x 1)
|
|
mjtByte* eq_active; // enable/disable constraint (neq x 1)
|
|
mjtNum* eq_solref; // constraint solver reference (neq x mjNREF)
|
|
mjtNum* eq_solimp; // constraint solver impedance (neq x mjNIMP)
|
|
mjtNum* eq_data; // numeric data for constraint (neq x mjNEQDATA)
|
|
|
|
// tendons
|
|
int* tendon_adr; // address of first object in tendon's path (ntendon x 1)
|
|
int* tendon_num; // number of objects in tendon's path (ntendon x 1)
|
|
int* tendon_matid; // material id for rendering (ntendon x 1)
|
|
int* tendon_group; // group for visibility (ntendon x 1)
|
|
mjtByte* tendon_limited; // does tendon have length limits (ntendon x 1)
|
|
mjtNum* tendon_width; // width for rendering (ntendon x 1)
|
|
mjtNum* tendon_solref_lim; // constraint solver reference: limit (ntendon x mjNREF)
|
|
mjtNum* tendon_solimp_lim; // constraint solver impedance: limit (ntendon x mjNIMP)
|
|
mjtNum* tendon_solref_fri; // constraint solver reference: friction (ntendon x mjNREF)
|
|
mjtNum* tendon_solimp_fri; // constraint solver impedance: friction (ntendon x mjNIMP)
|
|
mjtNum* tendon_range; // tendon length limits (ntendon x 2)
|
|
mjtNum* tendon_margin; // min distance for limit detection (ntendon x 1)
|
|
mjtNum* tendon_stiffness; // stiffness coefficient (ntendon x 1)
|
|
mjtNum* tendon_damping; // damping coefficient (ntendon x 1)
|
|
mjtNum* tendon_frictionloss; // loss due to friction (ntendon x 1)
|
|
mjtNum* tendon_lengthspring; // spring resting length range (ntendon x 2)
|
|
mjtNum* tendon_length0; // tendon length in qpos0 (ntendon x 1)
|
|
mjtNum* tendon_invweight0; // inv. weight in qpos0 (ntendon x 1)
|
|
mjtNum* tendon_user; // user data (ntendon x nuser_tendon)
|
|
float* tendon_rgba; // rgba when material is omitted (ntendon x 4)
|
|
|
|
// list of all wrap objects in tendon paths
|
|
int* wrap_type; // wrap object type (mjtWrap) (nwrap x 1)
|
|
int* wrap_objid; // object id: geom, site, joint (nwrap x 1)
|
|
mjtNum* wrap_prm; // divisor, joint coef, or site id (nwrap x 1)
|
|
|
|
// actuators
|
|
int* actuator_trntype; // transmission type (mjtTrn) (nu x 1)
|
|
int* actuator_dyntype; // dynamics type (mjtDyn) (nu x 1)
|
|
int* actuator_gaintype; // gain type (mjtGain) (nu x 1)
|
|
int* actuator_biastype; // bias type (mjtBias) (nu x 1)
|
|
int* actuator_trnid; // transmission id: joint, tendon, site (nu x 2)
|
|
int* actuator_actadr; // first activation address; -1: stateless (nu x 1)
|
|
int* actuator_actnum; // number of activation variables (nu x 1)
|
|
int* actuator_group; // group for visibility (nu x 1)
|
|
mjtByte* actuator_ctrllimited; // is control limited (nu x 1)
|
|
mjtByte* actuator_forcelimited;// is force limited (nu x 1)
|
|
mjtByte* actuator_actlimited; // is activation limited (nu x 1)
|
|
mjtNum* actuator_dynprm; // dynamics parameters (nu x mjNDYN)
|
|
mjtNum* actuator_gainprm; // gain parameters (nu x mjNGAIN)
|
|
mjtNum* actuator_biasprm; // bias parameters (nu x mjNBIAS)
|
|
mjtByte* actuator_actearly; // step activation before force (nu x 1)
|
|
mjtNum* actuator_ctrlrange; // range of controls (nu x 2)
|
|
mjtNum* actuator_forcerange; // range of forces (nu x 2)
|
|
mjtNum* actuator_actrange; // range of activations (nu x 2)
|
|
mjtNum* actuator_gear; // scale length and transmitted force (nu x 6)
|
|
mjtNum* actuator_cranklength; // crank length for slider-crank (nu x 1)
|
|
mjtNum* actuator_acc0; // acceleration from unit force in qpos0 (nu x 1)
|
|
mjtNum* actuator_length0; // actuator length in qpos0 (nu x 1)
|
|
mjtNum* actuator_lengthrange; // feasible actuator length range (nu x 2)
|
|
mjtNum* actuator_user; // user data (nu x nuser_actuator)
|
|
int* actuator_plugin; // plugin instance id; -1: not a plugin (nu x 1)
|
|
|
|
// sensors
|
|
int* sensor_type; // sensor type (mjtSensor) (nsensor x 1)
|
|
int* sensor_datatype; // numeric data type (mjtDataType) (nsensor x 1)
|
|
int* sensor_needstage; // required compute stage (mjtStage) (nsensor x 1)
|
|
int* sensor_objtype; // type of sensorized object (mjtObj) (nsensor x 1)
|
|
int* sensor_objid; // id of sensorized object (nsensor x 1)
|
|
int* sensor_reftype; // type of reference frame (mjtObj) (nsensor x 1)
|
|
int* sensor_refid; // id of reference frame; -1: global frame (nsensor x 1)
|
|
int* sensor_dim; // number of scalar outputs (nsensor x 1)
|
|
int* sensor_adr; // address in sensor array (nsensor x 1)
|
|
mjtNum* sensor_cutoff; // cutoff for real and positive; 0: ignore (nsensor x 1)
|
|
mjtNum* sensor_noise; // noise standard deviation (nsensor x 1)
|
|
mjtNum* sensor_user; // user data (nsensor x nuser_sensor)
|
|
int* sensor_plugin; // plugin instance id; -1: not a plugin (nsensor x 1)
|
|
|
|
// plugin instances
|
|
int* plugin; // globally registered plugin slot number (nplugin x 1)
|
|
int* plugin_stateadr; // address in the plugin state array (nplugin x 1)
|
|
int* plugin_statenum; // number of states in the plugin instance (nplugin x 1)
|
|
char* plugin_attr; // config attributes of plugin instances (npluginattr x 1)
|
|
int* plugin_attradr; // address to each instance's config attrib (nplugin x 1)
|
|
|
|
// custom numeric fields
|
|
int* numeric_adr; // address of field in numeric_data (nnumeric x 1)
|
|
int* numeric_size; // size of numeric field (nnumeric x 1)
|
|
mjtNum* numeric_data; // array of all numeric fields (nnumericdata x 1)
|
|
|
|
// custom text fields
|
|
int* text_adr; // address of text in text_data (ntext x 1)
|
|
int* text_size; // size of text field (strlen+1) (ntext x 1)
|
|
char* text_data; // array of all text fields (0-terminated) (ntextdata x 1)
|
|
|
|
// custom tuple fields
|
|
int* tuple_adr; // address of text in text_data (ntuple x 1)
|
|
int* tuple_size; // number of objects in tuple (ntuple x 1)
|
|
int* tuple_objtype; // array of object types in all tuples (ntupledata x 1)
|
|
int* tuple_objid; // array of object ids in all tuples (ntupledata x 1)
|
|
mjtNum* tuple_objprm; // array of object params in all tuples (ntupledata x 1)
|
|
|
|
// keyframes
|
|
mjtNum* key_time; // key time (nkey x 1)
|
|
mjtNum* key_qpos; // key position (nkey x nq)
|
|
mjtNum* key_qvel; // key velocity (nkey x nv)
|
|
mjtNum* key_act; // key activation (nkey x na)
|
|
mjtNum* key_mpos; // key mocap position (nkey x 3*nmocap)
|
|
mjtNum* key_mquat; // key mocap quaternion (nkey x 4*nmocap)
|
|
mjtNum* key_ctrl; // key control (nkey x nu)
|
|
|
|
// names
|
|
int* name_bodyadr; // body name pointers (nbody x 1)
|
|
int* name_jntadr; // joint name pointers (njnt x 1)
|
|
int* name_geomadr; // geom name pointers (ngeom x 1)
|
|
int* name_siteadr; // site name pointers (nsite x 1)
|
|
int* name_camadr; // camera name pointers (ncam x 1)
|
|
int* name_lightadr; // light name pointers (nlight x 1)
|
|
int* name_meshadr; // mesh name pointers (nmesh x 1)
|
|
int* name_skinadr; // skin name pointers (nskin x 1)
|
|
int* name_hfieldadr; // hfield name pointers (nhfield x 1)
|
|
int* name_texadr; // texture name pointers (ntex x 1)
|
|
int* name_matadr; // material name pointers (nmat x 1)
|
|
int* name_pairadr; // geom pair name pointers (npair x 1)
|
|
int* name_excludeadr; // exclude name pointers (nexclude x 1)
|
|
int* name_eqadr; // equality constraint name pointers (neq x 1)
|
|
int* name_tendonadr; // tendon name pointers (ntendon x 1)
|
|
int* name_actuatoradr; // actuator name pointers (nu x 1)
|
|
int* name_sensoradr; // sensor name pointers (nsensor x 1)
|
|
int* name_numericadr; // numeric name pointers (nnumeric x 1)
|
|
int* name_textadr; // text name pointers (ntext x 1)
|
|
int* name_tupleadr; // tuple name pointers (ntuple x 1)
|
|
int* name_keyadr; // keyframe name pointers (nkey x 1)
|
|
int* name_pluginadr; // plugin instance name pointers (nplugin x 1)
|
|
char* names; // names of all objects, 0-terminated (nnames x 1)
|
|
int* names_map; // internal hash map of names (nnames_map x 1)
|
|
};
|
|
typedef struct mjModel_ mjModel;
|
|
struct mjResource_ {
|
|
char* name; // name of resource (filename, etc)
|
|
void* data; // opaque data pointer
|
|
const struct mjpResourceProvider* provider; // pointer to the provider
|
|
};
|
|
typedef struct mjResource_ mjResource;
|
|
struct mjpResourceProvider {
|
|
const char* prefix; // prefix for match against a resource name
|
|
mjfOpenResource open; // opening callback
|
|
mjfReadResource read; // reading callback
|
|
mjfCloseResource close; // closing callback
|
|
mjfGetResourceDir getdir; // get directory callback (optional)
|
|
mjfResourceModified modified; // resource modified callback (optional)
|
|
void* data; // opaque data pointer (resource invariant)
|
|
};
|
|
typedef struct mjpResourceProvider mjpResourceProvider;
|
|
typedef enum mjtPluginCapabilityBit_ {
|
|
mjPLUGIN_ACTUATOR = 1<<0, // actuator forces
|
|
mjPLUGIN_SENSOR = 1<<1, // sensor measurements
|
|
mjPLUGIN_PASSIVE = 1<<2, // passive forces
|
|
mjPLUGIN_SDF = 1<<3, // signed distance fields
|
|
} mjtPluginCapabilityBit;
|
|
struct mjpPlugin_ {
|
|
const char* name; // globally unique name identifying the plugin
|
|
|
|
int nattribute; // number of configuration attributes
|
|
const char* const* attributes; // name of configuration attributes
|
|
|
|
int capabilityflags; // plugin capabilities: bitfield of mjtPluginCapabilityBit
|
|
int needstage; // sensor computation stage (mjtStage)
|
|
|
|
// number of mjtNums needed to store the state of a plugin instance (required)
|
|
int (*nstate)(const mjModel* m, int instance);
|
|
|
|
// dimension of the specified sensor's output (required only for sensor plugins)
|
|
int (*nsensordata)(const mjModel* m, int instance, int sensor_id);
|
|
|
|
// called when a new mjData is being created (required), returns 0 on success or -1 on failure
|
|
int (*init)(const mjModel* m, mjData* d, int instance);
|
|
|
|
// called when an mjData is being freed (optional)
|
|
void (*destroy)(mjData* d, int instance);
|
|
|
|
// called when an mjData is being copied (optional)
|
|
void (*copy)(mjData* dest, const mjModel* m, const mjData* src, int instance);
|
|
|
|
// called when an mjData is being reset (required)
|
|
void (*reset)(const mjModel* m, double* plugin_state, void* plugin_data, int instance);
|
|
|
|
// called when the plugin needs to update its outputs (required)
|
|
void (*compute)(const mjModel* m, mjData* d, int instance, int capability_bit);
|
|
|
|
// called when time integration occurs (optional)
|
|
void (*advance)(const mjModel* m, mjData* d, int instance);
|
|
|
|
// called by mjv_updateScene (optional)
|
|
void (*visualize)(const mjModel*m, mjData* d, const mjvOption* opt, mjvScene* scn, int instance);
|
|
|
|
// methods specific to signed distance fields (optional)
|
|
|
|
// signed distance from the surface
|
|
mjtNum (*sdf_distance)(const mjtNum point[3], const mjData* d, int instance);
|
|
|
|
// gradient of distance with respect to local coordinates
|
|
void (*sdf_gradient)(mjtNum gradient[3], const mjtNum point[3], const mjData* d, int instance);
|
|
|
|
// called during compilation for marching cubes
|
|
mjtNum (*sdf_staticdistance)(const mjtNum point[3], const mjtNum* attributes);
|
|
|
|
// bounding box of implicit surface
|
|
void (*sdf_aabb)(mjtNum aabb[6], const mjtNum* attributes);
|
|
};
|
|
typedef struct mjpPlugin_ mjpPlugin;
|
|
typedef enum mjtGridPos_ { // grid position for overlay
|
|
mjGRID_TOPLEFT = 0, // top left
|
|
mjGRID_TOPRIGHT, // top right
|
|
mjGRID_BOTTOMLEFT, // bottom left
|
|
mjGRID_BOTTOMRIGHT // bottom right
|
|
} mjtGridPos;
|
|
typedef enum mjtFramebuffer_ { // OpenGL framebuffer option
|
|
mjFB_WINDOW = 0, // default/window buffer
|
|
mjFB_OFFSCREEN // offscreen buffer
|
|
} mjtFramebuffer;
|
|
typedef enum mjtFontScale_ { // font scale, used at context creation
|
|
mjFONTSCALE_50 = 50, // 50% scale, suitable for low-res rendering
|
|
mjFONTSCALE_100 = 100, // normal scale, suitable in the absence of DPI scaling
|
|
mjFONTSCALE_150 = 150, // 150% scale
|
|
mjFONTSCALE_200 = 200, // 200% scale
|
|
mjFONTSCALE_250 = 250, // 250% scale
|
|
mjFONTSCALE_300 = 300 // 300% scale
|
|
} mjtFontScale;
|
|
typedef enum mjtFont_ { // font type, used at each text operation
|
|
mjFONT_NORMAL = 0, // normal font
|
|
mjFONT_SHADOW, // normal font with shadow (for higher contrast)
|
|
mjFONT_BIG // big font (for user alerts)
|
|
} mjtFont;
|
|
struct mjrRect_ { // OpenGL rectangle
|
|
int left; // left (usually 0)
|
|
int bottom; // bottom (usually 0)
|
|
int width; // width (usually buffer width)
|
|
int height; // height (usually buffer height)
|
|
};
|
|
typedef struct mjrRect_ mjrRect;
|
|
struct mjrContext_ { // custom OpenGL context
|
|
// parameters copied from mjVisual
|
|
float lineWidth; // line width for wireframe rendering
|
|
float shadowClip; // clipping radius for directional lights
|
|
float shadowScale; // fraction of light cutoff for spot lights
|
|
float fogStart; // fog start = stat.extent * vis.map.fogstart
|
|
float fogEnd; // fog end = stat.extent * vis.map.fogend
|
|
float fogRGBA[4]; // fog rgba
|
|
int shadowSize; // size of shadow map texture
|
|
int offWidth; // width of offscreen buffer
|
|
int offHeight; // height of offscreen buffer
|
|
int offSamples; // number of offscreen buffer multisamples
|
|
|
|
// parameters specified at creation
|
|
int fontScale; // font scale
|
|
int auxWidth[mjNAUX]; // auxiliary buffer width
|
|
int auxHeight[mjNAUX]; // auxiliary buffer height
|
|
int auxSamples[mjNAUX]; // auxiliary buffer multisamples
|
|
|
|
// offscreen rendering objects
|
|
unsigned int offFBO; // offscreen framebuffer object
|
|
unsigned int offFBO_r; // offscreen framebuffer for resolving multisamples
|
|
unsigned int offColor; // offscreen color buffer
|
|
unsigned int offColor_r; // offscreen color buffer for resolving multisamples
|
|
unsigned int offDepthStencil; // offscreen depth and stencil buffer
|
|
unsigned int offDepthStencil_r; // offscreen depth and stencil buffer for resolving multisamples
|
|
|
|
// shadow rendering objects
|
|
unsigned int shadowFBO; // shadow map framebuffer object
|
|
unsigned int shadowTex; // shadow map texture
|
|
|
|
// auxiliary buffers
|
|
unsigned int auxFBO[mjNAUX]; // auxiliary framebuffer object
|
|
unsigned int auxFBO_r[mjNAUX]; // auxiliary framebuffer object for resolving
|
|
unsigned int auxColor[mjNAUX]; // auxiliary color buffer
|
|
unsigned int auxColor_r[mjNAUX];// auxiliary color buffer for resolving
|
|
|
|
// texture objects and info
|
|
int ntexture; // number of allocated textures
|
|
int textureType[100]; // type of texture (mjtTexture) (ntexture)
|
|
unsigned int texture[100]; // texture names
|
|
|
|
// displaylist starting positions
|
|
unsigned int basePlane; // all planes from model
|
|
unsigned int baseMesh; // all meshes from model
|
|
unsigned int baseHField; // all hfields from model
|
|
unsigned int baseBuiltin; // all buildin geoms, with quality from model
|
|
unsigned int baseFontNormal; // normal font
|
|
unsigned int baseFontShadow; // shadow font
|
|
unsigned int baseFontBig; // big font
|
|
|
|
// displaylist ranges
|
|
int rangePlane; // all planes from model
|
|
int rangeMesh; // all meshes from model
|
|
int rangeHField; // all hfields from model
|
|
int rangeBuiltin; // all builtin geoms, with quality from model
|
|
int rangeFont; // all characters in font
|
|
|
|
// skin VBOs
|
|
int nskin; // number of skins
|
|
unsigned int* skinvertVBO; // skin vertex position VBOs (nskin)
|
|
unsigned int* skinnormalVBO; // skin vertex normal VBOs (nskin)
|
|
unsigned int* skintexcoordVBO; // skin vertex texture coordinate VBOs (nskin)
|
|
unsigned int* skinfaceVBO; // skin face index VBOs (nskin)
|
|
|
|
// character info
|
|
int charWidth[127]; // character widths: normal and shadow
|
|
int charWidthBig[127]; // chacarter widths: big
|
|
int charHeight; // character heights: normal and shadow
|
|
int charHeightBig; // character heights: big
|
|
|
|
// capabilities
|
|
int glInitialized; // is OpenGL initialized
|
|
int windowAvailable; // is default/window framebuffer available
|
|
int windowSamples; // number of samples for default/window framebuffer
|
|
int windowStereo; // is stereo available for default/window framebuffer
|
|
int windowDoublebuffer; // is default/window framebuffer double buffered
|
|
|
|
// framebuffer
|
|
int currentBuffer; // currently active framebuffer: mjFB_WINDOW or mjFB_OFFSCREEN
|
|
|
|
// pixel output format
|
|
int readPixelFormat; // default color pixel format for mjr_readPixels
|
|
};
|
|
typedef struct mjrContext_ mjrContext;
|
|
struct mjTask_ {
|
|
char buffer[24];
|
|
};
|
|
typedef struct mjTask_ mjTask;
|
|
struct mjThreadPool_ {
|
|
char buffer[6208];
|
|
};
|
|
typedef struct mjThreadPool_ mjThreadPool;
|
|
typedef enum mjtButton_ { // mouse button
|
|
mjBUTTON_NONE = 0, // no button
|
|
mjBUTTON_LEFT, // left button
|
|
mjBUTTON_RIGHT, // right button
|
|
mjBUTTON_MIDDLE // middle button
|
|
} mjtButton;
|
|
typedef enum mjtEvent_ { // mouse and keyboard event type
|
|
mjEVENT_NONE = 0, // no event
|
|
mjEVENT_MOVE, // mouse move
|
|
mjEVENT_PRESS, // mouse button press
|
|
mjEVENT_RELEASE, // mouse button release
|
|
mjEVENT_SCROLL, // scroll
|
|
mjEVENT_KEY, // key press
|
|
mjEVENT_RESIZE, // resize
|
|
mjEVENT_REDRAW, // redraw
|
|
mjEVENT_FILESDROP // files drop
|
|
} mjtEvent;
|
|
typedef enum mjtItem_ { // UI item type
|
|
mjITEM_END = -2, // end of definition list (not an item)
|
|
mjITEM_SECTION = -1, // section (not an item)
|
|
mjITEM_SEPARATOR = 0, // separator
|
|
mjITEM_STATIC, // static text
|
|
mjITEM_BUTTON, // button
|
|
|
|
// the rest have data pointer
|
|
mjITEM_CHECKINT, // check box, int value
|
|
mjITEM_CHECKBYTE, // check box, mjtByte value
|
|
mjITEM_RADIO, // radio group
|
|
mjITEM_RADIOLINE, // radio group, single line
|
|
mjITEM_SELECT, // selection box
|
|
mjITEM_SLIDERINT, // slider, int value
|
|
mjITEM_SLIDERNUM, // slider, mjtNum value
|
|
mjITEM_EDITINT, // editable array, int values
|
|
mjITEM_EDITNUM, // editable array, mjtNum values
|
|
mjITEM_EDITFLOAT, // editable array, float values
|
|
mjITEM_EDITTXT, // editable text
|
|
|
|
mjNITEM // number of item types
|
|
} mjtItem;
|
|
struct mjuiState_ { // mouse and keyboard state
|
|
// constants set by user
|
|
int nrect; // number of rectangles used
|
|
mjrRect rect[mjMAXUIRECT]; // rectangles (index 0: entire window)
|
|
void* userdata; // pointer to user data (for callbacks)
|
|
|
|
// event type
|
|
int type; // (type mjtEvent)
|
|
|
|
// mouse buttons
|
|
int left; // is left button down
|
|
int right; // is right button down
|
|
int middle; // is middle button down
|
|
int doubleclick; // is last press a double click
|
|
int button; // which button was pressed (mjtButton)
|
|
double buttontime; // time of last button press
|
|
|
|
// mouse position
|
|
double x; // x position
|
|
double y; // y position
|
|
double dx; // x displacement
|
|
double dy; // y displacement
|
|
double sx; // x scroll
|
|
double sy; // y scroll
|
|
|
|
// keyboard
|
|
int control; // is control down
|
|
int shift; // is shift down
|
|
int alt; // is alt down
|
|
int key; // which key was pressed
|
|
double keytime; // time of last key press
|
|
|
|
// rectangle ownership and dragging
|
|
int mouserect; // which rectangle contains mouse
|
|
int dragrect; // which rectangle is dragged with mouse
|
|
int dragbutton; // which button started drag (mjtButton)
|
|
|
|
// files dropping (only valid when type == mjEVENT_FILESDROP)
|
|
int dropcount; // number of files dropped
|
|
const char** droppaths; // paths to files dropped
|
|
};
|
|
typedef struct mjuiState_ mjuiState;
|
|
struct mjuiThemeSpacing_ { // UI visualization theme spacing
|
|
int total; // total width
|
|
int scroll; // scrollbar width
|
|
int label; // label width
|
|
int section; // section gap
|
|
int itemside; // item side gap
|
|
int itemmid; // item middle gap
|
|
int itemver; // item vertical gap
|
|
int texthor; // text horizontal gap
|
|
int textver; // text vertical gap
|
|
int linescroll; // number of pixels to scroll
|
|
int samples; // number of multisamples
|
|
};
|
|
typedef struct mjuiThemeSpacing_ mjuiThemeSpacing;
|
|
struct mjuiThemeColor_ { // UI visualization theme color
|
|
float master[3]; // master background
|
|
float thumb[3]; // scrollbar thumb
|
|
float secttitle[3]; // section title
|
|
float sectfont[3]; // section font
|
|
float sectsymbol[3]; // section symbol
|
|
float sectpane[3]; // section pane
|
|
float shortcut[3]; // shortcut background
|
|
float fontactive[3]; // font active
|
|
float fontinactive[3]; // font inactive
|
|
float decorinactive[3]; // decor inactive
|
|
float decorinactive2[3]; // inactive slider color 2
|
|
float button[3]; // button
|
|
float check[3]; // check
|
|
float radio[3]; // radio
|
|
float select[3]; // select
|
|
float select2[3]; // select pane
|
|
float slider[3]; // slider
|
|
float slider2[3]; // slider color 2
|
|
float edit[3]; // edit
|
|
float edit2[3]; // edit invalid
|
|
float cursor[3]; // edit cursor
|
|
};
|
|
typedef struct mjuiThemeColor_ mjuiThemeColor;
|
|
struct mjuiItemSingle_ { // check and button-related
|
|
int modifier; // 0: none, 1: control, 2: shift; 4: alt
|
|
int shortcut; // shortcut key; 0: undefined
|
|
};
|
|
|
|
|
|
struct mjuiItemMulti_ { // static, radio and select-related
|
|
int nelem; // number of elements in group
|
|
char name[mjMAXUIMULTI][mjMAXUINAME]; // element names
|
|
};
|
|
|
|
|
|
struct mjuiItemSlider_ { // slider-related
|
|
double range[2]; // slider range
|
|
double divisions; // number of range divisions
|
|
};
|
|
|
|
|
|
struct mjuiItemEdit_ { // edit-related
|
|
int nelem; // number of elements in list
|
|
double range[mjMAXUIEDIT][2]; // element range (min>=max: ignore)
|
|
};
|
|
|
|
|
|
struct mjuiItem_ { // UI item
|
|
// common properties
|
|
int type; // type (mjtItem)
|
|
char name[mjMAXUINAME]; // name
|
|
int state; // 0: disable, 1: enable, 2+: use predicate
|
|
void *pdata; // data pointer (type-specific)
|
|
int sectionid; // id of section containing item
|
|
int itemid; // id of item within section
|
|
|
|
// type-specific properties
|
|
union {
|
|
struct mjuiItemSingle_ single; // check and button
|
|
struct mjuiItemMulti_ multi; // static, radio and select
|
|
struct mjuiItemSlider_ slider; // slider
|
|
struct mjuiItemEdit_ edit; // edit
|
|
};
|
|
|
|
// internal
|
|
mjrRect rect; // rectangle occupied by item
|
|
};
|
|
typedef struct mjuiItem_ mjuiItem;
|
|
struct mjuiSection_ { // UI section
|
|
// properties
|
|
char name[mjMAXUINAME]; // name
|
|
int state; // 0: closed, 1: open
|
|
int modifier; // 0: none, 1: control, 2: shift; 4: alt
|
|
int shortcut; // shortcut key; 0: undefined
|
|
int nitem; // number of items in use
|
|
mjuiItem item[mjMAXUIITEM]; // preallocated array of items
|
|
|
|
// internal
|
|
mjrRect rtitle; // rectangle occupied by title
|
|
mjrRect rcontent; // rectangle occupied by content
|
|
};
|
|
typedef struct mjuiSection_ mjuiSection;
|
|
struct mjUI_ { // entire UI
|
|
// constants set by user
|
|
mjuiThemeSpacing spacing; // UI theme spacing
|
|
mjuiThemeColor color; // UI theme color
|
|
mjfItemEnable predicate; // callback to set item state programmatically
|
|
void* userdata; // pointer to user data (passed to predicate)
|
|
int rectid; // index of this ui rectangle in mjuiState
|
|
int auxid; // aux buffer index of this ui
|
|
int radiocol; // number of radio columns (0 defaults to 2)
|
|
|
|
// UI sizes (framebuffer units)
|
|
int width; // width
|
|
int height; // current heigth
|
|
int maxheight; // height when all sections open
|
|
int scroll; // scroll from top of UI
|
|
|
|
// mouse focus
|
|
int mousesect; // 0: none, -1: scroll, otherwise 1+section
|
|
int mouseitem; // item within section
|
|
int mousehelp; // help button down: print shortcuts
|
|
|
|
// keyboard focus and edit
|
|
int editsect; // 0: none, otherwise 1+section
|
|
int edititem; // item within section
|
|
int editcursor; // cursor position
|
|
int editscroll; // horizontal scroll
|
|
char edittext[mjMAXUITEXT]; // current text
|
|
mjuiItem* editchanged; // pointer to changed edit in last mjui_event
|
|
|
|
// sections
|
|
int nsect; // number of sections in use
|
|
mjuiSection sect[mjMAXUISECT]; // preallocated array of sections
|
|
};
|
|
typedef struct mjUI_ mjUI;
|
|
struct mjuiDef_ { // table passed to mjui_add()
|
|
int type; // type (mjtItem); -1: section
|
|
char name[mjMAXUINAME]; // name
|
|
int state; // state
|
|
void* pdata; // pointer to data
|
|
char other[mjMAXUITEXT]; // string with type-specific properties
|
|
};
|
|
typedef struct mjuiDef_ mjuiDef;
|
|
typedef enum mjtCatBit_ { // bitflags for mjvGeom category
|
|
mjCAT_STATIC = 1, // model elements in body 0
|
|
mjCAT_DYNAMIC = 2, // model elements in all other bodies
|
|
mjCAT_DECOR = 4, // decorative geoms
|
|
mjCAT_ALL = 7 // select all categories
|
|
} mjtCatBit;
|
|
typedef enum mjtMouse_ { // mouse interaction mode
|
|
mjMOUSE_NONE = 0, // no action
|
|
mjMOUSE_ROTATE_V, // rotate, vertical plane
|
|
mjMOUSE_ROTATE_H, // rotate, horizontal plane
|
|
mjMOUSE_MOVE_V, // move, vertical plane
|
|
mjMOUSE_MOVE_H, // move, horizontal plane
|
|
mjMOUSE_ZOOM, // zoom
|
|
mjMOUSE_SELECT // selection
|
|
} mjtMouse;
|
|
typedef enum mjtPertBit_ { // mouse perturbations
|
|
mjPERT_TRANSLATE = 1, // translation
|
|
mjPERT_ROTATE = 2 // rotation
|
|
} mjtPertBit;
|
|
typedef enum mjtCamera_ { // abstract camera type
|
|
mjCAMERA_FREE = 0, // free camera
|
|
mjCAMERA_TRACKING, // tracking camera; uses trackbodyid
|
|
mjCAMERA_FIXED, // fixed camera; uses fixedcamid
|
|
mjCAMERA_USER // user is responsible for setting OpenGL camera
|
|
} mjtCamera;
|
|
typedef enum mjtLabel_ { // object labeling
|
|
mjLABEL_NONE = 0, // nothing
|
|
mjLABEL_BODY, // body labels
|
|
mjLABEL_JOINT, // joint labels
|
|
mjLABEL_GEOM, // geom labels
|
|
mjLABEL_SITE, // site labels
|
|
mjLABEL_CAMERA, // camera labels
|
|
mjLABEL_LIGHT, // light labels
|
|
mjLABEL_TENDON, // tendon labels
|
|
mjLABEL_ACTUATOR, // actuator labels
|
|
mjLABEL_CONSTRAINT, // constraint labels
|
|
mjLABEL_SKIN, // skin labels
|
|
mjLABEL_SELECTION, // selected object
|
|
mjLABEL_SELPNT, // coordinates of selection point
|
|
mjLABEL_CONTACTPOINT, // contact information
|
|
mjLABEL_CONTACTFORCE, // magnitude of contact force
|
|
mjLABEL_ISLAND, // id of island
|
|
|
|
mjNLABEL // number of label types
|
|
} mjtLabel;
|
|
typedef enum mjtFrame_ { // frame visualization
|
|
mjFRAME_NONE = 0, // no frames
|
|
mjFRAME_BODY, // body frames
|
|
mjFRAME_GEOM, // geom frames
|
|
mjFRAME_SITE, // site frames
|
|
mjFRAME_CAMERA, // camera frames
|
|
mjFRAME_LIGHT, // light frames
|
|
mjFRAME_CONTACT, // contact frames
|
|
mjFRAME_WORLD, // world frame
|
|
|
|
mjNFRAME // number of visualization frames
|
|
} mjtFrame;
|
|
typedef enum mjtVisFlag_ { // flags enabling model element visualization
|
|
mjVIS_CONVEXHULL = 0, // mesh convex hull
|
|
mjVIS_TEXTURE, // textures
|
|
mjVIS_JOINT, // joints
|
|
mjVIS_CAMERA, // cameras
|
|
mjVIS_ACTUATOR, // actuators
|
|
mjVIS_ACTIVATION, // activations
|
|
mjVIS_LIGHT, // lights
|
|
mjVIS_TENDON, // tendons
|
|
mjVIS_RANGEFINDER, // rangefinder sensors
|
|
mjVIS_CONSTRAINT, // point constraints
|
|
mjVIS_INERTIA, // equivalent inertia boxes
|
|
mjVIS_SCLINERTIA, // scale equivalent inertia boxes with mass
|
|
mjVIS_PERTFORCE, // perturbation force
|
|
mjVIS_PERTOBJ, // perturbation object
|
|
mjVIS_CONTACTPOINT, // contact points
|
|
mjVIS_ISLAND, // constraint islands
|
|
mjVIS_CONTACTFORCE, // contact force
|
|
mjVIS_CONTACTSPLIT, // split contact force into normal and tangent
|
|
mjVIS_TRANSPARENT, // make dynamic geoms more transparent
|
|
mjVIS_AUTOCONNECT, // auto connect joints and body coms
|
|
mjVIS_COM, // center of mass
|
|
mjVIS_SELECT, // selection point
|
|
mjVIS_STATIC, // static bodies
|
|
mjVIS_SKIN, // skin
|
|
mjVIS_MIDPHASE, // mid-phase bounding volume hierarchy
|
|
mjVIS_MESHBVH, // mesh bounding volume hierarchy
|
|
mjVIS_SDFITER, // iterations of SDF gradient descent
|
|
|
|
mjNVISFLAG // number of visualization flags
|
|
} mjtVisFlag;
|
|
typedef enum mjtRndFlag_ { // flags enabling rendering effects
|
|
mjRND_SHADOW = 0, // shadows
|
|
mjRND_WIREFRAME, // wireframe
|
|
mjRND_REFLECTION, // reflections
|
|
mjRND_ADDITIVE, // additive transparency
|
|
mjRND_SKYBOX, // skybox
|
|
mjRND_FOG, // fog
|
|
mjRND_HAZE, // haze
|
|
mjRND_SEGMENT, // segmentation with random color
|
|
mjRND_IDCOLOR, // segmentation with segid+1 color
|
|
mjRND_CULL_FACE, // cull backward faces
|
|
|
|
mjNRNDFLAG // number of rendering flags
|
|
} mjtRndFlag;
|
|
typedef enum mjtStereo_ { // type of stereo rendering
|
|
mjSTEREO_NONE = 0, // no stereo; use left eye only
|
|
mjSTEREO_QUADBUFFERED, // quad buffered; revert to side-by-side if no hardware support
|
|
mjSTEREO_SIDEBYSIDE // side-by-side
|
|
} mjtStereo;
|
|
struct mjvPerturb_ { // object selection and perturbation
|
|
int select; // selected body id; non-positive: none
|
|
int skinselect; // selected skin id; negative: none
|
|
int active; // perturbation bitmask (mjtPertBit)
|
|
int active2; // secondary perturbation bitmask (mjtPertBit)
|
|
mjtNum refpos[3]; // reference position for selected object
|
|
mjtNum refquat[4]; // reference orientation for selected object
|
|
mjtNum refselpos[3]; // reference position for selection point
|
|
mjtNum localpos[3]; // selection point in object coordinates
|
|
mjtNum localmass; // spatial inertia at selection point
|
|
mjtNum scale; // relative mouse motion-to-space scaling (set by initPerturb)
|
|
};
|
|
typedef struct mjvPerturb_ mjvPerturb;
|
|
struct mjvCamera_ { // abstract camera
|
|
// type and ids
|
|
int type; // camera type (mjtCamera)
|
|
int fixedcamid; // fixed camera id
|
|
int trackbodyid; // body id to track
|
|
|
|
// abstract camera pose specification
|
|
mjtNum lookat[3]; // lookat point
|
|
mjtNum distance; // distance to lookat point or tracked body
|
|
mjtNum azimuth; // camera azimuth (deg)
|
|
mjtNum elevation; // camera elevation (deg)
|
|
};
|
|
typedef struct mjvCamera_ mjvCamera;
|
|
struct mjvGLCamera_ { // OpenGL camera
|
|
// camera frame
|
|
float pos[3]; // position
|
|
float forward[3]; // forward direction
|
|
float up[3]; // up direction
|
|
|
|
// camera projection
|
|
float frustum_center; // hor. center (left,right set to match aspect)
|
|
float frustum_bottom; // bottom
|
|
float frustum_top; // top
|
|
float frustum_near; // near
|
|
float frustum_far; // far
|
|
};
|
|
typedef struct mjvGLCamera_ mjvGLCamera;
|
|
struct mjvGeom_ { // abstract geom
|
|
// type info
|
|
int type; // geom type (mjtGeom)
|
|
int dataid; // mesh, hfield or plane id; -1: none
|
|
int objtype; // mujoco object type; mjOBJ_UNKNOWN for decor
|
|
int objid; // mujoco object id; -1 for decor
|
|
int category; // visual category
|
|
int texid; // texture id; -1: no texture
|
|
int texuniform; // uniform cube mapping
|
|
int texcoord; // mesh geom has texture coordinates
|
|
int segid; // segmentation id; -1: not shown
|
|
|
|
// OpenGL info
|
|
float texrepeat[2]; // texture repetition for 2D mapping
|
|
float size[3]; // size parameters
|
|
float pos[3]; // Cartesian position
|
|
float mat[9]; // Cartesian orientation
|
|
float rgba[4]; // color and transparency
|
|
float emission; // emission coef
|
|
float specular; // specular coef
|
|
float shininess; // shininess coef
|
|
float reflectance; // reflectance coef
|
|
char label[100]; // text label
|
|
|
|
// transparency rendering (set internally)
|
|
float camdist; // distance to camera (used by sorter)
|
|
float modelrbound; // geom rbound from model, 0 if not model geom
|
|
mjtByte transparent; // treat geom as transparent
|
|
};
|
|
typedef struct mjvGeom_ mjvGeom;
|
|
struct mjvLight_ { // OpenGL light
|
|
float pos[3]; // position rel. to body frame
|
|
float dir[3]; // direction rel. to body frame
|
|
float attenuation[3]; // OpenGL attenuation (quadratic model)
|
|
float cutoff; // OpenGL cutoff
|
|
float exponent; // OpenGL exponent
|
|
float ambient[3]; // ambient rgb (alpha=1)
|
|
float diffuse[3]; // diffuse rgb (alpha=1)
|
|
float specular[3]; // specular rgb (alpha=1)
|
|
mjtByte headlight; // headlight
|
|
mjtByte directional; // directional light
|
|
mjtByte castshadow; // does light cast shadows
|
|
};
|
|
typedef struct mjvLight_ mjvLight;
|
|
struct mjvOption_ { // abstract visualization options
|
|
int label; // what objects to label (mjtLabel)
|
|
int frame; // which frame to show (mjtFrame)
|
|
mjtByte geomgroup[mjNGROUP]; // geom visualization by group
|
|
mjtByte sitegroup[mjNGROUP]; // site visualization by group
|
|
mjtByte jointgroup[mjNGROUP]; // joint visualization by group
|
|
mjtByte tendongroup[mjNGROUP]; // tendon visualization by group
|
|
mjtByte actuatorgroup[mjNGROUP]; // actuator visualization by group
|
|
mjtByte skingroup[mjNGROUP]; // skin visualization by group
|
|
mjtByte flags[mjNVISFLAG]; // visualization flags (indexed by mjtVisFlag)
|
|
int bvh_depth; // depth of the bounding volume hierarchy to be visualized
|
|
};
|
|
typedef struct mjvOption_ mjvOption;
|
|
struct mjvScene_ { // abstract scene passed to OpenGL renderer
|
|
// abstract geoms
|
|
int maxgeom; // size of allocated geom buffer
|
|
int ngeom; // number of geoms currently in buffer
|
|
mjvGeom* geoms; // buffer for geoms (ngeom)
|
|
int* geomorder; // buffer for ordering geoms by distance to camera (ngeom)
|
|
|
|
// skin data
|
|
int nskin; // number of skins
|
|
int* skinfacenum; // number of faces in skin (nskin)
|
|
int* skinvertadr; // address of skin vertices (nskin)
|
|
int* skinvertnum; // number of vertices in skin (nskin)
|
|
float* skinvert; // skin vertex data (nskin)
|
|
float* skinnormal; // skin normal data (nskin)
|
|
|
|
// OpenGL lights
|
|
int nlight; // number of lights currently in buffer
|
|
mjvLight lights[mjMAXLIGHT]; // buffer for lights (nlight)
|
|
|
|
// OpenGL cameras
|
|
mjvGLCamera camera[2]; // left and right camera
|
|
|
|
// OpenGL model transformation
|
|
mjtByte enabletransform; // enable model transformation
|
|
float translate[3]; // model translation
|
|
float rotate[4]; // model quaternion rotation
|
|
float scale; // model scaling
|
|
|
|
// OpenGL rendering effects
|
|
int stereo; // stereoscopic rendering (mjtStereo)
|
|
mjtByte flags[mjNRNDFLAG]; // rendering flags (indexed by mjtRndFlag)
|
|
|
|
// framing
|
|
int framewidth; // frame pixel width; 0: disable framing
|
|
float framergb[3]; // frame color
|
|
};
|
|
typedef struct mjvScene_ mjvScene;
|
|
struct mjvFigure_ { // abstract 2D figure passed to OpenGL renderer
|
|
// enable flags
|
|
int flg_legend; // show legend
|
|
int flg_ticklabel[2]; // show grid tick labels (x,y)
|
|
int flg_extend; // automatically extend axis ranges to fit data
|
|
int flg_barplot; // isolated line segments (i.e. GL_LINES)
|
|
int flg_selection; // vertical selection line
|
|
int flg_symmetric; // symmetric y-axis
|
|
|
|
// style settings
|
|
float linewidth; // line width
|
|
float gridwidth; // grid line width
|
|
int gridsize[2]; // number of grid points in (x,y)
|
|
float gridrgb[3]; // grid line rgb
|
|
float figurergba[4]; // figure color and alpha
|
|
float panergba[4]; // pane color and alpha
|
|
float legendrgba[4]; // legend color and alpha
|
|
float textrgb[3]; // text color
|
|
float linergb[mjMAXLINE][3]; // line colors
|
|
float range[2][2]; // axis ranges; (min>=max) automatic
|
|
char xformat[20]; // x-tick label format for sprintf
|
|
char yformat[20]; // y-tick label format for sprintf
|
|
char minwidth[20]; // string used to determine min y-tick width
|
|
|
|
// text labels
|
|
char title[1000]; // figure title; subplots separated with 2+ spaces
|
|
char xlabel[100]; // x-axis label
|
|
char linename[mjMAXLINE][100]; // line names for legend
|
|
|
|
// dynamic settings
|
|
int legendoffset; // number of lines to offset legend
|
|
int subplot; // selected subplot (for title rendering)
|
|
int highlight[2]; // if point is in legend rect, highlight line
|
|
int highlightid; // if id>=0 and no point, highlight id
|
|
float selection; // selection line x-value
|
|
|
|
// line data
|
|
int linepnt[mjMAXLINE]; // number of points in line; (0) disable
|
|
float linedata[mjMAXLINE][2*mjMAXLINEPNT]; // line data (x,y)
|
|
|
|
// output from renderer
|
|
int xaxispixel[2]; // range of x-axis in pixels
|
|
int yaxispixel[2]; // range of y-axis in pixels
|
|
float xaxisdata[2]; // range of x-axis in data units
|
|
float yaxisdata[2]; // range of y-axis in data units
|
|
};
|
|
typedef struct mjvFigure_ mjvFigure;
|
|
struct mjvSceneState_ {
|
|
int nbuffer; // size of the buffer in bytes
|
|
void* buffer; // heap-allocated memory for all arrays in this struct
|
|
int maxgeom; // maximum number of mjvGeom supported by this state object
|
|
mjvScene plugincache; // scratch space for vis geoms inserted by plugins
|
|
|
|
// fields in mjModel that are necessary to re-render a scene
|
|
struct {
|
|
int nv;
|
|
int nu;
|
|
int na;
|
|
int nbody;
|
|
int nbvh;
|
|
int njnt;
|
|
int ngeom;
|
|
int nsite;
|
|
int ncam;
|
|
int nlight;
|
|
int nmesh;
|
|
int nskin;
|
|
int nskinvert;
|
|
int nskinface;
|
|
int nskinbone;
|
|
int nskinbonevert;
|
|
int nmat;
|
|
int neq;
|
|
int ntendon;
|
|
int ntree;
|
|
int nwrap;
|
|
int nsensor;
|
|
int nnames;
|
|
int nsensordata;
|
|
|
|
mjOption opt;
|
|
mjVisual vis;
|
|
mjStatistic stat;
|
|
|
|
int* body_parentid;
|
|
int* body_rootid;
|
|
int* body_weldid;
|
|
int* body_mocapid;
|
|
int* body_jntnum;
|
|
int* body_jntadr;
|
|
int* body_dofnum;
|
|
int* body_dofadr;
|
|
int* body_geomnum;
|
|
int* body_geomadr;
|
|
mjtNum* body_iquat;
|
|
mjtNum* body_mass;
|
|
mjtNum* body_inertia;
|
|
int* body_bvhadr;
|
|
int* body_bvhnum;
|
|
|
|
int* bvh_depth;
|
|
int* bvh_child;
|
|
int* bvh_geomid;
|
|
mjtNum* bvh_aabb;
|
|
|
|
int* jnt_type;
|
|
int* jnt_bodyid;
|
|
int* jnt_group;
|
|
|
|
int* geom_type;
|
|
int* geom_bodyid;
|
|
int* geom_contype;
|
|
int* geom_conaffinity;
|
|
int* geom_dataid;
|
|
int* geom_matid;
|
|
int* geom_group;
|
|
mjtNum* geom_size;
|
|
mjtNum* geom_aabb;
|
|
mjtNum* geom_rbound;
|
|
float* geom_rgba;
|
|
|
|
int* site_type;
|
|
int* site_bodyid;
|
|
int* site_matid;
|
|
int* site_group;
|
|
mjtNum* site_size;
|
|
float* site_rgba;
|
|
|
|
mjtNum* cam_fovy;
|
|
mjtNum* cam_ipd;
|
|
|
|
mjtByte* light_directional;
|
|
mjtByte* light_castshadow;
|
|
mjtByte* light_active;
|
|
float* light_attenuation;
|
|
float* light_cutoff;
|
|
float* light_exponent;
|
|
float* light_ambient;
|
|
float* light_diffuse;
|
|
float* light_specular;
|
|
|
|
int* mesh_bvhadr;
|
|
int* mesh_bvhnum;
|
|
int* mesh_texcoordadr;
|
|
int* mesh_graphadr;
|
|
|
|
int* skin_matid;
|
|
int* skin_group;
|
|
float* skin_rgba;
|
|
float* skin_inflate;
|
|
int* skin_vertadr;
|
|
int* skin_vertnum;
|
|
int* skin_texcoordadr;
|
|
int* skin_faceadr;
|
|
int* skin_facenum;
|
|
int* skin_boneadr;
|
|
int* skin_bonenum;
|
|
float* skin_vert;
|
|
int* skin_face;
|
|
int* skin_bonevertadr;
|
|
int* skin_bonevertnum;
|
|
float* skin_bonebindpos;
|
|
float* skin_bonebindquat;
|
|
int* skin_bonebodyid;
|
|
int* skin_bonevertid;
|
|
float* skin_bonevertweight;
|
|
|
|
int* mat_texid;
|
|
mjtByte* mat_texuniform;
|
|
float* mat_texrepeat;
|
|
float* mat_emission;
|
|
float* mat_specular;
|
|
float* mat_shininess;
|
|
float* mat_reflectance;
|
|
float* mat_rgba;
|
|
|
|
int* eq_type;
|
|
int* eq_obj1id;
|
|
int* eq_obj2id;
|
|
mjtByte* eq_active;
|
|
mjtNum* eq_data;
|
|
|
|
int* tendon_num;
|
|
int* tendon_matid;
|
|
int* tendon_group;
|
|
mjtByte* tendon_limited;
|
|
mjtNum* tendon_width;
|
|
mjtNum* tendon_range;
|
|
mjtNum* tendon_stiffness;
|
|
mjtNum* tendon_damping;
|
|
mjtNum* tendon_frictionloss;
|
|
mjtNum* tendon_lengthspring;
|
|
float* tendon_rgba;
|
|
|
|
int* actuator_trntype;
|
|
int* actuator_dyntype;
|
|
int* actuator_trnid;
|
|
int* actuator_actadr;
|
|
int* actuator_actnum;
|
|
int* actuator_group;
|
|
mjtByte* actuator_ctrllimited;
|
|
mjtByte* actuator_actlimited;
|
|
mjtNum* actuator_ctrlrange;
|
|
mjtNum* actuator_actrange;
|
|
mjtNum* actuator_cranklength;
|
|
|
|
int* sensor_type;
|
|
int* sensor_objid;
|
|
int* sensor_adr;
|
|
|
|
int* name_bodyadr;
|
|
int* name_jntadr;
|
|
int* name_geomadr;
|
|
int* name_siteadr;
|
|
int* name_camadr;
|
|
int* name_lightadr;
|
|
int* name_eqadr;
|
|
int* name_tendonadr;
|
|
int* name_actuatoradr;
|
|
char* names;
|
|
} model;
|
|
|
|
// fields in mjData that are necessary to re-render a scene
|
|
struct {
|
|
mjWarningStat warning[mjNWARNING];
|
|
|
|
int nefc;
|
|
int ncon;
|
|
int nisland;
|
|
|
|
mjtNum time;
|
|
|
|
mjtNum* act;
|
|
|
|
mjtNum* ctrl;
|
|
mjtNum* xfrc_applied;
|
|
|
|
mjtNum* sensordata;
|
|
|
|
mjtNum* xpos;
|
|
mjtNum* xquat;
|
|
mjtNum* xmat;
|
|
mjtNum* xipos;
|
|
mjtNum* ximat;
|
|
mjtNum* xanchor;
|
|
mjtNum* xaxis;
|
|
mjtNum* geom_xpos;
|
|
mjtNum* geom_xmat;
|
|
mjtNum* site_xpos;
|
|
mjtNum* site_xmat;
|
|
mjtNum* cam_xpos;
|
|
mjtNum* cam_xmat;
|
|
mjtNum* light_xpos;
|
|
mjtNum* light_xdir;
|
|
|
|
mjtNum* subtree_com;
|
|
|
|
int* ten_wrapadr;
|
|
int* ten_wrapnum;
|
|
int* wrap_obj;
|
|
mjtNum* ten_length;
|
|
mjtNum* wrap_xpos;
|
|
|
|
mjtByte* bvh_active;
|
|
int* island_dofadr;
|
|
int* island_dofind;
|
|
int* dof_island;
|
|
int* efc_island;
|
|
int* tendon_efcadr;
|
|
|
|
mjContact* contact;
|
|
mjtNum* efc_force;
|
|
} data;
|
|
};
|
|
typedef struct mjvSceneState_ mjvSceneState;
|
|
|
|
//----------------------------- MJAPI FUNCTIONS --------------------------------
|
|
void mj_defaultVFS(mjVFS* vfs);
|
|
int mj_addFileVFS(mjVFS* vfs, const char* directory, const char* filename);
|
|
int mj_makeEmptyFileVFS(mjVFS* vfs, const char* filename, int filesize);
|
|
int mj_findFileVFS(const mjVFS* vfs, const char* filename);
|
|
int mj_deleteFileVFS(mjVFS* vfs, const char* filename);
|
|
void mj_deleteVFS(mjVFS* vfs);
|
|
mjModel* mj_loadXML(const char* filename, const mjVFS* vfs, char* error, int error_sz);
|
|
int mj_saveLastXML(const char* filename, const mjModel* m, char* error, int error_sz);
|
|
void mj_freeLastXML(void);
|
|
int mj_printSchema(const char* filename, char* buffer, int buffer_sz,
|
|
int flg_html, int flg_pad);
|
|
void mj_step(const mjModel* m, mjData* d);
|
|
void mj_step1(const mjModel* m, mjData* d);
|
|
void mj_step2(const mjModel* m, mjData* d);
|
|
void mj_forward(const mjModel* m, mjData* d);
|
|
void mj_inverse(const mjModel* m, mjData* d);
|
|
void mj_forwardSkip(const mjModel* m, mjData* d, int skipstage, int skipsensor);
|
|
void mj_inverseSkip(const mjModel* m, mjData* d, int skipstage, int skipsensor);
|
|
void mj_defaultLROpt(mjLROpt* opt);
|
|
void mj_defaultSolRefImp(mjtNum* solref, mjtNum* solimp);
|
|
void mj_defaultOption(mjOption* opt);
|
|
void mj_defaultVisual(mjVisual* vis);
|
|
mjModel* mj_copyModel(mjModel* dest, const mjModel* src);
|
|
void mj_saveModel(const mjModel* m, const char* filename, void* buffer, int buffer_sz);
|
|
mjModel* mj_loadModel(const char* filename, const mjVFS* vfs);
|
|
void mj_deleteModel(mjModel* m);
|
|
int mj_sizeModel(const mjModel* m);
|
|
mjData* mj_makeData(const mjModel* m);
|
|
mjData* mj_copyData(mjData* dest, const mjModel* m, const mjData* src);
|
|
void mj_resetData(const mjModel* m, mjData* d);
|
|
void mj_resetDataDebug(const mjModel* m, mjData* d, unsigned char debug_value);
|
|
void mj_resetDataKeyframe(const mjModel* m, mjData* d, int key);
|
|
void mj_markStack(mjData* d);
|
|
void mj_freeStack(mjData* d);
|
|
void* mj_stackAlloc(mjData* d, size_t bytes, size_t alignment);
|
|
mjtNum* mj_stackAllocNum(mjData* d, int size);
|
|
int* mj_stackAllocInt(mjData* d, int size);
|
|
void mj_deleteData(mjData* d);
|
|
void mj_resetCallbacks(void);
|
|
void mj_setConst(mjModel* m, mjData* d);
|
|
int mj_setLengthRange(mjModel* m, mjData* d, int index,
|
|
const mjLROpt* opt, char* error, int error_sz);
|
|
void mj_printFormattedModel(const mjModel* m, const char* filename, const char* float_format);
|
|
void mj_printModel(const mjModel* m, const char* filename);
|
|
void mj_printFormattedData(const mjModel* m, mjData* d, const char* filename,
|
|
const char* float_format);
|
|
void mj_printData(const mjModel* m, mjData* d, const char* filename);
|
|
void mju_printMat(const mjtNum* mat, int nr, int nc);
|
|
void mju_printMatSparse(const mjtNum* mat, int nr,
|
|
const int* rownnz, const int* rowadr, const int* colind);
|
|
void mj_fwdPosition(const mjModel* m, mjData* d);
|
|
void mj_fwdVelocity(const mjModel* m, mjData* d);
|
|
void mj_fwdActuation(const mjModel* m, mjData* d);
|
|
void mj_fwdAcceleration(const mjModel* m, mjData* d);
|
|
void mj_fwdConstraint(const mjModel* m, mjData* d);
|
|
void mj_Euler(const mjModel* m, mjData* d);
|
|
void mj_RungeKutta(const mjModel* m, mjData* d, int N);
|
|
void mj_invPosition(const mjModel* m, mjData* d);
|
|
void mj_invVelocity(const mjModel* m, mjData* d);
|
|
void mj_invConstraint(const mjModel* m, mjData* d);
|
|
void mj_compareFwdInv(const mjModel* m, mjData* d);
|
|
void mj_sensorPos(const mjModel* m, mjData* d);
|
|
void mj_sensorVel(const mjModel* m, mjData* d);
|
|
void mj_sensorAcc(const mjModel* m, mjData* d);
|
|
void mj_energyPos(const mjModel* m, mjData* d);
|
|
void mj_energyVel(const mjModel* m, mjData* d);
|
|
void mj_checkPos(const mjModel* m, mjData* d);
|
|
void mj_checkVel(const mjModel* m, mjData* d);
|
|
void mj_checkAcc(const mjModel* m, mjData* d);
|
|
void mj_kinematics(const mjModel* m, mjData* d);
|
|
void mj_comPos(const mjModel* m, mjData* d);
|
|
void mj_camlight(const mjModel* m, mjData* d);
|
|
void mj_tendon(const mjModel* m, mjData* d);
|
|
void mj_transmission(const mjModel* m, mjData* d);
|
|
void mj_crb(const mjModel* m, mjData* d);
|
|
void mj_factorM(const mjModel* m, mjData* d);
|
|
void mj_solveM(const mjModel* m, mjData* d, mjtNum* x, const mjtNum* y, int n);
|
|
void mj_solveM2(const mjModel* m, mjData* d, mjtNum* x, const mjtNum* y, int n);
|
|
void mj_comVel(const mjModel* m, mjData* d);
|
|
void mj_passive(const mjModel* m, mjData* d);
|
|
void mj_subtreeVel(const mjModel* m, mjData* d);
|
|
void mj_rne(const mjModel* m, mjData* d, int flg_acc, mjtNum* result);
|
|
void mj_rnePostConstraint(const mjModel* m, mjData* d);
|
|
void mj_collision(const mjModel* m, mjData* d);
|
|
void mj_makeConstraint(const mjModel* m, mjData* d);
|
|
void mj_island(const mjModel* m, mjData* d);
|
|
void mj_projectConstraint(const mjModel* m, mjData* d);
|
|
void mj_referenceConstraint(const mjModel* m, mjData* d);
|
|
void mj_constraintUpdate(const mjModel* m, mjData* d, const mjtNum* jar,
|
|
mjtNum cost[1], int flg_coneHessian);
|
|
int mj_stateSize(const mjModel* m, unsigned int spec);
|
|
void mj_getState(const mjModel* m, const mjData* d, mjtNum* state, unsigned int spec);
|
|
void mj_setState(const mjModel* m, mjData* d, const mjtNum* state, unsigned int spec);
|
|
int mj_addContact(const mjModel* m, mjData* d, const mjContact* con);
|
|
int mj_isPyramidal(const mjModel* m);
|
|
int mj_isSparse(const mjModel* m);
|
|
int mj_isDual(const mjModel* m);
|
|
void mj_mulJacVec(const mjModel* m, const mjData* d, mjtNum* res, const mjtNum* vec);
|
|
void mj_mulJacTVec(const mjModel* m, const mjData* d, mjtNum* res, const mjtNum* vec);
|
|
void mj_jac(const mjModel* m, const mjData* d, mjtNum* jacp, mjtNum* jacr,
|
|
const mjtNum point[3], int body);
|
|
void mj_jacBody(const mjModel* m, const mjData* d, mjtNum* jacp, mjtNum* jacr, int body);
|
|
void mj_jacBodyCom(const mjModel* m, const mjData* d, mjtNum* jacp, mjtNum* jacr, int body);
|
|
void mj_jacSubtreeCom(const mjModel* m, mjData* d, mjtNum* jacp, int body);
|
|
void mj_jacGeom(const mjModel* m, const mjData* d, mjtNum* jacp, mjtNum* jacr, int geom);
|
|
void mj_jacSite(const mjModel* m, const mjData* d, mjtNum* jacp, mjtNum* jacr, int site);
|
|
void mj_jacPointAxis(const mjModel* m, mjData* d, mjtNum* jacPoint, mjtNum* jacAxis,
|
|
const mjtNum point[3], const mjtNum axis[3], int body);
|
|
int mj_name2id(const mjModel* m, int type, const char* name);
|
|
const char* mj_id2name(const mjModel* m, int type, int id);
|
|
void mj_fullM(const mjModel* m, mjtNum* dst, const mjtNum* M);
|
|
void mj_mulM(const mjModel* m, const mjData* d, mjtNum* res, const mjtNum* vec);
|
|
void mj_mulM2(const mjModel* m, const mjData* d, mjtNum* res, const mjtNum* vec);
|
|
void mj_addM(const mjModel* m, mjData* d, mjtNum* dst, int* rownnz, int* rowadr, int* colind);
|
|
void mj_applyFT(const mjModel* m, mjData* d, const mjtNum force[3], const mjtNum torque[3],
|
|
const mjtNum point[3], int body, mjtNum* qfrc_target);
|
|
void mj_objectVelocity(const mjModel* m, const mjData* d,
|
|
int objtype, int objid, mjtNum res[6], int flg_local);
|
|
void mj_objectAcceleration(const mjModel* m, const mjData* d,
|
|
int objtype, int objid, mjtNum res[6], int flg_local);
|
|
void mj_contactForce(const mjModel* m, const mjData* d, int id, mjtNum result[6]);
|
|
void mj_differentiatePos(const mjModel* m, mjtNum* qvel, mjtNum dt,
|
|
const mjtNum* qpos1, const mjtNum* qpos2);
|
|
void mj_integratePos(const mjModel* m, mjtNum* qpos, const mjtNum* qvel, mjtNum dt);
|
|
void mj_normalizeQuat(const mjModel* m, mjtNum* qpos);
|
|
void mj_local2Global(mjData* d, mjtNum xpos[3], mjtNum xmat[9], const mjtNum pos[3],
|
|
const mjtNum quat[4], int body, mjtByte sameframe);
|
|
mjtNum mj_getTotalmass(const mjModel* m);
|
|
void mj_setTotalmass(mjModel* m, mjtNum newmass);
|
|
const char* mj_getPluginConfig(const mjModel* m, int plugin_id, const char* attrib);
|
|
void mj_loadPluginLibrary(const char* path);
|
|
void mj_loadAllPluginLibraries(const char* directory, mjfPluginLibraryLoadCallback callback);
|
|
int mj_version(void);
|
|
const char* mj_versionString(void);
|
|
void mj_multiRay(const mjModel* m, mjData* d, const mjtNum pnt[3], const mjtNum* vec,
|
|
const mjtByte* geomgroup, mjtByte flg_static, int bodyexclude,
|
|
int* geomid, mjtNum* dist, int nray, mjtNum cutoff);
|
|
mjtNum mj_ray(const mjModel* m, const mjData* d, const mjtNum pnt[3], const mjtNum vec[3],
|
|
const mjtByte* geomgroup, mjtByte flg_static, int bodyexclude,
|
|
int geomid[1]);
|
|
mjtNum mj_rayHfield(const mjModel* m, const mjData* d, int geomid,
|
|
const mjtNum pnt[3], const mjtNum vec[3]);
|
|
mjtNum mj_rayMesh(const mjModel* m, const mjData* d, int geomid,
|
|
const mjtNum pnt[3], const mjtNum vec[3]);
|
|
mjtNum mju_rayGeom(const mjtNum pos[3], const mjtNum mat[9], const mjtNum size[3],
|
|
const mjtNum pnt[3], const mjtNum vec[3], int geomtype);
|
|
mjtNum mju_raySkin(int nface, int nvert, const int* face, const float* vert,
|
|
const mjtNum pnt[3], const mjtNum vec[3], int vertid[1]);
|
|
void mjv_defaultCamera(mjvCamera* cam);
|
|
void mjv_defaultFreeCamera(const mjModel* m, mjvCamera* cam);
|
|
void mjv_defaultPerturb(mjvPerturb* pert);
|
|
void mjv_room2model(mjtNum modelpos[3], mjtNum modelquat[4], const mjtNum roompos[3],
|
|
const mjtNum roomquat[4], const mjvScene* scn);
|
|
void mjv_model2room(mjtNum roompos[3], mjtNum roomquat[4], const mjtNum modelpos[3],
|
|
const mjtNum modelquat[4], const mjvScene* scn);
|
|
void mjv_cameraInModel(mjtNum headpos[3], mjtNum forward[3], mjtNum up[3],
|
|
const mjvScene* scn);
|
|
void mjv_cameraInRoom(mjtNum headpos[3], mjtNum forward[3], mjtNum up[3],
|
|
const mjvScene* scn);
|
|
mjtNum mjv_frustumHeight(const mjvScene* scn);
|
|
void mjv_alignToCamera(mjtNum res[3], const mjtNum vec[3], const mjtNum forward[3]);
|
|
void mjv_moveCamera(const mjModel* m, int action, mjtNum reldx, mjtNum reldy,
|
|
const mjvScene* scn, mjvCamera* cam);
|
|
void mjv_moveCameraFromState(const mjvSceneState* scnstate, int action,
|
|
mjtNum reldx, mjtNum reldy,
|
|
const mjvScene* scn, mjvCamera* cam);
|
|
void mjv_movePerturb(const mjModel* m, const mjData* d, int action, mjtNum reldx,
|
|
mjtNum reldy, const mjvScene* scn, mjvPerturb* pert);
|
|
void mjv_movePerturbFromState(const mjvSceneState* scnstate, int action,
|
|
mjtNum reldx, mjtNum reldy,
|
|
const mjvScene* scn, mjvPerturb* pert);
|
|
void mjv_moveModel(const mjModel* m, int action, mjtNum reldx, mjtNum reldy,
|
|
const mjtNum roomup[3], mjvScene* scn);
|
|
void mjv_initPerturb(const mjModel* m, mjData* d, const mjvScene* scn, mjvPerturb* pert);
|
|
void mjv_applyPerturbPose(const mjModel* m, mjData* d, const mjvPerturb* pert,
|
|
int flg_paused);
|
|
void mjv_applyPerturbForce(const mjModel* m, mjData* d, const mjvPerturb* pert);
|
|
mjvGLCamera mjv_averageCamera(const mjvGLCamera* cam1, const mjvGLCamera* cam2);
|
|
int mjv_select(const mjModel* m, const mjData* d, const mjvOption* vopt,
|
|
mjtNum aspectratio, mjtNum relx, mjtNum rely,
|
|
const mjvScene* scn, mjtNum selpnt[3], int geomid[1], int skinid[1]);
|
|
void mjv_defaultOption(mjvOption* opt);
|
|
void mjv_defaultFigure(mjvFigure* fig);
|
|
void mjv_initGeom(mjvGeom* geom, int type, const mjtNum size[3],
|
|
const mjtNum pos[3], const mjtNum mat[9], const float rgba[4]);
|
|
void mjv_makeConnector(mjvGeom* geom, int type, mjtNum width,
|
|
mjtNum a0, mjtNum a1, mjtNum a2,
|
|
mjtNum b0, mjtNum b1, mjtNum b2);
|
|
void mjv_connector(mjvGeom* geom, int type, mjtNum width,
|
|
const mjtNum from[3], const mjtNum to[3]);
|
|
void mjv_defaultScene(mjvScene* scn);
|
|
void mjv_makeScene(const mjModel* m, mjvScene* scn, int maxgeom);
|
|
void mjv_freeScene(mjvScene* scn);
|
|
void mjv_updateScene(const mjModel* m, mjData* d, const mjvOption* opt,
|
|
const mjvPerturb* pert, mjvCamera* cam, int catmask, mjvScene* scn);
|
|
int mjv_updateSceneFromState(const mjvSceneState* scnstate, const mjvOption* opt,
|
|
const mjvPerturb* pert, mjvCamera* cam, int catmask,
|
|
mjvScene* scn);
|
|
void mjv_defaultSceneState(mjvSceneState* scnstate);
|
|
void mjv_makeSceneState(const mjModel* m, const mjData* d,
|
|
mjvSceneState* scnstate, int maxgeom);
|
|
void mjv_freeSceneState(mjvSceneState* scnstate);
|
|
void mjv_updateSceneState(const mjModel* m, mjData* d, const mjvOption* opt,
|
|
mjvSceneState* scnstate);
|
|
void mjv_addGeoms(const mjModel* m, mjData* d, const mjvOption* opt,
|
|
const mjvPerturb* pert, int catmask, mjvScene* scn);
|
|
void mjv_makeLights(const mjModel* m, mjData* d, mjvScene* scn);
|
|
void mjv_updateCamera(const mjModel* m, mjData* d, mjvCamera* cam, mjvScene* scn);
|
|
void mjv_updateSkin(const mjModel* m, mjData* d, mjvScene* scn);
|
|
void mjr_defaultContext(mjrContext* con);
|
|
void mjr_makeContext(const mjModel* m, mjrContext* con, int fontscale);
|
|
void mjr_changeFont(int fontscale, mjrContext* con);
|
|
void mjr_addAux(int index, int width, int height, int samples, mjrContext* con);
|
|
void mjr_freeContext(mjrContext* con);
|
|
void mjr_resizeOffscreen(int width, int height, mjrContext* con);
|
|
void mjr_uploadTexture(const mjModel* m, const mjrContext* con, int texid);
|
|
void mjr_uploadMesh(const mjModel* m, const mjrContext* con, int meshid);
|
|
void mjr_uploadHField(const mjModel* m, const mjrContext* con, int hfieldid);
|
|
void mjr_restoreBuffer(const mjrContext* con);
|
|
void mjr_setBuffer(int framebuffer, mjrContext* con);
|
|
void mjr_readPixels(unsigned char* rgb, float* depth,
|
|
mjrRect viewport, const mjrContext* con);
|
|
void mjr_drawPixels(const unsigned char* rgb, const float* depth,
|
|
mjrRect viewport, const mjrContext* con);
|
|
void mjr_blitBuffer(mjrRect src, mjrRect dst,
|
|
int flg_color, int flg_depth, const mjrContext* con);
|
|
void mjr_setAux(int index, const mjrContext* con);
|
|
void mjr_blitAux(int index, mjrRect src, int left, int bottom, const mjrContext* con);
|
|
void mjr_text(int font, const char* txt, const mjrContext* con,
|
|
float x, float y, float r, float g, float b);
|
|
void mjr_overlay(int font, int gridpos, mjrRect viewport,
|
|
const char* overlay, const char* overlay2, const mjrContext* con);
|
|
mjrRect mjr_maxViewport(const mjrContext* con);
|
|
void mjr_rectangle(mjrRect viewport, float r, float g, float b, float a);
|
|
void mjr_label(mjrRect viewport, int font, const char* txt,
|
|
float r, float g, float b, float a, float rt, float gt, float bt,
|
|
const mjrContext* con);
|
|
void mjr_figure(mjrRect viewport, mjvFigure* fig, const mjrContext* con);
|
|
void mjr_render(mjrRect viewport, mjvScene* scn, const mjrContext* con);
|
|
void mjr_finish(void);
|
|
int mjr_getError(void);
|
|
int mjr_findRect(int x, int y, int nrect, const mjrRect* rect);
|
|
mjuiThemeSpacing mjui_themeSpacing(int ind);
|
|
mjuiThemeColor mjui_themeColor(int ind);
|
|
void mjui_add(mjUI* ui, const mjuiDef* def);
|
|
void mjui_addToSection(mjUI* ui, int sect, const mjuiDef* def);
|
|
void mjui_resize(mjUI* ui, const mjrContext* con);
|
|
void mjui_update(int section, int item, const mjUI* ui,
|
|
const mjuiState* state, const mjrContext* con);
|
|
mjuiItem* mjui_event(mjUI* ui, mjuiState* state, const mjrContext* con);
|
|
void mjui_render(mjUI* ui, const mjuiState* state, const mjrContext* con);
|
|
void mju_error(const char* msg, ...) mjPRINTFLIKE(1, 2);
|
|
void mju_error_i(const char* msg, int i);
|
|
void mju_error_s(const char* msg, const char* text);
|
|
void mju_warning(const char* msg, ...) mjPRINTFLIKE(1, 2);
|
|
void mju_warning_i(const char* msg, int i);
|
|
void mju_warning_s(const char* msg, const char* text);
|
|
void mju_clearHandlers(void);
|
|
void* mju_malloc(size_t size);
|
|
void mju_free(void* ptr);
|
|
void mj_warning(mjData* d, int warning, int info);
|
|
void mju_writeLog(const char* type, const char* msg);
|
|
void mju_zero3(mjtNum res[3]);
|
|
void mju_copy3(mjtNum res[3], const mjtNum data[3]);
|
|
void mju_scl3(mjtNum res[3], const mjtNum vec[3], mjtNum scl);
|
|
void mju_add3(mjtNum res[3], const mjtNum vec1[3], const mjtNum vec2[3]);
|
|
void mju_sub3(mjtNum res[3], const mjtNum vec1[3], const mjtNum vec2[3]);
|
|
void mju_addTo3(mjtNum res[3], const mjtNum vec[3]);
|
|
void mju_subFrom3(mjtNum res[3], const mjtNum vec[3]);
|
|
void mju_addToScl3(mjtNum res[3], const mjtNum vec[3], mjtNum scl);
|
|
void mju_addScl3(mjtNum res[3], const mjtNum vec1[3], const mjtNum vec2[3], mjtNum scl);
|
|
mjtNum mju_normalize3(mjtNum res[3]);
|
|
mjtNum mju_norm3(const mjtNum vec[3]);
|
|
mjtNum mju_dot3(const mjtNum vec1[3], const mjtNum vec2[3]);
|
|
mjtNum mju_dist3(const mjtNum pos1[3], const mjtNum pos2[3]);
|
|
void mju_rotVecMat(mjtNum res[3], const mjtNum vec[3], const mjtNum mat[9]);
|
|
void mju_rotVecMatT(mjtNum res[3], const mjtNum vec[3], const mjtNum mat[9]);
|
|
void mju_cross(mjtNum res[3], const mjtNum a[3], const mjtNum b[3]);
|
|
void mju_zero4(mjtNum res[4]);
|
|
void mju_unit4(mjtNum res[4]);
|
|
void mju_copy4(mjtNum res[4], const mjtNum data[4]);
|
|
mjtNum mju_normalize4(mjtNum res[4]);
|
|
void mju_zero(mjtNum* res, int n);
|
|
void mju_fill(mjtNum* res, mjtNum val, int n);
|
|
void mju_copy(mjtNum* res, const mjtNum* data, int n);
|
|
mjtNum mju_sum(const mjtNum* vec, int n);
|
|
mjtNum mju_L1(const mjtNum* vec, int n);
|
|
void mju_scl(mjtNum* res, const mjtNum* vec, mjtNum scl, int n);
|
|
void mju_add(mjtNum* res, const mjtNum* vec1, const mjtNum* vec2, int n);
|
|
void mju_sub(mjtNum* res, const mjtNum* vec1, const mjtNum* vec2, int n);
|
|
void mju_addTo(mjtNum* res, const mjtNum* vec, int n);
|
|
void mju_subFrom(mjtNum* res, const mjtNum* vec, int n);
|
|
void mju_addToScl(mjtNum* res, const mjtNum* vec, mjtNum scl, int n);
|
|
void mju_addScl(mjtNum* res, const mjtNum* vec1, const mjtNum* vec2, mjtNum scl, int n);
|
|
mjtNum mju_normalize(mjtNum* res, int n);
|
|
mjtNum mju_norm(const mjtNum* res, int n);
|
|
mjtNum mju_dot(const mjtNum* vec1, const mjtNum* vec2, int n);
|
|
void mju_mulMatVec(mjtNum* res, const mjtNum* mat, const mjtNum* vec, int nr, int nc);
|
|
void mju_mulMatTVec(mjtNum* res, const mjtNum* mat, const mjtNum* vec, int nr, int nc);
|
|
mjtNum mju_mulVecMatVec(const mjtNum* vec1, const mjtNum* mat, const mjtNum* vec2, int n);
|
|
void mju_transpose(mjtNum* res, const mjtNum* mat, int nr, int nc);
|
|
void mju_symmetrize(mjtNum* res, const mjtNum* mat, int n);
|
|
void mju_eye(mjtNum* mat, int n);
|
|
void mju_mulMatMat(mjtNum* res, const mjtNum* mat1, const mjtNum* mat2,
|
|
int r1, int c1, int c2);
|
|
void mju_mulMatMatT(mjtNum* res, const mjtNum* mat1, const mjtNum* mat2,
|
|
int r1, int c1, int r2);
|
|
void mju_mulMatTMat(mjtNum* res, const mjtNum* mat1, const mjtNum* mat2,
|
|
int r1, int c1, int c2);
|
|
void mju_sqrMatTD(mjtNum* res, const mjtNum* mat, const mjtNum* diag, int nr, int nc);
|
|
void mju_transformSpatial(mjtNum res[6], const mjtNum vec[6], int flg_force,
|
|
const mjtNum newpos[3], const mjtNum oldpos[3],
|
|
const mjtNum rotnew2old[9]);
|
|
void mju_rotVecQuat(mjtNum res[3], const mjtNum vec[3], const mjtNum quat[4]);
|
|
void mju_negQuat(mjtNum res[4], const mjtNum quat[4]);
|
|
void mju_mulQuat(mjtNum res[4], const mjtNum quat1[4], const mjtNum quat2[4]);
|
|
void mju_mulQuatAxis(mjtNum res[4], const mjtNum quat[4], const mjtNum axis[3]);
|
|
void mju_axisAngle2Quat(mjtNum res[4], const mjtNum axis[3], mjtNum angle);
|
|
void mju_quat2Vel(mjtNum res[3], const mjtNum quat[4], mjtNum dt);
|
|
void mju_subQuat(mjtNum res[3], const mjtNum qa[4], const mjtNum qb[4]);
|
|
void mju_quat2Mat(mjtNum res[9], const mjtNum quat[4]);
|
|
void mju_mat2Quat(mjtNum quat[4], const mjtNum mat[9]);
|
|
void mju_derivQuat(mjtNum res[4], const mjtNum quat[4], const mjtNum vel[3]);
|
|
void mju_quatIntegrate(mjtNum quat[4], const mjtNum vel[3], mjtNum scale);
|
|
void mju_quatZ2Vec(mjtNum quat[4], const mjtNum vec[3]);
|
|
void mju_mulPose(mjtNum posres[3], mjtNum quatres[4],
|
|
const mjtNum pos1[3], const mjtNum quat1[4],
|
|
const mjtNum pos2[3], const mjtNum quat2[4]);
|
|
void mju_negPose(mjtNum posres[3], mjtNum quatres[4],
|
|
const mjtNum pos[3], const mjtNum quat[4]);
|
|
void mju_trnVecPose(mjtNum res[3], const mjtNum pos[3], const mjtNum quat[4],
|
|
const mjtNum vec[3]);
|
|
int mju_cholFactor(mjtNum* mat, int n, mjtNum mindiag);
|
|
void mju_cholSolve(mjtNum* res, const mjtNum* mat, const mjtNum* vec, int n);
|
|
int mju_cholUpdate(mjtNum* mat, mjtNum* x, int n, int flg_plus);
|
|
mjtNum mju_cholFactorBand(mjtNum* mat, int ntotal, int nband, int ndense,
|
|
mjtNum diagadd, mjtNum diagmul);
|
|
void mju_cholSolveBand(mjtNum* res, const mjtNum* mat, const mjtNum* vec,
|
|
int ntotal, int nband, int ndense);
|
|
void mju_band2Dense(mjtNum* res, const mjtNum* mat, int ntotal, int nband, int ndense,
|
|
mjtByte flg_sym);
|
|
void mju_dense2Band(mjtNum* res, const mjtNum* mat, int ntotal, int nband, int ndense);
|
|
void mju_bandMulMatVec(mjtNum* res, const mjtNum* mat, const mjtNum* vec,
|
|
int ntotal, int nband, int ndense, int nvec, mjtByte flg_sym);
|
|
int mju_bandDiag(int i, int ntotal, int nband, int ndense);
|
|
int mju_eig3(mjtNum eigval[3], mjtNum eigvec[9], mjtNum quat[4], const mjtNum mat[9]);
|
|
int mju_boxQP(mjtNum* res, mjtNum* R, int* index, const mjtNum* H, const mjtNum* g, int n,
|
|
const mjtNum* lower, const mjtNum* upper);
|
|
void mju_boxQPmalloc(mjtNum** res, mjtNum** R, int** index, mjtNum** H, mjtNum** g, int n,
|
|
mjtNum** lower, mjtNum** upper);
|
|
mjtNum mju_muscleGain(mjtNum len, mjtNum vel, const mjtNum lengthrange[2],
|
|
mjtNum acc0, const mjtNum prm[9]);
|
|
mjtNum mju_muscleBias(mjtNum len, const mjtNum lengthrange[2],
|
|
mjtNum acc0, const mjtNum prm[9]);
|
|
mjtNum mju_muscleDynamics(mjtNum ctrl, mjtNum act, const mjtNum prm[3]);
|
|
void mju_encodePyramid(mjtNum* pyramid, const mjtNum* force, const mjtNum* mu, int dim);
|
|
void mju_decodePyramid(mjtNum* force, const mjtNum* pyramid, const mjtNum* mu, int dim);
|
|
mjtNum mju_springDamper(mjtNum pos0, mjtNum vel0, mjtNum Kp, mjtNum Kv, mjtNum dt);
|
|
mjtNum mju_min(mjtNum a, mjtNum b);
|
|
mjtNum mju_max(mjtNum a, mjtNum b);
|
|
mjtNum mju_clip(mjtNum x, mjtNum min, mjtNum max);
|
|
mjtNum mju_sign(mjtNum x);
|
|
int mju_round(mjtNum x);
|
|
const char* mju_type2Str(int type);
|
|
int mju_str2Type(const char* str);
|
|
const char* mju_writeNumBytes(size_t nbytes);
|
|
const char* mju_warningText(int warning, size_t info);
|
|
int mju_isBad(mjtNum x);
|
|
int mju_isZero(mjtNum* vec, int n);
|
|
mjtNum mju_standardNormal(mjtNum* num2);
|
|
void mju_f2n(mjtNum* res, const float* vec, int n);
|
|
void mju_n2f(float* res, const mjtNum* vec, int n);
|
|
void mju_d2n(mjtNum* res, const double* vec, int n);
|
|
void mju_n2d(double* res, const mjtNum* vec, int n);
|
|
void mju_insertionSort(mjtNum* list, int n);
|
|
void mju_insertionSortInt(int* list, int n);
|
|
mjtNum mju_Halton(int index, int base);
|
|
char* mju_strncpy(char *dst, const char *src, int n);
|
|
mjtNum mju_sigmoid(mjtNum x);
|
|
void mjd_transitionFD(const mjModel* m, mjData* d, mjtNum eps, mjtByte flg_centered,
|
|
mjtNum* A, mjtNum* B, mjtNum* C, mjtNum* D);
|
|
void mjd_inverseFD(const mjModel* m, mjData* d, mjtNum eps, mjtByte flg_actuation,
|
|
mjtNum *DfDq, mjtNum *DfDv, mjtNum *DfDa,
|
|
mjtNum *DsDq, mjtNum *DsDv, mjtNum *DsDa,
|
|
mjtNum *DmDq);
|
|
void mjd_subQuat(const mjtNum qa[4], const mjtNum qb[4], mjtNum Da[9], mjtNum Db[9]);
|
|
void mjd_quatIntegrate(const mjtNum vel[3], mjtNum scale,
|
|
mjtNum Dquat[9], mjtNum Dvel[9], mjtNum Dscale[3]);
|
|
void mjp_defaultPlugin(mjpPlugin* plugin);
|
|
int mjp_registerPlugin(const mjpPlugin* plugin);
|
|
int mjp_pluginCount(void);
|
|
const mjpPlugin* mjp_getPlugin(const char* name, int* slot);
|
|
const mjpPlugin* mjp_getPluginAtSlot(int slot);
|
|
void mjp_defaultResourceProvider(mjpResourceProvider* provider);
|
|
int mjp_registerResourceProvider(const mjpResourceProvider* provider);
|
|
int mjp_resourceProviderCount(void);
|
|
const mjpResourceProvider* mjp_getResourceProvider(const char* resource_name);
|
|
const mjpResourceProvider* mjp_getResourceProviderAtSlot(int slot);
|
|
mjThreadPool* mju_threadPoolCreate(size_t number_of_threads);
|
|
void mju_threadPoolEnqueue(
|
|
ThreadPool* thread_pool, mjTask* task, void*(start_routine)(void*),
|
|
id* args);
|
|
void mju_taskJoin(mjTask* task);
|
|
void mju_threadPoolDestroy(mjThreadPool* thread_pool);
|
|
// NOLINTEND
|