decPLM — official codebase for the paper Multi-Quadruped Cooperative Object Transport: Learning Decentralized Pinch-Lift-Move (ICRA 2026).
- Project page: decplm.github.io
- Paper: arXiv:2509.14342
This repository implements decentralized reinforcement learning for teams of quadruped-arm (Unitree Go2 + D1) robots that pinch, lift, and transport a rigid payload using only local sensing and contact—no inter-robot communication or centralized controller. Training uses two robots in Isaac Lab; evaluation supports both the two-robot task and an N-robot play environment to study scaling. The stack extends the DRAIL / Isaac Lab task and training layout under drail_extensions/.
drail_extensions/
├── .vscode/ # VS Code launch configurations (see Example Runs)
├── drail_extensions/
│ ├── core/ # Shared Isaac Lab tasks, MDP utilities, assets
│ ├── research_bikram/ # decPLM tasks, scripts, pretrained checkpoints
drail_learning/ # Learning code (e.g. rsl_rl, rsl_rl_drail)
Git LFS
Larger assets (e.g. .usd models, pretrained .pt checkpoints) use Git LFS.
- Install Git LFS: GitHub: Installing Git LFS
- Initialize in the repo:
git lfs install
- Pull LFS objects:
git lfs pull
Conda environment
-
Run:
./setup_conda_env.sh
You will be prompted for an environment name.
-
Activate it:
conda activate <your_conda_env>
Launch configuration (optional)
VS Code–style launch files can be merged per extension. For example:
./activate_launch.sh coreYou can also open .vscode/launch.json directly. The Example Runs below use the configuration names in that file.
These match .vscode/launch.json: train, eval (2 robots), and eval (N robots).
Option A — VS Code: open Run and Debug, choose a configuration in the dropdown, then start (green play) or F5.
Option B — CLI: from the repository root, pass the configuration name exactly as in launch.json:
./run_launch_config.sh "<configuration name>"Optional second argument: another launch file path, e.g. ./run_launch_config.sh "<name>" .vscode/launch.other.json.
Train
Configuration name:
Train Go2 D1 MARL Box Reach, Touch, Lift and Move
VS Code: select that name in the Run and Debug dropdown, then run.
CLI:
./run_launch_config.sh "Train Go2 D1 MARL Box Reach, Touch, Lift and Move"Training logs to Weights & Biases (
--logger wandb). SetWANDB_USERNAMEas inlaunch.jsonenvand authenticate on first run if prompted.
Eval — 2 robots (play)
Task: Go2-D1-MARL-Box-Reach-Touch-Lift-and-Move-Finetuning-Play-v0.
Configuration name:
Play Go2 D1 MARL Box Reach, Touch, Lift and Move
VS Code: select that name in the Run and Debug dropdown, then run.
CLI:
./run_launch_config.sh "Play Go2 D1 MARL Box Reach, Touch, Lift and Move"The first launch can take a while before the GUI appears.
DISPLAYis set inlaunch.json; change it if your display differs.
Eval — N robots (play)
Task: Go2-D1-MARL-Box-Reach-Touch-Lift-and-Move-Finetuning-N-Robots-Play-v0.
Configuration name:
Play Go2 D1 MARL Box Reach, Touch, Lift and Move (N Robots)
VS Code: select that name in the Run and Debug dropdown, then run.
CLI:
./run_launch_config.sh "Play Go2 D1 MARL Box Reach, Touch, Lift and Move (N Robots)"Same notes as the 2-robot play for startup time and display.
@misc{pandit2025multiquadrupedcooperativeobjecttransport,
title = {Multi-Quadruped Cooperative Object Transport: Learning Decentralized Pinch-Lift-Move},
author = {Pandit, Bikram and Shrestha, Aayam Kumar and Fern, Alan},
year = {2025},
eprint = {2509.14342},
archivePrefix = {arXiv},
primaryClass = {cs.RO},
url = {https://arxiv.org/abs/2509.14342}
}