Merge branch 'google-deepmind:main' into usd-integration

This commit is contained in:
Abhishek Joshi
2023-11-19 10:33:14 -06:00
committed by GitHub
29 changed files with 99 additions and 81 deletions
+1 -1
View File
@@ -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"
)
+1 -1
View File
@@ -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."
)
+4 -4
View File
@@ -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"
+4 -4
View File
@@ -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"
+1 -1
View File
@@ -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 <https://github.com/google-deepmind/mujoco/blob/main/include/mujoco/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.
+5
View File
@@ -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<equality-connect-active>` attribute of :ref:`equality constraints<coEquality>`.
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<siSimulation>`.
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

+42 -20
View File
@@ -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 <mjtTrn>`
- ``TRN_JOINT``
* - :ref:`Actuation <geactuation>`
- ``DYN_NONE``, ``DYN_INTEGRATOR``, ``DYN_FILTER``, ``GAIN_FIXED``, ``GAIN_AFFINE``, ``BIAS_NONE``,
``BIAS_AFFINE``
* - :ref:`Actuator Dynamics <mjtDyn>`
- ``NONE``, ``INTEGRATOR``, ``FILTER``
* - :ref:`Actuator Gain <mjtGain>`
- ``FIXED``, ``AFFINE``
* - :ref:`Actuator Bias <mjtBias>`
- ``NONE``, ``AFFINE``
* - :ref:`Geom <mjtGeom>`
- ``PLANE``, ``SPHERE``, ``CAPSULE``, ``BOX``, ``MESH``
* - :ref:`Constraint <mjtConstraint>`
@@ -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 <mj_inverse>`
* - :ref:`Transmission <mjtTrn>`
- ``TRN_TENDON``
* - :ref:`Actuator Dynamics <mjtDyn>`
- ``MUSCLE``
* - :ref:`Actuator Gain <mjtGain>`
- ``MUSCLE``
* - :ref:`Actuator Bias <mjtBias>`
- ``MUSCLE``
* - :ref:`Tendon Wrapping <mjtWrap>`
- ``NONE``, ``JOINT``, ``PULLEY``, ``SITE``, ``SPHERE``, ``CYLINDER``
* - :ref:`Geom <mjtGeom>`
- ``HFIELD``, ``ELLIPSOID``, ``CYLINDER``, ``SDF``
- ``HFIELD``, ``ELLIPSOID``, ``CYLINDER``
* - :ref:`Constraint <mjtConstraint>`
- ``CONTACT_FRICTIONLESS``, ``CONTACT_ELLIPTIC``, ``FRICTION_DOF``
* - :ref:`Integrator <mjtIntegrator>`
@@ -233,24 +244,32 @@ The following features are **in development** and coming soon:
* - :ref:`Equality <mjtEq>`
- ``TENDON``
* - :ref:`Sensors <mjtSensor>`
- 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 <mjtTrn>`
- ``TRN_JOINTINPARENT``, ``TRN_SLIDERCRANK``, ``TRN_SITE``, ``TRN_BODY``, ``MUSCLE``
- ``TRN_JOINTINPARENT``, ``TRN_SLIDERCRANK``, ``TRN_SITE``, ``TRN_BODY``
* - :ref:`Actuator Dynamics <mjtDyn>`
- ``FILTEREXACT``, ``USER``
* - :ref:`Actuator Gain <mjtGain>`
- ``USER``
* - :ref:`Actuator Bias <mjtBias>`
- ``USER``
* - :ref:`Solver <mjtSolver>`
- ``PGS``
* - :ref:`Callbacks <glphysics>`
- ``mjDYN_USER``, ``mjGAIN_USER``, ``mjBIAS_USER``, ``mjSENS_USER``
* - :ref:`Sensors <mjtSensor>`
- ``PLUGIN``, ``USER``
* - :ref:`Geom <mjtGeom>`
- ``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<saTestspeed>`, 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 <https://cloud.google.com/blog/products/compute/announcing-cloud-tpu-v5e-and-a3-gpus-in-ga>`__
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
+2 -2
View File
@@ -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
_______
+1 -1
View File
@@ -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 <stdlib.h>
@@ -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):
@@ -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):
@@ -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):
+4 -4
View File
@@ -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"
+3 -3
View File
@@ -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}")
@@ -173,7 +173,7 @@ findorfetch(
GIT_REPO
https://gitlab.com/libeigen/eigen
GIT_TAG
e8515f78ac098329ab9f8cab21c87caede090a3f
aa6964bf3a34fd607837dd8123bc42465185c4f8
TARGETS
Eigen3::Eigen
EXCLUDE_FROM_ALL
+4 -4
View File
@@ -7,13 +7,13 @@
<key>CFBundleIdentifier</key>
<string>org.mujoco.mjpython</string>
<key>CFBundleVersion</key>
<string>3.0.1</string>
<string>3.0.2</string>
<key>CFBundleGetInfoString</key>
<string>3.0.1</string>
<string>3.0.2</string>
<key>CFBundleLongVersionString</key>
<string>3.0.1</string>
<string>3.0.2</string>
<key>CFBundleShortVersionString</key>
<string>3.0.1</string>
<string>3.0.2</string>
<key>CFBundleExecutable</key>
<string>mjpython</string>
<key>CFBundleIconFile</key>
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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"
)
+1 -1
View File
@@ -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"
)
+6 -6
View File
@@ -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}
};
+2 -2
View File
@@ -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] = {
+1 -1
View File
@@ -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);
+4 -3
View File
@@ -28,15 +28,16 @@
<inertial pos="0 0 0" mass="1" diaginertia="0.01 0.01 0.01"/>
<freejoint/>
<flexcomp name="f1" type="ellipsoid" rgba=".8 .2 .2 1" radius="0.001" count="5 5 5"
<flexcomp name="f1" type="ellipsoid" rgba=".8 .2 .2 1" radius="0.001" count="4 4 4"
spacing=".025 .025 .025" dim="3" mass="1">
<edge equality="true" solref="0.15 0.2" stiffness="0" damping="0"/>
</flexcomp>
</body>
<flexcomp name="f2" type="grid" rgba="1 1 0 1" radius="0.003" dim="2" pos="0 0 .6"
zaxis="1 1 1" count="7 7 1" mass="1" spacing="0.02 0.03 0.04" material="grid">
<flexcomp name="f2" type="grid" rgba="1 1 0 1" radius="0.003" dim="2" pos="0 0 .1"
zaxis="0 0 1" count="6 6 1" mass="1" spacing="0.02 0.03 0.04" material="grid">
<edge equality="true" solref="0.15 0.2" stiffness="0" damping="0"/>
<pin id="0"/>
</flexcomp>
<flexcomp name="f3" type="grid" rgba=".6 .5 .1 1" radius="0.003" dim="3" pos="0 0 .3"
@@ -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();
}
+1 -1
View File
@@ -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------------------------------------
+1 -10
View File
@@ -34,10 +34,6 @@ public enum IntegratorType {
@implicitfast
}
public enum CollisionCheckType {
all
}
public enum FrictionConeType {
pyramidal,
elliptic
@@ -151,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) {
@@ -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<IntegratorType>("integrator", localDefault.Integrator);
Collision = mjcf.GetEnumAttribute<CollisionCheckType>("collision", localDefault.Collision);
Cone = mjcf.GetEnumAttribute<FrictionConeType>("cone", localDefault.Cone);
Jacobian = mjcf.GetEnumAttribute<JacobianType>("jacobian", localDefault.Jacobian);
Solver = mjcf.GetEnumAttribute<ConstraintSolverType>("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());
@@ -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");
+1 -1
View File
@@ -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": {