File size: 6,385 Bytes
2cd9e86 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>JuggleRL: Mastering Ball Juggling with a Quadrotor via Deep Reinforcement Learning</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="color-scheme" content="dark">
<style>
:root{
--bg:#0b1020; --bg2:#0f1630; --fg:#e7eefc; --muted:#9eb2d8; --link:#6cb0ff;
--br:14px; --shadow:0 4px 24px rgba(0,0,0,.35);
}
html,body{margin:0;background:var(--bg);color:var(--fg);font:16px/1.6 system-ui,-apple-system,Segoe UI,Roboto; }
a{color:var(--link);text-decoration:none}
.wrap{max-width:1100px;margin:auto;padding:20px;}
.topbar{position:sticky;top:0;z-index:10;background:var(--bg);
border-bottom:1px solid rgba(255,255,255,.08); padding:16px 20px;display:flex;gap:12px;align-items:center;justify-content:space-between;}
.title{font-weight:800;letter-spacing:.2px}
.pills{display:flex;flex-wrap:wrap;gap:8px}
.pill{padding:6px 10px;border:1px solid rgba(255,255,255,.15);border-radius:999px;color:#cfe3ff}
.pill:hover{border-color:rgba(255,255,255,.35);background:rgba(255,255,255,.06)}
.grid{display:grid;grid-template-columns:1.1fr .9fr;gap:18px}
@media (max-width: 900px){ .grid{grid-template-columns:1fr} }
.card{background:var(--bg2);border:1px solid rgba(255,255,255,.08);border-radius:var(--br);box-shadow:var(--shadow);padding:16px}
.info3{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}
@media (max-width: 900px){ .info3{grid-template-columns:1fr} }
.metric{text-align:center;background:linear-gradient(180deg,rgba(255,255,255,.05),rgba(255,255,255,.02));
border:1px solid rgba(255,255,255,.08);border-radius:var(--br);padding:14px}
.metric .k{font-size:28px;font-weight:800}
.gallery{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
@media (max-width:900px){ .gallery{grid-template-columns:repeat(2,1fr)} }
.gallery img{width:100%;height:200px;object-fit:cover;border-radius:10px;border:1px solid rgba(255,255,255,.08)}
.footer{color:var(--muted);text-align:center;padding:26px 10px}
details{background:var(--bg2);border:1px solid rgba(255,255,255,.08);border-radius:var(--br);padding:12px}
summary{cursor:pointer;font-weight:700}
.heroimg{width:100%;height:380px;object-fit:cover;border-radius:12px;border:1px solid rgba(255,255,255,.08)}
</style>
</head>
<body>
<!-- 顶部导航:保留 arXiv + 三个 GitHub 链接 -->
<div class="topbar">
<div class="title">JuggleRL: Mastering Ball Juggling with a Quadrotor via Deep Reinforcement Learning</div>
<div class="pills">
<a class="pill" href="https://arxiv.org/abs/2509.24892" target="_blank" rel="noopener">📄 arXiv</a>
<a class="pill" href="https://github.com/thu-uav/JuggleRL_train" target="_blank" rel="noopener">Training</a>
<a class="pill" href="https://github.com/thu-uav/JuggleRL_rospack" target="_blank" rel="noopener">ROS Pack</a>
<a class="pill" href="https://github.com/thu-uav/JuggleRL_NatNetSDK" target="_blank" rel="noopener">NatNet SDK</a>
</div>
</div>
<div class="wrap">
<!-- Overview + Hero 图 -->
<div class="grid">
<div class="card">
<h2>Overview</h2>
<p><b>Highlights</b></p>
<ul>
<li><b>Zero-shot sim-to-real</b> deployment (no real data for training)</li>
<li><b>Calibrated dynamics + domain randomization</b> reduce sim-to-real gap</li>
<li><b>Lightweight Communication Protocol (LCP)</b> for low-latency streaming</li>
<li><b>Real-world performance</b>: up to <b>462</b> hits (avg <b>311</b> across 10 trials)</li>
</ul>
<p>This page hosts figures, demo videos, and links to paper & code.</p>
</div>
<div class="card">
<!-- 可放一张系统图:assets/system_overview.png -->
<img class="heroimg" src="assets/system_overview.png" alt="System Diagram / Teaser" onerror="this.style.display='none'">
</div>
</div>
<!-- Links + Metrics -->
<div class="grid" style="margin-top:14px">
<div class="card">
<h3>Project Links</h3>
<ul>
<li><b>Paper:</b> <a href="https://arxiv.org/abs/2509.24892" target="_blank" rel="noopener">arXiv:2509.24892</a></li>
<li><b>Training:</b> <a href="https://github.com/thu-uav/JuggleRL_train" target="_blank" rel="noopener">GitHub</a></li>
<li><b>ROS Pack:</b> <a href="https://github.com/thu-uav/JuggleRL_rospack" target="_blank" rel="noopener">GitHub</a></li>
<li><b>NatNet SDK:</b> <a href="https://github.com/thu-uav/JuggleRL_NatNetSDK" target="_blank" rel="noopener">GitHub</a></li>
</ul>
</div>
<div class="card">
<h3>Key Metrics</h3>
<div class="info3">
<div class="metric"><div class="k">462</div><div>Max real-world hits</div></div>
<div class="metric"><div class="k">311</div><div>Avg hits (10 trials)</div></div>
<div class="metric"><div class="k">0</div><div>Real data for training</div></div>
</div>
</div>
</div>
<!-- Figures 画廊:自动读取 assets/ 下图片(简单:按固定文件名;或手工列出) -->
<div class="card" style="margin-top:14px">
<h3>Figures</h3>
<div class="gallery">
<!-- 你可以按需要增删文件名 -->
<img src="assets/overview.png" alt="Figure 1" onerror="this.style.display='none'">
</div>
</div>
<!-- Bilibili -->
<div class="card" style="margin-top:14px">
<h3>Real-world Video (Bilibili)</h3>
<div style="position:relative;padding-top:56.25%;">
<iframe src="https://player.bilibili.com/player.html?bvid=BV1hKxDzrEw5&autoplay=0"
scrolling="no" frameborder="0" allowfullscreen
style="position:absolute;top:0;left:0;width:100%;height:100%;">
</iframe>
</div>
</div>
<!-- BibTeX -->
<div class="card" style="margin-top:14px">
<details>
<summary>BibTeX</summary>
<pre>
@article{JuggleRL2025,
title = {JuggleRL: Mastering Ball Juggling with a Quadrotor via Deep Reinforcement Learning},
author = {Your Name and Coauthors},
journal = {arXiv preprint arXiv:2509.24892},
year = {2025}
}
</pre>
</details>
</div>
<div class="footer">© 2025 JuggleRL Team · Hosted on Hugging Face Spaces</div>
</div>
</body>
</html>
|