Import upstream snapshot c19f713c415a699a79d71cd96aa13c3104a05047
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
Docker / build (push) Has been cancelled
docs / build (push) Has been cancelled
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
Docker / build (push) Has been cancelled
docs / build (push) Has been cancelled
Upstream: https://github.com/michaelgillett/mjlab Upstream-Commit: c19f713c415a699a79d71cd96aa13c3104a05047 Upstream-Branch: main
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
.. _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.
|
||||
Reference in New Issue
Block a user