======================
Collision Models
======================
This section covers the collision model system in DexRobot MuJoCo, including both full mesh-based collisions and simplified primitive-based collisions.
.. figure:: ../assets/hands_simplified_collision_geom.png
:width: 80%
:align: center
Comparison of full mesh-based (left) and simplified primitive-based (right) collision models.
Collision Model Types
-------------------
Full Mesh-Based Collisions
^^^^^^^^^^^^^^^^^^^^^^^
The default collision model uses the full mesh geometry from the URDF:
- Accurate representation of hand geometry
- Higher computational cost
- Better for visualization and precise contact modeling
- Suitable for non-real-time applications
Simplified Primitive-Based Collisions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The optimized collision model uses primitive shapes:
- Boxes for palm and base
- Capsules for finger segments
- Significantly faster computation
- Suitable for real-time applications
- Maintains essential contact behavior
Configuration
------------
Collision Model Definition
^^^^^^^^^^^^^^^^^^^^^^^
Simplified collision models are defined in YAML format:
.. code-block:: yaml
# Example from dexhand021_right_simplified.yaml
right_hand_base:
type: box
size: [0.0273, 0.05, 0.05]
pos: [-0.0022, 0, 0.11]
r_f_link1_2:
type: capsule
size: [0.0095]
fromto: [0.00, 0, 0, 0.03, 0, -0.002]
Box Parameters
~~~~~~~~~~~~
- ``type: box`` - Specifies a box primitive
- ``size: [x, y, z]`` - Half-lengths in each dimension
- ``pos: [x, y, z]`` - Center position relative to link frame
Capsule Parameters
~~~~~~~~~~~~~~~
- ``type: capsule`` - Specifies a capsule primitive
- ``size: [radius]`` - Radius of the capsule
- ``fromto: [x1, y1, z1, x2, y2, z2]`` - Endpoint coordinates
Usage
-----
Converting with Simplified Collisions
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Use the ``--simplified-collision`` flag with ``convert_hand.py``:
.. code-block:: bash
python scripts/convert_hand.py \
--urdf hand.urdf \
--simplified-collision config/collision_geoms/dexhand021_right_simplified.yaml
Manual Application
^^^^^^^^^^^^^^^
Apply simplified collisions to an existing MJCF:
.. code-block:: python
from dexrobot_mujoco.utils.mjcf_utils import update_geom_collisions
update_geom_collisions(
xml_file_path='model.xml',
collision_yaml_path='collision_config.yaml'
)
Collision Groups
--------------
The collision system uses different groups for visualization and collision:
.. code-block:: xml
Group Assignments
^^^^^^^^^^^^^^
- Group 1: Visual geometries (no collision)
- Group 3: Collision geometries
- Contype/Conaffinity: Contact generation properties
Collision Exclusions
------------------
Some collisions are automatically excluded to prevent self-interference:
Fingertip-Fingertip
^^^^^^^^^^^^^^^^^
Allows finger-finger contact:
.. code-block:: python
fingertip_re = r"[lr]_f_link\d_4" # Matches fingertip links
allowed_collision_pairs = [
(fingertip_re, fingertip_re)
]
Fingertip-Palm
^^^^^^^^^^^^
Allows fingers to contact palm:
.. code-block:: python
palm_re = r"[lr]_p_link\d" # Matches palm links
allowed_collision_pairs.append(
(fingertip_re, palm_re)
)
Implementation
------------
The collision system is implemented in several utility functions:
update_geom_collisions()
^^^^^^^^^^^^^^^^^^^^^^
Updates collision properties based on YAML configuration:
.. code-block:: python
def update_geom_collisions(xml_file_path, collision_yaml_path):
"""Update collision properties of an MJCF XML file.
Args:
xml_file_path: Path to MJCF XML file
collision_yaml_path: Path to collision config YAML
"""
# Load collision specifications
with open(collision_yaml_path, 'r') as f:
collision_specs = yaml.safe_load(f)
# Disable existing collisions
for geom in root.findall(".//body//geom"):
if not collision_props_set(geom):
disable_collision(geom)
# Add collision geometries
for body_name, spec in collision_specs.items():
add_collision_geom(body, spec)
exclude_self_collisions()
^^^^^^^^^^^^^^^^^^^^^^
Excludes specified collision pairs:
.. code-block:: python
def exclude_self_collisions(
xml_file_path,
allowed_collision_pairs=[]
):
"""Exclude self-collisions except allowed pairs.
Args:
xml_file_path: Path to MJCF XML file
allowed_collision_pairs: List of allowed patterns
"""
# Find collision pairs to exclude
pairs = find_collision_pairs(root)
# Filter allowed pairs
pairs = filter_allowed_pairs(
pairs,
allowed_collision_pairs
)
# Add exclusions
add_collision_exclusions(root, pairs)
Performance Considerations
-----------------------
Mesh vs. Primitive Performance
^^^^^^^^^^^^^^^^^^^^^^^^^^
Performance comparison on a typical system:
+----------------------+-----------------+------------------+
| Collision Model | Update Time (ms)| Memory Usage (MB)|
+======================+=================+==================+
| Full Mesh | 0.05 | 500 |
+----------------------+-----------------+------------------+
| Simplified Primitive | 0.02 | 300 |
+----------------------+-----------------+------------------+
Optimization Tips
^^^^^^^^^^^^^^
1. Use simplified collisions for real-time applications
2. Adjust collision margins if needed
3. Consider contact filtering for specific scenarios
4. Balance precision vs. performance based on needs
Troubleshooting
-------------
Common Issues
^^^^^^^^^^^
Missing Collisions
~~~~~~~~~~~~~~~
If collisions aren't working:
1. Check collision group assignments
2. Verify contype/conaffinity settings
3. Review collision exclusions
4. Validate primitive parameters
Unstable Contacts
~~~~~~~~~~~~~~
If experiencing contact instability:
1. Adjust collision margins
2. Check primitive sizes
3. Consider using different primitive types
4. Review solver parameters
Next Steps
---------
After setting up collision models:
- Configure :doc:`actuators`
- Add :doc:`sensors`
- Test with :doc:`examples`