Joint-Space Empowerment for Dexterous Coordination in Tendon-Driven Hands

This repository contains the official trained policies for:

Joint-Space Empowerment for Dexterous Coordination in Tendon-Driven Hands
James Heald, Vittorio Caggiano, Vikash Kumar, Maneesh Sahani
ICML 2026 (Spotlight)
πŸ“œ Paper | πŸ’» Code | 🌐 Project Page


πŸ“‚ Repository Structure

The files are organized by task environment and training seed:

joint-space-empowerment
β”œβ”€β”€ Adroit
β”‚   β”œβ”€β”€ BaodingBalls
β”‚   β”‚   β”œβ”€β”€ seed_0
β”‚   β”‚   β”‚   β”œβ”€β”€ rl_model_10000000_steps.zip                    # Trained model
β”‚   β”‚   β”‚   └── rl_model_vecnormalize_10000000_steps.pkl       # Observation normalization statistics
β”‚   β”‚   β”œβ”€β”€ seed_1  …  seed_4
β”‚   β”œβ”€β”€ DieReorient
β”‚   β”‚   └── ...
β”‚   β”œβ”€β”€ KeyTurn
β”‚   β”‚   └── ...
β”‚   └── PenTwirl
β”‚       └── ...
β”œβ”€β”€ MyoHand
β”‚   β”œβ”€β”€ BaodingBalls
β”‚   β”‚   └── ...
β”‚   β”œβ”€β”€ DieReorient
β”‚   β”‚   └── ...
β”‚   β”œβ”€β”€ KeyTurn
β”‚   β”‚   └── ...
β”‚   β”œβ”€β”€ PenTwirl
β”‚   β”‚   └── ...
β”‚   β”œβ”€β”€ Reorient100
β”‚   β”‚   β”œβ”€β”€ Pretraining_Play
β”‚   β”‚   β”‚   β”œβ”€β”€ seed_0
β”‚   β”‚   β”‚   β”‚   β”œβ”€β”€ rl_model_replay_buffer_1000000_steps.pkl   # Replay buffer
β”‚   β”‚   β”‚   β”‚   └── rl_model_vecnormalize_1000000_steps.pkl
β”‚   β”‚   β”‚   β”œβ”€β”€ seed_1  …  seed_4
β”‚   β”‚   └── Training
β”‚   β”‚       └── ...
β”‚   └── Reorient8-sparse
β”‚       └── ...
└── README.md

Loading Example

Policies were trained using Stable-Baselines3 with observation normalization.

from huggingface_hub import hf_hub_download
from myosuite.utils import gym
from src.agents.josepi.sac import SAC as JoSEPi
from stable_baselines3.common.vec_env import DummyVecEnv, VecNormalize

REPO_ID = "jamesheald/joint-space-empowerment"
SUBFOLDER = "MyoHand/BaodingBalls/seed_0"
MODEL_FILE = "rl_model_10000000_steps.zip"
STATS_FILE = "rl_model_vecnormalize_10000000_steps.pkl"

# 1. Download SB3 zip model and VecNormalize pickle stats
model_path = hf_hub_download(repo_id=REPO_ID, filename=MODEL_FILE, subfolder=SUBFOLDER)
stats_path = hf_hub_download(repo_id=REPO_ID, filename=STATS_FILE, subfolder=SUBFOLDER)

# 2. Reconstruct base vectorized environment
raw_env = DummyVecEnv([lambda: gym.make("CustomMyoChallengeBaodingP1-v1", normalize_act=True)])

# 3. Apply normalization stats and freeze updating
env = VecNormalize.load(stats_path, raw_env)
env.training = False     # Freeze running mean/var statistics
env.norm_reward = False  # Return unnormalized environment rewards

# 4. Load SB3 policy
model = JoSEPi.load(model_path, env=env)

# 5. Run inference
obs = env.reset()
while True:
    action, _ = model.predict(obs, deterministic=True)
    obs, reward, done, info = env.step(action)
    if done[0]:
        break
Downloads last month
6,513
Video Preview
loading