Document engine plugins.
Rename `mjPLUGIN_DYNAMIC_LIBRARY_INIT` -> `mjPLUGIN_LIB_INIT`. PiperOrigin-RevId: 521458377 Change-Id: I42aaec923e4f392899dfe53ab6ce1dddc75a83b3
This commit is contained in:
committed by
Copybara-Service
parent
ebb150fa3d
commit
01b84089dd
@@ -43,6 +43,7 @@ API function can be classified as:
|
||||
Macros
|
||||
^^^^^^
|
||||
|
||||
|
||||
.. _mjMARKSTACK:
|
||||
|
||||
mjMARKSTACK
|
||||
@@ -62,6 +63,7 @@ This macro is helpful when using the MuJoCo stack in custom computations. It wor
|
||||
// ... use temp as needed
|
||||
mjFREESTACK
|
||||
|
||||
|
||||
.. _mjFREESTACK:
|
||||
|
||||
mjFREESTACK
|
||||
@@ -73,6 +75,7 @@ mjFREESTACK
|
||||
|
||||
Reset the MuJoCo stack pointer to the variable \_mark, normally saved by mjMARKSTACK.
|
||||
|
||||
|
||||
.. _mjDISABLED:
|
||||
|
||||
mjDISABLED
|
||||
@@ -85,6 +88,7 @@ mjDISABLED
|
||||
Check if a given standard feature has been disabled via the physics options, assuming mjModel\* m is defined. x is of
|
||||
type :ref:`mjtDisableBit`.
|
||||
|
||||
|
||||
.. _mjENABLED:
|
||||
|
||||
mjENABLED
|
||||
@@ -97,6 +101,7 @@ mjENABLED
|
||||
Check if a given optional feature has been enabled via the physics options, assuming mjModel\* m is defined. x is of
|
||||
type :ref:`mjtEnableBit`.
|
||||
|
||||
|
||||
.. _mjMAX:
|
||||
|
||||
mjMAX
|
||||
@@ -108,6 +113,7 @@ mjMAX
|
||||
|
||||
Return maximum value. To avoid repeated evaluation with mjtNum types, use the function :ref:`mju_max`.
|
||||
|
||||
|
||||
.. _mjMIN:
|
||||
|
||||
mjMIN
|
||||
@@ -118,3 +124,23 @@ mjMIN
|
||||
#define mjMIN(a,b) (((a) < (b)) ? (a) : (b))
|
||||
|
||||
Return minimum value. To avoid repeated evaluation with mjtNum types, use the function :ref:`mju_min`.
|
||||
|
||||
|
||||
.. _mjPLUGIN_LIB_INIT:
|
||||
|
||||
mjPLUGIN_LIB_INIT
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. code-block:: C
|
||||
|
||||
#define mjPLUGIN_LIB_INIT \
|
||||
static void _mjplugin_dllmain(void); \
|
||||
mjEXTERNC int __stdcall mjDLLMAIN(void* hinst, unsigned long reason, void* reserved) { \
|
||||
if (reason == 1) { \
|
||||
_mjplugin_dllmain(); \
|
||||
} \
|
||||
return 1; \
|
||||
} \
|
||||
static void _mjplugin_dllmain(void)
|
||||
|
||||
Register a plugin as a dynamic library. See :ref:`plugin registration<exRegistration>` for more details.
|
||||
|
||||
@@ -26,6 +26,7 @@ MuJoCo defines a large number of types:
|
||||
- Structs for :ref:`abstract visualization<tyVisStructure>`.
|
||||
- Structs used by the :ref:`openGL renderer<tyRenderStructure>`.
|
||||
- Structs used by the :ref:`UI framework<tyUIStructure>`.
|
||||
- Structs used by :ref:`engine plugins<tyPluginStructure>`.
|
||||
|
||||
- Several :ref:`tyFunction` for user-defined callbacks.
|
||||
|
||||
@@ -555,6 +556,25 @@ Item types used in the UI framework.
|
||||
.. mujoco-include:: mjtItem
|
||||
|
||||
|
||||
.. _tyPluginEnums:
|
||||
|
||||
Plugins
|
||||
^^^^^^^
|
||||
|
||||
The enums below are defined in `mjplugin.h <https://github.com/deepmind/mujoco/blob/main/include/mujoco/mjplugin.h>`_.
|
||||
See :ref:`exPlugin` for details.
|
||||
|
||||
|
||||
.. _mjtPluginCapabilityBit:
|
||||
|
||||
mjtPluginCapabilityBit
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Capabilities declared by an engine plugin.
|
||||
|
||||
.. mujoco-include:: mjtPluginCapabilityBit
|
||||
|
||||
|
||||
|
||||
.. _tyStructure:
|
||||
|
||||
@@ -838,7 +858,8 @@ This structure contains the custom OpenGL rendering context, with the ids of all
|
||||
User Interface
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
The names of these struct types are prefixed with ``mjui``.
|
||||
The names of these struct types are prefixed with ``mjui``, except for the main :ref:`mjUI` struct itself.
|
||||
|
||||
|
||||
.. _mjuiState:
|
||||
|
||||
@@ -890,6 +911,16 @@ This structure defines one section of the UI.
|
||||
.. mujoco-include:: mjuiSection
|
||||
|
||||
|
||||
.. _mjuiDef:
|
||||
|
||||
mjuiDef
|
||||
~~~~~~~
|
||||
|
||||
This structure defines one entry in the definition table used for simplified UI construction.
|
||||
|
||||
.. mujoco-include:: mjuiDef
|
||||
|
||||
|
||||
.. _mjUI:
|
||||
|
||||
mjUI
|
||||
@@ -900,14 +931,23 @@ This structure defines the entire UI.
|
||||
.. mujoco-include:: mjUI
|
||||
|
||||
|
||||
.. _mjuiDef:
|
||||
.. _tyPluginStructure:
|
||||
|
||||
mjuiDef
|
||||
~~~~~~~
|
||||
Plugins
|
||||
^^^^^^^
|
||||
|
||||
This structure defines one entry in the definition table used for simplified UI construction.
|
||||
The names of these struct types are prefixed with ``mjp``. See :ref:`exPlugin` for more details.
|
||||
|
||||
.. mujoco-include:: mjuiDef
|
||||
|
||||
.. _mjpPlugin:
|
||||
|
||||
mjpPlugin
|
||||
~~~~~~~~~
|
||||
|
||||
This structure contains the definition of a single engine plugin. It mostly contains a set of callbacks, which are
|
||||
triggered by the compiler and the engine during various phases of the computation pipeline.
|
||||
|
||||
.. mujoco-include:: mjpPlugin
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2889,6 +2889,24 @@ defined. Its body name is automatically defined as "world".
|
||||
See :ref:`CUser`.
|
||||
|
||||
|
||||
.. _body-plugin:
|
||||
|
||||
:el-prefix:`body/` |-| **plugin** (?)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Associate this body with an :ref:`engine plugin<exPlugin>`. Either :at:`plugin` or :at:`instance` are required.
|
||||
|
||||
.. _body-plugin-plugin:
|
||||
|
||||
:at:`plugin`: :at-val:`string, optional`
|
||||
Plugin identifier, used for implicit plugin instantiation.
|
||||
|
||||
.. _body-plugin-instance:
|
||||
|
||||
:at:`instance`: :at-val:`string, optional`
|
||||
Instance name, used for explicit plugin instantiation.
|
||||
|
||||
|
||||
.. _body-inertial:
|
||||
|
||||
:el-prefix:`body/` |-| **inertial** (?)
|
||||
@@ -4214,6 +4232,23 @@ handle where the composite object is attached. For other composite types this su
|
||||
attribute can have only one number, in which case the second number is automatically set to 0.
|
||||
|
||||
|
||||
.. _composite-plugin:
|
||||
|
||||
:el-prefix:`composite/` |-| **plugin** (?)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Associate this composite with an :ref:`engine plugin<exPlugin>`. Either :at:`plugin` or :at:`instance` are required.
|
||||
|
||||
.. _composite-plugin-plugin:
|
||||
|
||||
:at:`plugin`: :at-val:`string, optional`
|
||||
Plugin identifier, used for implicit plugin instantiation.
|
||||
|
||||
.. _composite-plugin-instance:
|
||||
|
||||
:at:`instance`: :at-val:`string, optional`
|
||||
Instance name, used for explicit plugin instantiation.
|
||||
|
||||
.. _contact:
|
||||
|
||||
**contact** (*)
|
||||
@@ -5682,6 +5717,65 @@ This element has a subset of the common attributes and two custom attributes.
|
||||
to the target body.
|
||||
|
||||
|
||||
.. _actuator-plugin:
|
||||
|
||||
:el-prefix:`actuator/` |-| **plugin** (?)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Associate this actuator with an :ref:`engine plugin<exPlugin>`. Either :at:`plugin` or :at:`instance` are required.
|
||||
|
||||
.. _actuator-plugin-plugin:
|
||||
|
||||
:at:`plugin`: :at-val:`string, optional`
|
||||
Plugin identifier, used for implicit plugin instantiation.
|
||||
|
||||
.. _actuator-plugin-instance:
|
||||
|
||||
:at:`instance`: :at-val:`string, optional`
|
||||
Instance name, used for explicit plugin instantiation.
|
||||
|
||||
.. _actuator-plugin-name:
|
||||
|
||||
.. _actuator-plugin-class:
|
||||
|
||||
.. _actuator-plugin-group:
|
||||
|
||||
.. _actuator-plugin-ctrllimited:
|
||||
|
||||
.. _actuator-plugin-forcelimited:
|
||||
|
||||
.. _actuator-plugin-ctrlrange:
|
||||
|
||||
.. _actuator-plugin-forcerange:
|
||||
|
||||
.. _actuator-plugin-lengthrange:
|
||||
|
||||
.. _actuator-plugin-gear:
|
||||
|
||||
.. _actuator-plugin-cranklength:
|
||||
|
||||
.. _actuator-plugin-joint:
|
||||
|
||||
.. _actuator-plugin-jointinparent:
|
||||
|
||||
.. _actuator-plugin-site:
|
||||
|
||||
.. _actuator-plugin-tendon:
|
||||
|
||||
.. _actuator-plugin-cranksite:
|
||||
|
||||
.. _actuator-plugin-slidersite:
|
||||
|
||||
.. _actuator-plugin-user:
|
||||
|
||||
.. |actuator/plugin attrib list| replace:: :at:`name`, :at:`class`, :at:`group`, :at:`ctrllimited`, :at:`forcelimited`
|
||||
:at:`ctrlrange`, :at:`forcerange`, :at:`lengthrange`, :at:`gear`, :at:`cranklength`, :at:`joint`, :at:`jointinparent`
|
||||
:at:`site`, :at:`tendon`, :at:`cranksite`, :at:`slidersite`, :at:`user`
|
||||
|
||||
|actuator/plugin attrib list|
|
||||
Same as in actuator/ :ref:`general <actuator-general>`.
|
||||
|
||||
|
||||
.. _sensor:
|
||||
|
||||
**sensor** (*)
|
||||
@@ -6787,6 +6881,44 @@ bodies whose center of mass is of interest.
|
||||
Number of scalar outputs of this sensor.
|
||||
|
||||
|
||||
.. _sensor-plugin:
|
||||
|
||||
:el-prefix:`sensor/` |-| **plugin** (?)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Ascociate this sensor with an :ref:`engine plugin<exPlugin>`. Either :at:`plugin` or :at:`instance` are required.
|
||||
|
||||
.. _sensor-plugin-plugin:
|
||||
|
||||
:at:`plugin`: :at-val:`string, optional`
|
||||
Plugin identifier, used for implicit plugin instantiation.
|
||||
|
||||
.. _sensor-plugin-instance:
|
||||
|
||||
:at:`instance`: :at-val:`string, optional`
|
||||
Instance name, used for explicit plugin instantiation.
|
||||
|
||||
.. _sensor-plugin-name:
|
||||
|
||||
.. _sensor-plugin-cutoff:
|
||||
|
||||
.. _sensor-plugin-objtype:
|
||||
|
||||
.. _sensor-plugin-objname:
|
||||
|
||||
.. _sensor-plugin-reftype:
|
||||
|
||||
.. _sensor-plugin-refname:
|
||||
|
||||
.. _sensor-plugin-user:
|
||||
|
||||
.. |sensor/plugin attrib list| replace:: :at:`name`, :at:`cutoff`, :at:`objtype`, :at:`objname`, :at:`reftype`
|
||||
:at:`refname`, :at:`user`
|
||||
|
||||
|sensor/plugin attrib list|
|
||||
See :ref:`CSensor`.
|
||||
|
||||
|
||||
.. _keyframe:
|
||||
|
||||
**keyframe** (*)
|
||||
@@ -6849,3 +6981,64 @@ This element sets the data for one of the keyframes. They are set in the order i
|
||||
|
||||
:at:`mquat`: :at-val:`real(4*mjModel.nmocap), default = mjModel.body_quat`
|
||||
Vector of mocap body quaternions, copied into mjData.mocap_quat when the simulation state is set to this keyframe.
|
||||
|
||||
.. _extension:
|
||||
|
||||
**extension** (*)
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
This is a grouping element for MuJoCo extensions. Extensions allow the user to extend MuJoCo's capabilities with custom
|
||||
code and are described in detail in the Programming chapter's :ref:`exExtension` page. Currently, the only available
|
||||
extension type are :ref:`exPlugin`.
|
||||
|
||||
.. _extension-plugin:
|
||||
|
||||
:el-prefix:`extension/` |-| **plugin** (*)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
This element specifies that an engine plugin is required in order to simulate this model.
|
||||
See :ref:`exPlugin` for more details.
|
||||
|
||||
.. _extension-plugin-plugin:
|
||||
|
||||
:at:`plugin`: :at-val:`string, required`
|
||||
Identifier of the plugin.
|
||||
|
||||
.. _plugin-instance:
|
||||
|
||||
:el-prefix:`plugin/` |-| **instance** (*)
|
||||
'''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
Declares a plugin instance. Explicit instances declaration is required when multiple elements are backed by the same
|
||||
plugin, or when global plugin configuration is desired. See plugin :ref:`declaration<exDeclaration>` and
|
||||
:ref:`configuration<exConfiguration>` for more details.
|
||||
|
||||
.. _plugin-instance-name:
|
||||
|
||||
:at:`name`: :at-val:`string, required`
|
||||
Name of the plugin instance.
|
||||
|
||||
.. _plugin-config:
|
||||
|
||||
.. _instance-config:
|
||||
|
||||
:el-prefix:`instance/` |-| **config** (*)
|
||||
"""""""""""""""""""""""""""""""""""""""""
|
||||
|
||||
Configuration of a plugin instance. When implicitly declaring a plugin under a model element, configuration is
|
||||
performed with identical semantics using :el:`element/plugin/config`. The elements which currently support plugins are
|
||||
:el:`body`, :el:`composite`, :el:`actuator` and :el:`sensor`.
|
||||
|
||||
.. _plugin-config-key:
|
||||
|
||||
.. _instance-config-key:
|
||||
|
||||
:at:`key`: :at-val:`string, optional`
|
||||
Key used for plugin configuration.
|
||||
|
||||
.. _plugin-config-value:
|
||||
|
||||
.. _instance-config-value:
|
||||
|
||||
:at:`value`: :at-val:`string, optional`
|
||||
Value associated with key.
|
||||
|
||||
+42
-42
@@ -446,27 +446,27 @@
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| mujoco |br| |L| | | *no attributes* |
|
||||
| extension | | |
|
||||
| :ref:`extension<extension>` | | |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| |_| extension |br| |_| |L| | | .. table:: |
|
||||
| :el:`plugin` | \* | :class: mjcf-attributes |
|
||||
| | | |
|
||||
| :ref:`plugin | \* | :class: mjcf-attributes |
|
||||
| <extension-plugin>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`plugin` | | | |
|
||||
| | | | :ref:`plugin<extension-plugin-plugin>` | | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| |_2| plugin |br| |_2| |L| | | .. table:: |
|
||||
| :el:`instance` | \* | :class: mjcf-attributes |
|
||||
| | | |
|
||||
| :ref:`instance | \* | :class: mjcf-attributes |
|
||||
| <plugin-instance>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`name` | | | |
|
||||
| | | | :ref:`name<plugin-instance-name>` | | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| |_3| instance |br| |_3| |L| | | .. table:: |
|
||||
| :el:`config` | \* | :class: mjcf-attributes |
|
||||
| | | |
|
||||
| :ref:`config | \* | :class: mjcf-attributes |
|
||||
| <instance-config>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`key` | :at:`value` | | |
|
||||
| | | | :ref:`key<instance-config-key>` | :ref:`value<instance-config-value>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| mujoco |br| |L| | | *no attributes* |
|
||||
@@ -591,17 +591,17 @@
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| |_| body |br| |_| |L| | | .. table:: |
|
||||
| :el:`plugin` | \* | :class: mjcf-attributes |
|
||||
| | | |
|
||||
| :ref:`plugin | \* | :class: mjcf-attributes |
|
||||
| <body-plugin>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`plugin` | :at:`instance` | | |
|
||||
| | | | :ref:`plugin<body-plugin-plugin>` | :ref:`instance<body-plugin-instance>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| |_2| plugin |br| |_2| |L| | | .. table:: |
|
||||
| :el:`config` | \* | :class: mjcf-attributes |
|
||||
| | | |
|
||||
| :ref:`config | \* | :class: mjcf-attributes |
|
||||
| <plugin-config>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`key` | :at:`value` | | |
|
||||
| | | | :ref:`key<plugin-config-key>` | :ref:`value<plugin-config-value>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| |_| body |br| |_| |L| | | .. table:: |
|
||||
@@ -727,17 +727,17 @@
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| |_2| composite |br| |_2| |L| | | .. table:: |
|
||||
| :el:`plugin` | \* | :class: mjcf-attributes |
|
||||
| | | |
|
||||
| :ref:`plugin | \* | :class: mjcf-attributes |
|
||||
| <composite-plugin>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`plugin` | :at:`instance` | | |
|
||||
| | | | :ref:`plugin<composite-plugin-plugin>` | :ref:`instance<composite-plugin-instance>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| |_3| plugin |br| |_3| |L| | | .. table:: |
|
||||
| :el:`config` | \* | :class: mjcf-attributes |
|
||||
| | | |
|
||||
| :ref:`config | \* | :class: mjcf-attributes |
|
||||
| <plugin-config>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`key` | :at:`value` | | |
|
||||
| | | | :ref:`key<plugin-config-key>` | :ref:`value<plugin-config-value>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| |_2| composite |br| |_2| |L| | | .. table:: |
|
||||
@@ -1126,29 +1126,29 @@
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| |_| actuator |br| |_| |L| | | .. table:: |
|
||||
| :el:`plugin` | \* | :class: mjcf-attributes |
|
||||
| | | |
|
||||
| :ref:`plugin | \* | :class: mjcf-attributes |
|
||||
| <actuator-plugin>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`name` | :at:`class` | :at:`plugin` | |
|
||||
| | | | :ref:`name<actuator-plugin-name>` | :ref:`class<actuator-plugin-class>` | :ref:`plugin<actuator-plugin-plugin>` | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`instance` | :at:`group` | :at:`ctrllimited` | |
|
||||
| | | | :ref:`instance<actuator-plugin-instance>` | :ref:`group<actuator-plugin-group>` | :ref:`ctrllimited<actuator-plugin-ctrllimited>` | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`forcelimited` | :at:`ctrlrange` | :at:`forcerange` | |
|
||||
| | | | :ref:`forcelimited<actuator-plugin-forcelimited>` | :ref:`ctrlrange<actuator-plugin-ctrlrange>` | :ref:`forcerange<actuator-plugin-forcerange>` | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`lengthrange` | :at:`gear` | :at:`cranklength` | |
|
||||
| | | | :ref:`lengthrange<actuator-plugin-lengthrange>` | :ref:`gear<actuator-plugin-gear>` | :ref:`cranklength<actuator-plugin-cranklength>` | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`joint` | :at:`jointinparent` | :at:`site` | |
|
||||
| | | | :ref:`joint<actuator-plugin-joint>` | :ref:`jointinparent<actuator-plugin-jointinparent>` | :ref:`site<actuator-plugin-site>` | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`tendon` | :at:`cranksite` | :at:`slidersite` | |
|
||||
| | | | :ref:`tendon<actuator-plugin-tendon>` | :ref:`cranksite<actuator-plugin-cranksite>` | :ref:`slidersite<actuator-plugin-slidersite>` | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`user` | | | |
|
||||
| | | | :ref:`user<actuator-plugin-user>` | | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| |_2| plugin |br| |_2| |L| | | .. table:: |
|
||||
| :el:`config` | \* | :class: mjcf-attributes |
|
||||
| | | |
|
||||
| :ref:`config | \* | :class: mjcf-attributes |
|
||||
| <plugin-config>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`key` | :at:`value` | | |
|
||||
| | | | :ref:`key<plugin-config-key>` | :ref:`value<plugin-config-value>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| mujoco |br| |L| | | *no attributes* |
|
||||
@@ -1504,21 +1504,21 @@
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| |_| sensor |br| |_| |L| | | .. table:: |
|
||||
| :el:`plugin` | \* | :class: mjcf-attributes |
|
||||
| | | |
|
||||
| :ref:`plugin | \* | :class: mjcf-attributes |
|
||||
| <sensor-plugin>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`name` | :at:`plugin` | :at:`instance` | |
|
||||
| | | | :ref:`name<sensor-plugin-name>` | :ref:`plugin<sensor-plugin-plugin>` | :ref:`instance<sensor-plugin-instance>` | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`cutoff` | :at:`objtype` | :at:`objname` | |
|
||||
| | | | :ref:`cutoff<sensor-plugin-cutoff>` | :ref:`objtype<sensor-plugin-objtype>` | :ref:`objname<sensor-plugin-objname>` | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`reftype` | :at:`refname` | :at:`user` | |
|
||||
| | | | :ref:`reftype<sensor-plugin-reftype>` | :ref:`refname<sensor-plugin-refname>` | :ref:`user<sensor-plugin-user>` | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| |_2| plugin |br| |_2| |L| | | .. table:: |
|
||||
| :el:`config` | \* | :class: mjcf-attributes |
|
||||
| | | |
|
||||
| :ref:`config | \* | :class: mjcf-attributes |
|
||||
| <plugin-config>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
| | | | :at:`key` | :at:`value` | | |
|
||||
| | | | :ref:`key<plugin-config-key>` | :ref:`value<plugin-config-value>` | | |
|
||||
| | | +-----------------------------------------------------------------+-----------------------------------------------------------------+-----------------------------------------------------------------+ |
|
||||
+------------------------------------+----+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|
||||
| mujoco |br| |L| | | *no attributes* |
|
||||
|
||||
+3
-1
@@ -12,7 +12,9 @@ General
|
||||
:align: right
|
||||
:width: 240px
|
||||
|
||||
- Added :ref:`ellipsoidinertia<visual-global-ellipsoidinertia>` to visualize equivalent inertias with ellipsoids instead of the default boxes.
|
||||
- Added :ref:`ellipsoidinertia<visual-global-ellipsoidinertia>` to visualize equivalent inertias with ellipsoids instead
|
||||
of the default boxes.
|
||||
- Added documentation for :ref:`engine plugins<exPlugin>`.
|
||||
|
||||
Bug fixes
|
||||
^^^^^^^^^
|
||||
|
||||
@@ -630,6 +630,15 @@ Warmstart accelerations
|
||||
<https://en.wikipedia.org/wiki/Lyapunov_exponent>`__ when time-stepping, quickly leading to divergent trajectories
|
||||
for different warmstarts.
|
||||
|
||||
.. _gePlugin:
|
||||
|
||||
Plugin state
|
||||
^^^^^^^^^^^^
|
||||
|
||||
``plugin_state``
|
||||
``mjData.plugin_state`` are states declared by :ref:`engine plugins<exPlugin>`. Please see the :ref:`exPluginState`
|
||||
section for more details.
|
||||
|
||||
.. _geIntegrationState:
|
||||
|
||||
Integration state
|
||||
|
||||
@@ -0,0 +1,248 @@
|
||||
.. _exExtension:
|
||||
|
||||
Extensions
|
||||
----------
|
||||
|
||||
This section describes MuJoCo's mechanisms for user-authored extensions. At present, extensibility is provided only
|
||||
via **engine plugins**.
|
||||
|
||||
.. _exPlugin:
|
||||
|
||||
Engine plugins
|
||||
~~~~~~~~~~~~~~
|
||||
|
||||
Engine plugins, introduced in MuJoCo 2.3.0, allow user-defined logic to be inserted into various parts of MuJoCo's
|
||||
computational pipeline. For example, custom sensor and actuator types can be implemented as plugins. Plugin features are
|
||||
referenced in the XML content of an MJCF model, allowing MJCF to remain an abstract physical description of
|
||||
a system even if the simulation requirements extend beyond MuJoCo's built-in capabilities.
|
||||
|
||||
The plugin mechanism was designed to overcome the disadvantages of MuJoCo's :ref:`physics callbacks<glPhysics>`. These
|
||||
global callbacks (:ref:`usage example<siSimulation>`) are still available and useful for fast prototyping or when
|
||||
the user wishes to implement functionality in Python, but are generally deprecated as a stable mechanism for extended
|
||||
functionality. The central features of the plugin mechanism are:
|
||||
|
||||
- **Thread safety:** Plugin instances (see below) are thread-local, avoiding collisions.
|
||||
- **Statefulness:** Plugins can be stateful, and their state will be (de)serialized correctly.
|
||||
- **Interoperability:** Different plugins can coexist without interference.
|
||||
|
||||
Both users and developers of plugins should familiarize themselves with two key concepts:
|
||||
|
||||
Plugin
|
||||
A **plugin** is a collection of functions and static attributes that implement its capabilities, bundled into an
|
||||
:ref:`mjpPlugin` struct. Plugin functions are **stateless**: they depend only on the
|
||||
arguments passed to them. When a plugin requires an internal state, it declares this state
|
||||
and allows MuJoCo to manage it and pass it in. This enables (de)serialization of the full simulation state.
|
||||
A plugin can therefore be regarded as the "pure logic" part of the functionality and is often bundled as a C library.
|
||||
A plugin is neither a model element nor is it associated with specific model elements.
|
||||
|
||||
Plugin instance
|
||||
A plugin **instance** represents the self-contained runtime state that is operated on by the
|
||||
plugin: when the plugin logic is executed, the instance state is passed in by the engine.
|
||||
A plugin instance is itself a model element of type :ref:`mjOBJ_PLUGIN<mjtObj>`.
|
||||
There are ``mjModel.nplugin`` instances with id's in ``[0 nplugin-1]``. Like other elements, instances
|
||||
can have names, with :ref:`mj_name2id` and :ref:`mj_id2name` mapping between id's and names. Unlike the
|
||||
plugin code which is loaded once into a global table, multiple instances of the same plugin can be defined and have a
|
||||
one-to-many relationship with other model elements.
|
||||
|
||||
**one-to-one:**
|
||||
In this simplest case, each instance is referenced once in the model. For example,
|
||||
two sensors may declare that their values are computed by two plugin instances of the same plugin.
|
||||
In this case, every time the sensor output is computed, the plugin logic will be executed separately.
|
||||
|
||||
**one-to-many:**
|
||||
Alternatively, the behavior of multiple elements can be backed by a single plugin instance. There are
|
||||
two main scenarios where this is useful:
|
||||
|
||||
* The values of different element types are linked to the same physical entity and computation. For example
|
||||
consider a motor with an internal thermometer. This would manifest as an actuator and sensor, both associated with
|
||||
the same plugin instance which computes both torque outputs and temperature readings.
|
||||
* It is advantageous to batch the computation of multiple related elements together, for example where the computed
|
||||
value is the output of a neural network. The canonical example here is a robot that is equipped with ``N`` motors,
|
||||
where motor dynamics are modeled as a neural network. In this case, it can be substantially faster to produce the
|
||||
torque output of all N actuators in a single forward pass than for each motor separately.
|
||||
|
||||
Below, we begin by describing plugins from a user perspective:
|
||||
|
||||
* Types of plugin capabilities.
|
||||
* How plugins are declared and configured in an MJCF model.
|
||||
* How plugin states are incorporated into :ref:`mjData`, and what users need to do to safely duplicate and serialize
|
||||
:ref:`mjData` structs when plugin instances are present.
|
||||
|
||||
Next, we describe the logistics of plugin registration that are relevant to both users and developers of plugins. This
|
||||
is followed by a section that targets plugin developers.
|
||||
|
||||
.. _exCapabilities:
|
||||
|
||||
Plugin capabilities
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
A plugin is described by the contents of its associated :ref:`mjpPlugin` struct. The ``capabilityflags`` member is an
|
||||
integer bitfield describing the plugin's capabilities, where bit semantics are defined in the enum
|
||||
:ref:`mjtPluginCapabilityBit`. Using a bitfield allows plugins to support multiple types of computation. The currently
|
||||
supported plugin capabilities are:
|
||||
|
||||
* Actuator plugin
|
||||
* Sensor plugin
|
||||
* Passive force plugin
|
||||
|
||||
Additional capabilities will be added in the future as required.
|
||||
|
||||
|
||||
.. _exDeclaration:
|
||||
|
||||
Declaration in MJCF
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
First, a plugin dependency must be declared through ``<extension><plugin>``. When the model is parsed, if any plugin
|
||||
is declared but not registered (see below), a model compilation error is raised. If only a single MJCF element is
|
||||
backed by a plugin, instances can be implicitly created in-place. If multiple elements are backed by the same plugin,
|
||||
instance declaration must be explicit:
|
||||
|
||||
.. code:: xml
|
||||
|
||||
<mujoco>
|
||||
<extension>
|
||||
<plugin plugin="mujoco.test.simple_sensor_plugin"/>
|
||||
<plugin plugin="mujoco.test.actuator_sensor_plugin">
|
||||
<instance name="explicit_instance"/>
|
||||
</plugin>
|
||||
</extension>
|
||||
...
|
||||
<sensor>
|
||||
<plugin name="sensor0" plugin="mujoco.test.simple_sensor_plugin"/>
|
||||
<plugin name="sensor1" plugin="mujoco.test.simple_sensor_plugin"/>
|
||||
<plugin name="sensor2" instance="explicit_instance"/>
|
||||
</sensor>
|
||||
...
|
||||
<actuator>
|
||||
<plugin name="actuator2" instance="explicit_instance"/>
|
||||
</actuator>
|
||||
</mujoco>
|
||||
|
||||
In the example above, ``sensor0`` and ``sensor1`` are each backed by a simple plugin that does not share computation
|
||||
among elements, so an instance is implicitly created for each sensor by directly referencing the plugin identifier.
|
||||
In contrast, ``sensor2`` and ``actuator2`` are backed by a plugin that shares computation, so they must reference a
|
||||
shared instance that was explicitly declared.
|
||||
|
||||
|
||||
.. _exConfiguration:
|
||||
|
||||
Configuration in MJCF
|
||||
^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Plugins can declare custom attributes that represent specialized configurable parameters. For example, a DC motor model
|
||||
may expose the resistance, inductance, and capacitance as configuration attributes. In MJCF, the values of these
|
||||
attributes can be specified via ``<config>`` elements, where each ``<config>`` has a key and a value. Valid keys and
|
||||
values are specified by the plugin developers, but are declared to MuJoCo during plugin registration time so that the
|
||||
MuJoCo model compiler can raise errors for invalid values.
|
||||
|
||||
.. code:: xml
|
||||
|
||||
<mujoco>
|
||||
<extension>
|
||||
<plugin plugin="mujoco.test.simple_actuator_plugin">
|
||||
<instance name="explicit_instance">
|
||||
<config key="resistance" value="1.0"/>
|
||||
<config key="inductance" value="2.0"/>
|
||||
</instance>
|
||||
</plugin>
|
||||
</extension>
|
||||
...
|
||||
<actuator>
|
||||
<plugin name="actuator0" instance="explicit_instance"/>
|
||||
<plugin name="actuator1" plugin="mujoco.test.simple_actuator_plugin">
|
||||
<config key="resistance" value="3.0"/>
|
||||
<config key="inductance" value="4.0"/>
|
||||
</plugin>
|
||||
</actuator>
|
||||
</mujoco>
|
||||
|
||||
In the example above, ``actuator0`` refers to a pre-existing plugin instance that was created and configured via the
|
||||
``<instance>`` element, while ``actuator1`` is implicitly creating and configuring a new plugin instance in-place. Note
|
||||
that it would be an error to add ``<config>`` child elements directly to ``actuator0`` because a new plugin instance is
|
||||
not being created there.
|
||||
|
||||
.. _exPluginState:
|
||||
|
||||
Plugin state
|
||||
^^^^^^^^^^^^
|
||||
|
||||
While plugin code should be stateless, individual plugin instances are permitted to hold time-dependent state that is
|
||||
intended to evolve alongside MuJoCo physics, for example temperature variables in thermodynamically coupled actuator
|
||||
models. Separately, it may also be desirable for plugin instances to memoize potentially expensive parts of their
|
||||
operation. For example, sensor or actuator plugins that are backed by pretrained neural networks will want to preload
|
||||
their weights at model compilation time. It is important for us to distinguish between these two types of per-instance
|
||||
plugin payload. The term **plugin state** refers to the time-dependent state of the plugin instance that consists of
|
||||
*floating point* values, while the term **plugin data** refers to *arbitrary data structures* consisting of memoized
|
||||
payload that should be considered implementation detail for the plugin's computation.
|
||||
|
||||
Crucially, plugin data must be reconstructible only from plugin configuration attributes, the plugin state,
|
||||
and :ref:`MuJoCo state variables<geState>`. This means that the plugin data is not expected to be serializable, and will
|
||||
not be serialized by MuJoCo when it copies or stores data. On the other hand, plugin state is considered an integral
|
||||
part of the physics and must be serialized alongside MuJoCo's other state variables in order for the physics to be
|
||||
faithfully restored.
|
||||
|
||||
Plugins must declare the number of floating point values required for each instance via the ``nstate`` callback of its
|
||||
:ref:`mjpPlugin` struct. Note that this number can depend on the exact configuration of the instance. During
|
||||
:ref:`mj_makeData`, MuJoCo allocate the requisite number of slots in the ``plugin_state`` field of :ref:`mjData` for
|
||||
each plugin instance. The ``plugin_stateadr`` field in :ref:`mjModel` indicates the position within the overall
|
||||
``plugin_state`` array at which each plugin instance can find its state values.
|
||||
|
||||
Plugin data, however, is entirely opaque from MuJoCo's point of view. During :ref:`mj_makeData`, MuJoCo calls the
|
||||
``init`` callback from the relevant :ref:`mjpPlugin`. In this callback, the plugin is permitted to allocate or otherwise
|
||||
create an arbitrary data structure that it requires to function and stores its pointer in the ``plugin_data`` field of
|
||||
:ref:`mjData` that is being created. During :ref:`mj_deleteData`, MuJoCo calls the ``destroy`` callback from the same
|
||||
:ref:`mjpPlugin`, and the plugin is responsible for deallocating its internal resources associated with the instance.
|
||||
|
||||
When :ref:`mjData` is being copied via :ref:`mj_copyData`, MuJoCo will copy over the plugin state. However, the plugin
|
||||
code is responsible for setting up the plugin data for the newly copied :ref:`mjData`. To facilitate this, MuJoCo calls
|
||||
the ``copy`` callback from :ref:`mjpPlugin` for each plugin instance present.
|
||||
|
||||
.. _exRegistration:
|
||||
|
||||
Registration
|
||||
^^^^^^^^^^^^
|
||||
|
||||
Plugins must be registered with MuJoCo before they can be referenced in MJCF models.
|
||||
|
||||
One-off plugins that are intended to support a specific application (or throwaway plugins that are implemented to help
|
||||
troubleshoot issues with a model) can be statically linked into the application. This can be as simple as preparing an
|
||||
:ref:`mjpPlugin` struct in the ``main`` function, then passing it to :ref:`mjp_registerPlugin` to be registered with
|
||||
MuJoCo.
|
||||
|
||||
Generally, reusable plugins are expected to be packaged as dynamic libraries. A dynamic library containing one or more
|
||||
MuJoCo plugins should make sure that all plugins are registered when the library is loaded. In GCC-compatible compilers,
|
||||
this can be achieved by calling :ref:`mjp_registerPlugin` in a function that is declared with
|
||||
``__attribute__((constructor))``, while in MSVC this can be done in a DLL entry point (canonically known as
|
||||
``DllMain``). MuJoCo provides a convenience macro :ref:`mjPLUGIN_LIB_INIT` that expands to either of these
|
||||
constructs depending on the compiler used.
|
||||
|
||||
Users of plugins that are delivered as dynamic libraries as described above can load the library using the function
|
||||
:ref:`mj_loadPluginLibrary`. This is the preferred way to load dynamic libraries containing MuJoCo plugins (rather than,
|
||||
say, calling ``dlopen`` or ``LoadLibraryA`` directly) since the exact way in which MuJoCo expects dynamic libraries to
|
||||
auto-register plugins may change over time, but :ref:`mj_loadPluginLibrary` is expected to also evolve to reflect the
|
||||
best practices.
|
||||
|
||||
For applications that need to be able to load arbitrary user-provided MJCF models, it may be desirable to automatically
|
||||
scan and load all dynamic libraries found without a specific directory. Users who bring along an MJCF that requires a
|
||||
plugin can then be instructed to place the requisite plugin libraries in the relevant directory. For example, this is
|
||||
what is done in the :ref:`saSimulate` interactive viewer application. The :ref:`mj_loadAllPluginLibraries` function is
|
||||
provided for this scan-and-load use case.
|
||||
|
||||
.. _exWriting:
|
||||
|
||||
Writing plugins
|
||||
^^^^^^^^^^^^^^^
|
||||
|
||||
This section, targeted at developers, is not yet written. We encourage people who wish to write their own plugins
|
||||
to contact the MuJoCo development team for help. A good starting point for experienced developers is the
|
||||
`associated tests <https://github.com/deepmind/mujoco/blob/main/test/engine/engine_plugin_test.cc>`_ and the first-party
|
||||
plugins in the `first-party plugin directory <https://github.com/deepmind/mujoco/tree/main/plugin>`_.
|
||||
|
||||
A future version of this section will include:
|
||||
|
||||
* The content of the :ref:`mjpPlugin` struct.
|
||||
* Which functions and properties need to be provided in order to define a plugin.
|
||||
* How to declare custom MJCF attributes for a plugin.
|
||||
* Things that developers need to keep in mind in order to ensure that plugins function correctly when :ref:`mjData` is
|
||||
copied, stepped, or reset.
|
||||
@@ -135,18 +135,18 @@ mujoco.h `(source) <https://github.com/deepmind/mujoco/blob/main/include/muj
|
||||
This is the main header file and must be included in all programs using MuJoCo. It defines all API functions and
|
||||
global variables, and includes the next 5 files which provide the necessary type definitions.
|
||||
mjmodel.h `(source) <https://github.com/deepmind/mujoco/blob/main/include/mujoco/mjmodel.h>`__
|
||||
This file defines the C structure :ref:`mjModel` which is the runtime representation of the
|
||||
Defines the C structure :ref:`mjModel` which is the runtime representation of the
|
||||
model being simulated. It also defines a number of primitive types and other structures needed to define mjModel.
|
||||
mjdata.h `(source) <https://github.com/deepmind/mujoco/blob/main/include/mujoco/mjdata.h>`__
|
||||
This file defines the C structure :ref:`mjData` which is the workspace where all computations
|
||||
Defines the C structure :ref:`mjData` which is the workspace where all computations
|
||||
read their inputs and write their outputs. It also defines primitive types and other structures needed to define
|
||||
mjData.
|
||||
mjvisualize.h `(source) <https://github.com/deepmind/mujoco/blob/main/include/mujoco/mjvisualize.h>`__
|
||||
This file defines the primitive types and structures needed by the abstract visualizer.
|
||||
Defines the primitive types and structures needed by the abstract visualizer.
|
||||
mjrender.h `(source) <https://github.com/deepmind/mujoco/blob/main/include/mujoco/mjrender.h>`__
|
||||
This file defines the primitive types and structures needed by the OpenGL renderer.
|
||||
Defines the primitive types and structures needed by the OpenGL renderer.
|
||||
mjui.h `(source) <https://github.com/deepmind/mujoco/blob/main/include/mujoco/mjui.h>`__
|
||||
This file defines the primitive types and structures needed by the UI framework.
|
||||
Defines the primitive types and structures needed by the UI framework.
|
||||
mjtnum.h `(source) <https://github.com/deepmind/mujoco/blob/main/include/mujoco/mjtnum.h>`__
|
||||
Defines MuJoCo's ``mjtNum`` floating-point type to be either ``double`` or ``float``. See :ref:`mjtNum`.
|
||||
mjxmacro.h `(source) <https://github.com/deepmind/mujoco/blob/main/include/mujoco/mjxmacro.h>`__
|
||||
@@ -156,9 +156,8 @@ mjxmacro.h `(source) <https://github.com/deepmind/mujoco/blob/main/include/m
|
||||
mjexport.h `(source) <https://github.com/deepmind/mujoco/blob/main/include/mujoco/mjexport.h>`__
|
||||
Macros used for exporting public symbols from the MuJoCo library. This header should not be used directly by client
|
||||
code.
|
||||
glfw3.h
|
||||
This file is optional and is not included by mujoco.h. It is the only header file needed for the GLFW library. See
|
||||
code sample :ref:`simulate.cc <saSimulate>`.
|
||||
mjplugin.h `(source) <https://github.com/deepmind/mujoco/blob/main/include/mujoco/mjplugin.h>`__
|
||||
Defines data structures required by :ref:`engine plugins<exPlugin>`.
|
||||
|
||||
.. _inVersion:
|
||||
|
||||
@@ -262,3 +261,4 @@ now lazily resolved at runtime after the switch to GLAD, the "nogl" libraries ar
|
||||
samples
|
||||
simulation
|
||||
visualization
|
||||
extension
|
||||
|
||||
@@ -67,8 +67,7 @@ typedef struct mjpPlugin_ mjpPlugin;
|
||||
#if defined(__has_attribute)
|
||||
|
||||
#if __has_attribute(constructor)
|
||||
#define mjPLUGIN_DYNAMIC_LIBRARY_INIT \
|
||||
__attribute__((constructor)) static void _mjplugin_init(void)
|
||||
#define mjPLUGIN_LIB_INIT __attribute__((constructor)) static void _mjplugin_init(void)
|
||||
#endif // __has_attribute(constructor)
|
||||
|
||||
#elif defined(_MSC_VER)
|
||||
@@ -86,7 +85,7 @@ typedef struct mjpPlugin_ mjpPlugin;
|
||||
#endif // !defined(mjEXTERNC)
|
||||
|
||||
// NOLINTBEGIN(runtime/int)
|
||||
#define mjPLUGIN_DYNAMIC_LIBRARY_INIT \
|
||||
#define mjPLUGIN_LIB_INIT \
|
||||
static void _mjplugin_dllmain(void); \
|
||||
mjEXTERNC int __stdcall mjDLLMAIN(void* hinst, unsigned long reason, void* reserved) { \
|
||||
if (reason == 1) { \
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
namespace mujoco::plugin::elasticity {
|
||||
|
||||
mjPLUGIN_DYNAMIC_LIBRARY_INIT {
|
||||
mjPLUGIN_LIB_INIT {
|
||||
Cable::RegisterPlugin();
|
||||
Solid::RegisterPlugin();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user