Skip to content

Commit 60d0cb7

Browse files
update
1 parent e5701a3 commit 60d0cb7

File tree

2 files changed

+144
-26
lines changed

2 files changed

+144
-26
lines changed

assets/js/main.js

Lines changed: 103 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,10 @@ function drawBarChartPerBar(cfg){
127127
maxV = isPercentAxis ? 100 : 10;
128128
}
129129

130+
// Animation support
131+
if(!canvas._animProgress) canvas._animProgress = 0;
132+
const animProgress = canvas._animProgress;
133+
130134
ctx.clearRect(0,0,W,H);
131135

132136
const ticks = cfg.ticks || 5;
@@ -152,7 +156,8 @@ function drawBarChartPerBar(cfg){
152156

153157
for(let i=0;i<n;i++){
154158
const v = values[i];
155-
const bh = (v/maxV)*plotH;
159+
const bhFull = (v/maxV)*plotH;
160+
const bh = bhFull * animProgress; // Apply animation progress
156161
const x = pad.l + i*groupW + (groupW-barW)/2;
157162
const y = pad.t + plotH - bh;
158163

@@ -232,6 +237,10 @@ function drawGroupedBarChart(cfg){
232237
maxV = isPercentAxis ? 100 : 10;
233238
}
234239

240+
// Animation support
241+
if(!canvas._animProgress) canvas._animProgress = 0;
242+
const animProgress = canvas._animProgress;
243+
235244
ctx.clearRect(0,0,W,H);
236245

237246
const ticks = cfg.ticks || 5;
@@ -261,7 +270,8 @@ function drawGroupedBarChart(cfg){
261270
for(let j=0;j<m;j++){
262271
const s = series[j];
263272
const v = s.values[i];
264-
const bh = (v/maxV)*plotH;
273+
const bhFull = (v/maxV)*plotH;
274+
const bh = bhFull * animProgress; // Apply animation progress
265275
const x = gx + gap + j*barW;
266276
const y = pad.t + plotH - bh;
267277
ctx.fillStyle=s.color;
@@ -349,37 +359,61 @@ function setupCharts(){
349359
if(!data) continue;
350360
const labels = data.methods.map(simplifyMethod);
351361

352-
let values, yFmt, title, tipLabel;
362+
let values, yFmt, tipLabel, htmlTitle;
353363
if(metric==="succ"){
354364
values = data.succ.slice();
355365
yFmt = (v)=>v.toFixed(0)+"%";
356-
title = `${task}: Success (%)`;
366+
htmlTitle = `${task}: Success (%)`;
357367
tipLabel = "Success:";
358368
}else{
359369
values = data.score.slice();
360370
yFmt = (v)=>v.toFixed(2);
361-
title = `${task}: Score`;
371+
htmlTitle = `${task}: Score`;
362372
tipLabel = "Score:";
363373
}
364374

375+
// Update HTML title (h4 above canvas)
376+
const canvasId = TASK_CANVAS[task].replace('#', '');
377+
const canvasEl = document.getElementById(canvasId);
378+
if(canvasEl){
379+
// Find parent div, then find the h4 sibling before canvas-wrap
380+
const parentDiv = canvasEl.closest('.canvas-wrap').parentElement;
381+
const h4 = parentDiv.querySelector('h4');
382+
if(h4){
383+
h4.textContent = htmlTitle;
384+
}
385+
}
386+
365387
const outlineIdx = labels.findIndex(x=>x.includes("RISE"));
366388
const colors = labels.map(m=> m.includes("RISE") ? "rgba(91,124,250,.88)" : "rgba(120,140,170,.55)");
367389
const chartMax = (metric==="succ") ? 100 : null;
368-
drawBarChartPerBar({canvas: TASK_CANVAS[task], labels, values, colors, outlineIdx, yFmt, title, tipLabel, max: chartMax});
390+
// Remove 'title' parameter to hide chart internal title
391+
drawBarChartPerBar({canvas: TASK_CANVAS[task], labels, values, colors, outlineIdx, yFmt, tipLabel, max: chartMax});
369392
}
370393
}
371394

395+
// Initialize charts with progress 0 (invisible bars)
396+
for(const task of TASKS){
397+
const canvasEl = q(TASK_CANVAS[task]);
398+
if(canvasEl) canvasEl._animProgress = 0;
399+
}
400+
const ablOffline = q("#ablationOffline");
401+
const ablOnline = q("#ablationOnline");
402+
if(ablOffline) ablOffline._animProgress = 0;
403+
if(ablOnline) ablOnline._animProgress = 0;
404+
372405
metricSel.onchange = renderMainAll;
373406
renderMainAll();
374-
407+
408+
// Store redraw functions
375409
const r1 = drawGroupedBarChart({
376410
canvas:"#ablationOffline",
377-
title:"Ablation: Offline data ratio",
411+
// title removed - now in HTML h4
378412
labels: C.offline_ratio.ratio.map(r=>`ratio ${r}`),
379413
series:[
380-
{name:"Pick&Place Succ.(%)", values:C.offline_ratio.pick, color:"rgba(91,124,250,.72)"},
381-
{name:"Sort Acc.(%)", values:C.offline_ratio.sort, color:"rgba(168,85,247,.55)"},
382-
{name:"Complete Succ.(%)", values:C.offline_ratio.comp, color:"rgba(120,140,170,.55)"},
414+
{name:"Sort Success Rate", values:C.offline_ratio.sort, color:"rgba(91,124,250,.72)"},
415+
{name:"Pick&Place Success Rate", values:C.offline_ratio.pick, color:"rgba(168,85,247,.55)"},
416+
{name:"Complete Success Rate", values:C.offline_ratio.comp, color:"rgba(120,140,170,.55)"},
383417
],
384418
yFmt:(v)=>v.toFixed(0)+"%",
385419
ticks:5,
@@ -388,17 +422,21 @@ function setupCharts(){
388422

389423
const r2 = drawGroupedBarChart({
390424
canvas:"#ablationOnline",
391-
title:"Ablation: Online action/state integration",
425+
// title removed - now in HTML h4
392426
labels: C.online_integration.labels,
393427
series:[
394-
{name:"Pick&Place Succ.(%)", values:C.online_integration.pick, color:"rgba(91,124,250,.72)"},
395-
{name:"Sort Acc.(%)", values:C.online_integration.sort, color:"rgba(168,85,247,.55)"},
396-
{name:"Complete Succ.(%)", values:C.online_integration.comp, color:"rgba(120,140,170,.55)"},
428+
{name:"Sort Success Rate", values:C.online_integration.sort, color:"rgba(91,124,250,.72)"},
429+
{name:"Pick&Place Success Rate", values:C.online_integration.pick, color:"rgba(168,85,247,.55)"},
430+
{name:"Complete Success Rate", values:C.online_integration.comp, color:"rgba(120,140,170,.55)"},
397431
],
398432
yFmt:(v)=>v.toFixed(0)+"%",
399433
ticks:5,
400434
boldLabels:["(✓,✓)"]
401435
});
436+
437+
// Initial draw with 0 progress (invisible bars)
438+
r1();
439+
r2();
402440

403441
let t=null;
404442
window.addEventListener("resize", ()=>{
@@ -407,6 +445,56 @@ function setupCharts(){
407445
renderMainAll(); r1(); r2();
408446
}, 120);
409447
}, {passive:true});
448+
449+
// Animation on scroll into view
450+
const animateChartOnScroll = (canvas) => {
451+
if(!canvas || canvas._animated) return;
452+
453+
const observer = new IntersectionObserver((entries) => {
454+
entries.forEach(entry => {
455+
if(entry.isIntersecting && !canvas._animated){
456+
canvas._animated = true;
457+
const duration = 800; // Animation duration in ms
458+
const startTime = performance.now();
459+
460+
const animate = (currentTime) => {
461+
const elapsed = currentTime - startTime;
462+
const progress = Math.min(elapsed / duration, 1);
463+
// Ease-out cubic for smooth deceleration
464+
const eased = 1 - Math.pow(1 - progress, 3);
465+
466+
canvas._animProgress = eased;
467+
468+
// Redraw based on which chart type
469+
if(canvas.id === 'mainChartBrick' || canvas.id === 'mainChartBackpack' || canvas.id === 'mainChartBox'){
470+
renderMainAll();
471+
} else if(canvas.id === 'ablationOffline'){
472+
r1();
473+
} else if(canvas.id === 'ablationOnline'){
474+
r2();
475+
}
476+
477+
if(progress < 1){
478+
requestAnimationFrame(animate);
479+
}
480+
};
481+
482+
requestAnimationFrame(animate);
483+
observer.unobserve(canvas);
484+
}
485+
});
486+
}, {threshold: 0.2}); // Trigger when 20% of chart is visible
487+
488+
observer.observe(canvas);
489+
};
490+
491+
// Setup animation for all charts
492+
for(const task of TASKS){
493+
const canvasEl = q(TASK_CANVAS[task]);
494+
if(canvasEl) animateChartOnScroll(canvasEl);
495+
}
496+
animateChartOnScroll(q("#ablationOffline"));
497+
animateChartOnScroll(q("#ablationOnline"));
410498
}
411499

412500
window.addEventListener("load", ()=>{

index.html

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,27 @@
3737
<div class="hero-overlay-inner">
3838
<div class="hero-links" id="heroLinks">
3939
<!-- <a class="btn" href="assets/paper.pdf">PDF</a> -->
40-
<a class="btn" href="#" onclick="alert('Add arXiv link here.'); return false;">arXiv</a>
41-
<a class="btn" href="#" onclick="https://opendrivelab.github.io/test_page.github.io/"; return false;">Code (Soon)</a>
40+
<a class="btn" href="#" onclick="alert('Add arXiv link here.'); return false;">
41+
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
42+
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"></path>
43+
<polyline points="14 2 14 8 20 8"></polyline>
44+
<line x1="16" y1="13" x2="8" y2="13"></line>
45+
<line x1="16" y1="17" x2="8" y2="17"></line>
46+
<polyline points="10 9 9 9 8 9"></polyline>
47+
</svg>
48+
arXiv
49+
</a>
50+
<a class="btn" href="#" onclick="https://opendrivelab.github.io/test_page.github.io/"; return false;">
51+
<svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor">
52+
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
53+
</svg>
54+
Code (Soon)
55+
</a>
4256
</div>
4357
<!-- <div class="pill">Project Page</div> -->
4458
<div class="hero-title" id="heroTitle">RISE: Self-Improving Robot Policy with Compositional World Model</div>
45-
<div class="hero-subtitle" id="heroSubtitle">
46-
| The first study on leveraging world
59+
<div class="hero-subtitle" id="heroSubtitle" style="text-align: justify;">
60+
The first study on leveraging world
4761
models as an effective learning environment for challenging
4862
real-world manipulation, bootstrapping performance on tasks
4963
requiring high dynamics, dexterity, and precision.
@@ -385,46 +399,62 @@ <h3>Main Results</h3>
385399

386400
<div class="grid3 results-grid" style="margin-top:10px">
387401
<div>
402+
<h4 style="font-size: 16px; font-weight: 700; margin-bottom: 8px; text-align: center;">Dynamic Brick Sorting: Success (%)</h4>
388403
<div class="canvas-wrap">
389404
<canvas id="mainChartBrick" class="chart"></canvas>
390405
<div class="tooltip"></div>
391406
</div>
392-
</div>
407+
</div>
393408
<div>
409+
<h4 style="font-size: 16px; font-weight: 700; margin-bottom: 8px; text-align: center;">Backpack Packing: Success (%)</h4>
394410
<div class="canvas-wrap">
395411
<canvas id="mainChartBackpack" class="chart"></canvas>
396412
<div class="tooltip"></div>
397413
</div>
398-
</div>
414+
</div>
399415
<div>
416+
<h4 style="font-size: 16px; font-weight: 700; margin-bottom: 8px; text-align: center;">Box Closing: Success (%)</h4>
400417
<div class="canvas-wrap">
401418
<canvas id="mainChartBox" class="chart"></canvas>
402419
<div class="tooltip"></div>
403420
</div>
404-
</div>
421+
</div>
405422
</div>
406423
</div>
407424

408425
<hr/>
409426

410427
<h3>Ablations</h3>
428+
<p class="small" style="margin-bottom:8px">
429+
Ablation studies conducted on the <b>Dynamic Brick Sorting</b> task.
430+
</p>
411431
<p class="small" style="margin-bottom:12px">
412432
<b>Left:</b> Optimal offline ratio (0.6) balances demonstrations with online rollouts.<br/>
413-
<b>Right:</b> Both online actions and states essential; full RISE with all components achieves best performance.
433+
<b>Right:</b> Both online actions and states are essential; full RISE with all components achieves best performance.
414434
</p>
435+
415436
<div class="grid2 ablation-grid" style="margin-top:10px">
416437
<div class="card">
438+
<h4 style="font-size: 16px; font-weight: 700; margin-bottom: 12px; text-align: center;">Ablation: Offline data ratio</h4>
417439
<div class="canvas-wrap">
418440
<canvas id="ablationOffline" class="chart"></canvas>
419441
<div class="tooltip"></div>
420442
</div>
421-
</div>
443+
</div>
422444
<div class="card">
445+
<h4 style="font-size: 16px; font-weight: 700; margin-bottom: 12px; text-align: center;">Ablation: Online action/state integration</h4>
423446
<div class="canvas-wrap">
424447
<canvas id="ablationOnline" class="chart"></canvas>
425448
<div class="tooltip"></div>
426449
</div>
427-
</div>
450+
</div>
451+
</div>
452+
453+
<!-- Legend for Ablation Charts -->
454+
<div class="legend" style="margin-top: 16px; justify-content: center;">
455+
<div class="item"><span class="swatch" style="background: rgba(91,124,250,.72)"></span> Sort Success Rate</div>
456+
<div class="item"><span class="swatch" style="background: rgba(168,85,247,.55)"></span> Pick&Place Success Rate</div>
457+
<div class="item"><span class="swatch" style="background: rgba(120,140,170,.55)"></span> Complete Success Rate</div>
428458
</div>
429459

430460
<hr/>
@@ -583,7 +613,7 @@ <h3>Policy Improvement</h3>
583613

584614
<section id="abstract">
585615
<h2>Abstract</h2>
586-
<p>
616+
<p style="text-align: justify; line-height: 1.7;">
587617
Despite the sustained scaling on model capacity and data acquisition,
588618
Vision–Language–Action (VLA) models remain brittle in contact-rich and dynamic manipulation tasks,
589619
where minor execution deviations can compound into failures.

0 commit comments

Comments
 (0)