Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
7ee9697
Support intvelocity actuators (#271)
AbsoluteQ Aug 13, 2026
380fd2b
Fix control mode selection (#281)
Ortisa Aug 17, 2026
a5df33d
Add a pre-step callback to the simulation (#282)
eholum-nasa Aug 17, 2026
1882da9
[doc] Fix external link (#287)
christophfroehlich Aug 18, 2026
b9edd35
Update Changelog
saikishor Aug 18, 2026
4158aee
0.1.0
saikishor Aug 18, 2026
57fc674
Fix the generate changelog of 0.1.0 (#288)
saikishor Aug 19, 2026
075d133
Fix compilation on MuJoCo 3.12.0 (#290)
saikishor Aug 25, 2026
12ccfa8
Update Changelog
saikishor Aug 25, 2026
d5b1f01
0.1.1
saikishor Aug 25, 2026
bb26c28
Shut down ROS when the MuJoCo UI closes (#285)
Dylan-Gallagher Aug 25, 2026
945556d
Fix plugin parameter namespaces (#291)
scastro-nasa Aug 27, 2026
6d7d6ef
Remove deprecated tinyxml2_vendor dependency (#286)
Dylan-Gallagher Aug 27, 2026
e6a6160
Readd conditional tinyxml2_vendor dependency (#293)
saikishor Aug 27, 2026
7f0aa57
Add world_reset plugin hook and restore eq_active on world reset (#294)
bgill92 Sep 3, 2026
34e07ce
Bump prefix-dev/setup-pixi from 0.10.1 to 0.10.2 (#305)
dependabot[bot] Sep 7, 2026
4fbb5d3
Update Changelog
saikishor Sep 7, 2026
178b1c3
0.1.2
saikishor Sep 7, 2026
06c695a
Use collision-tag meshes/info for collision geoms (primitives, STL/DA…
saikishor Sep 9, 2026
92732a6
visual-only mesh fallback + visual/collision group split, refactors m…
saikishor Sep 9, 2026
61a1659
sets contype/conaffinity=0 on visual-only geoms and grouping (#267)
saikishor Sep 11, 2026
5e7e084
Add support for simulating sensor noise (#307)
saikishor Sep 11, 2026
8c3f99a
sibling links reuse already-decomposed collision meshes instead of re…
saikishor Sep 12, 2026
58f465b
Add FTS Gravity Compensation Plugin (#308)
ndunkelb-nasa Sep 15, 2026
7515da0
Log noise type and value of each of the sensor components (#314)
saikishor Sep 30, 2026
49a4155
Align to default camera at startup (#316)
ndunkelb-nasa Sep 30, 2026
90814eb
Add check-docs workflow (#312)
christophfroehlich Oct 4, 2026
c1bda9e
Require frame_id to identify sensors in FTS grav comp pluggin (#315)
Vedant87 Oct 5, 2026
bf2aac5
Merge upstream/main into impedence-control-support
lgulich Oct 5, 2026
85cfa09
Use mju_warning for full user-geom buffer in simulate patch
lgulich Oct 5, 2026
38235a0
Fix build on newer MuJoCo and ROS Rolling
lgulich Oct 5, 2026
58e74c1
Export tf2_ros dependency from mujoco_ros2_control
lgulich Oct 5, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/docs.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7
- uses: prefix-dev/setup-pixi@v0.10.1
- uses: prefix-dev/setup-pixi@v0.10.2
with:
manifest-path: doc/pixi.toml
- name: Build docs
Expand Down
29 changes: 29 additions & 0 deletions .github/workflows/rolling-check-docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Check Docs - Rolling

on:
workflow_dispatch:
pull_request:
branches:
- main
paths:
- '**.rst'
- '**.md'
- '**.jpg'
- '**.jpeg'
- '**.png'
- '**.svg'
- '**.yml'
- '**.yaml'
- '!.github/**' # exclude yaml files in .github directory
- '.github/workflows/rolling-check-docs.yml'

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
check-docs:
name: Check Docs
uses: ros-controls/control.ros.org/.github/workflows/reusable-sphinx-check-single-version.yml@rolling
with:
MUJOCO_ROS2_CONTROL_PR: ${{ github.ref }}
1 change: 1 addition & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -85,3 +85,4 @@ repos:
hooks:
- id: codespell
exclude: '\.(svg|stl|dae)$|.*pixi.*'
args: ["--ignore-words-list=assertin"]
2 changes: 1 addition & 1 deletion doc/development.rst
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ pixi also provides an interactive shell that sources the installed package envir
ros2 launch mujoco_ros2_control_demos demo.launch.py

For more information on pixi and ROS refer to the documentation or this excellent
`blog post <https://jafarabdi.github.io/blog/2025/ros2-pixi-dev/>`_.
`blog post <https://jafarabdi.github.io/2025/08/23/ros2-pixi-dev/>`_.

Docker Development Workflow
----------------------------
Expand Down
29 changes: 29 additions & 0 deletions mujoco_extensions/mujoco_3d_lidar/CHANGELOG.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Changelog for package mujoco_3d_lidar
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0.1.2 (2026-09-07)
------------------

0.1.1 (2026-08-25)
------------------
* Fix compilation on MuJoCo 3.12.0 (`#290 <https://github.com/pal-robotics-forks/mujoco_ros2_control/issues/290>`_)
* Fix the generate changelog of 0.1.0 (`#288 <https://github.com/pal-robotics-forks/mujoco_ros2_control/issues/288>`_)
* Contributors: Sai Kishor Kothakota

0.1.0 (2026-08-18)
------------------
* Make CI tests more robust (`#239 <https://github.com/ros-controls/mujoco_ros2_control/issues/239>`_)
* Add Plugin for the 3D Lidar Extension (`#207 <https://github.com/ros-controls/mujoco_ros2_control/issues/207>`_)
* Update Pixi packages with pixi.lock (`#223 <https://github.com/ros-controls/mujoco_ros2_control/issues/223>`_)
* Add a 3-D Lidar Extension (`#205 <https://github.com/ros-controls/mujoco_ros2_control/issues/205>`_)
* Contributors: Erik Holum, Sai Kishor Kothakota

0.0.3 (2026-05-01)
------------------

0.0.2 (2026-03-17)
------------------

0.0.1 (2026-02-24)
------------------
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,12 @@

#include <mujoco/mjdata.h>
#include <mujoco/mjmodel.h>
#include <mujoco/mujoco.h> // pulls in whichever exists
#if mjVERSION_HEADER >= 3009000
#include <mujoco/mjtype.h>
#else
#include <mujoco/mjtnum.h>
#endif
#include <mujoco/mjvisualize.h>

namespace mujoco::plugin::lidar
Expand Down
2 changes: 1 addition & 1 deletion mujoco_extensions/mujoco_3d_lidar/package.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<?xml-model href="http://download.ros.org/schema/package_format3.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3">
<name>mujoco_3d_lidar</name>
<version>0.0.3</version>
<version>0.1.2</version>
<description>Plugin for mujoco to use raycasters to simulate lidar</description>
<maintainer email="jodi.s.graf@nasa.gov">Jodi Graf</maintainer>

Expand Down
5 changes: 5 additions & 0 deletions mujoco_extensions/mujoco_3d_lidar/src/3dlidar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,12 @@
#include <mujoco/mjdata.h>
#include <mujoco/mjmodel.h>
#include <mujoco/mjplugin.h>
#include <mujoco/mujoco.h> // pulls in whichever exists
#if mjVERSION_HEADER >= 3009000
#include <mujoco/mjtype.h>
#else
#include <mujoco/mjtnum.h>
#endif
#include <mujoco/mjvisualize.h>
#include <mujoco/mujoco.h>

Expand Down
57 changes: 57 additions & 0 deletions mujoco_ros2_control/CHANGELOG.rst
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,63 @@
Changelog for package mujoco_ros2_control
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

0.1.2 (2026-09-07)
------------------
* Add world_reset plugin hook and restore eq_active on world reset (`#294 <https://github.com/ros-controls/mujoco_ros2_control/issues/294>`_)
* Re-add conditional tinyxml2_vendor dependency (`#293 <https://github.com/ros-controls/mujoco_ros2_control/issues/293>`_)
* Remove deprecated tinyxml2_vendor dependency (`#286 <https://github.com/ros-controls/mujoco_ros2_control/issues/286>`_)
* Shut down ROS when the MuJoCo UI closes (`#285 <https://github.com/ros-controls/mujoco_ros2_control/issues/285>`_)
* Contributors: Bilal Gill, Dylan Gallagher, Erik Holum, Sai Kishor Kothakota

0.1.1 (2026-08-25)
------------------
* Fix the generate changelog of 0.1.0 (`#288 <https://github.com/pal-robotics-forks/mujoco_ros2_control/issues/288>`_)
* Contributors: Sai Kishor Kothakota

0.1.0 (2026-08-18)
------------------
* Add a pre-step callback to the simulation (`#282 <https://github.com/ros-controls/mujoco_ros2_control/issues/282>`_)
* Fix control mode selection (`#281 <https://github.com/ros-controls/mujoco_ros2_control/issues/281>`_)
* Support intvelocity actuators (`#271 <https://github.com/ros-controls/mujoco_ros2_control/issues/271>`_)
* Add base twist plugin for commanding the mobile base (`#254 <https://github.com/ros-controls/mujoco_ros2_control/issues/254>`_)
* Refine reset world overrides functionality (`#263 <https://github.com/ros-controls/mujoco_ros2_control/issues/263>`_)
* Support joint overrides in reset world service (`#256 <https://github.com/ros-controls/mujoco_ros2_control/issues/256>`_)
* Support multiple sets of state interfaces from multiple sensor tags with same name (`#258 <https://github.com/ros-controls/mujoco_ros2_control/issues/258>`_)
* [Fix] Don't overwrite transmission-driven joint states in the direct-copy fallback (`#259 <https://github.com/ros-controls/mujoco_ros2_control/issues/259>`_)
* [doc] Fix undefined label errors (`#260 <https://github.com/ros-controls/mujoco_ros2_control/issues/260>`_)
* Add support for Magnetometer sensor (`#257 <https://github.com/ros-controls/mujoco_ros2_control/issues/257>`_)
* [Feature] modify elements of geom attribute (`#244 <https://github.com/ros-controls/mujoco_ros2_control/issues/244>`_)
* Add missing dependencies (`#250 <https://github.com/ros-controls/mujoco_ros2_control/issues/250>`_)
* [CI] Fix dependency declarations for bloom (`#226 <https://github.com/ros-controls/mujoco_ros2_control/issues/226>`_)
* Fix transmissions integration working with multiple actuators (`#241 <https://github.com/ros-controls/mujoco_ros2_control/issues/241>`_)
* Add service to set the free joint body state (`#233 <https://github.com/ros-controls/mujoco_ros2_control/issues/233>`_)
* Fix links in interface docs, use auto label generator like the upstream (`#238 <https://github.com/ros-controls/mujoco_ros2_control/issues/238>`_)
* Fix state passed into pose sensors (`#231 <https://github.com/ros-controls/mujoco_ros2_control/issues/231>`_)
* Fix controller manager rate collapse by decoupling control and physics locks (`#224 <https://github.com/ros-controls/mujoco_ros2_control/issues/224>`_)
* Use updated ament_index_cpp interfaces, re-add rolling (`#229 <https://github.com/ros-controls/mujoco_ros2_control/issues/229>`_)
* Add a 3-D Lidar Extension (`#205 <https://github.com/ros-controls/mujoco_ros2_control/issues/205>`_)
* Add support for "site" transmission type (`#154 <https://github.com/ros-controls/mujoco_ros2_control/issues/154>`_)
* Add support for pose sensors (`#220 <https://github.com/ros-controls/mujoco_ros2_control/issues/220>`_)
* Fix deprecations in ament_index_cpp (`#145 <https://github.com/ros-controls/mujoco_ros2_control/issues/145>`_)
* Fix race condition on sim-display overlay text (`#222 <https://github.com/ros-controls/mujoco_ros2_control/issues/222>`_)
* Display the sim real time factor on the native viewer (`#189 <https://github.com/ros-controls/mujoco_ros2_control/issues/189>`_)
* Refactor Rangefinder base Lidar as a Plugin (`#214 <https://github.com/ros-controls/mujoco_ros2_control/issues/214>`_)
* Refactor RGB-D Cameras to a Plugin (`#211 <https://github.com/ros-controls/mujoco_ros2_control/issues/211>`_)
* Add 'lyrical' to ros_distro matrix in CI workflow (`#213 <https://github.com/ros-controls/mujoco_ros2_control/issues/213>`_)
* Fix scipy for openblas missing dependency (`#212 <https://github.com/ros-controls/mujoco_ros2_control/issues/212>`_)
* Isolate flakey functional tests and update pixi (`#204 <https://github.com/ros-controls/mujoco_ros2_control/issues/204>`_)
* Support/cameras rendering/headless (`#197 <https://github.com/ros-controls/mujoco_ros2_control/issues/197>`_)
* Fix glfw initialization on headless run (`#200 <https://github.com/ros-controls/mujoco_ros2_control/issues/200>`_)
* Add changes for mujoco vendor bump (`#202 <https://github.com/ros-controls/mujoco_ros2_control/issues/202>`_)
* Control and plugin data input cleanup (`#191 <https://github.com/ros-controls/mujoco_ros2_control/issues/191>`_)
* Migrate documentation to rst format for control.ros.org (`#188 <https://github.com/ros-controls/mujoco_ros2_control/issues/188>`_)
* Refactor the core mujoco simulation to be in its own container (`#175 <https://github.com/ros-controls/mujoco_ros2_control/issues/175>`_)
* Handle topic model loading failures with nullptr instead of exit (`#183 <https://github.com/ros-controls/mujoco_ros2_control/issues/183>`_)
* Improve LiDAR validation in URDF-to-MJCF conversion (`#182 <https://github.com/ros-controls/mujoco_ros2_control/issues/182>`_)
* Fix Sphinx xref_missing reference (`#186 <https://github.com/ros-controls/mujoco_ros2_control/issues/186>`_)
* Handle duplicate mesh file names in the conversion tool (`#171 <https://github.com/ros-controls/mujoco_ros2_control/issues/171>`_)
* Contributors: Christian Rauch, Christoph Fröhlich, Erik Holum, Julia Jia, Lang Qinglin, Marq Rasmussen, Ortisa, Sai Kishor Kothakota, Sebastian Castro, Tianlin Zhang, Daniel Costanzi, msavchen-nasa

0.0.3 (2026-05-01)
------------------
* Add more useful plugins for the mujoco_ros2_control (`#165 <https://github.com/ros-controls/mujoco_ros2_control/issues/165>`_)
Expand Down
1 change: 1 addition & 0 deletions mujoco_ros2_control/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,7 @@ ament_export_dependencies(
mujoco_ros2_control_plugins
pluginlib
control_toolbox
tf2_ros
Eigen3
mujoco_vendor
)
Expand Down
78 changes: 69 additions & 9 deletions mujoco_ros2_control/docs/hardware_interface.rst
Original file line number Diff line number Diff line change
Expand Up @@ -115,20 +115,28 @@ Maps to the following ``ros2_control`` hardware interface:
* - Command Interface
- MuJoCo ``position``
- MuJoCo ``velocity``
- MuJoCo ``intvelocity``
- MuJoCo ``motor``, ``general``, etc.
* - **position**
- Native support
- Supported using PIDs
- Supported using PIDs
- Supported using PIDs
* - **velocity**
- Not supported
- Native support
- Native support
- Supported using PIDs
* - **effort**
- Not supported
- Not supported
- Not supported
- Native support

MuJoCo's ``intvelocity`` actuator integrates its ``ctrl`` input into an internal position setpoint. The input itself has
velocity semantics, so it maps natively to a ros2_control ``velocity`` command interface without changing the actuator's
integrated-velocity dynamics.

.. note::

The ``torque`` and ``force`` command/state interfaces are semantically equivalent to ``effort`` and map to the same underlying data in the sim.
Expand Down Expand Up @@ -170,13 +178,15 @@ MuJoCo does not model complete FTS and IMUs natively, so we combine supported MJ
Force-Torque Sensors
~~~~~~~~~~~~~~~~~~~~

Model ``force`` and ``torque`` sensors separately in the MJCF, suffixed with ``_force`` and ``_torque``:
Model ``force`` and ``torque`` sensors separately in the MJCF, suffixed with ``_force`` and ``_torque``.
Each optionally takes a ``noise`` attribute (standard deviation, in N / N*m) to add zero-mean Gaussian noise
to its readings, see :ref:`Sensor Noise <sensor_noise>` below:

.. code-block:: xml

<sensor>
<force name="fts_sensor_force" site="ft_frame"/>
<torque name="fts_sensor_torque" site="ft_frame"/>
<force name="fts_sensor_force" site="ft_frame" noise="0.0"/>
<torque name="fts_sensor_torque" site="ft_frame" noise="0.0"/>
</sensor>

Map them to a single ``ros2_control`` sensor:
Expand All @@ -201,14 +211,16 @@ Map them to a single ``ros2_control`` sensor:
IMU
~~~

Simulate a ``framequat``, ``gyro``, and ``accelerometer`` as a single IMU:
Simulate a ``framequat``, ``gyro``, and ``accelerometer`` as a single IMU. Each optionally takes a ``noise``
attribute (standard deviation) to add zero-mean Gaussian noise to its readings, see
:ref:`Sensor Noise <sensor_noise>` below:

.. code-block:: xml

<sensor>
<framequat name="imu_sensor_quat" objtype="site" objname="imu_sensor"/>
<gyro name="imu_sensor_gyro" site="imu_sensor"/>
<accelerometer name="imu_sensor_accel" site="imu_sensor"/>
<framequat name="imu_sensor_quat" objtype="site" objname="imu_sensor" noise="0.0"/>
<gyro name="imu_sensor_gyro" site="imu_sensor" noise="0.0"/>
<accelerometer name="imu_sensor_accel" site="imu_sensor" noise="0.0"/>
</sensor>

Map to the corresponding ``ros2_control`` sensor:
Expand Down Expand Up @@ -240,12 +252,13 @@ These sensor state interfaces work out of the box with the standard ROS 2 broadc
Magnetometer
~~~~~~~~~~~~

Model a MuJoCo ``magnetometer`` sensor in the MJCF:
Model a MuJoCo ``magnetometer`` sensor in the MJCF. It optionally takes a ``noise`` attribute (standard
deviation) to add zero-mean Gaussian noise to its readings, see :ref:`Sensor Noise <sensor_noise>` below:

.. code-block:: xml

<sensor>
<magnetometer name="magnetometer_sensor" site="imu_sensor"/>
<magnetometer name="magnetometer_sensor" site="imu_sensor" noise="0.0"/>
</sensor>

Map it to the corresponding ``ros2_control`` sensor:
Expand All @@ -261,6 +274,53 @@ Map it to the corresponding ``ros2_control`` sensor:
<state_interface name="magnetic_field.z"/>
</sensor>

.. _sensor_noise:

Sensor Noise
~~~~~~~~~~~~

Every MJCF sensor element used above (``force``, ``torque``, ``framequat``, ``gyro``, ``accelerometer``,
``framepos``, ``magnetometer``) accepts MuJoCo's native ``noise`` attribute: the standard deviation, in the
sensor's native units, of the noise added to its reading. It defaults to ``0`` (no noise). Noise magnitude is
entirely driven by the MJCF, e.g.:

.. code-block:: xml

<sensor>
<force name="fts_sensor_force" site="ft_frame" noise="0.5"/>
<torque name="fts_sensor_torque" site="ft_frame" noise="0.05"/>
</sensor>

.. note::

MuJoCo compiles ``noise`` into ``mjModel::sensor_noise`` but does not apply it itself (``mj_step`` leaves
``sensordata`` noise-free) — it's normally left for tools like the ``simulate`` GUI to apply for display.
This hardware interface applies it on every ``read()``, using its own RNG per ``ros2_control`` sensor
(seeded from ``std::random_device``, so the noise sequence differs between runs; there is no seed
parameter).

MJCF has no concept of noise *shape* though — ``noise`` only ever means "standard deviation of zero-mean
noise". Choose the shape with the ``ros2_control`` ``noise_distribution`` parameter, applying to every field
of that sensor:

.. code-block:: xml

<sensor name="fts_sensor">
<param name="mujoco_type">fts</param>
<param name="mujoco_sensor_name">fts_sensor</param>
<!-- "gaussian" (default) or "uniform" -->
<param name="noise_distribution">gaussian</param>
...
</sensor>

``uniform`` draws from ``[-stddev*sqrt(3), stddev*sqrt(3)]``, so its actual standard deviation still matches
the configured MJCF ``noise`` value — switching distributions doesn't change the noise magnitude, only its
shape (bounded vs. unbounded tails).

For an IMU, the configured ``noise`` values are also surfaced as the diagonal of that field's (previously
always-zero) covariance state interfaces (e.g. ``orientation_covariance.0``), for controllers that consume a
covariance estimate.

.. warning::

Cameras and lidar sensors are no longer supported in the base interface, they are now provided as ``mujoco_ros2_control_plugins``.
Expand Down
47 changes: 42 additions & 5 deletions mujoco_ros2_control/docs/tools.rst
Original file line number Diff line number Diff line change
Expand Up @@ -128,11 +128,48 @@ Rough outline of the automated conversion process
Duplicate mesh files will have an ``_N`` appended to them to avoid conflicts in the output ``assets`` folder.
For instance, if running multiple types of UR robots in one sim, there will be multiple ``shoulder.dae`` files.

- Reads absolute filepaths of all meshes and converts either ``.dae`` or ``.stl`` to ``.obj`` using trimesh.

- Puts all meshes into an ``assets/`` folder under ``mjcf_data/`` relative to current working dir.
- Modifies filepaths again in URDF to point to the ``assets/`` folder.
- Decomposes large meshes into multiple components to ensure convex hulls.
- Reads absolute filepaths of all meshes (from both ``<visual>`` and ``<collision>`` tags) and
materializes them into an ``assets/`` folder under ``mjcf_data/`` relative to the current
working dir, rewriting the URDF mesh paths to point there.

- Handles visual and collision geometry independently:

- **Visual** geometry is used purely for rendering (the ``visual`` class). Visual meshes are
plain references - ``.stl``/``.obj`` are kept as-is and only ``.dae`` is converted to ``.obj``
(MuJoCo cannot load DAE). They live under ``assets/visual/`` and are **never decomposed**; their
color is applied as the geom's ``rgba``.
- **Collision** geometry drives physics (the ``collision`` class). Collision *primitives*
(box/sphere/cylinder/capsule) are used directly. Collision *meshes* are also used directly
(as a single whole-mesh collision geom) **unless** their link is named in a ``decompose_mesh``
input, in which case they are convex-decomposed with obj2mjcf (coacd) under
``assets/decomposed/`` at the requested threshold. So decomposition is opt-in per link.
- When a link defines no ``<collision>``, one is synthesized from its ``<visual>`` so the visual
mesh is reused as the collision shape. This synthesis happens at the URDF level, so it stays
correct per link even when MuJoCo fuses fixed-jointed bodies together. A mesh shared by a visual
and a collision is converted once and reused for both (and, if that link requests decomposition,
the whole mesh renders while its decomposed pieces collide).
- Both kinds of geom get explicit attributes written directly onto them, so visual/collision
separation does not depend on a user-supplied ``<default class="...">`` block:

- **Visual** geoms (``class="visual"``) are render-only: they never collide and keep
their own material or ``rgba``.
- **Collision** geoms (``class="collision"``), i.e. primitives and whole meshes, do the
colliding and are tinted with the ``bright_orange`` material so they are easy to spot in
the viewer by toggling their group. The material is added to the ``<asset>`` automatically
when not already defined (an existing definition, e.g. from ``mujoco_inputs``, is left
untouched).
- **Decomposed collision** pieces (``class="decomposed_collision"``) collide like any other
collision geom but live in their own viewer group, so the convex decomposition can be
toggled independently of the other collisions. They are not tinted: they keep obj2mjcf's
per-piece colors so the individual convex hulls stay distinguishable.

- Handles visual and collision geometry independently:

- The ``<visual>`` geometry is used purely for rendering (the ``visual`` class).
- The ``<collision>`` geometry drives physics (the ``collision`` class). When a link defines no
``<collision>``, a collision is synthesized from its ``<visual>`` so the visual mesh is reused
as the collision shape (the previous behaviour). This synthesis happens at the URDF level, so it
stays correct per link even when MuJoCo fuses fixed-jointed bodies together.

- Publishes the new formatted robot description XML file that can be used for conversion.
- Converts the new robot description URDF file.
Expand Down
Loading
Loading