Merge branch 'google-deepmind:main' into mjx-warp-segmentation
This commit is contained in:
@@ -1179,6 +1179,18 @@ It is also triggered for :ref:`user sensors<sensor-user>` of :ref:`stage<sensor-
|
||||
The computed force arrays ``cfrc_int`` and ``cfrc_ext`` currently suffer from a know bug, they do not take into account
|
||||
the effect of spatial tendons, see :issue:`832`.
|
||||
|
||||
.. _mj_maxContact:
|
||||
|
||||
`mj_maxContact <#mj_maxContact>`__
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. mujoco-include:: mj_maxContact
|
||||
|
||||
Return the maximum number of contacts that can be generated between two geoms.
|
||||
|
||||
If has_margin is -1, then the margin is pulled from the model, otherwise if has_margin > 0
|
||||
indicates that the geoms have a positive margin.
|
||||
|
||||
.. _mj_collision:
|
||||
|
||||
`mj_collision <#mj_collision>`__
|
||||
@@ -1507,6 +1519,24 @@ Add file to VFS from buffer; return 0: success, 2: repeated name, -1: failed to
|
||||
|
||||
Delete file from VFS; return 0: success, -1: not found in VFS.
|
||||
|
||||
.. _mj_containsBufferVFS:
|
||||
|
||||
`mj_containsBufferVFS <#mj_containsBufferVFS>`__
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. mujoco-include:: mj_containsBufferVFS
|
||||
|
||||
Check if buffer exists in VFS; return 1: exists, 0: not found.
|
||||
|
||||
.. _mj_containsFileVFS:
|
||||
|
||||
`mj_containsFileVFS <#mj_containsFileVFS>`__
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
.. mujoco-include:: mj_containsFileVFS
|
||||
|
||||
Check if file exists in VFS; return 1: exists, 0: not found.
|
||||
|
||||
.. _mj_deleteVFS:
|
||||
|
||||
`mj_deleteVFS <#mj_deleteVFS>`__
|
||||
|
||||
+11
-4
@@ -677,7 +677,7 @@ from its default.
|
||||
|
||||
.. _option-flag-multiccd:
|
||||
|
||||
:at:`multiccd`: :at-val:`[disable, enable], "disable"`
|
||||
:at:`multiccd`: :at-val:`[disable, enable], "enable"`
|
||||
This flag enables multiple-contact collision detection for geom pairs that use a general-purpose convex-convex
|
||||
collider e.g., mesh-mesh collisions. This can be useful when the contacting geoms have a flat surface and the
|
||||
single contact point generated by the convex-convex collider cannot accurately capture the surface contact, leading
|
||||
@@ -3593,7 +3593,7 @@ saving the XML:
|
||||
|
||||
.. _body-flexcomp-dof:
|
||||
|
||||
:at:`dof`: :at-val:`[full, radial, trilinear, quadratic], "full"`
|
||||
:at:`dof`: :at-val:`[full, radial, trilinear, quadratic, 2d], "full"`
|
||||
The parametrization of the flex's degrees of freedom (dofs). See the video on the right illustrating the
|
||||
different parametrizations with deformable spheres. The three models in the video are respectively
|
||||
`sphere_full <https://github.com/google-deepmind/mujoco/blob/main/model/flex/sphere_full.xml>`__,
|
||||
@@ -3608,6 +3608,10 @@ saving the XML:
|
||||
requires a free joint at the flex's parent in order for free body motion to be possible. This type of
|
||||
parametrization is appropriate for shapes that are relatively spherical.
|
||||
|
||||
**2d**
|
||||
Two orthogonal translational dofs (X and Y) per vertex. This restricts the motion of the vertices to planes
|
||||
parallel to the parent body's X-Y plane.
|
||||
|
||||
**trilinear**
|
||||
Three translational dofs at each corner of the bounding box of the flex, for a total of 24 dofs for the entire
|
||||
flex, independent of the number of vertices. The positions of the vertices are updated using trilinear
|
||||
@@ -4324,7 +4328,7 @@ stress-strain relationship. See also :ref:`deformable <CDeformable>` objects and
|
||||
|
||||
:at:`elastic2d`: :at-val:`[none, bend, stretch, both], "none"`
|
||||
Elastic contribution to passive forces of 2D flexes. "none": none, "bend": bending only, "stretch": stretching only,
|
||||
"both": bending and stretching.
|
||||
"both": bending and stretching. Not yet supported by :ref:`dof<body-flexcomp-dof>` **trilinear** and **quadratic**.
|
||||
|
||||
.. _flex-contact:
|
||||
|
||||
@@ -4888,8 +4892,11 @@ constraint type is only supported for dimension 3 flexes with trilinear or quadr
|
||||
:at:`flex`: :at-val:`string, required`
|
||||
Name of the flex whose strain is being constrained.
|
||||
|
||||
.. _equality-flexstrain-cell:
|
||||
|
||||
|
||||
:at:`cell`: :at-val:`int(3), optional`
|
||||
3D grid index (i, j, k) identifying the cell in the flex object. The grid size is specified in the :ref:`cellcount
|
||||
<deformable-flex-cellcount>` attribute.
|
||||
|
||||
|
||||
.. _tendon:
|
||||
|
||||
@@ -2062,6 +2062,9 @@
|
||||
.. grid-item::
|
||||
:ref:`flex<equality-flexstrain-flex>`
|
||||
|
||||
.. grid-item::
|
||||
:ref:`cell<equality-flexstrain-cell>`
|
||||
|
||||
.. grid-item::
|
||||
:ref:`active<equality-flexstrain-active>`
|
||||
|
||||
|
||||
+21
-1
@@ -7,9 +7,29 @@ Upcoming version (not yet released)
|
||||
|
||||
General
|
||||
^^^^^^^
|
||||
|
||||
- Added new :ref:`mj_maxContact<mj_maxContact>` function to get the maximum number of possible contacts returned by
|
||||
two geoms.
|
||||
- Added ``mj_containsBufferVFS`` and ``mj_containsFileVFS`` to check for existence of buffers and files in VFS.
|
||||
- Added :ref:`multi-cell support<body-flexcomp-cellnum>` for trilinear and quadratic flexes. Note that the implicit
|
||||
integrator uses a dense solver for the flex degrees of freedom, which can be slow for multi-cell flexes.
|
||||
- Refactored ``flexstrain`` equality constraints to be instantiated per cell instead of per flex object, reducing the
|
||||
number of degrees of freedom per constraint row. The equality can be associated with a specific cell with the new
|
||||
attribute ":ref:`cell <equality-flexstrain-cell>`
|
||||
|
||||
.. admonition:: Breaking API changes
|
||||
:class: attention
|
||||
|
||||
- The feature :ref:`multiccd<coMultiCCD>` is now enabled by default. This feature has little performance overhead
|
||||
and gives better contact behavior for stability.
|
||||
|
||||
**Migration:** The flag :ref:`multiccd<option-flag-multiccd>` must be explicitly disabled.
|
||||
|
||||
Bug fixes
|
||||
^^^^^^^^^
|
||||
|
||||
- Asset paths in attached child specs are now resolved relative to the model file directory of the child spec, rather
|
||||
than the parent spec. This prevents the origin of the parent spec to affect the resolution of asset paths in the child
|
||||
spec.
|
||||
|
||||
Version 3.7.0 (April 14, 2026)
|
||||
------------------------------
|
||||
|
||||
+138
-27
@@ -1656,23 +1656,25 @@ Both pipelines are controlled by a tolerance (in units of distance) and maximum
|
||||
|
||||
Multiple contacts
|
||||
^^^^^^^^^^^^^^^^^
|
||||
Some colliders can return more than one contact per colliding pair to model line or surface contacts, as when two flat
|
||||
Some colliders can return more than one contact per colliding pair to model edge or surface contacts, as when two flat
|
||||
objects touch. For example the capsule-plane and box-plane colliders can return up to two or four contacts,
|
||||
respectively. Standard general-purpose convex collision algorithms like MPR and GJK always return a single contact
|
||||
respectively. Standard general-purpose convex collision algorithms like MPR and GJK/EPA always return a single contact
|
||||
point, which is problematic for surface contact scenarios (e.g., box-stacking). Both of MuJoCo's CCD pipelines can
|
||||
return multiple points per contacting pair ("multiccd"). This behavior is controlled by the
|
||||
:ref:`multiccd<option-flag-multiccd>` flag, but is implemented in different ways with different trade-offs:
|
||||
|
||||
libccd pipeline (legacy)
|
||||
multi-run pipeline (legacy)
|
||||
Multiple contact points are found by rotating the two geoms by ±1e-3 radians around the tangential axes and
|
||||
re-running the collision routine. If a new contact is detected it is added, allowing for up to 4 additional contact
|
||||
points. This method is effective, but increases the cost of each collision call by a factor of 5.
|
||||
points. This method is effective, but increases the cost of each collision call by a factor of 5. This method is
|
||||
used when the :ref:`nativeccd<option-flag-nativeccd>` flag is disabled, and for geoms collisions involving cylinders
|
||||
and capsules or with :ref:`positive contact margins<body-geom-margin>`.
|
||||
|
||||
native pipeline
|
||||
Native multiccd discovers multiple contacts using a novel analysis of the contacting surfaces at the solution,
|
||||
avoiding full re-runs of the collision routine, and is thus effectively "free". Note that native multiccd currently
|
||||
does not support positive contact margins. If one of the two geoms has a positive margin, native multiccd will fall
|
||||
back to legacy algorithm.
|
||||
single-shot pipeline
|
||||
The single-shot pipeline is used in conjunction with the native CCD pipeline, i.e., when the
|
||||
:ref:`nativeccd<option-flag-nativeccd>` flag is enabled. As this pipeline is one-shot and most of the geom analysis
|
||||
is done at compilation time, there is very little performance overhead. Supported geoms are boxes and meshes without
|
||||
:ref:`positive contact margins<body-geom-margin>`.
|
||||
|
||||
.. _coDistance:
|
||||
|
||||
@@ -1716,9 +1718,36 @@ work, but it pays off at runtime and yields both faster and more stable simulati
|
||||
Pair-wise colliders
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The table below provides information about the colliders used for different geom pairs. The second row in each cell
|
||||
lists the maximum number of contacts generated, possibly with ``multiccd`` enabled. For example, ``Mesh`` / ``Mesh``
|
||||
will generate up to 1 contact or with ``multiccd`` up to 4 contacts.
|
||||
The table below provides information about the colliders used for different geom pairs. These values can be computed
|
||||
dynamically by the :ref:`mj_maxContact` function. Use the toggles to see the max number of contacts returned with the
|
||||
parameters :ref:`nativeccd<option-flag-nativeccd>`, :ref:`multiccd<option-flag-multiccd>`, and
|
||||
:ref:`margin<body-geom-margin>`.
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<div class="pairwise-toggles">
|
||||
<div class="pairwise-toggle-item">
|
||||
<label class="pairwise-switch">
|
||||
<input type="checkbox" id="nativeccd-checkbox" checked>
|
||||
<span class="pairwise-slider"></span>
|
||||
</label>
|
||||
<span>nativeccd</span>
|
||||
</div>
|
||||
<div class="pairwise-toggle-item">
|
||||
<label class="pairwise-switch">
|
||||
<input type="checkbox" id="multiccd-checkbox">
|
||||
<span class="pairwise-slider"></span>
|
||||
</label>
|
||||
<span>multiccd</span>
|
||||
</div>
|
||||
<div class="pairwise-toggle-item">
|
||||
<label class="pairwise-switch">
|
||||
<input type="checkbox" id="margin-checkbox">
|
||||
<span class="pairwise-slider"></span>
|
||||
</label>
|
||||
<span>with margin</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
.. list-table::
|
||||
:header-rows: 1
|
||||
@@ -1742,7 +1771,7 @@ will generate up to 1 contact or with ``multiccd`` up to 4 contacts.
|
||||
- | primitive
|
||||
| **1**
|
||||
- | primitive
|
||||
| **2**
|
||||
| **4**
|
||||
- | primitive
|
||||
| **4**
|
||||
- | primitive
|
||||
@@ -1785,12 +1814,28 @@ will generate up to 1 contact or with ``multiccd`` up to 4 contacts.
|
||||
| **2**
|
||||
- | CCD
|
||||
| **1**
|
||||
- | CCD
|
||||
| **1**, **4**
|
||||
-
|
||||
.. raw:: html
|
||||
|
||||
<div class="line">CCD</div>
|
||||
<div class="line">
|
||||
<div class="multiccd-off"><strong>1</strong></div>
|
||||
<div class="multiccd-native"><strong>5</strong></div>
|
||||
<div class="multiccd-legacy"><strong>5</strong></div>
|
||||
</div>
|
||||
|
||||
- | primitive
|
||||
| **2**
|
||||
- | CCD
|
||||
| **1**, **4**
|
||||
-
|
||||
.. raw:: html
|
||||
|
||||
<div class="line">CCD</div>
|
||||
<div class="line">
|
||||
<div class="multiccd-off"><strong>1</strong></div>
|
||||
<div class="multiccd-native"><strong>5</strong></div>
|
||||
<div class="multiccd-legacy"><strong>5</strong></div>
|
||||
</div>
|
||||
|
||||
- | SDF
|
||||
| :ref:`sdf_initpoints <option-sdf_initpoints>`
|
||||
* - Ellipsoid
|
||||
@@ -1810,12 +1855,36 @@ will generate up to 1 contact or with ``multiccd`` up to 4 contacts.
|
||||
-
|
||||
-
|
||||
-
|
||||
- | CCD
|
||||
| **1**, **4**
|
||||
- | CCD
|
||||
| **1**, **4**
|
||||
- | CCD
|
||||
| **1**, **4**
|
||||
-
|
||||
.. raw:: html
|
||||
|
||||
<div class="line">CCD</div>
|
||||
<div class="line">
|
||||
<div class="multiccd-off"><strong>1</strong></div>
|
||||
<div class="multiccd-native"><strong>5</strong></div>
|
||||
<div class="multiccd-legacy"><strong>5</strong></div>
|
||||
</div>
|
||||
|
||||
-
|
||||
.. raw:: html
|
||||
|
||||
<div class="line">CCD</div>
|
||||
<div class="line">
|
||||
<div class="multiccd-off"><strong>1</strong></div>
|
||||
<div class="multiccd-native"><strong>5</strong></div>
|
||||
<div class="multiccd-legacy"><strong>5</strong></div>
|
||||
</div>
|
||||
|
||||
-
|
||||
.. raw:: html
|
||||
|
||||
<div class="line">CCD</div>
|
||||
<div class="line">
|
||||
<div class="multiccd-off"><strong>1</strong></div>
|
||||
<div class="multiccd-native"><strong>5</strong></div>
|
||||
<div class="multiccd-legacy"><strong>5</strong></div>
|
||||
</div>
|
||||
|
||||
- | SDF
|
||||
| :ref:`sdf_initpoints <option-sdf_initpoints>`
|
||||
* - Box
|
||||
@@ -1825,8 +1894,16 @@ will generate up to 1 contact or with ``multiccd`` up to 4 contacts.
|
||||
-
|
||||
- | primitive
|
||||
| **8**
|
||||
- | CCD
|
||||
| **1**, **4**
|
||||
-
|
||||
.. raw:: html
|
||||
|
||||
<div class="line">CCD</div>
|
||||
<div class="line">
|
||||
<div class="multiccd-off"><strong>1</strong></div>
|
||||
<div class="multiccd-native"><strong>4</strong></div>
|
||||
<div class="multiccd-legacy"><strong>5</strong></div>
|
||||
</div>
|
||||
|
||||
- | SDF
|
||||
| :ref:`sdf_initpoints <option-sdf_initpoints>`
|
||||
* - Mesh
|
||||
@@ -1835,8 +1912,16 @@ will generate up to 1 contact or with ``multiccd`` up to 4 contacts.
|
||||
-
|
||||
-
|
||||
-
|
||||
- | CCD
|
||||
| **1**, **4**
|
||||
-
|
||||
.. raw:: html
|
||||
|
||||
<div class="line">CCD</div>
|
||||
<div class="line">
|
||||
<div class="multiccd-off"><strong>1</strong></div>
|
||||
<div class="multiccd-native"><strong>4</strong></div>
|
||||
<div class="multiccd-legacy"><strong>5</strong></div>
|
||||
</div>
|
||||
|
||||
- | MeshSDF
|
||||
| :ref:`sdf_initpoints <option-sdf_initpoints>`
|
||||
* - SDF
|
||||
@@ -1849,6 +1934,32 @@ will generate up to 1 contact or with ``multiccd`` up to 4 contacts.
|
||||
- | SDF
|
||||
| :ref:`sdf_initpoints <option-sdf_initpoints>`
|
||||
|
||||
.. raw:: html
|
||||
|
||||
<script>
|
||||
const pairwiseToggles = () => {
|
||||
const table = document.querySelector('.table-pairwise');
|
||||
const toggles = [
|
||||
{id: 'nativeccd-checkbox', cls: 'nativeccd-enabled'},
|
||||
{id: 'multiccd-checkbox', cls: 'multiccd-enabled'},
|
||||
{id: 'margin-checkbox', cls: 'margin-enabled'}
|
||||
];
|
||||
|
||||
toggles.forEach(toggle => {
|
||||
const cb = document.getElementById(toggle.id);
|
||||
if (cb.checked) {
|
||||
table.classList.add(toggle.cls);
|
||||
}
|
||||
cb.addEventListener('change', () => {
|
||||
table.classList.toggle(toggle.cls, this.checked);
|
||||
});
|
||||
});
|
||||
};
|
||||
pairwiseToggles();
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
.. _Sleeping:
|
||||
|
||||
Sleeping islands
|
||||
|
||||
@@ -54,6 +54,98 @@ body[data-theme="dark"] table.docutils:not(.mjcf-attributes) {
|
||||
font-size: 85%;
|
||||
}
|
||||
|
||||
.pairwise-toggles {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 1.5em;
|
||||
margin-bottom: 0.75em;
|
||||
}
|
||||
|
||||
.pairwise-toggle-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.5em;
|
||||
}
|
||||
|
||||
.pairwise-switch {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
width: 36px;
|
||||
height: 20px;
|
||||
}
|
||||
|
||||
.pairwise-switch input {
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.pairwise-slider {
|
||||
position: absolute;
|
||||
cursor: pointer;
|
||||
inset: 0;
|
||||
background-color: #ccc;
|
||||
transition: 0.3s;
|
||||
border-radius: 20px;
|
||||
}
|
||||
|
||||
.pairwise-slider:before {
|
||||
content: "";
|
||||
position: absolute;
|
||||
height: 14px;
|
||||
width: 14px;
|
||||
left: 3px;
|
||||
bottom: 3px;
|
||||
background-color: white;
|
||||
transition: 0.3s;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.pairwise-switch input:checked + .pairwise-slider {
|
||||
background-color: var(--secondary-header-color, #123693);
|
||||
}
|
||||
|
||||
.pairwise-switch input:checked + .pairwise-slider:before {
|
||||
transform: translateX(16px);
|
||||
}
|
||||
|
||||
.multiccd-off,
|
||||
.multiccd-native,
|
||||
.multiccd-legacy {
|
||||
display: none;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.multiccd-off {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.multiccd-enabled .multiccd-off {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.multiccd-enabled.nativeccd-enabled:not(.margin-enabled) .multiccd-native {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.multiccd-enabled:not(.nativeccd-enabled) .multiccd-legacy,
|
||||
.multiccd-enabled.nativeccd-enabled.margin-enabled .multiccd-legacy {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.margin-show {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.margin-enabled .margin-hide {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.margin-enabled .margin-show {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
|
||||
.small-centered td, .small-centered th,
|
||||
.table-pairwise td, .table-pairwise th {
|
||||
text-align: center !important;
|
||||
|
||||
@@ -494,8 +494,9 @@ typedef enum mjtDisableBit_ { // disable default feature bitflags
|
||||
mjDSBL_AUTORESET = 1<<16, // automatic reset when numerical issues are detected
|
||||
mjDSBL_NATIVECCD = 1<<17, // native convex collision detection
|
||||
mjDSBL_ISLAND = 1<<18, // constraint island discovery
|
||||
mjDSBL_MULTICCD = 1<<19, // multiple CCD contact points
|
||||
|
||||
mjNDISABLE = 19 // number of disable flags
|
||||
mjNDISABLE = 20 // number of disable flags
|
||||
} mjtDisableBit;
|
||||
typedef enum mjtEnableBit_ { // enable optional feature bitflags
|
||||
mjENBL_OVERRIDE = 1<<0, // override contact parameters
|
||||
@@ -503,10 +504,9 @@ typedef enum mjtEnableBit_ { // enable optional feature bitflags
|
||||
mjENBL_FWDINV = 1<<2, // record solver statistics
|
||||
mjENBL_INVDISCRETE = 1<<3, // discrete-time inverse dynamics
|
||||
// experimental features:
|
||||
mjENBL_MULTICCD = 1<<4, // multi-point convex collision detection
|
||||
mjENBL_SLEEP = 1<<5, // sleeping
|
||||
mjENBL_SLEEP = 1<<4, // sleeping
|
||||
|
||||
mjNENABLE = 6 // number of enable flags
|
||||
mjNENABLE = 5 // number of enable flags
|
||||
} mjtEnableBit;
|
||||
typedef enum mjtJoint_ { // type of degree of freedom
|
||||
mjJNT_FREE = 0, // global position and orientation (quat) (7)
|
||||
@@ -3161,6 +3161,8 @@ int mj_unmountVFS(mjVFS* vfs, const char* filename);
|
||||
int mj_addFileVFS(mjVFS* vfs, const char* directory, const char* filename);
|
||||
int mj_addBufferVFS(mjVFS* vfs, const char* name, const void* buffer, int nbuffer);
|
||||
int mj_deleteFileVFS(mjVFS* vfs, const char* filename);
|
||||
int mj_containsBufferVFS(mjVFS* vfs, const char* name);
|
||||
int mj_containsFileVFS(mjVFS* vfs, const char* directory, const char* filename);
|
||||
void mj_deleteVFS(mjVFS* vfs);
|
||||
size_t mj_getCacheSize(const mjCache* cache);
|
||||
size_t mj_getCacheCapacity(const mjCache* cache);
|
||||
@@ -3272,6 +3274,7 @@ void mj_passive(const mjModel* m, mjData* d);
|
||||
void mj_subtreeVel(const mjModel* m, mjData* d);
|
||||
void mj_rne(const mjModel* m, mjData* d, int flg_acc, mjtNum* result);
|
||||
void mj_rnePostConstraint(const mjModel* m, mjData* d);
|
||||
int mj_maxContact(const mjModel* m, int g1, int g2, int has_margin);
|
||||
void mj_collision(const mjModel* m, mjData* d);
|
||||
void mj_makeConstraint(const mjModel* m, mjData* d);
|
||||
void mj_island(const mjModel* m, mjData* d);
|
||||
|
||||
@@ -1265,8 +1265,6 @@ is available by setting the ``NATIVECCD`` disable flag:
|
||||
The specialized collider generates up to 8 contact points, compared to up to 4 for the convex pipeline, and may improve
|
||||
contact stability for tasks involving box stacking or manipulation.
|
||||
|
||||
.. TODO(taylorhowell): update this section once multiccd is on by default.
|
||||
|
||||
CCD margin
|
||||
----------
|
||||
|
||||
@@ -1283,8 +1281,8 @@ CCD colliders and will raise a ``NotImplementedError`` when calling :func:`mjw.p
|
||||
- Scenario
|
||||
- Workaround
|
||||
* - box-box, box-mesh, mesh-mesh
|
||||
- :ref:`MULTICCD <option-flag-multiccd>` enabled
|
||||
- Set margin to ``0`` or do not enable ``MULTICCD``
|
||||
- :ref:`MULTICCD <option-flag-multiccd>` enabled (on by default)
|
||||
- Set margin to ``0`` or disable ``MULTICCD``
|
||||
* - box-box
|
||||
- :ref:`NATIVECCD <option-flag-nativeccd>` enabled (on by default)
|
||||
- Set margin to ``0`` or disable ``NATIVECCD``
|
||||
|
||||
@@ -29,7 +29,7 @@ This script updates such instances with valid types
|
||||
@dataclasses.dataclass
|
||||
class Option:
|
||||
...
|
||||
timestep: wp.array(dtype=float)
|
||||
timestep: wp.array[float]
|
||||
...
|
||||
"""
|
||||
|
||||
@@ -48,13 +48,13 @@ def replace_array_calls(match):
|
||||
dtype = args[-1]
|
||||
|
||||
if n_args == 2:
|
||||
return f'wp.array(dtype={dtype})'
|
||||
return f'wp.array[{dtype}]'
|
||||
elif n_args == 3:
|
||||
return f'wp.array2d(dtype={dtype})'
|
||||
return f'wp.array2d[{dtype}]'
|
||||
elif n_args == 4:
|
||||
return f'wp.array3d(dtype={dtype})'
|
||||
return f'wp.array3d[{dtype}]'
|
||||
elif n_args == 5:
|
||||
return f'wp.array4d(dtype={dtype})'
|
||||
return f'wp.array4d[{dtype}]'
|
||||
else:
|
||||
return match.group(0)
|
||||
|
||||
|
||||
+5
-4
@@ -1767,10 +1767,11 @@ better visualize and understand the contact configuration and resulting forces.
|
||||
|
||||
a. Improve the geometry of the contacting geoms in order to add more contact points, possibly with non-flat
|
||||
geometry (e.g., bumps), so slippage is prevented by the normal force and not only frictional components.
|
||||
b. If contacts are between flat surfaces, try enabling the :ref:`multiccd<option-flag-multiccd>` flag, which allows
|
||||
the detector to find more contacts than the single contact returned by the convex-convex collider.
|
||||
c. Try enabling the native collision detection pipeline by setting the :ref:`nativeccd<option-flag-nativeccd>` flag,
|
||||
which uses a more accurate and efficient convex collision detection algorithm.
|
||||
b. If contacts are between flat surfaces, make sure that the flag :ref:`multiccd<option-flag-multiccd>` is not
|
||||
disabled (enabled by default), as it allows the detector to find more contacts than the single contact
|
||||
returned by the convex-convex collider.
|
||||
c. Make sure that the flag :ref:`nativeccd<option-flag-nativeccd>` is not disabled (enabled by default),
|
||||
as NativeCCD is a more accurate and efficient convex collision detection algorithm.
|
||||
|
||||
**High-frequency vibration**
|
||||
High-frequency, low-amplitude vibrations are also a real-world problem in many industrial settings, but unlike in
|
||||
|
||||
@@ -116,9 +116,10 @@ target directory.
|
||||
|
||||
**Notes:**
|
||||
|
||||
- When building on Windows, use Visual Studio 2019 or later and make sure Windows SDK version 10.0.22000 or later is
|
||||
installed (see :issue:`862` for more details).
|
||||
- To optimize runtime performance build with ``-DCMAKE_BUILD_TYPE=Release``
|
||||
- To optimize runtime performance build with ``-DCMAKE_BUILD_TYPE=Release``.
|
||||
- When building on Windows with MSVC, use Visual Studio 2019 or later and make sure Windows SDK version 10.0.22000 or
|
||||
later is installed (see :issue:`862` for more details).
|
||||
- We've found that performance on Windows is best when building with Clang, rather than MSVC.
|
||||
|
||||
.. tip::
|
||||
As a reference, a working build configuration can be found in MuJoCo's
|
||||
|
||||
Reference in New Issue
Block a user