Skip to content

Commit b66175e

Browse files
quaglacopybara-github
authored andcommitted
Bending stiffness for curved shells in flex.
PiperOrigin-RevId: 796361841 Change-Id: I105ea235fe2a8e1bcbde67276d77fa92eed214a1
1 parent 972ffd7 commit b66175e

File tree

18 files changed

+489
-251
lines changed

18 files changed

+489
-251
lines changed

doc/changelog.rst

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ Changelog
55
Upcoming version (not yet released)
66
-----------------------------------
77

8+
General
9+
^^^^^^^
10+
- Added support for shells with a curved reference configuration. See this `example
11+
<https://github.com/google-deepmind/mujoco/blob/main/model/flex/basket.xml>`__
12+
813
MJX
914
^^^
1015
- Promote ``ten_length`` to the public MJX API. Add Warp support for ``mjx.tendon``.

doc/includes/references.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1268,7 +1268,7 @@ struct mjModel_ {
12681268
mjtNum* flexedge_invweight0; // edge inv. weight in qpos0 (nflexedge x 1)
12691269
mjtNum* flex_radius; // radius around primitive element (nflex x 1)
12701270
mjtNum* flex_stiffness; // finite element stiffness matrix (nflexelem x 21)
1271-
mjtNum* flex_bending; // bending stiffness (nflexedge x 16)
1271+
mjtNum* flex_bending; // bending stiffness (nflexedge x 17)
12721272
mjtNum* flex_damping; // Rayleigh's damping coefficient (nflex x 1)
12731273
mjtNum* flex_edgestiffness; // edge stiffness (nflex x 1)
12741274
mjtNum* flex_edgedamping; // edge damping (nflex x 1)

include/mujoco/mjmodel.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -958,7 +958,7 @@ struct mjModel_ {
958958
mjtNum* flexedge_invweight0; // edge inv. weight in qpos0 (nflexedge x 1)
959959
mjtNum* flex_radius; // radius around primitive element (nflex x 1)
960960
mjtNum* flex_stiffness; // finite element stiffness matrix (nflexelem x 21)
961-
mjtNum* flex_bending; // bending stiffness (nflexedge x 16)
961+
mjtNum* flex_bending; // bending stiffness (nflexedge x 17)
962962
mjtNum* flex_damping; // Rayleigh's damping coefficient (nflex x 1)
963963
mjtNum* flex_edgestiffness; // edge stiffness (nflex x 1)
964964
mjtNum* flex_edgedamping; // edge damping (nflex x 1)

include/mujoco/mjxmacro.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@
372372
X ( mjtNum, flexedge_invweight0, nflexedge, 1 ) \
373373
X ( mjtNum, flex_radius, nflex, 1 ) \
374374
X ( mjtNum, flex_stiffness, nflexelem, 21 ) \
375-
X ( mjtNum, flex_bending, nflexedge, 16 ) \
375+
X ( mjtNum, flex_bending, nflexedge, 17 ) \
376376
X ( mjtNum, flex_damping, nflex, 1 ) \
377377
X ( mjtNum, flex_edgestiffness, nflex, 1 ) \
378378
X ( mjtNum, flex_edgedamping, nflex, 1 ) \

mjx/mujoco/mjx/third_party/mujoco_warp/_src/io.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,7 @@ def create_nmodel_batched_array(mjm_array, dtype, expand_dim=True):
609609
flex_elemedge=wp.array(mjm.flex_elemedge, dtype=int),
610610
flexedge_length0=wp.array(mjm.flexedge_length0, dtype=float),
611611
flex_stiffness=wp.array(mjm.flex_stiffness.flatten(), dtype=float),
612-
flex_bending=wp.array(mjm.flex_bending, dtype=wp.mat44f),
612+
flex_bending=wp.array(mjm.flex_bending.flatten(), dtype=float),
613613
flex_damping=wp.array(mjm.flex_damping, dtype=float),
614614
mesh_vertadr=wp.array(mjm.mesh_vertadr, dtype=int),
615615
mesh_vertnum=wp.array(mjm.mesh_vertnum, dtype=int),

mjx/mujoco/mjx/third_party/mujoco_warp/_src/passive.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -454,7 +454,7 @@ def _flex_bending(
454454
flex_vertbodyid: wp.array(dtype=int),
455455
flex_edge: wp.array(dtype=wp.vec2i),
456456
flex_edgeflap: wp.array(dtype=wp.vec2i),
457-
flex_bending: wp.array(dtype=wp.mat44f),
457+
flex_bending: wp.array(dtype=float),
458458
# Data in:
459459
flexvert_xpos_in: wp.array2d(dtype=wp.vec3),
460460
# Data out:
@@ -481,7 +481,7 @@ def _flex_bending(
481481
for i in range(nvert):
482482
for j in range(nvert):
483483
for x in range(3):
484-
force[i, x] -= flex_bending[edgeid][i, j] * flexvert_xpos_in[worldid, v[j]][x]
484+
force[i, x] -= flex_bending[17*edgeid + 4*i + j] * flexvert_xpos_in[worldid, v[j]][x]
485485

486486
for i in range(nvert):
487487
bodyid = flex_vertbodyid[flex_vertadr[f] + v[i]]

mjx/mujoco/mjx/third_party/mujoco_warp/_src/types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1199,7 +1199,7 @@ class Model:
11991199
flex_elemedge: wp.array(dtype=int)
12001200
flexedge_length0: wp.array(dtype=float)
12011201
flex_stiffness: wp.array(dtype=float)
1202-
flex_bending: wp.array(dtype=wp.mat44f)
1202+
flex_bending: wp.array(dtype=float)
12031203
flex_damping: wp.array(dtype=float)
12041204
mesh_vertadr: wp.array(dtype=int)
12051205
mesh_vertnum: wp.array(dtype=int)

mjx/mujoco/mjx/warp/forward.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ def _forward_shim(
124124
eq_solref: wp.array2d(dtype=wp.vec2),
125125
eq_ten_adr: wp.array(dtype=int),
126126
eq_wld_adr: wp.array(dtype=int),
127-
flex_bending: wp.array(dtype=wp.mat44f),
127+
flex_bending: wp.array(dtype=float),
128128
flex_damping: wp.array(dtype=float),
129129
flex_dim: wp.array(dtype=int),
130130
flex_edge: wp.array(dtype=wp.vec2i),
@@ -2148,7 +2148,7 @@ def _step_shim(
21482148
eq_solref: wp.array2d(dtype=wp.vec2),
21492149
eq_ten_adr: wp.array(dtype=int),
21502150
eq_wld_adr: wp.array(dtype=int),
2151-
flex_bending: wp.array(dtype=wp.mat44f),
2151+
flex_bending: wp.array(dtype=float),
21522152
flex_damping: wp.array(dtype=float),
21532153
flex_dim: wp.array(dtype=int),
21542154
flex_edge: wp.array(dtype=wp.vec2i),

mjx/mujoco/mjx/warp/types.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -737,7 +737,7 @@ def _from_elt(cont, axis_size, d, axis_dest):
737737
'eq_type': 1,
738738
'eq_wld_adr': 1,
739739
'exclude_signature': 1,
740-
'flex_bending': 3,
740+
'flex_bending': 1,
741741
'flex_damping': 1,
742742
'flex_dim': 1,
743743
'flex_edge': 2,

model/flex/basket.xml

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<!-- Copyright 2025 DeepMind Technologies Limited
2+
3+
Licensed under the Apache License, Version 2.0 (the "License");
4+
you may not use this file except in compliance with the License.
5+
You may obtain a copy of the License at
6+
7+
http://www.apache.org/licenses/LICENSE-2.0
8+
9+
Unless required by applicable law or agreed to in writing, software
10+
distributed under the License is distributed on an "AS IS" BASIS,
11+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
See the License for the specific language governing permissions and
13+
limitations under the License.
14+
-->
15+
16+
<mujoco model="Basket">
17+
<include file="scene.xml"/>
18+
19+
<compiler autolimits="true"/>
20+
21+
<option solver="CG" tolerance="1e-6"/>
22+
23+
<size memory="10M"/>
24+
25+
<visual>
26+
<map stiffness="100"/>
27+
</visual>
28+
29+
<worldbody>
30+
<flexcomp type="box" count="8 8 8" spacing=".1 .1 .1" pos="0 0 1"
31+
radius=".01" rgba=".68 .53 .38 1" name="box" dim="2" mass="0.25">
32+
<contact condim="3" solref="0.01 1" solimp=".95 .99 .0001" selfcollide="none"/>
33+
<edge equality="true" damping="10"/>
34+
<elasticity young="6e6" poisson="0.2" thickness="8e-3" elastic2d="bend"/>
35+
</flexcomp>
36+
37+
<replicate count="3" offset=".2 0 0">
38+
<replicate count="3" offset="0 .2 0">
39+
<replicate count="5" offset="0 0 .2">
40+
<body name="ball" pos="-.2 -.2 1.8">
41+
<freejoint/>
42+
<geom type="sphere" size="0.1" rgba="1 0 .2 1" mass=".03"/>
43+
</body>
44+
</replicate>
45+
</replicate>
46+
</replicate>
47+
</worldbody>
48+
</mujoco>

0 commit comments

Comments
 (0)