f9f1db1e0a
with a preconditioned Conjugate Gradient (CG) solver that operates on the full system matrix. The previous approach extracted flex DOFs into a reduced banded system, factored it separately, and overwrote the global solve. This required precomputed bandwidth (makeFlexBandwidth), parent-joint detection, coupling corrections, and a FlexInterpContext struct — and only worked for standalone flex trees without parent joints. The new CG solver uses the already-factored global system (M - h*qDeriv) as a preconditioner and adds the flex stiffness contribution via matrix-free products (mjd_flexInterp_mulKD/mulK). This handles any kinematic configuration — including flexes attached to articulated chains or with parent joints — without sparsity pattern restrictions. Before (`bunny_multicell`): ``` Simulation time : 50.80 s Steps per second : 197 Realtime factor : 0.20 x Time per step : 5080.3 µs CG iters / step : 3.16 Contacts / step : 31.04 Constraints / step : 124.15 Degrees of freedom : 178 Dynamic memory usage : 0.4% of 100M ``` After: ``` Simulation time : 9.52 s Steps per second : 1051 Realtime factor : 1.05 x Time per step : 951.7 µs CG iters / step : 3.21 Contacts / step : 30.90 Constraints / step : 123.61 Degrees of freedom : 178 Dynamic memory usage : 0.3% of 100M ``` PiperOrigin-RevId: 913758038 Change-Id: If5aa617b2d535c86aec9bd71c9e0003a2b38bdd7
43 lines
1.4 KiB
XML
43 lines
1.4 KiB
XML
<!-- Copyright 2024 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.
|
|
-->
|
|
|
|
<mujoco model="Trilinear">
|
|
<include file="scene.xml"/>
|
|
|
|
<option solver="CG" tolerance="1e-6" integrator="implicitfast"/>
|
|
|
|
<size memory="10M"/>
|
|
|
|
<visual>
|
|
<map stiffness="100"/>
|
|
</visual>
|
|
|
|
<worldbody>
|
|
<body>
|
|
<joint name="press" type="slide" axis="0 0 1" damping="500"/>
|
|
<geom type="box" size=".02 .2 .2" pos="0 0 .5"/>
|
|
</body>
|
|
<flexcomp type="mesh" file="bunny.obj" pos="0 0 0" dim="2" euler="90 0 0" cellcount="3 3 3"
|
|
radius=".001" rgba="0 .7 .7 1" mass=".05" name="softbody" dof="trilinear">
|
|
<elasticity young="1e3" poisson="0.1" damping="0.01" elastic2d="none"/>
|
|
<contact selfcollide="none" internal="false"/>
|
|
</flexcomp>
|
|
</worldbody>
|
|
|
|
<actuator>
|
|
<position name="press" joint="press" gear="-1 0 0 0 0 0" ctrlrange="-1 1" kp="1000"/>
|
|
</actuator>
|
|
</mujoco>
|