Loading files
e19a62fd1This file is pinned to the selected release. Download the original to open it in your design tool.
// Copyright 2026 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.
// GENERATED FILE, DO NOT EDIT. Generated from src/xml/mjcf.schema by
// doc/generate/generate_mjcf_table.py; test/doc/doc_test.py checks freshness.
//
// The MJCF grammar table consumed by mjXSchema: rows of {name, cardinality,
// attributes...} with {"<"}/{">"} nesting markers. worldbody, frame and
// replicate have no rows: mjXSchema::NameMatch validates them against the
// body row (see the alias= facets in mjcf.schema).
// clang-format off
std::vector<const char*> MJCF[] = {
{"mujoco", "!", "model"},
{"<"},
{"compiler", "*", "autolimits", "boundmass", "boundinertia", "settotalmass", "balanceinertia",
"strippath", "coordinate", "angle", "fitaabb", "eulerseq", "meshdir", "texturedir",
"discardvisual", "usethread", "fusestatic", "inertiafromgeom", "inertiagrouprange",
"saveinertial", "assetdir", "alignfree", "conflict"},
{"<"},
{"lengthrange", "?", "mode", "useexisting", "uselimit", "accel", "maxforce", "timeconst",
"timestep", "inttotal", "interval", "tolrange"},
{">"},
{"option", "*", "timestep", "impratio", "tolerance", "ls_tolerance", "noslip_tolerance",
"ccd_tolerance", "sleep_tolerance", "gravity", "wind", "magnetic", "density", "viscosity",
"o_margin", "o_solref", "o_solimp", "o_friction", "integrator", "cone", "jacobian",
"solver", "iterations", "ls_iterations", "noslip_iterations", "ccd_iterations",
"sdf_iterations", "sdf_initpoints", "actuatorgroupdisable"},
{"<"},
{"flag", "?", "constraint", "equality", "frictionloss", "limit", "contact", "spring",
"damper", "gravity", "clampctrl", "warmstart", "filterparent", "actuation", "refsafe",
"sensor", "midphase", "eulerdamp", "autoreset", "nativeccd", "island", "multiccd",
"override", "energy", "fwdinv", "invdiscrete", "sleep", "diagexact"},
{">"},
{"size", "*", "memory", "njmax", "nconmax", "nstack", "nuserdata", "nkey", "nuser_body",
"nuser_jnt", "nuser_geom", "nuser_site", "nuser_cam", "nuser_tendon", "nuser_actuator",
"nuser_sensor"},
{"statistic", "*", "meaninertia", "meanmass", "meansize", "extent", "center"},
{"visual", "*"},
{"<"},
{"global", "?", "cameraid", "orthographic", "fovy", "ipd", "azimuth", "elevation",
"linewidth", "glow", "offwidth", "offheight", "realtime", "ellipsoidinertia",
"bvactive"},
{"quality", "?", "shadowsize", "offsamples", "numslices", "numstacks", "numquads"},
{"headlight", "?", "ambient", "diffuse", "specular", "active"},
{"map", "?", "stiffness", "stiffnessrot", "force", "torque", "alpha", "fogstart", "fogend",
"znear", "zfar", "haze", "shadowclip", "shadowscale", "actuatortendon"},
{"scale", "?", "forcewidth", "contactwidth", "contactheight", "connect", "com", "camera",
"light", "selectpoint", "jointlength", "jointwidth", "actuatorlength", "actuatorwidth",
"framelength", "framewidth", "constraint", "slidercrank", "frustum"},
{"rgba", "?", "fog", "haze", "force", "inertia", "joint", "actuator", "actuatornegative",
"actuatorpositive", "com", "camera", "light", "selectpoint", "connect", "contactpoint",
"contactforce", "contactfriction", "contacttorque", "contactgap", "rangefinder",
"constraint", "slidercrank", "crankbroken", "frustum", "bv", "bvactive"},
{">"},
{"default", "R", "class"},
{"<"},
{"mesh", "?", "scale", "maxhullvert", "inertia"},
{"material", "?", "texture", "texrepeat", "texuniform", "emission", "specular",
"shininess", "reflectance", "metallic", "roughness", "rgba"},
{"<"},
{"layer", "*", "texture", "role"},
{">"},
{"joint", "?", "type", "group", "pos", "axis", "springdamper", "limited",
"actuatorfrclimited", "solreflimit", "solimplimit", "solreffriction", "solimpfriction",
"stiffness", "range", "actuatorfrcrange", "actuatorgravcomp", "margin", "ref",
"springref", "armature", "damping", "frictionloss", "user"},
{"geom", "?", "type", "contype", "conaffinity", "condim", "group", "priority", "size",
"material", "friction", "mass", "density", "shellinertia", "solmix", "solref",
"solimp", "margin", "gap", "surfacevel", "adhesion", "fromto", "pos", "quat",
"axisangle", "xyaxes", "zaxis", "euler", "hfield", "mesh", "fitscale", "rgba",
"fluidshape", "fluidcoef", "user"},
{"site", "?", "type", "group", "pos", "quat", "axisangle", "xyaxes", "zaxis", "euler",
"material", "size", "fromto", "rgba", "user"},
{"camera", "?", "projection", "fovy", "ipd", "resolution", "output", "pos", "quat",
"axisangle", "xyaxes", "zaxis", "euler", "mode", "focal", "focalpixel", "principal",
"principalpixel", "sensorsize", "user"},
{"light", "?", "directional", "type", "castshadow", "active", "pos", "dir", "bulbradius",
"intensity", "range", "attenuation", "cutoff", "softness", "exponent", "ambient",
"diffuse", "specular", "mode"},
{"pair", "?", "condim", "friction", "solref", "solreffriction", "solimp", "gap", "margin",
"adhesion"},
{"equality", "?", "active", "solref", "solimp"},
{"tendon", "?", "group", "limited", "range", "solreflimit", "solimplimit",
"solreffriction", "solimpfriction", "frictionloss", "springlength", "width",
"material", "margin", "stiffness", "damping", "rgba", "user"},
{"general", "?", "group", "nsample", "interp", "delay", "ctrlrange", "user", "ctrllimited",
"forcelimited", "actlimited", "forcerange", "actrange", "gear", "damping", "armature",
"cranklength", "actdim", "input", "velrange", "ffrange", "dyntype", "gaintype",
"biastype", "dynprm", "gainprm", "biasprm", "actearly"},
{"motor", "?", "group", "nsample", "interp", "delay", "ctrlrange", "user", "ctrllimited",
"forcelimited", "forcerange", "gear", "damping", "armature", "cranklength"},
{"position", "?", "group", "nsample", "interp", "delay", "ctrlrange", "user",
"ctrllimited", "forcelimited", "inheritrange", "forcerange", "gear", "damping",
"armature", "cranklength", "kp", "kv", "dampratio", "timeconst"},
{"velocity", "?", "group", "nsample", "interp", "delay", "ctrlrange", "user",
"ctrllimited", "forcelimited", "forcerange", "gear", "damping", "armature",
"cranklength", "kv"},
{"intvelocity", "?", "group", "nsample", "interp", "delay", "ctrlrange", "user",
"ctrllimited", "forcelimited", "actlimited", "forcerange", "actrange", "inheritrange",
"gear", "damping", "armature", "cranklength", "kp", "kv", "dampratio"},
{"orientation", "?", "group", "nsample", "interp", "delay", "ctrlrange", "user",
"forcelimited", "forcerange", "kp", "kv", "dampratio", "input"},
{"pid", "?", "group", "nsample", "interp", "delay", "ctrlrange", "user", "ctrllimited",
"forcelimited", "posrange", "velrange", "ffrange", "forcerange", "inheritrange",
"gear", "damping", "armature", "cranklength", "kp", "kv", "dampratio", "ki", "imax",
"slewmax", "input"},
{"damper", "?", "group", "nsample", "interp", "delay", "ctrlrange", "user", "forcelimited",
"forcerange", "gear", "damping", "armature", "cranklength", "kv"},
{"cylinder", "?", "group", "nsample", "interp", "delay", "ctrlrange", "user",
"ctrllimited", "forcelimited", "forcerange", "gear", "damping", "armature",
"cranklength", "timeconst", "area", "diameter", "bias"},
{"muscle", "?", "group", "nsample", "interp", "delay", "ctrlrange", "user", "ctrllimited",
"forcelimited", "forcerange", "gear", "damping", "armature", "cranklength",
"timeconst", "range", "force", "scale", "lmin", "lmax", "vmax", "fpmax", "fvmax"},
{"adhesion", "?", "group", "nsample", "interp", "delay", "ctrlrange", "user",
"forcelimited", "forcerange", "gain"},
{"dcmotor", "?", "group", "nsample", "interp", "delay", "ctrlrange", "user", "ctrllimited",
"gear", "damping", "armature", "cranklength", "motorconst", "resistance", "nominal",
"saturation", "inductance", "cogging", "controller", "thermal", "lugre", "input"},
{">"},
{"extension", "*"},
{"<"},
{"plugin", "*", "plugin"},
{"<"},
{"instance", "*", "name"},
{"<"},
{"config", "*", "key", "value"},
{">"},
{">"},
{">"},
{"asset", "*"},
{"<"},
{"mesh", "*", "name", "class", "content_type", "file", "vertex", "normal", "texcoord",
"face", "refpos", "refquat", "scale", "smoothnormal", "maxhullvert", "inertia",
"builtin", "params", "material"},
{"<"},
{"plugin", "*", "plugin", "instance"},
{"<"},
{"config", "*", "key", "value"},
{">"},
{">"},
{"hfield", "*", "name", "content_type", "file", "nrow", "ncol", "size", "elevation"},
{"skin", "*", "name", "file", "material", "rgba", "inflate", "vertex", "texcoord", "face",
"group"},
{"<"},
{"bone", "*", "body", "bindpos", "bindquat", "vertid", "vertweight"},
{">"},
{"texture", "*", "name", "type", "colorspace", "content_type", "file", "gridsize",
"gridlayout", "fileright", "fileleft", "fileup", "filedown", "filefront", "fileback",
"builtin", "rgb1", "rgb2", "mark", "markrgb", "random", "width", "height", "hflip",
"vflip", "nchannel"},
{"material", "*", "name", "class", "texture", "texrepeat", "texuniform", "emission",
"specular", "shininess", "reflectance", "metallic", "roughness", "rgba"},
{"<"},
{"layer", "*", "texture", "role"},
{">"},
{"model", "*", "name", "file", "content_type"},
{">"},
{"body", "R", "name", "childclass", "pos", "quat", "axisangle", "xyaxes", "zaxis", "euler",
"mocap", "gravcomp", "sleep", "simple", "user"},
{"<"},
{"inertial", "?", "pos", "quat", "mass", "diaginertia", "axisangle", "xyaxes", "zaxis",
"euler", "fullinertia"},
{"joint", "*", "name", "class", "type", "group", "pos", "axis", "springdamper", "limited",
"actuatorfrclimited", "solreflimit", "solimplimit", "solreffriction", "solimpfriction",
"stiffness", "range", "actuatorfrcrange", "actuatorgravcomp", "margin", "ref",
"springref", "armature", "damping", "frictionloss", "user"},
{"freejoint", "*", "name", "group", "align"},
{"geom", "*", "name", "class", "type", "contype", "conaffinity", "condim", "group",
"priority", "size", "material", "friction", "mass", "density", "shellinertia",
"solmix", "solref", "solimp", "margin", "gap", "surfacevel", "adhesion", "fromto",
"pos", "quat", "axisangle", "xyaxes", "zaxis", "euler", "hfield", "mesh", "fitscale",
"rgba", "fluidshape", "fluidcoef", "user"},
{"<"},
{"plugin", "*", "plugin", "instance"},
{"<"},
{"config", "*", "key", "value"},
{">"},
{">"},
{"attach", "*", "model", "body", "frame", "prefix"},
{"site", "*", "name", "class", "type", "group", "pos", "quat", "axisangle", "xyaxes",
"zaxis", "euler", "material", "size", "fromto", "rgba", "user"},
{"camera", "*", "name", "class", "projection", "fovy", "ipd", "resolution", "output",
"pos", "quat", "axisangle", "xyaxes", "zaxis", "euler", "mode", "target", "focal",
"focalpixel", "principal", "principalpixel", "sensorsize", "user"},
{"light", "*", "name", "class", "directional", "type", "castshadow", "active", "pos",
"dir", "bulbradius", "intensity", "range", "attenuation", "cutoff", "softness",
"exponent", "ambient", "diffuse", "specular", "mode", "target", "texture"},
{"plugin", "*", "plugin", "instance"},
{"<"},
{"config", "*", "key", "value"},
{">"},
{"composite", "*", "prefix", "type", "count", "offset", "vertex", "initial", "curve",
"size", "quat"},
{"<"},
{"joint", "*", "kind", "group", "stiffness", "damping", "armature", "solreffix",
"solimpfix", "type", "axis", "limited", "range", "margin", "solreflimit",
"solimplimit", "frictionloss", "solreffriction", "solimpfriction"},
{"skin", "?", "texcoord", "material", "group", "rgba", "inflate", "subgrid"},
{"geom", "?", "type", "contype", "conaffinity", "condim", "group", "priority", "size",
"material", "rgba", "friction", "mass", "density", "solmix", "solref", "solimp",
"margin", "gap", "surfacevel", "adhesion"},
{"site", "?", "group", "size", "material", "rgba"},
{"plugin", "*", "plugin", "instance"},
{"<"},
{"config", "*", "key", "value"},
{">"},
{">"},
{"flexcomp", "*", "name", "type", "group", "dim", "dof", "count", "cellcount", "spacing",
"radius", "rigid", "mass", "inertiabox", "scale", "file", "point", "element",
"texcoord", "material", "rgba", "flatskin", "pos", "quat", "axisangle", "xyaxes",
"zaxis", "euler", "origin"},
{"<"},
{"edge", "?", "equality", "solref", "solimp", "stiffness", "damping"},
{"elasticity", "?", "young", "poisson", "damping", "thickness", "elastic2d"},
{"contact", "?", "contype", "conaffinity", "condim", "priority", "friction", "solmix",
"solref", "solimp", "margin", "gap", "internal", "selfcollide", "activelayers",
"passive"},
{"pin", "*", "id", "range", "grid", "gridrange"},
{"plugin", "*", "plugin", "instance"},
{"<"},
{"config", "*", "key", "value"},
{">"},
{">"},
{">"},
{"deformable", "*"},
{"<"},
{"flex", "*", "name", "group", "dim", "radius", "material", "rgba", "flatskin", "body",
"vertex", "element", "texcoord", "elemtexcoord", "node", "nodecoord", "cellcount",
"dof"},
{"<"},
{"contact", "?", "contype", "conaffinity", "condim", "priority", "friction", "solmix",
"solref", "solimp", "margin", "gap", "internal", "selfcollide", "activelayers",
"passive"},
{"edge", "?", "stiffness", "damping"},
{"elasticity", "?", "young", "poisson", "damping", "thickness", "elastic2d"},
{">"},
{"skin", "*", "name", "file", "material", "rgba", "inflate", "vertex", "texcoord", "face",
"group"},
{"<"},
{"bone", "*", "body", "bindpos", "bindquat", "vertid", "vertweight"},
{">"},
{">"},
{"contact", "*"},
{"<"},
{"pair", "*", "name", "class", "geom1", "geom2", "condim", "friction", "solref",
"solreffriction", "solimp", "gap", "margin", "adhesion"},
{"exclude", "*", "name", "body1", "body2"},
{">"},
{"tendon", "*"},
{"<"},
{"spatial", "*", "name", "class", "group", "limited", "actuatorfrclimited", "range",
"actuatorfrcrange", "solreflimit", "solimplimit", "solreffriction", "solimpfriction",
"frictionloss", "springlength", "width", "material", "margin", "stiffness", "damping",
"armature", "rgba", "user"},
{"<"},
{"site", "*", "site"},
{"geom", "*", "geom", "sidesite"},
{"pulley", "*", "divisor"},
{">"},
{"fixed", "*", "name", "class", "group", "limited", "actuatorfrclimited", "range",
"actuatorfrcrange", "solreflimit", "solimplimit", "solreffriction", "solimpfriction",
"frictionloss", "springlength", "margin", "stiffness", "damping", "armature", "user"},
{"<"},
{"joint", "*", "joint", "coef"},
{">"},
{">"},
{"equality", "*"},
{"<"},
{"connect", "*", "name", "class", "active", "solref", "solimp", "body1", "body2", "anchor",
"site1", "site2"},
{"weld", "*", "name", "class", "active", "solref", "solimp", "body1", "body2", "relpose",
"anchor", "site1", "site2", "torquescale"},
{"joint", "*", "name", "class", "active", "solref", "solimp", "joint1", "joint2",
"polycoef"},
{"tendon", "*", "name", "class", "active", "solref", "solimp", "tendon1", "tendon2",
"polycoef"},
{"flex", "*", "name", "class", "active", "solref", "solimp", "flex"},
{"flexvert", "*", "name", "class", "active", "solref", "solimp", "flex"},
{"flexstrain", "*", "name", "class", "active", "solref", "solimp", "flex", "cell"},
{">"},
{"actuator", "*"},
{"<"},
{"general", "*", "name", "class", "group", "nsample", "interp", "delay", "ctrlrange",
"user", "ctrllimited", "forcelimited", "actlimited", "forcerange", "actrange",
"lengthrange", "gear", "damping", "armature", "cranklength", "joint", "jointinparent",
"tendon", "slidersite", "cranksite", "site", "refsite", "body", "actdim", "input",
"velrange", "ffrange", "dyntype", "gaintype", "biastype", "dynprm", "gainprm",
"biasprm", "actearly"},
{"motor", "*", "name", "class", "group", "nsample", "interp", "delay", "ctrlrange", "user",
"ctrllimited", "forcelimited", "forcerange", "lengthrange", "gear", "damping",
"armature", "cranklength", "joint", "jointinparent", "tendon", "slidersite",
"cranksite", "site", "refsite"},
{"position", "*", "name", "class", "group", "nsample", "interp", "delay", "ctrlrange",
"user", "ctrllimited", "forcelimited", "inheritrange", "forcerange", "lengthrange",
"gear", "damping", "armature", "cranklength", "joint", "jointinparent", "tendon",
"slidersite", "cranksite", "site", "refsite", "kp", "kv", "dampratio", "timeconst"},
{"velocity", "*", "name", "class", "group", "nsample", "interp", "delay", "ctrlrange",
"user", "ctrllimited", "forcelimited", "forcerange", "lengthrange", "gear", "damping",
"armature", "cranklength", "joint", "jointinparent", "tendon", "slidersite",
"cranksite", "site", "refsite", "kv"},
{"intvelocity", "*", "name", "class", "group", "nsample", "interp", "delay", "ctrlrange",
"user", "ctrllimited", "forcelimited", "actlimited", "forcerange", "actrange",
"inheritrange", "lengthrange", "gear", "damping", "armature", "cranklength", "joint",
"jointinparent", "tendon", "slidersite", "cranksite", "site", "refsite", "kp", "kv",
"dampratio"},
{"orientation", "*", "name", "class", "group", "nsample", "interp", "delay", "ctrlrange",
"user", "forcelimited", "forcerange", "joint", "site", "refsite", "kp", "kv",
"dampratio", "input"},
{"pid", "*", "name", "class", "group", "nsample", "interp", "delay", "ctrlrange", "user",
"ctrllimited", "forcelimited", "posrange", "velrange", "ffrange", "forcerange",
"inheritrange", "lengthrange", "gear", "damping", "armature", "cranklength", "joint",
"jointinparent", "tendon", "slidersite", "cranksite", "site", "refsite", "kp", "kv",
"dampratio", "ki", "imax", "slewmax", "input"},
{"damper", "*", "name", "class", "group", "nsample", "interp", "delay", "ctrlrange",
"user", "forcelimited", "forcerange", "lengthrange", "gear", "damping", "armature",
"cranklength", "joint", "jointinparent", "tendon", "slidersite", "cranksite", "site",
"refsite", "kv"},
{"cylinder", "*", "name", "class", "group", "nsample", "interp", "delay", "ctrlrange",
"user", "ctrllimited", "forcelimited", "forcerange", "lengthrange", "gear", "damping",
"armature", "cranklength", "joint", "jointinparent", "tendon", "slidersite",
"cranksite", "site", "refsite", "timeconst", "area", "diameter", "bias"},
{"muscle", "*", "name", "class", "group", "nsample", "interp", "delay", "ctrlrange",
"user", "ctrllimited", "forcelimited", "forcerange", "lengthrange", "gear", "damping",
"armature", "cranklength", "joint", "jointinparent", "tendon", "slidersite",
"cranksite", "timeconst", "tausmooth", "range", "force", "scale", "lmin", "lmax",
"vmax", "fpmax", "fvmax"},
{"adhesion", "*", "name", "class", "group", "nsample", "interp", "delay", "ctrlrange",
"user", "forcelimited", "forcerange", "body", "gain"},
{"dcmotor", "*", "name", "class", "group", "nsample", "interp", "delay", "ctrlrange",
"user", "ctrllimited", "lengthrange", "gear", "damping", "armature", "cranklength",
"joint", "jointinparent", "tendon", "slidersite", "cranksite", "site", "refsite",
"motorconst", "resistance", "nominal", "saturation", "inductance", "cogging",
"controller", "thermal", "lugre", "input"},
{"plugin", "*", "name", "class", "group", "nsample", "interp", "delay", "ctrlrange",
"user", "plugin", "instance", "ctrllimited", "forcelimited", "actlimited",
"forcerange", "actrange", "lengthrange", "gear", "damping", "armature", "cranklength",
"joint", "jointinparent", "site", "actdim", "dyntype", "dynprm", "tendon", "cranksite",
"slidersite", "actearly"},
{"<"},
{"config", "*", "key", "value"},
{">"},
{">"},
{"sensor", "*"},
{"<"},
{"touch", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise", "user",
"site"},
{"accelerometer", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "site"},
{"velocimeter", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "site"},
{"gyro", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise", "user",
"site"},
{"force", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise", "user",
"site"},
{"torque", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "site"},
{"magnetometer", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "site"},
{"camprojection", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "site", "camera"},
{"rangefinder", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "site", "camera", "data"},
{"jointpos", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "joint"},
{"jointvel", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "joint"},
{"tendonpos", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "tendon"},
{"tendonvel", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "tendon"},
{"actuatorpos", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "actuator"},
{"actuatorvel", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "actuator"},
{"actuatorfrc", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "actuator"},
{"jointactuatorfrc", "*", "name", "nsample", "interp", "delay", "interval", "cutoff",
"noise", "user", "joint"},
{"tendonactuatorfrc", "*", "name", "nsample", "interp", "delay", "interval", "cutoff",
"noise", "user", "tendon"},
{"ballquat", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "joint"},
{"ballangvel", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "joint"},
{"jointlimitpos", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "joint"},
{"jointlimitvel", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "joint"},
{"jointlimitfrc", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "joint"},
{"tendonlimitpos", "*", "name", "nsample", "interp", "delay", "interval", "cutoff",
"noise", "user", "tendon"},
{"tendonlimitvel", "*", "name", "nsample", "interp", "delay", "interval", "cutoff",
"noise", "user", "tendon"},
{"tendonlimitfrc", "*", "name", "nsample", "interp", "delay", "interval", "cutoff",
"noise", "user", "tendon"},
{"framepos", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "objtype", "objname", "reftype", "refname"},
{"framequat", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "objtype", "objname", "reftype", "refname"},
{"framexaxis", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "objtype", "objname", "reftype", "refname"},
{"frameyaxis", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "objtype", "objname", "reftype", "refname"},
{"framezaxis", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "objtype", "objname", "reftype", "refname"},
{"framelinvel", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "objtype", "objname", "reftype", "refname"},
{"frameangvel", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "objtype", "objname", "reftype", "refname"},
{"framelinacc", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "objtype", "objname"},
{"frameangacc", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "objtype", "objname"},
{"subtreecom", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "body"},
{"subtreelinvel", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "body"},
{"subtreeangmom", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "body"},
{"insidesite", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "site", "objtype", "objname"},
{"distance", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "geom1", "geom2", "body1", "body2"},
{"normal", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "geom1", "geom2", "body1", "body2"},
{"fromto", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "geom1", "geom2", "body1", "body2"},
{"contact", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user", "geom1", "geom2", "body1", "body2", "subtree1", "subtree2", "site", "num",
"data", "reduce"},
{"e_potential", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user"},
{"e_kinetic", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise",
"user"},
{"clock", "*", "name", "nsample", "interp", "delay", "interval", "cutoff", "noise", "user"},
{"tactile", "*", "name", "geom", "mesh", "nsample", "interp", "delay", "interval",
"cutoff", "user"},
{"user", "*", "name", "objtype", "objname", "datatype", "needstage", "dim", "cutoff",
"noise", "user"},
{"plugin", "*", "name", "plugin", "instance", "cutoff", "objtype", "objname", "reftype",
"refname", "user"},
{"<"},
{"config", "*", "key", "value"},
{">"},
{">"},
{"custom", "*"},
{"<"},
{"numeric", "*", "name", "size", "data"},
{"text", "*", "name", "data"},
{"tuple", "*", "name"},
{"<"},
{"element", "*", "objtype", "objname", "prm"},
{">"},
{">"},
{"keyframe", "*"},
{"<"},
{"key", "*", "name", "time", "qpos", "qvel", "act", "mpos", "mquat", "ctrl"},
{">"},
{">"},
};
// clang-format on
const int nMJCF = sizeof(MJCF) / sizeof(MJCF[0]);
// presence constraints, indexed into MJCF[]; enforced by
// mjXSchema::Check. spec: attribute bundles, space-joined,
// '|'-separated; kind: e=exclusive t=together r=requires o=oneof
// clang-format off
const mjXConstraintDef MJCF_constraints[] = {
{10, 'e', "memory|nstack"},
{10, 'e', "memory|njmax"},
{31, 'e', "fovy|sensorsize"},
{32, 'e', "directional|type"},
{61, 'e', "builtin|file"},
{61, 'e', "builtin|vertex"},
{82, 'e', "fullinertia|quat|axisangle|xyaxes|zaxis|euler"},
{92, 'e', "body|frame"},
{94, 'e', "fovy|sensorsize"},
{95, 'e', "directional|type"},
{156, 'e', "site1 site2|body1 body2 anchor"},
{156, 'o', "site1 site2|body1 anchor"},
{156, 't', "site1|site2"},
{157, 'e', "site1 site2|body1 body2 anchor relpose"},
{157, 'o', "site1 site2|body1"},
{157, 't', "site1|site2"},
{193, 'e', "site|camera"},
{193, 'o', "site|camera"},
{211, 't', "reftype|refname"},
{212, 't', "reftype|refname"},
{213, 't', "reftype|refname"},
{214, 't', "reftype|refname"},
{215, 't', "reftype|refname"},
{216, 't', "reftype|refname"},
{217, 't', "reftype|refname"},
{224, 'e', "geom1|body1"},
{224, 'o', "geom1|body1"},
{224, 'e', "geom2|body2"},
{224, 'o', "geom2|body2"},
{225, 'e', "geom1|body1"},
{225, 'o', "geom1|body1"},
{225, 'e', "geom2|body2"},
{225, 'o', "geom2|body2"},
{226, 'e', "geom1|body1"},
{226, 'o', "geom1|body1"},
{226, 'e', "geom2|body2"},
{226, 'o', "geom2|body2"},
{227, 'e', "geom1|body1|subtree1|site"},
{227, 'e', "geom2|body2|subtree2"},
{232, 't', "objtype|objname"},
};
// clang-format on
const int nMJCF_constraints = sizeof(MJCF_constraints) / sizeof(MJCF_constraints[0]);