在 MuJoCo 中,mjData 用於存放模擬資料,即給定模型後,當前的狀態資料。比如,各個物件的位置、各關節的角度、碰撞資訊等等。下面,詳細解析 mjData 中各個變數的含義。
1. mjContact
mjContact
是表示碰撞結果的類,其定義如下:
struct mjContact_ { // result of collision detection functions
// contact parameters set by near-phase collision function
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], points from geom[0] to geom[1]
// 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_constraintUpdate
// contact descriptors set by mj_collideXXX
int dim; // contact space dimensionality: 1, 3, 4 or 6
int geom1; // id of geom 1; deprecated, use geom[0]
int geom2; // id of geom 2; deprecated, use geom[1]
int geom[2]; // geom ids; -1 for flex
int flex[2]; // flex ids; -1 for geom
int elem[2]; // element ids; -1 for geom or flex vertex
int vert[2]; // vertex ids; -1 for geom or flex element
// flag set by mj_setContact or mj_instantiateContact
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;
其中,dist
是碰撞深度/距離,即 A、B 兩物體之間最近的距離;pos[3]
是碰撞點,是 A、B 兩物體相交處的中點;frame[9]
則依次存放了法向量,A 上的碰撞點,B 上的碰撞點。這部分資訊的示意圖如下:
(待補充)
includemargin
是 *** 某邊界資訊 *** ;friction[5]
是摩擦資訊,包括了 tangent,spin,roll,具體入下示意圖:
(待補充)
solref[mjNREF]
是 **** ;solreffriction[mjNREF]
是 **** ;solimp[mjNIMP]
是 *** ;
mu
是 *** ;H[36]
是 **** 。具體理論推導如下:
(待補充)
dim
是碰撞空間維度(1,3, 4,or 6),具體含義是***;
geom1
是物體 A 的編號;geom2
是物體 B 的編號。(注:這兩個變數已 deprecated,推薦使用 geom[2]
)。
geom[2]
裡面存放了物體 A 和 B 的編號,如果值是 -1,則意味著該物體時 flex;flex[2]
裡存放了物體 A 和 B 的編號,如果值是 -1,則意味著該物體是 geom;elem[2]
裡存放了單元的編號,如果值是 -1,則意味著是頂點;vert[2]
裡存放了頂點的編號,如果值是 -1,則意味著是單元。舉個例子, ***。
exclude
表示 ***;
efc_address
表示 ***;