Add mjs_makeFlex to the MuJoCo C and Python APIs.

- Add mjs_makeFlex C API that wraps mjCFlexcomp::Make(), creating
  a flex with auto-generated bodies, joints, and equality constraints
  from parameters (type, dim, dof, count, cellcount, spacing, scale,
  radius, mass, inertiabox, equality, rigid, flatskin, elastic2d,
  pos, quat, origin, file, vfs).
- Add Python binding body.make_flex() in specs.cc with keyword args.
- Refactor flex_spec_provision.py to use make_flex() instead of XML
  string templating + separate spec + attach. Eliminates textwrap
  dependency.
- Merge user_flexcomp into user_model BUILD target to resolve
  circular dependency.

PiperOrigin-RevId: 922725304
Change-Id: Ice13787c45f3173407fec659f9590a6453bc65dd
This commit is contained in:
Alessio Quaglino
2026-05-28 05:58:47 -07:00
committed by Copybara-Service
parent b9fb817af8
commit 4c381635e1
11 changed files with 506 additions and 2 deletions
+138
View File
@@ -10366,6 +10366,144 @@ FUNCTIONS: Mapping[str, FunctionDecl] = dict([
),
doc='Add flex.',
)),
('mjs_makeFlex',
FunctionDecl(
name='mjs_makeFlex',
return_type=PointerType(
inner_type=ValueType(name='mjsFlex'),
),
parameters=(
FunctionParameterDecl(
name='body',
type=PointerType(
inner_type=ValueType(name='mjsBody'),
),
),
FunctionParameterDecl(
name='name',
type=PointerType(
inner_type=ValueType(name='char', is_const=True),
),
),
FunctionParameterDecl(
name='type',
type=PointerType(
inner_type=ValueType(name='char', is_const=True),
),
nullable=True,
),
FunctionParameterDecl(
name='dim',
type=ValueType(name='int'),
),
FunctionParameterDecl(
name='dof',
type=PointerType(
inner_type=ValueType(name='char', is_const=True),
),
nullable=True,
),
FunctionParameterDecl(
name='count',
type=ArrayType(
inner_type=ValueType(name='int', is_const=True),
extents=(3,),
),
nullable=True,
),
FunctionParameterDecl(
name='cellcount',
type=ArrayType(
inner_type=ValueType(name='int', is_const=True),
extents=(3,),
),
nullable=True,
),
FunctionParameterDecl(
name='spacing',
type=ArrayType(
inner_type=ValueType(name='double', is_const=True),
extents=(3,),
),
nullable=True,
),
FunctionParameterDecl(
name='scale',
type=ArrayType(
inner_type=ValueType(name='double', is_const=True),
extents=(3,),
),
nullable=True,
),
FunctionParameterDecl(
name='radius',
type=ValueType(name='double'),
),
FunctionParameterDecl(
name='mass',
type=ValueType(name='double'),
),
FunctionParameterDecl(
name='inertiabox',
type=ValueType(name='double'),
),
FunctionParameterDecl(
name='equality',
type=ValueType(name='int'),
),
FunctionParameterDecl(
name='rigid',
type=ValueType(name='int'),
),
FunctionParameterDecl(
name='flatskin',
type=ValueType(name='int'),
),
FunctionParameterDecl(
name='elastic2d',
type=ValueType(name='int'),
),
FunctionParameterDecl(
name='pos',
type=ArrayType(
inner_type=ValueType(name='double', is_const=True),
extents=(3,),
),
nullable=True,
),
FunctionParameterDecl(
name='quat',
type=ArrayType(
inner_type=ValueType(name='double', is_const=True),
extents=(4,),
),
nullable=True,
),
FunctionParameterDecl(
name='origin',
type=ArrayType(
inner_type=ValueType(name='double', is_const=True),
extents=(3,),
),
nullable=True,
),
FunctionParameterDecl(
name='file',
type=PointerType(
inner_type=ValueType(name='char', is_const=True),
),
nullable=True,
),
FunctionParameterDecl(
name='vfs',
type=PointerType(
inner_type=ValueType(name='mjVFS', is_const=True),
),
nullable=True,
),
),
doc='Add flexcomp: create flex with auto-generated bodies/joints, return flex spec.', # pylint: disable=line-too-long
)),
('mjs_addPair',
FunctionDecl(
name='mjs_addPair',