MuJoCo解析之 mjData

wghou09發表於2024-08-29

在 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 表示 ***;

相關文章