mjlab/docs/source/commands.rst
Upstream Snapshot 32a241c28f
Some checks failed
nightly / Test against latest dependencies (py3.10) (push) Has been cancelled
nightly / Test against latest dependencies (py3.13) (push) Has been cancelled
tests / tests (3.13, locked) (push) Has been cancelled
tests / tests (3.13, unlocked) (push) Has been cancelled
tests / pyright (3.10) (push) Has been cancelled
tests / lint-format (push) Has been cancelled
tests / tests (3.10, locked) (push) Has been cancelled
tests / tests (3.11, locked) (push) Has been cancelled
tests / tests (3.12, locked) (push) Has been cancelled
tests / pyright (3.11) (push) Has been cancelled
tests / pyright (3.12) (push) Has been cancelled
tests / pyright (3.13) (push) Has been cancelled
tests / ty-check (3.10) (push) Has been cancelled
tests / ty-check (3.11) (push) Has been cancelled
tests / ty-check (3.12) (push) Has been cancelled
tests / ty-check (3.13) (push) Has been cancelled
tests / stubs (push) Has been cancelled
tests / smoke-test (push) Has been cancelled
Docker / check_paths (push) Has been cancelled
docs / build (push) Has been cancelled
Docker / build (push) Has been cancelled
Import upstream snapshot c19f713c415a699a79d71cd96aa13c3104a05047
Upstream: https://github.com/michaelgillett/mjlab
Upstream-Commit: c19f713c415a699a79d71cd96aa13c3104a05047
Upstream-Branch: main
2026-08-28 15:42:17 +08:00

124 lines
4.6 KiB
ReStructuredText

.. _commands:
Commands
========
Commands specify what the policy should achieve at each moment: a target
velocity, a reference trajectory, a goal position. The command manager
generates these signals, resamples them at configurable intervals, and
passes them to the policy through the observation system.
Registration
------------
Commands are registered in ``ManagerBasedRlEnvCfg`` as a dictionary
mapping string names to ``CommandTermCfg`` instances. Unlike the
function-based terms used by other managers, every command term is a
class that inherits from ``CommandTerm``.
The ``resampling_time_range`` field controls how often the command
changes. After each resample the term draws a new timer value uniformly
from the given ``(min, max)`` range in seconds. Commands are also
resampled unconditionally on every episode reset.
.. code-block:: python
commands = {
"twist": UniformVelocityCommandCfg(
entity_name="robot",
resampling_time_range=(3.0, 8.0),
ranges=UniformVelocityCommandCfg.Ranges(
lin_vel_x=(-1.0, 1.0),
lin_vel_y=(-1.0, 1.0),
ang_vel_z=(-0.5, 0.5),
),
),
}
The ``generated_commands`` observation function reads the current
command tensor by name and passes it to the policy:
.. code-block:: python
ObservationTermCfg(
func=mdp.generated_commands,
params={"command_name": "twist"},
)
If the environment has no commands, the manager no-ops all operations
and returns empty tensors. There is no special handling required.
Included command terms
----------------------
Each task ships with its own command terms tailored to its objective.
.. list-table::
:header-rows: 1
:widths: 28 72
* - Term
- Description
* - ``UniformVelocityCommand``
- Generates planar velocity commands ``[v_x, v_y, omega_z]``
sampled uniformly from configurable ranges. Supports a standing
mode (fraction of environments receive zero velocity) and a
heading mode (yaw rate replaced by a proportional controller
tracking a sampled heading angle). Used by the velocity task.
* - ``LiftingCommand``
- Generates a 3D target position for a manipulated object.
Supports fixed and dynamic difficulty modes. Tracks metrics
including position error and episode success rate. Used by the
manipulation task.
* - ``MotionCommand``
- Streams reference joint positions, velocities, and body poses
from a pre-recorded ``.npz`` motion clip. Supports three
start-frame sampling modes: ``"start"`` (always frame 0),
``"uniform"`` (random), and ``"adaptive"`` (biased toward
difficult regions). At reset the robot is initialized from the
sampled frame with optional perturbations. Used by the tracking
task.
Each term can render debug visualizations in the interactive viewer
when ``debug_vis=True`` is set in the configuration. The image below
shows the ghost visualization from ``MotionCommand``, which renders a
translucent copy of the robot at the reference pose alongside the
actual robot.
.. figure:: _static/ghost_visualization.png
:align: center
:width: 100%
Viser visualization of the commanded reference motion for the G1 tracking task.
Writing custom command terms
-----------------------------
A custom command term is a class inheriting from ``CommandTerm`` paired
with a configuration dataclass inheriting from ``CommandTermCfg``. The
term must implement four methods: ``_resample_command(env_ids)`` to
sample new goals, ``_update_command(env_ids)`` for per-step updates,
``_update_metrics()`` for logging, and a ``command`` property returning
the current goal tensor. The base class manages the resampling timer
and reset logic automatically.
``_update_command`` is called in two situations. On every environment
step it receives ``env_ids=None``, meaning update all environments.
After a reset it is called again with the ids of the environments that
were just reset, so their command state is brought up to date before
observations are computed.
The distinction matters when your update advances state, such as
incrementing a frame index into a reference motion. Apply such advances
only to ``env_ids`` (all environments when ``None``); otherwise
resetting a few environments would also advance every other one. Updates
that simply recompute values from the current simulation state, like a
heading error, give the same result no matter how often they run and can
safely ignore ``env_ids``.
The configuration must implement a ``build(env)`` method that
constructs the paired term instance.