Skip flex edge Jacobian if not needed.
When equality constraints and built-in passive forces are not present, edge Jacobians are unused. This gives a 3x speedup in `mj_kinematics` in `floppy_flex` (from 0.2ms/step to 0.06ms/step). Changed the default options of `floppy_flex` to match those of `floppy` for a fair comparison. PiperOrigin-RevId: 575850622 Change-Id: I4c618536fd17ef930153bbd1f1da7d9e0e44abbe
This commit is contained in:
committed by
Copybara-Service
parent
2bb8652bf6
commit
643c1248b8
@@ -22,7 +22,7 @@
|
|||||||
|
|
||||||
<compiler autolimits="true"/>
|
<compiler autolimits="true"/>
|
||||||
|
|
||||||
<option solver="CG" tolerance="1e-6" timestep=".001" integrator="implicitfast"/>
|
<option solver="Newton" tolerance="1e-6" timestep=".001" integrator="Euler"/>
|
||||||
|
|
||||||
<size memory="100M"/>
|
<size memory="100M"/>
|
||||||
|
|
||||||
@@ -34,11 +34,11 @@
|
|||||||
<flexcomp type="grid" count="24 4 4" spacing=".1 .1 .1" pos=".1 0 1.5"
|
<flexcomp type="grid" count="24 4 4" spacing=".1 .1 .1" pos=".1 0 1.5"
|
||||||
radius=".0" rgba="0 .7 .7 1" name="softbody" dim="3" mass="7">
|
radius=".0" rgba="0 .7 .7 1" name="softbody" dim="3" mass="7">
|
||||||
<contact condim="3" solref="0.01 1" solimp=".95 .99 .0001" selfcollide="none"/>
|
<contact condim="3" solref="0.01 1" solimp=".95 .99 .0001" selfcollide="none"/>
|
||||||
<edge damping="1"/>
|
|
||||||
<plugin plugin="mujoco.elasticity.solid">
|
<plugin plugin="mujoco.elasticity.solid">
|
||||||
<config key="poisson" value="0.2"/>
|
<config key="poisson" value="0.2"/>
|
||||||
<!--Units are in Pa (SI)-->
|
<!--Units are in Pa (SI)-->
|
||||||
<config key="young" value="5e4"/>
|
<config key="young" value="5e4"/>
|
||||||
|
<config key="damping" value="0.002"/>
|
||||||
</plugin>
|
</plugin>
|
||||||
</flexcomp>
|
</flexcomp>
|
||||||
|
|
||||||
|
|||||||
@@ -541,6 +541,11 @@ void mj_flex(const mjModel* m, mjData* d) {
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// skip Jacobian if no built-in passive force is needed
|
||||||
|
int skipjacobian = !m->flex_edgeequality[f] &&
|
||||||
|
!m->flex_edgedamping[f] &&
|
||||||
|
!m->flex_edgestiffness[f];
|
||||||
|
|
||||||
// process edges of this flex
|
// process edges of this flex
|
||||||
int vbase = m->flex_vertadr[f];
|
int vbase = m->flex_vertadr[f];
|
||||||
int ebase = m->flex_edgeadr[f];
|
int ebase = m->flex_edgeadr[f];
|
||||||
@@ -557,6 +562,11 @@ void mj_flex(const mjModel* m, mjData* d) {
|
|||||||
mju_sub3(vec, pos2, pos1);
|
mju_sub3(vec, pos2, pos1);
|
||||||
d->flexedge_length[ebase+e] = mju_normalize3(vec);
|
d->flexedge_length[ebase+e] = mju_normalize3(vec);
|
||||||
|
|
||||||
|
// skip Jacobian if not needed
|
||||||
|
if (skipjacobian) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
// sparse edge Jacobian
|
// sparse edge Jacobian
|
||||||
if (issparse) {
|
if (issparse) {
|
||||||
// set rowadr
|
// set rowadr
|
||||||
|
|||||||
Reference in New Issue
Block a user