Bio-Inspired Robotics Testbed

BRT bridges robotics and biology with MuJoCo simulation environments of animals. One task implementation runs on CPU with MuJoCo, and on accelerators with MJX or MuJoCo Warp, so you can go from a single interactive rollout to thousands of parallel environments without changing your code.

Two communities, one testbed

For roboticists

Benchmarks for bio-inspired design and control

Animal morphologies are parameterised by plain Python specifications, so the same task can benchmark controllers, morphologies, or both at once. Environments expose standard observation and action spaces, a Gymnasium adapter, and JAX-native batching for large-scale learning and co-design.

For biologists

Robots as a controlled comparative method

Simulated animals let you change one trait at a time, such as arm count, leg proportions, or sensing, and measure the effect on behaviour. That makes hypotheses about behaviour, ecology and evolution testable in ways that are hard or impossible with living animals.

Environments

Each animal comes with a parameterised morphology, arenas, and tasks or an open playground. Open a demo to run the model in your browser.

Echinoderm

Brittle star

A central disk with segmented arms, each segment actuated in and out of plane. Brittle stars move without a fixed front, coordinating many arms through a decentralised nervous system.

  • undirected_locomotion
  • directed_locomotion
  • light_escape
Arachnid

Jumping spider

A cephalothorax, abdomen and eight multi-segment legs. Jumping spiders leap many times their body length with precise aim, combining leg extension with hydraulic pressure and a stabilising dragline.

  • long_jump
  • directed_jump
  • platform_jump
Fish

Seahorse tail

The prehensile tail of a seahorse: vertebrae inside overlapping bony plates, pulled by long HM and short MVM muscles. No task: configure the muscle architecture and drive it with open-loop controls. From Marzougui et al. (2025).

  • tail
Abstract swimmer

Swimmer

An abstract anguilliform swimmer: a planar chain of capsules in a viscous fluid that swims by sending a wave along its body. Its body length, taper and joint stiffness are parameters, and a task rewards swimming head first.

  • head_first_swimming

Quickstart

Install

pip install biorobot

Run an episode on the CPU

import biorobot

env = biorobot.make("brittle_star/undirected_locomotion", backend="mjc")
state = env.reset(0)
while not (state.terminated or state.truncated):
    action = env.action_space.sample()
    state = env.step(state, action)
print(state.reward, state.observations.keys())

Batch thousands of environments with JAX

import jax
import biorobot

num_envs = 1024
# With backend="warp", num_envs sizes MuJoCo Warp's contact buffer, which all environments share.
env = biorobot.make("brittle_star/undirected_locomotion", backend="mjx", num_envs=num_envs)
keys = jax.random.split(jax.random.PRNGKey(0), num_envs)
reset = jax.jit(jax.vmap(env.reset))
step = jax.jit(jax.vmap(env.step))

states = reset(keys)
actions = jax.numpy.zeros((num_envs, env.action_space.shape[0]))
states = step(states, actions)

Backends

Backend Engine Arrays Use it for
mjc MuJoCo (C) NumPy Debugging, interactive rendering, Gymnasium, CPU evolution strategies
mjx MJX, JAX implementation JAX jax.jit / jax.vmap on GPU or TPU
warp MJX with MuJoCo Warp JAX Fast, contact-rich batched simulation on NVIDIA GPUs

The task logic is written once and shared by all three backends. Version 1.0 is a rewrite on native mujoco.MjSpec; if you depend on the old API, pin biorobot==0.4.*.

Contribute

Would you like a model of your favourite animal? Tell us about it through the model request form. Bug reports, new tasks and new animals are welcome as issues and pull requests on GitHub.