Add geom adhesion: contacts that pull, via translated friction cones.
https://youtu.be/GioWwB36XHI The new geom attribute adhesion (units of force, signed; pair-level override) translates the contact friction cone along its normal so that the force origin lies strictly inside it. Consequences: each contact can pull with up to the given force before breaking, and the tangential friction budget becomes mu*(f_N + adhesion) -- the Mohr-Coulomb yield condition with cohesion c = mu*adhesion -- so lightly-squeezed grasps retain a guaranteed friction floor. A translated cone factors exactly into {constant attractive force} + {original cone}, so no solver kernels change. The implementation is this factorization: a constant attraction along contact normals accumulated into the new mjData.qfrc_adhesion (summed into qfrc_passive), plus a bias of adhesive contact rows' reference acceleration (aref += R*adhesion), which makes resting penetration exactly independent of adhesion. Contacts of adhesive pairs remain active throughout the gap zone, producing rows with positive violation whose reference acceleration pulls: a tether that resists pull-off smoothly, captures objects released within the band into steady contact, and detaches at the specified force. Adhesion values of the two geoms combine by sum; explicit pairs override. mj_contactForce reports the net interface force (cone force minus the adhesive pull), whose normal component can now be negative. Negative adhesion is allowed and produces a repulsive offset (air hockey). PiperOrigin-RevId: 950858148 Change-Id: I879c08eba7ae501e5c0f8c2f807167344da4c2bc
This commit is contained in:
committed by
Copybara-Service
parent
b942c9f922
commit
a264d0bc8b
@@ -1118,6 +1118,7 @@ public unsafe struct mjModel_ {
|
||||
public UInt64 nbuffer;
|
||||
public byte flg_gravcomp;
|
||||
public byte flg_surfacevel;
|
||||
public byte flg_adhesion;
|
||||
public mjOption_ opt;
|
||||
public mjVisual_ vis;
|
||||
public mjStatistic_ stat;
|
||||
@@ -1223,6 +1224,7 @@ public unsafe struct mjModel_ {
|
||||
public double* geom_margin;
|
||||
public double* geom_gap;
|
||||
public double* geom_surfacevel;
|
||||
public double* geom_adhesion;
|
||||
public double* geom_fluid;
|
||||
public double* geom_user;
|
||||
public float* geom_rgba;
|
||||
@@ -1444,6 +1446,7 @@ public unsafe struct mjModel_ {
|
||||
public double* pair_solimp;
|
||||
public double* pair_margin;
|
||||
public double* pair_gap;
|
||||
public double* pair_adhesion;
|
||||
public double* pair_friction;
|
||||
public int* exclude_signature;
|
||||
public int* eq_type;
|
||||
@@ -1624,6 +1627,7 @@ public unsafe struct mjContact_ {
|
||||
public fixed double solref[2];
|
||||
public fixed double solreffriction[2];
|
||||
public fixed double solimp[5];
|
||||
public double adhesion;
|
||||
public double mu;
|
||||
public fixed double H[36];
|
||||
public int dim;
|
||||
@@ -5801,6 +5805,7 @@ public unsafe struct mjData_ {
|
||||
public double* qfrc_damper;
|
||||
public double* qfrc_gravcomp;
|
||||
public double* qfrc_fluid;
|
||||
public double* qfrc_adhesion;
|
||||
public double* qfrc_passive;
|
||||
public double* subtree_linvel;
|
||||
public double* subtree_angmom;
|
||||
|
||||
Reference in New Issue
Block a user