English

JuggleRL: Mastering Ball Juggling with a Quadrotor via Deep Reinforcement Learning

Robotics 2026-01-15 v2

Abstract

Aerial robots interacting with objects must perform precise, contact-rich maneuvers under uncertainty. In this paper, we study the problem of aerial ball juggling using a quadrotor equipped with a racket, a task that demands accurate timing, stable control, and continuous adaptation. We propose JuggleRL, the first reinforcement learning-based system for aerial juggling. It learns closed-loop policies in large-scale simulation using systematic calibration of quadrotor and ball dynamics to reduce the sim-to-real gap. The training incorporates reward shaping to encourage racket-centered hits and sustained juggling, as well as domain randomization over ball position and coefficient of restitution to enhance robustness and transferability. The learned policy outputs mid-level commands executed by a low-level controller and is deployed zero-shot on real hardware, where an enhanced perception module with a lightweight communication protocol reduces delays in high-frequency state estimation and ensures real-time control. Experiments show that JuggleRL achieves an average of 311311 hits over 1010 consecutive trials in the real world, with a maximum of 462462 hits observed, far exceeding a model-based baseline that reaches at most 1414 hits with an average of 3.13.1. Moreover, the policy generalizes to unseen conditions, successfully juggling a lighter 55 g ball with an average of 145.9145.9 hits. This work demonstrates that reinforcement learning can empower aerial robots with robust and stable control in dynamic interaction tasks.

Keywords

Cite

@article{arxiv.2509.24892,
  title  = {JuggleRL: Mastering Ball Juggling with a Quadrotor via Deep Reinforcement Learning},
  author = {Shilong Ji and Yinuo Chen and Chuqi Wang and Jiayu Chen and Ruize Zhang and Feng Gao and Wenhao Tang and Shu'ang Yu and Sirui Xiang and Xinlei Chen and Chao Yu and Yu Wang},
  journal= {arXiv preprint arXiv:2509.24892},
  year   = {2026}
}