From 1554048856f2720dbdf812514991876468db00e8 Mon Sep 17 00:00:00 2001 From: Baruch Tabanpour Date: Wed, 15 Nov 2023 12:50:18 -0800 Subject: [PATCH 01/10] Bump dev version number to 3.0.2. PiperOrigin-RevId: 582773849 Change-Id: I07a70911578fabb556eec1a4d8aa6fcb6557513f --- CMakeLists.txt | 2 +- dist/mujoco.rc | 8 ++++---- dist/simulate.rc | 8 ++++---- doc/APIreference/APIglobals.rst | 2 +- doc/unity.rst | 4 ++-- include/mujoco/mujoco.h | 2 +- mjx/pyproject.toml | 8 ++++---- python/mujoco/CMakeLists.txt | 4 ++-- python/mujoco/mjpython/Info.plist | 8 ++++---- python/pyproject.toml | 6 +++--- sample/CMakeLists.txt | 2 +- simulate/CMakeLists.txt | 2 +- src/engine/engine_support.c | 4 ++-- unity/Editor/Bindings/MujocoBinaryRetriever.cs | 4 ++-- unity/Runtime/Bindings/MjBindings.cs | 2 +- unity/package.json | 2 +- 16 files changed, 34 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8a76576a..7bafe59a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,7 @@ set(MSVC_INCREMENTAL_DEFAULT ON) project( mujoco - VERSION 3.0.1 + VERSION 3.0.2 DESCRIPTION "MuJoCo Physics Simulator" HOMEPAGE_URL "https://mujoco.org" ) diff --git a/dist/mujoco.rc b/dist/mujoco.rc index eecb3c24..e52e3530 100644 --- a/dist/mujoco.rc +++ b/dist/mujoco.rc @@ -1,6 +1,6 @@ 1 VERSIONINFO -FILEVERSION 3,0,1,0 -PRODUCTVERSION 3,0,1,0 +FILEVERSION 3,0,2,0 +PRODUCTVERSION 3,0,2,0 FILEOS 0x4 FILETYPE 0x1 { @@ -9,9 +9,9 @@ FILETYPE 0x1 BLOCK "040904b0" { VALUE "ProductName", "MuJoCo" - VALUE "ProductVersion", "3.0.1" + VALUE "ProductVersion", "3.0.2" VALUE "FileDescription", "MuJoCo" - VALUE "FileVersion", "3.0.1" + VALUE "FileVersion", "3.0.2" VALUE "InternalName", "mujoco.dll" VALUE "OriginalFilename", "mujoco.dll" VALUE "CompanyName", "Google DeepMind" diff --git a/dist/simulate.rc b/dist/simulate.rc index bcf38e79..4835c979 100644 --- a/dist/simulate.rc +++ b/dist/simulate.rc @@ -1,8 +1,8 @@ MUJOCO ICON "mujoco.ico" 1 VERSIONINFO -FILEVERSION 3,0,1,0 -PRODUCTVERSION 3,0,1,0 +FILEVERSION 3,0,2,0 +PRODUCTVERSION 3,0,2,0 FILEOS 0x4 FILETYPE 0x1 { @@ -11,9 +11,9 @@ FILETYPE 0x1 BLOCK "040904b0" { VALUE "ProductName", "MuJoCo" - VALUE "ProductVersion", "3.0.1" + VALUE "ProductVersion", "3.0.2" VALUE "FileDescription", "MuJoCo" - VALUE "FileVersion", "3.0.1" + VALUE "FileVersion", "3.0.2" VALUE "InternalName", "simulate.exe" VALUE "OriginalFilename", "simulate.exe" VALUE "CompanyName", "Google DeepMind" diff --git a/doc/APIreference/APIglobals.rst b/doc/APIreference/APIglobals.rst index 6f821776..33c5401c 100644 --- a/doc/APIreference/APIglobals.rst +++ b/doc/APIreference/APIglobals.rst @@ -522,7 +522,7 @@ shown in the table below. Their names are in the format ``mjKEY_XXX``. They corr - Maximum number of UI rectangles. Defined in `mjui.h `_. * - ``mjVERSION_HEADER`` - - 301 + - 302 - The version of the MuJoCo headers; changes with every release. This is an integer equal to 100x the software version, so 210 corresponds to version 2.1. Defined in mujoco.h. The API function :ref:`mj_version` returns a number with the same meaning but for the compiled library. diff --git a/doc/unity.rst b/doc/unity.rst index 13ddec5a..457c2cd7 100644 --- a/doc/unity.rst +++ b/doc/unity.rst @@ -30,14 +30,14 @@ _____ The MuJoCo app needs to be run at least once before the native library can be used, in order to register the library as a trusted binary. Then, copy the dynamic library file from -``/Applications/MuJoCo.app/Contents/Frameworks/mujoco.framework/Versions/Current/libmujoco.3.0.1.dylib`` (it can be +``/Applications/MuJoCo.app/Contents/Frameworks/mujoco.framework/Versions/Current/libmujoco.3.0.2.dylib`` (it can be found by browsing the contents of ``MuJoCo.app``) and rename it as ``mujoco.dylib``. Linux _____ Expand the ``tar.gz`` archive to ``~/.mujoco``. Then copy the dynamic library from -``~/.mujoco/mujoco-3.0.1/lib/libmujoco.so.3.0.1`` and rename it as ``libmujoco.so``. +``~/.mujoco/mujoco-3.0.2/lib/libmujoco.so.3.0.2`` and rename it as ``libmujoco.so``. Windows _______ diff --git a/include/mujoco/mujoco.h b/include/mujoco/mujoco.h index 54e6e582..ac1b509e 100644 --- a/include/mujoco/mujoco.h +++ b/include/mujoco/mujoco.h @@ -24,7 +24,7 @@ extern "C" { #endif // header version; should match the library version as returned by mj_version() -#define mjVERSION_HEADER 301 +#define mjVERSION_HEADER 302 // needed to define size_t, fabs and log10 #include diff --git a/mjx/pyproject.toml b/mjx/pyproject.toml index bea4b310..a385e9af 100644 --- a/mjx/pyproject.toml +++ b/mjx/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name="mujoco-mjx" -version = "3.0.1" +version = "3.0.2" authors = [ {name = "Google DeepMind", email = "mujoco@deepmind.com"}, ] @@ -31,13 +31,13 @@ dependencies = [ "etils[epath]", "jax", "jaxlib", - "mujoco>=3.0.1.dev0", + "mujoco>=3.0.2.dev0", "scipy", "trimesh", ] [project.urls] Homepage = "https://github.com/google-deepmind/mujoco/tree/main/mjx" -Documentation = "https://mujoco.readthedocs.io/en/3.0.1" +Documentation = "https://mujoco.readthedocs.io/en/3.0.2" Repository = "https://github.com/google-deepmind/mujoco/tree/main/mjx" -Changelog = "https://mujoco.readthedocs.io/en/3.0.1/changelog.html" +Changelog = "https://mujoco.readthedocs.io/en/3.0.2/changelog.html" diff --git a/python/mujoco/CMakeLists.txt b/python/mujoco/CMakeLists.txt index 942397d5..2505c88b 100644 --- a/python/mujoco/CMakeLists.txt +++ b/python/mujoco/CMakeLists.txt @@ -84,7 +84,7 @@ if(NOT TARGET mujoco) if(MUJOCO_FRAMEWORK) message("MuJoCo framework is at ${MUJOCO_FRAMEWORK}/mujoco.framework") set(MUJOCO_LIBRARY - ${MUJOCO_FRAMEWORK}/mujoco.framework/Versions/A/libmujoco.3.0.1.dylib + ${MUJOCO_FRAMEWORK}/mujoco.framework/Versions/A/libmujoco.3.0.2.dylib ) target_compile_options(mujoco INTERFACE -F${MUJOCO_FRAMEWORK}) endif() @@ -92,7 +92,7 @@ if(NOT TARGET mujoco) if(NOT MUJOCO_FRAMEWORK) find_library( - MUJOCO_LIBRARY mujoco mujoco.3.0.1 HINTS ${MUJOCO_LIBRARY_DIR} REQUIRED + MUJOCO_LIBRARY mujoco mujoco.3.0.2 HINTS ${MUJOCO_LIBRARY_DIR} REQUIRED ) find_path(MUJOCO_INCLUDE mujoco/mujoco.h HINTS ${MUJOCO_INCLUDE_DIR} REQUIRED) message("MuJoCo is at ${MUJOCO_LIBRARY}") diff --git a/python/mujoco/mjpython/Info.plist b/python/mujoco/mjpython/Info.plist index 39f09da3..6c6d68b2 100644 --- a/python/mujoco/mjpython/Info.plist +++ b/python/mujoco/mjpython/Info.plist @@ -7,13 +7,13 @@ CFBundleIdentifier org.mujoco.mjpython CFBundleVersion - 3.0.1 + 3.0.2 CFBundleGetInfoString - 3.0.1 + 3.0.2 CFBundleLongVersionString - 3.0.1 + 3.0.2 CFBundleShortVersionString - 3.0.1 + 3.0.2 CFBundleExecutable mjpython CFBundleIconFile diff --git a/python/pyproject.toml b/python/pyproject.toml index e42f08cf..81b7da8e 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "mujoco" -version = "3.0.1" +version = "3.0.2" authors = [ {name = "Google DeepMind", email = "mujoco@deepmind.com"}, ] @@ -36,9 +36,9 @@ dynamic = ["readme", "scripts"] [project.urls] Homepage = "https://github.com/google-deepmind/mujoco" -Documentation = "https://mujoco.readthedocs.io/en/3.0.1" +Documentation = "https://mujoco.readthedocs.io/en/3.0.2" Repository = "https://github.com/google-deepmind/mujoco" -Changelog = "https://mujoco.readthedocs.io/en/3.0.1/changelog.html" +Changelog = "https://mujoco.readthedocs.io/en/3.0.2/changelog.html" [tool.setuptools] include-package-data = false diff --git a/sample/CMakeLists.txt b/sample/CMakeLists.txt index 82e8dc49..3dceb85c 100644 --- a/sample/CMakeLists.txt +++ b/sample/CMakeLists.txt @@ -24,7 +24,7 @@ set(MSVC_INCREMENTAL_DEFAULT ON) project( mujoco_samples - VERSION 3.0.1 + VERSION 3.0.2 DESCRIPTION "MuJoCo samples binaries" HOMEPAGE_URL "https://mujoco.org" ) diff --git a/simulate/CMakeLists.txt b/simulate/CMakeLists.txt index 5ee3a866..464fc4c5 100644 --- a/simulate/CMakeLists.txt +++ b/simulate/CMakeLists.txt @@ -29,7 +29,7 @@ set(MUJOCO_DEP_VERSION_lodepng project( mujoco_simulate - VERSION 3.0.1 + VERSION 3.0.2 DESCRIPTION "MuJoCo simulate binaries" HOMEPAGE_URL "https://mujoco.org" ) diff --git a/src/engine/engine_support.c b/src/engine/engine_support.c index a6ef399a..b223a3e2 100644 --- a/src/engine/engine_support.c +++ b/src/engine/engine_support.c @@ -38,8 +38,8 @@ //-------------------------- Constants ------------------------------------------------------------- - #define mjVERSION 301 -#define mjVERSIONSTRING "3.0.1" + #define mjVERSION 302 +#define mjVERSIONSTRING "3.0.2" // names of disable flags const char* mjDISABLESTRING[mjNDISABLE] = { diff --git a/unity/Editor/Bindings/MujocoBinaryRetriever.cs b/unity/Editor/Bindings/MujocoBinaryRetriever.cs index def28419..f670431b 100644 --- a/unity/Editor/Bindings/MujocoBinaryRetriever.cs +++ b/unity/Editor/Bindings/MujocoBinaryRetriever.cs @@ -37,7 +37,7 @@ public class MujocoBinaryRetriever { if (AssetDatabase.LoadMainAssetAtPath(mujocoPath + "/mujoco.dylib") == null) { File.Copy( "/Applications/MuJoCo.app/Contents/Frameworks" + - "/mujoco.framework/Versions/Current/libmujoco.3.0.1.dylib", + "/mujoco.framework/Versions/Current/libmujoco.3.0.2.dylib", mujocoPath + "/mujoco.dylib"); AssetDatabase.Refresh(); } @@ -45,7 +45,7 @@ public class MujocoBinaryRetriever { if (AssetDatabase.LoadMainAssetAtPath(mujocoPath + "/libmujoco.so") == null) { File.Copy( Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + - "/.mujoco/mujoco-3.0.1/lib/libmujoco.so.3.0.1", + "/.mujoco/mujoco-3.0.2/lib/libmujoco.so.3.0.2", mujocoPath + "/libmujoco.so"); AssetDatabase.Refresh(); } diff --git a/unity/Runtime/Bindings/MjBindings.cs b/unity/Runtime/Bindings/MjBindings.cs index 263568cd..74d15c7c 100644 --- a/unity/Runtime/Bindings/MjBindings.cs +++ b/unity/Runtime/Bindings/MjBindings.cs @@ -108,7 +108,7 @@ public const int mjMAXLINEPNT = 1000; public const int mjMAXPLANEGRID = 200; public const bool THIRD_PARTY_MUJOCO_MJXMACRO_H_ = true; public const bool THIRD_PARTY_MUJOCO_MUJOCO_H_ = true; -public const int mjVERSION_HEADER = 301; +public const int mjVERSION_HEADER = 302; // ------------------------------------Enums------------------------------------ diff --git a/unity/package.json b/unity/package.json index 2f69424c..9c093316 100644 --- a/unity/package.json +++ b/unity/package.json @@ -1,7 +1,7 @@ { "name": "org.mujoco", "displayName": "MuJoCo", - "version": "3.0.1", + "version": "3.0.2", "description": "MuJoCo importer and runtime plug-in", "dependencies": {}, "author": { From 9952f1708cacd0a1bdc3bd171e746962b7e5e4db Mon Sep 17 00:00:00 2001 From: Tom Erez Date: Thu, 16 Nov 2023 03:23:06 -0800 Subject: [PATCH 02/10] Remove collision option from Unity plug-in GUI. PiperOrigin-RevId: 582978831 Change-Id: I97275438c730655a9c942526fa410bf006189968 --- unity/Runtime/Components/MjGlobalSettings.cs | 9 --------- unity/Tests/Editor/Components/MjGlobalSettingsTests.cs | 2 -- 2 files changed, 11 deletions(-) diff --git a/unity/Runtime/Components/MjGlobalSettings.cs b/unity/Runtime/Components/MjGlobalSettings.cs index 6052297c..de55a6a9 100644 --- a/unity/Runtime/Components/MjGlobalSettings.cs +++ b/unity/Runtime/Components/MjGlobalSettings.cs @@ -34,10 +34,6 @@ public enum IntegratorType { @implicitfast } -public enum CollisionCheckType { - all -} - public enum FrictionConeType { pyramidal, elliptic @@ -183,8 +179,6 @@ public struct MjOptionStruct { public SolverImpedance OverrideSolImp; [Tooltip("Numerical integrator.")] public IntegratorType Integrator; - [Tooltip("What collision types should be checked.")] - public CollisionCheckType Collision; [Tooltip("How to model the friction cone.")] public FrictionConeType Cone; [Tooltip("How to represent the constraint Jacobian.")] @@ -217,7 +211,6 @@ public struct MjOptionStruct { OverrideSolRef = SolverReference.Default, OverrideSolImp = SolverImpedance.Default, Integrator = IntegratorType.Euler, - Collision = CollisionCheckType.all, Cone = FrictionConeType.pyramidal, Jacobian = JacobianType.auto, Solver = ConstraintSolverType.Newton, @@ -260,7 +253,6 @@ public struct MjOptionStruct { OverrideSolImp.FromMjcf(mjcf, "o_solimp"); Integrator = mjcf.GetEnumAttribute("integrator", localDefault.Integrator); - Collision = mjcf.GetEnumAttribute("collision", localDefault.Collision); Cone = mjcf.GetEnumAttribute("cone", localDefault.Cone); Jacobian = mjcf.GetEnumAttribute("jacobian", localDefault.Jacobian); Solver = mjcf.GetEnumAttribute("solver", localDefault.Solver); @@ -295,7 +287,6 @@ public struct MjOptionStruct { OverrideSolImp.ToMjcf(mjcf, "o_solimp"); mjcf.SetAttribute("integrator", Integrator.ToString()); - mjcf.SetAttribute("collision", Collision.ToString()); mjcf.SetAttribute("cone", Cone.ToString()); mjcf.SetAttribute("jacobian", Jacobian.ToString()); mjcf.SetAttribute("solver", Solver.ToString()); diff --git a/unity/Tests/Editor/Components/MjGlobalSettingsTests.cs b/unity/Tests/Editor/Components/MjGlobalSettingsTests.cs index f3a6a218..6575bbf1 100644 --- a/unity/Tests/Editor/Components/MjGlobalSettingsTests.cs +++ b/unity/Tests/Editor/Components/MjGlobalSettingsTests.cs @@ -69,7 +69,6 @@ public class MjGlobalSettingsGenerationTests { Assert.That(_doc.OuterXml, Does.Contain(@"o_margin=""4.5""")); Assert.That(_doc.OuterXml, Does.Contain(@"integrator=""RK4""")); Assert.That(_doc.OuterXml, Does.Contain(@"cone=""elliptic""")); - Assert.That(_doc.OuterXml, Does.Contain(@"collision=""all""")); // the default value. Assert.That(_doc.OuterXml, Does.Contain(@"jacobian=""dense""")); Assert.That(_doc.OuterXml, Does.Contain(@"o_solref=")); Assert.That(_doc.OuterXml, Does.Contain(@"o_solimp=")); @@ -143,7 +142,6 @@ public class MjGlobalSettingsParsingTests { _option.SetAttribute("o_margin", "4.5"); _option.SetAttribute("integrator", "RK4"); _option.SetAttribute("cone", "elliptic"); - _option.SetAttribute("collisionchecktype", "all"); _option.SetAttribute("jacobian", "dense"); _option.SetAttribute("solver", "PGS"); _option.SetAttribute("iterations", "12"); From 4014196c6c26e7933fd13be03e0d897d5e0b8ae3 Mon Sep 17 00:00:00 2001 From: Alessio Quaglino Date: Thu, 16 Nov 2023 04:14:07 -0800 Subject: [PATCH 03/10] Add pin to flex golden data. Also reduce slightly the resolution of the models to make comparing golden data more readable. PiperOrigin-RevId: 582990641 Change-Id: I4f935a4ce316c70f4b1641e1c0f2fe49f801b32c --- test/testdata/flex.xml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/testdata/flex.xml b/test/testdata/flex.xml index bebf0163..5fdc6ca0 100644 --- a/test/testdata/flex.xml +++ b/test/testdata/flex.xml @@ -28,15 +28,16 @@ - - + + Date: Thu, 16 Nov 2023 06:09:37 -0800 Subject: [PATCH 04/10] Clarify support for muscles/tendons in future MJX. Add details to the large scene benchmark. PiperOrigin-RevId: 583018058 Change-Id: I3d93a73b4bd71ade1ecf28b8cff9a114259e71e1 --- doc/images/mjx/SPS.svg | 1 + doc/images/mjx/mujoco_vs_mjx_large_scene.png | Bin 26229 -> 0 bytes doc/mjx.rst | 62 +++++++++++++------ 3 files changed, 43 insertions(+), 20 deletions(-) create mode 100644 doc/images/mjx/SPS.svg delete mode 100644 doc/images/mjx/mujoco_vs_mjx_large_scene.png diff --git a/doc/images/mjx/SPS.svg b/doc/images/mjx/SPS.svg new file mode 100644 index 00000000..a35a2508 --- /dev/null +++ b/doc/images/mjx/SPS.svg @@ -0,0 +1 @@ + diff --git a/doc/images/mjx/mujoco_vs_mjx_large_scene.png b/doc/images/mjx/mujoco_vs_mjx_large_scene.png deleted file mode 100644 index d9ef4b543143031b196c8fb9a8eb21fccc4010af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 26229 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 Wd|77b<4O4P5!4}busoWciTEEyMfDH> diff --git a/doc/mjx.rst b/doc/mjx.rst index 481da5c8..2bdd9a58 100644 --- a/doc/mjx.rst +++ b/doc/mjx.rst @@ -171,7 +171,7 @@ The following features are **fully supported** in MJX: .. list-table:: :width: 90% :align: left - :widths: 1 5 + :widths: 2 5 :header-rows: 1 * - Category @@ -182,9 +182,12 @@ The following features are **fully supported** in MJX: - ``FREE``, ``BALL``, ``SLIDE``, ``HINGE`` * - :ref:`Transmission ` - ``TRN_JOINT`` - * - :ref:`Actuation ` - - ``DYN_NONE``, ``DYN_INTEGRATOR``, ``DYN_FILTER``, ``GAIN_FIXED``, ``GAIN_AFFINE``, ``BIAS_NONE``, - ``BIAS_AFFINE`` + * - :ref:`Actuator Dynamics ` + - ``NONE``, ``INTEGRATOR``, ``FILTER`` + * - :ref:`Actuator Gain ` + - ``FIXED``, ``AFFINE`` + * - :ref:`Actuator Bias ` + - ``NONE``, ``AFFINE`` * - :ref:`Geom ` - ``PLANE``, ``SPHERE``, ``CAPSULE``, ``BOX``, ``MESH`` * - :ref:`Constraint ` @@ -207,7 +210,7 @@ The following features are **in development** and coming soon: .. list-table:: :width: 90% :align: left - :widths: 1 5 + :widths: 2 5 :header-rows: 1 * - Category @@ -216,8 +219,16 @@ The following features are **in development** and coming soon: - :ref:`Inverse ` * - :ref:`Transmission ` - ``TRN_TENDON`` + * - :ref:`Actuator Dynamics ` + - ``MUSCLE`` + * - :ref:`Actuator Gain ` + - ``MUSCLE`` + * - :ref:`Actuator Bias ` + - ``MUSCLE`` + * - :ref:`Tendon Wrapping ` + - ``NONE``, ``JOINT``, ``PULLEY``, ``SITE``, ``SPHERE``, ``CYLINDER`` * - :ref:`Geom ` - - ``HFIELD``, ``ELLIPSOID``, ``CYLINDER``, ``SDF`` + - ``HFIELD``, ``ELLIPSOID``, ``CYLINDER`` * - :ref:`Constraint ` - ``CONTACT_FRICTIONLESS``, ``CONTACT_ELLIPTIC``, ``FRICTION_DOF`` * - :ref:`Integrator ` @@ -233,24 +244,32 @@ The following features are **in development** and coming soon: * - :ref:`Equality ` - ``TENDON`` * - :ref:`Sensors ` - - All except ``mjSENS_PLUGIN``, ``mjSENS_USER`` + - All except ``PLUGIN``, ``USER`` The following features are **unsupported**: .. list-table:: :width: 90% :align: left - :widths: 1 5 + :widths: 2 5 :header-rows: 1 * - Category - Feature * - :ref:`Transmission ` - - ``TRN_JOINTINPARENT``, ``TRN_SLIDERCRANK``, ``TRN_SITE``, ``TRN_BODY``, ``MUSCLE`` + - ``TRN_JOINTINPARENT``, ``TRN_SLIDERCRANK``, ``TRN_SITE``, ``TRN_BODY`` + * - :ref:`Actuator Dynamics ` + - ``FILTEREXACT``, ``USER`` + * - :ref:`Actuator Gain ` + - ``USER`` + * - :ref:`Actuator Bias ` + - ``USER`` * - :ref:`Solver ` - ``PGS`` - * - :ref:`Callbacks ` - - ``mjDYN_USER``, ``mjGAIN_USER``, ``mjBIAS_USER``, ``mjSENS_USER`` + * - :ref:`Sensors ` + - ``PLUGIN``, ``USER`` + * - :ref:`Geom ` + - ``SDF`` .. _MjxSharpBits: @@ -276,17 +295,20 @@ Large, complex scenes with many contacts bodies in a scene. MJX ships with a simple branchless broad-phase algorithm (see performance tuning) but it is not as powerful as the one in MuJoCo. - To see how this affects simulation, let us consider a physics scene with increasing numbers of physics bodies. We - simulate a scene with a variable number of humanoids (from 1 to 10) and then compare MJX's performance on an Nvidia - A100 GPU to MuJoCo on a 12-core workstation: + To see how this affects simulation, let us consider a physics scene with increasing numbers of humanoid bodies, + varied from 1 to 10. We simulate this scene using CPU MuJoCo on an Apple M1 Pro and a 64-core AMD 3995WX and time + it using :ref:`testspeed`, using ``2 x numcore`` threads. We time the MJX simulation on an Nvidia + A100 GPU using a batch size of 8192 and an 8-chip + `v5 TPU `__ + machine using a batch size of 16384. Note the vertical scale is logarithmic. - .. figure:: images/mjx/mujoco_vs_mjx_large_scene.png - :width: 658px - :align: center + .. figure:: images/mjx/SPS.svg + :width: 95% + :align: center - Notice that as we increase the number of humanoids (which increases the number of potential contacts in a scene), MJX - performance degrades more rapidly than MuJoCo. At the limit, for such a large scene, MuJoCo performance nearly - matches MJX. + The values for a single humanoid (leftmost datapoints) for the four timed architectures are **320K**, **1.8M**, + **950K** and **2.7M** steps per second, respectively. Note that as we increase the number of humanoids (which + increases the number of potential contacts in a scene), MJX throughput decreases more rapidly than MuJoCo. Scenes with collisions between meshes with many vertices MJX supports mesh geometries and can determine if two meshes are colliding using branchless versions of From 8693e0bba52b6d3860ec83560fb77cca77a145b0 Mon Sep 17 00:00:00 2001 From: Yuval Tassa Date: Thu, 16 Nov 2023 07:34:03 -0800 Subject: [PATCH 05/10] Stop actuator group disable from mistakenly binding to the number keys (should toggle geom groups, not actuators). PiperOrigin-RevId: 583038620 Change-Id: Ibf339aed339b7ad862f61ac72298f43e717e3973 --- simulate/simulate.cc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/simulate/simulate.cc b/simulate/simulate.cc index e73fd55f..676b1594 100644 --- a/simulate/simulate.cc +++ b/simulate/simulate.cc @@ -718,12 +718,12 @@ void MakePhysicsSection(mj::Simulate* sim, int oldstate) { }; mjuiDef defDisableActuator[] = { {mjITEM_SEPARATOR, "Actuator Group Enable", 1}, - {mjITEM_CHECKBYTE, "Act Group 0", 2, sim->enableactuator+0, " 0"}, - {mjITEM_CHECKBYTE, "Act Group 1", 2, sim->enableactuator+1, " 1"}, - {mjITEM_CHECKBYTE, "Act Group 2", 2, sim->enableactuator+2, " 2"}, - {mjITEM_CHECKBYTE, "Act Group 3", 2, sim->enableactuator+3, " 3"}, - {mjITEM_CHECKBYTE, "Act Group 4", 2, sim->enableactuator+4, " 4"}, - {mjITEM_CHECKBYTE, "Act Group 5", 2, sim->enableactuator+5, " 5"}, + {mjITEM_CHECKBYTE, "Act Group 0", 2, sim->enableactuator+0, ""}, + {mjITEM_CHECKBYTE, "Act Group 1", 2, sim->enableactuator+1, ""}, + {mjITEM_CHECKBYTE, "Act Group 2", 2, sim->enableactuator+2, ""}, + {mjITEM_CHECKBYTE, "Act Group 3", 2, sim->enableactuator+3, ""}, + {mjITEM_CHECKBYTE, "Act Group 4", 2, sim->enableactuator+4, ""}, + {mjITEM_CHECKBYTE, "Act Group 5", 2, sim->enableactuator+5, ""}, {mjITEM_END} }; From 23cdfef7fe66820a9b78a46ed996ac1064818625 Mon Sep 17 00:00:00 2001 From: Baruch Tabanpour Date: Thu, 16 Nov 2023 11:13:24 -0800 Subject: [PATCH 06/10] Update C++ dependency versions. PiperOrigin-RevId: 583105482 Change-Id: Ieeffd477a3b3baafd1d7f622881c81944298d233 --- cmake/MujocoDependencies.cmake | 2 +- python/mujoco/CMakeLists.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmake/MujocoDependencies.cmake b/cmake/MujocoDependencies.cmake index 4e3e2c8d..87bb13a7 100644 --- a/cmake/MujocoDependencies.cmake +++ b/cmake/MujocoDependencies.cmake @@ -39,7 +39,7 @@ set(MUJOCO_DEP_VERSION_qhull CACHE STRING "Version of `qhull` to be fetched." ) set(MUJOCO_DEP_VERSION_Eigen3 - e8515f78ac098329ab9f8cab21c87caede090a3f + aa6964bf3a34fd607837dd8123bc42465185c4f8 CACHE STRING "Version of `Eigen3` to be fetched." ) diff --git a/python/mujoco/CMakeLists.txt b/python/mujoco/CMakeLists.txt index 2505c88b..064f087b 100644 --- a/python/mujoco/CMakeLists.txt +++ b/python/mujoco/CMakeLists.txt @@ -173,7 +173,7 @@ findorfetch( GIT_REPO https://gitlab.com/libeigen/eigen GIT_TAG - e8515f78ac098329ab9f8cab21c87caede090a3f + aa6964bf3a34fd607837dd8123bc42465185c4f8 TARGETS Eigen3::Eigen EXCLUDE_FROM_ALL From 4d2a176a8afecfc1b31b87aeb015602cb2772769 Mon Sep 17 00:00:00 2001 From: Baruch Tabanpour Date: Thu, 16 Nov 2023 11:23:19 -0800 Subject: [PATCH 07/10] Modify name of mjx integration tests. PiperOrigin-RevId: 583108693 Change-Id: If972c376181ca98201ff61ff06d200c82d214e2b --- mjx/mujoco/mjx/integration_test/collision_driver_test.py | 2 +- mjx/mujoco/mjx/integration_test/forward_test.py | 2 +- mjx/mujoco/mjx/integration_test/smooth_test.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/mjx/mujoco/mjx/integration_test/collision_driver_test.py b/mjx/mujoco/mjx/integration_test/collision_driver_test.py index c5015446..d49ef10a 100644 --- a/mjx/mujoco/mjx/integration_test/collision_driver_test.py +++ b/mjx/mujoco/mjx/integration_test/collision_driver_test.py @@ -41,7 +41,7 @@ def _assert_attr_eq(mjx_d, mj_d, attr, name, atol): np.testing.assert_allclose(mjx_d, mj_d, err_msg=err_msg, atol=atol) -class CollisionDriverTest(parameterized.TestCase): +class CollisionDriverIntegrationTest(parameterized.TestCase): @parameterized.parameters(list(range(256))) def test_collision_driver(self, seed): diff --git a/mjx/mujoco/mjx/integration_test/forward_test.py b/mjx/mujoco/mjx/integration_test/forward_test.py index bff9ed8b..6fa913c4 100644 --- a/mjx/mujoco/mjx/integration_test/forward_test.py +++ b/mjx/mujoco/mjx/integration_test/forward_test.py @@ -30,7 +30,7 @@ def _assert_attr_eq(a, b, attr, step, fname, atol=1e-3, rtol=1e-3): np.testing.assert_allclose(a, b, err_msg=err_msg, atol=atol, rtol=rtol) -class ActuationTest(parameterized.TestCase): +class ActuationIntegrationTest(parameterized.TestCase): @parameterized.parameters(list(range(30))) def test_actuation(self, seed): diff --git a/mjx/mujoco/mjx/integration_test/smooth_test.py b/mjx/mujoco/mjx/integration_test/smooth_test.py index 92284565..c924e005 100644 --- a/mjx/mujoco/mjx/integration_test/smooth_test.py +++ b/mjx/mujoco/mjx/integration_test/smooth_test.py @@ -34,7 +34,7 @@ def _assert_attr_eq(a, b, attr, step, fname, atol=1e-5, rtol=1e-5): np.testing.assert_allclose(a, b, err_msg=err_msg, atol=atol, rtol=rtol) -class TransmissionTest(parameterized.TestCase): +class TransmissionIntegrationTest(parameterized.TestCase): @parameterized.parameters(list(range(30))) def test_transmission(self, seed): From 4fb1787a3ba9b946ba0ccb8accbaad16dda5700f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1lint=20Hodossy?= Date: Fri, 17 Nov 2023 12:46:55 +0000 Subject: [PATCH 08/10] Use default value of memory option if not present in imported XML --- unity/Runtime/Components/MjGlobalSettings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unity/Runtime/Components/MjGlobalSettings.cs b/unity/Runtime/Components/MjGlobalSettings.cs index de55a6a9..171039a1 100644 --- a/unity/Runtime/Components/MjGlobalSettings.cs +++ b/unity/Runtime/Components/MjGlobalSettings.cs @@ -147,7 +147,7 @@ public struct MjSizeStruct { }; public void ParseMjcf(XmlElement mjcf) { - Memory = mjcf.GetAttribute("memory"); + Memory = mjcf.GetStringAttribute("memory", "-1"); } public XmlElement ToMjcf(XmlElement mjcf) { From d3eee0316c87dca14aa7ad890d3dc9ae302fe062 Mon Sep 17 00:00:00 2001 From: Matthew Bennice Date: Fri, 17 Nov 2023 09:36:02 -0800 Subject: [PATCH 09/10] Small changes to Kuka IIWA7 Biarm PiperOrigin-RevId: 583412101 Change-Id: Icee1c5f1f2a9354425d8f6c311322903e1e0af83 --- src/xml/xml_urdf.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/xml/xml_urdf.cc b/src/xml/xml_urdf.cc index 13c12ce2..dab94fa8 100644 --- a/src/xml/xml_urdf.cc +++ b/src/xml/xml_urdf.cc @@ -367,7 +367,7 @@ void mjXURDF::Joint(XMLElement* joint_elem) { throw mjXError(joint_elem, "invalid joint type in URDF joint definition"); } ReadAttrTxt(joint_elem, "name", jntname, true); - + jntname = GetPrefixedName(jntname); // get parent, check elem = FindSubElem(joint_elem, "parent", true); ReadAttrTxt(elem, "link", name, true); From 98082ae7f9b25df3ab3a26dc873fc330de8f1fb9 Mon Sep 17 00:00:00 2001 From: Yuval Tassa Date: Sat, 18 Nov 2023 20:05:40 -0800 Subject: [PATCH 10/10] Add description of `eq_active` state variable to documentation. Fixes #1208. PiperOrigin-RevId: 583712793 Change-Id: I6f4adca5692fd181bb8f6c0f34ae09a756a84fc1 --- doc/computation/index.rst | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/doc/computation/index.rst b/doc/computation/index.rst index ca7c9e98..5665fb02 100644 --- a/doc/computation/index.rst +++ b/doc/computation/index.rst @@ -656,6 +656,11 @@ MoCap poses: ``mocap_pos`` and ``mocap_quat`` 6D poses from a motion-capture device. The default values set by :ref:`mj_resetData` are the poses of the bodies at the default configuration. +Equality constraint toggle: ``eq_active`` + ``mjData.eq_active`` is a byte-valued array that allows the user to toggle the state of equality constraints at + runtime. The initial value of this array is ``mjModel.eq_active0`` which can be set in XML using the + :ref:`active` attribute of :ref:`equality constraints`. + User data: ``userdata`` ``mjData.userdata`` acts as a user-defined memory space untouched by the engine. For example it can be used by callbacks. This is described in more detail in the :ref:`Programming chapter`.