Centralized motion planning algorithms struggle to scale in multi-arm manipulation, where inter-arm coupling and tight workspaces amplify complexity. We introduce MR-STORM, a distributed sampling-based MPC framework that leverages massively parallel GPU sampling for arm control. Our approach integrates inter-arm collision avoidance via plan-sharing and a dynamic priority scheme to maintain task efficiency. We show empirically that MR-STORM outperforms existing baselines in complex simulation environments and that it transfers effectively to physical hardware.
🔊 Recommended to watch with sound.
STORM Decentralized
CuRobo
MR STORM no prioritization (tau=0)
⭐ MR STORM
MR-STORM provides a simulator- and hardware-agnostic mr_storm Python & ROS 2 package.
Run in NVIDIA Isaac Sim, Gazebo, MuJoCo / PyBullet,
Distributed ROS 2, or directly on physical robot hardware.
# Create Conda environment (Python 3.10 for Isaac Sim 4.5 / ROS 2 Humble, or Python 3.11 for Isaac Sim 5.0)
conda create -n mr_storm python=3.10 -y
conda activate mr_storm
# Clone repository & pull LFS robot meshes
git clone https://github.com/RoboWorkshop/rl_for_curobo.git
cd rl_for_curobo
git lfs install && git lfs pull
# Install bundled CuRobo (with MR-STORM GPU DynamicObsCost rollout kernels) + mr_storm package
cd curobo
SETUPTOOLS_SCM_PRETEND_VERSION_FOR_NVIDIA_CUROBO=0.0.0+local pip install -e . --no-build-isolation
cd ..
pip install -e .
Connect directly to Gazebo (Harmonic / Ignition / Classic) via ros2_control or plug into MuJoCo/PyBullet:
# Auto-generate Gazebo ros2_control YAML:
python3 examples/01_gazebo_multi_arm.py \
--print_ros2_control_yaml > controllers.yaml
# Run MR-STORM with Gazebo:
python3 examples/01_gazebo_multi_arm.py \
--fleet_config mr_storm/ros2/config/quad_ur5e_fleet.yaml
Run each arm as an independent decentralized ROS 2 node (on one or multiple PCs/GPUs) sharing horizon plans over /mr_storm/plan_broadcast:
# Launch 4 distributed MR-STORM arm nodes:
ros2 launch mr_storm/ros2/launch/distributed_multi_arm.launch.py \
num_arms:=4
# Send crossing 6-DoF goals & monitor bus:
python3 examples/03_distributed_ros2_goal_sender.py
Built-in real-time SafetySupervisor (step clamping, velocity limits, EMA smoothing, E-Stop), UR RTDE driver, and a 5-line callback wrapper for any robot SDK (Unitree G1, Franka, Kinova):
# Universal Robots (UR5e/UR10e via ur_rtde):
python3 examples/02_real_robot_multi_arm.py \
--mode ur_rtde \
--arm0_ip 192.168.1.101 --arm1_ip 192.168.1.102
Reproduce all IROS 2026 paper benchmarks (MR-STORM O, O-, STORM Decentralized SD, Centralized SC, CuRobo CC, dRRT* D):
# Optional: Install Isaac Sim 4.5 or 5.0 via pip
pip install isaacsim[all,extscache]==4.5.0 \
--extra-index-url https://pypi.nvidia.com
# Run benchmark suite:
python3 projects_root/experiments/core_api/dataset_collector.py
@inproceedings{evron2026mrstorm,
title = {MR-STORM: Scalable Multi-Arm Control By Distributed MPC},
author = {Evron, Dan and Goldsztejn, Elias and Suissa, Dan R. and Brafman, Ronen I.},
booktitle = {IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS)},
year = {2026},
eprint = {2602.10114},
archivePrefix = {arXiv},
primaryClass = {cs.RO},
url = {https://arxiv.org/abs/2602.10114}
}