dm_control: Software and Tasks for Continuous Control


The dm_control software package is a collection of Python libraries and task suites for reinforcement learning agents in an articulated-body simulation. A MuJoCo wrapper provides convenient bindings to functions and data structures. The PyMJCF and Composer libraries enable procedural model manipulation and task authoring. The Control Suite is a fixed set of tasks with standardised structure, intended to serve as performance benchmarks. The Locomotion framework provides high-level abstractions and examples of locomotion tasks. A set of configurable manipulation tasks with a robot arm and snap-together bricks is also included.

dm_control is publicly available at

Authors' Notes


A public colab notebook with a tutorial for dm_control software is available here.

  • An autogenerated MuJoCo Python wrapper provides full access to the underlying engine.
  • PyMJCF is a Document Object Model, wherein a hierarchy of Python Entity objects corresponds to MuJoCo model elements. 
  • Composer is the high-level “game engine” which streamlines the composing of Entities into scenes and the defining observations, rewards, terminations and general game logic. 
  • The Locomotion framework introduces several abstract Composer entities such as the Arena and Walker, facilitating locomotion-like tasks.
  • The Control Suite, including a new quadruped and dog environment.
  • Several locomotion tasks, including soccer.
  • Single arm robotic manipulation tasks using snap-together bricks.


Named Indexing

Exploiting MuJoCo’s support of names for all model elements, we allow strings to index and slice into arrays. So instead of writing:

fingertip_height =[7, 2]

...using obscure, fragile numerical indexing, you can write:

fingertip_height =['fingertip', 'z']

leading to a much more robust, readable codebase.


The PyMJCF library creates a Python object hierarchy with 1 : 1 correspondence to a MuJoCo model. It introduces the attach() method which allows models to be attached to one another. For example, in our tutorial we create procedural multi-legged creatures by attaching legs to bodies and creatures to the scene.

PyMJCF "creatures"


Composer is the “game engine“ framework, which defines a particular order of runtime function calls, and abstracts the affordances of reward, termination and observation. These abstractions allowed us to create useful submodules:

composer.Observable: An abstract observation wrapper which can add noise, delays, buffering and filtering to any sensor.

composer.Variation: A set of tools for randomising simulation quantities, allowing for agent robustification and sim-to-real via model variation.

Diagram showing the life-cycle of Composer callbacks. Rounded rectangles represent callbacks that Tasks and Entities may implement. Blue rectangles represent built-in Composer operations.

The Locomotion framework introduced the abstractions:

Walker: A controllable entity with common locomotion-related methods, like projection of vectors into an egocentric frame.

Arena: A self-scaling randomized scene, in which the walker can be placed and given a task to perform.

For example, using just 4 function calls, we can instantiate a humanoid walker, a WallsCorridor arena and combine them in a RunThroughCorridor task.

CMU Humanoid solving the RunThroughCorridor task

New Control Suite domains 


      • A generic quadruped domain with a passively stable body.
      • Several pure locomotion tasks (e.g. walk, run).
      • An escape task requiring rough terrain navigation.
      • A fetch task requiring ball dribbling.


1 mins


  • An elaborate model based on a skeleton commissioned from leo3Dmodels.
  • A challenging ball-fetching task that requires precision grasping with the mouth.


1 mins


A fast-paced montage of dm_control based tasks from DeepMind:


2 mins