Spaces:
Sleeping
Sleeping
Upload 2 files for new demo page
Browse filesThis demo includes video bevs, better visualization for frames in closed loop setting, etc. Still need to update code for 1) success status, 2) vlm planning response, 3) best plan selection response
- .gitattributes +1 -0
- src/display/bev_video_5ZKStnWn8Zo.mp4 +3 -0
- src/display/demo_new.html +660 -0
.gitattributes
CHANGED
|
@@ -33,3 +33,4 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
|
| 33 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 35 |
scale-hf-logo.png filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
| 33 |
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 34 |
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 35 |
scale-hf-logo.png filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
src/display/bev_video_5ZKStnWn8Zo.mp4 filter=lfs diff=lfs merge=lfs -text
|
src/display/bev_video_5ZKStnWn8Zo.mp4
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
version https://git-lfs.github.com/spec/v1
|
| 2 |
+
oid sha256:6dc12af4f4bb161ef094a7ce2c45fb308d7306e5d75fbddf61e6f151490d6ce1
|
| 3 |
+
size 7399610
|
src/display/demo_new.html
ADDED
|
@@ -0,0 +1,660 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8" />
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
+
<title>World Model Closed Loop Framework</title>
|
| 7 |
+
<style>
|
| 8 |
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
| 9 |
+
body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background: linear-gradient(135deg,#667eea 0%,#764ba2 100%); min-height: 100vh; overflow-x: hidden; }
|
| 10 |
+
.container { max-width: 1400px; margin: 0 auto; padding: 20px; }
|
| 11 |
+
.header { text-align: center; color: white; margin-bottom: 30px; }
|
| 12 |
+
.header h1 { font-size: 2.5em; margin-bottom: 10px; text-shadow: 2px 2px 4px rgba(0,0,0,.3); }
|
| 13 |
+
.header p { font-size: 1.2em; opacity: .9; }
|
| 14 |
+
.demo-container { background: white; border-radius: 20px; padding: 30px; box-shadow: 0 20px 40px rgba(0,0,0,.1); display: flex; flex-direction: column; transition: all .5s ease; margin: 30px; }
|
| 15 |
+
.demo-container.expanded { min-height: 85vh; }
|
| 16 |
+
.control-panel { background: #f8f9fa; border-radius: 15px; padding: 20px; margin-bottom: 20px; border-left: 5px solid #4285f4; flex-shrink: 0; }
|
| 17 |
+
.control-row { display: flex; gap: 20px; align-items: center; margin-bottom: 15px; }
|
| 18 |
+
.control-row:last-child { margin-bottom: 0; }
|
| 19 |
+
.control-label { font-weight: bold; min-width: 150px; color: #333; }
|
| 20 |
+
.control-input { flex: 1; }
|
| 21 |
+
select, input[type="text"] { width: 100%; padding: 10px; border: 2px solid #ddd; border-radius: 8px; font-size: 14px; transition: border-color .3s; }
|
| 22 |
+
select:focus, input[type="text"]:focus { outline: none; border-color: #4285f4; }
|
| 23 |
+
.start-btn { background: linear-gradient(135deg,#4285f4,#34a853); color: white; border: none; padding: 12px 30px; border-radius: 25px; font-size: 16px; font-weight: bold; cursor: pointer; transition: transform .3s, box-shadow .3s; }
|
| 24 |
+
.start-btn:hover { transform: translateY(-2px); box-shadow: 0 10px 20px rgba(66,133,244,.3); }
|
| 25 |
+
.scenario-info { padding: 10px; background: #e8f4fd; border-radius: 8px; color: #333; }
|
| 26 |
+
|
| 27 |
+
/* Timeline */
|
| 28 |
+
.timeline-container { background: #f8f9fa; border-radius: 10px; padding: 15px; margin-bottom: 15px; flex-shrink: 0; display: none; }
|
| 29 |
+
.timeline-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px; }
|
| 30 |
+
.timeline-title { font-weight: bold; color: #333; font-size: 1em; }
|
| 31 |
+
.frame-counter { background: #4285f4; color: white; padding: 3px 12px; border-radius: 15px; font-size: .8em; }
|
| 32 |
+
.timeline { position: relative; height: 40px; background: #e8eaed; border-radius: 20px; margin-bottom: 10px; overflow: hidden; }
|
| 33 |
+
.timeline-progress { height: 100%; background: linear-gradient(90deg,#4285f4,#34a853); border-radius: 20px; transition: width .5s ease; position: relative; }
|
| 34 |
+
.timeline-markers { position: absolute; top: 0; left: 0; right: 0; height: 100%; display: flex; align-items: center; padding: 0 15px; }
|
| 35 |
+
.frame-marker { width: 24px; height: 24px; border-radius: 50%; background: white; border: 2px solid #e8eaed; display: flex; align-items: center; justify-content: center; font-size: 10px; font-weight: bold; cursor: pointer; transition: all .3s; position: absolute; color: #666; }
|
| 36 |
+
.frame-marker:hover { transform: scale(1.1); box-shadow: 0 3px 8px rgba(0,0,0,.2); }
|
| 37 |
+
.frame-marker.completed { border-color: #34a853; color: #34a853; background: #e8f5e8; }
|
| 38 |
+
.frame-marker.current { border-color: #4285f4; color: white; background: #4285f4; animation: pulse 2s infinite; }
|
| 39 |
+
@keyframes pulse { 0%,100%{transform:scale(1)} 50%{transform:scale(1.1)} }
|
| 40 |
+
.navigation-controls { display: flex; justify-content: center; gap: 15px; }
|
| 41 |
+
.nav-btn { background: #4285f4; color: white; border: none; padding: 10px 20px; border-radius: 20px; cursor: pointer; font-size: 14px; transition: background .3s; }
|
| 42 |
+
.nav-btn:hover { background: #3367d6; }
|
| 43 |
+
.nav-btn:disabled { background: #ccc; cursor: not-allowed; }
|
| 44 |
+
|
| 45 |
+
/* Overview */
|
| 46 |
+
.overview-panel { display: none; gap: 20px; margin-bottom: 20px; flex-shrink: 0; }
|
| 47 |
+
.birds-eye-section, .results-section { flex: 1; background: white; border: 3px solid #e8eaed; border-radius: 15px; padding: 20px; display: flex; flex-direction: column; }
|
| 48 |
+
.section-header { background: linear-gradient(135deg,#34a853,#4285f4); color: white; padding: 12px 20px; border-radius: 10px; text-align: center; font-weight: bold; margin-bottom: 15px; }
|
| 49 |
+
.results-section .section-header { background: linear-gradient(135deg,#ea4335,#fbbc04); }
|
| 50 |
+
.section-content { flex: 1; background: #f8f9fa; border-radius: 10px; display: flex; align-items: center; justify-content: center; color: #666; font-style: italic; height: 180px; border: 2px dashed #ddd; }
|
| 51 |
+
.results-content { background: #f8f9fa; border-radius: 10px; padding: 15px; height: 180px; display: flex; flex-direction: column; justify-content: flex-start; align-items: center; text-align: center; overflow: hidden; }
|
| 52 |
+
.final-status-display { padding: 8px 20px; border-radius: 20px; font-weight: bold; margin-bottom: 12px; font-size: 1em; flex-shrink: 0; }
|
| 53 |
+
.final-status-display.success { background: #34a853; color: white; }
|
| 54 |
+
.final-status-display.failure { background: #ea4335; color: white; }
|
| 55 |
+
.final-status-display.pending { background: #e8eaed; color: #666; }
|
| 56 |
+
.results-stats { font-size: .9em; color: #666; line-height: 1.5; }
|
| 57 |
+
|
| 58 |
+
/* Main */
|
| 59 |
+
.main-content { flex: 1; min-height: 0; display: flex; flex-direction: column; }
|
| 60 |
+
.iteration-display { background: white; border: 3px solid #e8eaed; border-radius: 15px; padding: 20px; flex: 1; display: flex; flex-direction: column; transition: all .5s ease; min-height: 400px; }
|
| 61 |
+
.iteration-display.active { border-color: #4285f4; background: linear-gradient(135deg,rgba(66,133,244,.05),rgba(52,168,83,.05)); }
|
| 62 |
+
.iteration-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 20px; padding: 15px 20px; background: linear-gradient(135deg,#4285f4,#34a853); color: white; border-radius: 10px; flex-shrink: 0; }
|
| 63 |
+
.iteration-title { font-size: 1.4em; font-weight: bold; }
|
| 64 |
+
.iteration-status { padding: 5px 15px; border-radius: 20px; background: rgba(255,255,255,.2); font-size: .9em; }
|
| 65 |
+
|
| 66 |
+
/* NEW: Sequential Processing Indicator */
|
| 67 |
+
.sequence-indicator {
|
| 68 |
+
text-align: center;
|
| 69 |
+
margin-bottom: 20px;
|
| 70 |
+
padding: 15px;
|
| 71 |
+
background: linear-gradient(135deg, #ff6b6b, #4ecdc4);
|
| 72 |
+
border-radius: 15px;
|
| 73 |
+
color: white;
|
| 74 |
+
}
|
| 75 |
+
.sequence-title {
|
| 76 |
+
font-size: 1.2em;
|
| 77 |
+
font-weight: bold;
|
| 78 |
+
margin-bottom: 10px;
|
| 79 |
+
}
|
| 80 |
+
.sequence-flow {
|
| 81 |
+
display: flex;
|
| 82 |
+
justify-content: center;
|
| 83 |
+
align-items: center;
|
| 84 |
+
gap: 15px;
|
| 85 |
+
flex-wrap: wrap;
|
| 86 |
+
}
|
| 87 |
+
.sequence-step {
|
| 88 |
+
display: flex;
|
| 89 |
+
align-items: center;
|
| 90 |
+
background: rgba(255,255,255,0.15);
|
| 91 |
+
padding: 8px 15px;
|
| 92 |
+
border-radius: 20px;
|
| 93 |
+
transition: all 0.3s;
|
| 94 |
+
}
|
| 95 |
+
.sequence-step.active {
|
| 96 |
+
background: rgba(255,255,255,0.3);
|
| 97 |
+
transform: scale(1.05);
|
| 98 |
+
box-shadow: 0 4px 15px rgba(0,0,0,0.2);
|
| 99 |
+
}
|
| 100 |
+
.sequence-number {
|
| 101 |
+
width: 25px;
|
| 102 |
+
height: 25px;
|
| 103 |
+
background: white;
|
| 104 |
+
color: #333;
|
| 105 |
+
border-radius: 50%;
|
| 106 |
+
display: flex;
|
| 107 |
+
align-items: center;
|
| 108 |
+
justify-content: center;
|
| 109 |
+
font-weight: bold;
|
| 110 |
+
font-size: 14px;
|
| 111 |
+
margin-right: 8px;
|
| 112 |
+
}
|
| 113 |
+
.sequence-arrow {
|
| 114 |
+
color: white;
|
| 115 |
+
font-size: 18px;
|
| 116 |
+
margin: 0 5px;
|
| 117 |
+
}
|
| 118 |
+
|
| 119 |
+
.step-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: 20px; flex: 1; margin-bottom: 20px; }
|
| 120 |
+
.step-card { background: white; border: 2px solid #e8eaed; border-radius: 12px; padding: 20px; transition: all .3s ease; display: flex; flex-direction: column; position: relative; }
|
| 121 |
+
.step-card.active { border-color: #4285f4; transform: translateY(-5px); box-shadow: 0 10px 20px rgba(66,133,244,.15); }
|
| 122 |
+
|
| 123 |
+
/* NEW: Processing animation for active step */
|
| 124 |
+
.step-card.processing::before {
|
| 125 |
+
content: '';
|
| 126 |
+
position: absolute;
|
| 127 |
+
top: -2px;
|
| 128 |
+
left: -2px;
|
| 129 |
+
right: -2px;
|
| 130 |
+
bottom: -2px;
|
| 131 |
+
background: linear-gradient(45deg, #4285f4, #34a853, #fbbc04, #ea4335);
|
| 132 |
+
background-size: 300% 300%;
|
| 133 |
+
border-radius: 12px;
|
| 134 |
+
z-index: -1;
|
| 135 |
+
animation: rainbow-border 2s linear infinite;
|
| 136 |
+
}
|
| 137 |
+
@keyframes rainbow-border {
|
| 138 |
+
0% { background-position: 0% 50%; }
|
| 139 |
+
50% { background-position: 100% 50%; }
|
| 140 |
+
100% { background-position: 0% 50%; }
|
| 141 |
+
}
|
| 142 |
+
|
| 143 |
+
.step-header { display: flex; align-items: center; margin-bottom: 15px; }
|
| 144 |
+
.step-number { width: 30px; height: 30px; background: #4285f4; color: white; border-radius: 50%; display: flex; align-items: center; justify-content: center; font-weight: bold; margin-right: 10px; position: relative; }
|
| 145 |
+
|
| 146 |
+
/* NEW: Step number pulsing animation */
|
| 147 |
+
.step-number.active-number {
|
| 148 |
+
animation: number-pulse 1.5s ease-in-out infinite;
|
| 149 |
+
background: linear-gradient(45deg, #4285f4, #34a853);
|
| 150 |
+
}
|
| 151 |
+
@keyframes number-pulse {
|
| 152 |
+
0%, 100% { transform: scale(1); }
|
| 153 |
+
50% { transform: scale(1.1); }
|
| 154 |
+
}
|
| 155 |
+
|
| 156 |
+
.step-title { font-weight: bold; color: #333; }
|
| 157 |
+
.step-content { background: #f8f9fa; border-radius: 8px; padding: 12px; flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; color: #666; font-style: italic; min-height: 100px; font-size: .9em; text-align: center; }
|
| 158 |
+
|
| 159 |
+
/* Step 4 side column for Best Plan */
|
| 160 |
+
.step4-wrap { display: grid; grid-template-columns: 0.6fr 0.4fr; gap: 14px; }
|
| 161 |
+
.step4-card .step-content { align-items: center; justify-content: center; }
|
| 162 |
+
.plan-list { display: flex; flex-direction: column; gap: 12px; }
|
| 163 |
+
.plan-card { background: white; border: 2px solid #e8eaed; border-radius: 8px; padding: 15px; cursor: pointer; transition: all .3s; }
|
| 164 |
+
.plan-card:hover { border-color: #4285f4; }
|
| 165 |
+
.plan-card.selected { border-color: #34a853; background: rgba(52,168,83,.1); }
|
| 166 |
+
.plan-title { font-weight: bold; margin-bottom: 8px; color: #333; }
|
| 167 |
+
.confidence-bar { width: 100%; height: 8px; background: #e8eaed; border-radius: 4px; overflow: hidden; margin-top: 10px; }
|
| 168 |
+
.confidence-fill { height: 100%; background: linear-gradient(90deg,#ea4335,#fbbc04,#34a853); transition: width .5s ease; }
|
| 169 |
+
|
| 170 |
+
/* Responsive tweak */
|
| 171 |
+
@media (max-width: 1100px) {
|
| 172 |
+
.step4-wrap { grid-template-columns: 1fr; }
|
| 173 |
+
.sequence-flow { flex-direction: column; }
|
| 174 |
+
.sequence-arrow { transform: rotate(90deg); }
|
| 175 |
+
}
|
| 176 |
+
</style>
|
| 177 |
+
</head>
|
| 178 |
+
<body>
|
| 179 |
+
<div class="container">
|
| 180 |
+
<div class="header">
|
| 181 |
+
<h1>🤖 World Model Closed Loop Framework</h1>
|
| 182 |
+
<p>Navigate through iterations and explore the decision-making process</p>
|
| 183 |
+
</div>
|
| 184 |
+
|
| 185 |
+
<div class="demo-container">
|
| 186 |
+
<div class="control-panel">
|
| 187 |
+
<div class="control-row">
|
| 188 |
+
<div class="control-label">Scenario:</div>
|
| 189 |
+
<div class="control-input">
|
| 190 |
+
<select id="scenarioSelect" onchange="loadScenario()">
|
| 191 |
+
<option value="0">Kitchen Navigation - Find Red Cup</option>
|
| 192 |
+
<option value="1">Living Room - Approach Blue Chair</option>
|
| 193 |
+
<option value="2">Office Space - Navigate to Green Door</option>
|
| 194 |
+
<option value="3">Bedroom - Find Yellow Lamp</option>
|
| 195 |
+
</select>
|
| 196 |
+
</div>
|
| 197 |
+
</div>
|
| 198 |
+
<div class="control-row">
|
| 199 |
+
<div class="control-label">Target & Prompt:</div>
|
| 200 |
+
<div class="control-input">
|
| 201 |
+
<div id="scenarioInfo" class="scenario-info">🎯 Target: <strong>Red Cup (Kitchen Counter)</strong> | 📝 Prompt: "Navigate safely to the red cup on the kitchen counter"</div>
|
| 202 |
+
</div>
|
| 203 |
+
</div>
|
| 204 |
+
<div class="control-row">
|
| 205 |
+
<div class="control-label">Start Demo:</div>
|
| 206 |
+
<div class="control-input">
|
| 207 |
+
<button class="start-btn" onclick="startDemo()">🚀 Begin Closed Loop Process</button>
|
| 208 |
+
</div>
|
| 209 |
+
</div>
|
| 210 |
+
</div>
|
| 211 |
+
|
| 212 |
+
<div class="overview-panel" id="overviewPanel">
|
| 213 |
+
<div class="birds-eye-section">
|
| 214 |
+
<div class="section-header">🗺️ Bird's Eye View</div>
|
| 215 |
+
<div class="section-content" id="birdEyeContent">
|
| 216 |
+
<video id="birdEyeVideo" src="demo_bev.mp4" autoplay loop muted style="width:100%;max-height:200px;object-fit:contain;border-radius:8px;" controls>
|
| 217 |
+
Your browser does not support the video tag.
|
| 218 |
+
</video>
|
| 219 |
+
</div>
|
| 220 |
+
</div>
|
| 221 |
+
<div class="results-section">
|
| 222 |
+
<div class="section-header">📊 Final Results & Video</div>
|
| 223 |
+
<div class="results-content" id="resultsContent">
|
| 224 |
+
<div style="display:flex;align-items:center;gap:15px;height:100%;width:100%;">
|
| 225 |
+
<div class="final-status-display pending" id="statusDisplay" style="margin-bottom:0;flex-shrink:0;">Processing...</div>
|
| 226 |
+
<video id="finalVideo" src="https://huggingface.co/datasets/zonszer/demo_source_data/resolve/main/AR/FTwan21_lora/5ZKStnWn8Zo/E014/A001/world_model_gen/bbox_gen_video_1.mp4" controls style="flex:1;height:120px;border-radius:8px;display:none;"></video>
|
| 227 |
+
</div>
|
| 228 |
+
</div>
|
| 229 |
+
</div>
|
| 230 |
+
</div>
|
| 231 |
+
|
| 232 |
+
<div class="timeline-container" id="timelineContainer">
|
| 233 |
+
<div class="timeline-header">
|
| 234 |
+
<div class="timeline-title">🎬 Navigation Timeline</div>
|
| 235 |
+
<div class="frame-counter">Frame <span id="currentFrame">1</span> of <span id="totalFrames">8</span></div>
|
| 236 |
+
</div>
|
| 237 |
+
<div class="timeline">
|
| 238 |
+
<div class="timeline-progress" id="timelineProgress"></div>
|
| 239 |
+
<div class="timeline-markers" id="timelineMarkers"></div>
|
| 240 |
+
</div>
|
| 241 |
+
<div class="navigation-controls">
|
| 242 |
+
<button class="nav-btn" id="prevBtn" onclick="previousFrame()" disabled>⏮ Previous</button>
|
| 243 |
+
<button class="nav-btn" id="playBtn" onclick="togglePlayback()">▶️ Play</button>
|
| 244 |
+
<button class="nav-btn" id="nextBtn" onclick="nextFrame()">Next ⏭</button>
|
| 245 |
+
</div>
|
| 246 |
+
</div>
|
| 247 |
+
|
| 248 |
+
<div class="main-content">
|
| 249 |
+
<div class="iteration-display" id="iterationDisplay">
|
| 250 |
+
<div class="iteration-header">
|
| 251 |
+
<div class="iteration-title">Ready to Start</div>
|
| 252 |
+
<div class="iteration-status">Waiting...</div>
|
| 253 |
+
</div>
|
| 254 |
+
<div style="flex:1;display:flex;align-items:center;justify-content:center;color:#666;font-size:1.2em;">👆 Click "Begin Closed Loop Process" to start the demonstration</div>
|
| 255 |
+
</div>
|
| 256 |
+
</div>
|
| 257 |
+
</div>
|
| 258 |
+
</div>
|
| 259 |
+
|
| 260 |
+
<script>
|
| 261 |
+
let currentFrameIndex = 0;
|
| 262 |
+
let totalFramesCount = 8;
|
| 263 |
+
let isPlaying = false;
|
| 264 |
+
let playInterval = null;
|
| 265 |
+
let frames = [];
|
| 266 |
+
let isRunning = false;
|
| 267 |
+
let currentActiveStep = 0; // NEW: Track current processing step (1-4)
|
| 268 |
+
let realActionData = {}; // Store loaded action data
|
| 269 |
+
|
| 270 |
+
const scenarios = [
|
| 271 |
+
{ name: "Kitchen Navigation - Find Red Cup", target: "Red Cup (Kitchen Counter)", prompt: "Navigate safely to the red cup on the kitchen counter", frames: 8, environment: "Kitchen" },
|
| 272 |
+
{ name: "Living Room - Approach Blue Chair", target: "Blue Chair (Living Room)", prompt: "Move carefully to the blue armchair avoiding obstacles", frames: 12, environment: "Living Room" },
|
| 273 |
+
{ name: "Office Space - Navigate to Green Door", target: "Green Door (Exit)", prompt: "Navigate to the green emergency exit door", frames: 15, environment: "Office" },
|
| 274 |
+
{ name: "Bedroom - Find Yellow Lamp", target: "Yellow Lamp (Bedside)", prompt: "Approach the yellow bedside lamp without disturbing items", frames: 10, environment: "Bedroom" }
|
| 275 |
+
];
|
| 276 |
+
|
| 277 |
+
let currentScenario = scenarios[0];
|
| 278 |
+
|
| 279 |
+
// Load real action data from your huggingface dataset
|
| 280 |
+
async function loadActionData() {
|
| 281 |
+
const baseUrl = "https://huggingface.co/datasets/zonszer/demo_source_data/resolve/main/AR/FTwan21_lora/5ZKStnWn8Zo/E014";
|
| 282 |
+
const frameIds = ["A000", "A001", "A002", "A003", "A004", "A005", "A006"];
|
| 283 |
+
|
| 284 |
+
realActionData = {};
|
| 285 |
+
|
| 286 |
+
for (let i = 0; i < frameIds.length; i++) {
|
| 287 |
+
try {
|
| 288 |
+
const response = await fetch(`${baseUrl}/${frameIds[i]}/action_plan.json`);
|
| 289 |
+
if (response.ok) {
|
| 290 |
+
const data = await response.json();
|
| 291 |
+
realActionData[frameIds[i]] = data;
|
| 292 |
+
console.log(`Loaded data for ${frameIds[i]}:`, data);
|
| 293 |
+
} else {
|
| 294 |
+
console.warn(`Could not load data for ${frameIds[i]}`);
|
| 295 |
+
}
|
| 296 |
+
} catch (error) {
|
| 297 |
+
console.warn(`Error loading ${frameIds[i]}:`, error);
|
| 298 |
+
}
|
| 299 |
+
}
|
| 300 |
+
}
|
| 301 |
+
|
| 302 |
+
// Convert action plan data to display format
|
| 303 |
+
function convertActionToPlans(actionData) {
|
| 304 |
+
if (!actionData || !actionData.planner_data || !actionData.planner_data["planner_next-1.json"]) {
|
| 305 |
+
return samplePlans; // Fallback to sample data
|
| 306 |
+
}
|
| 307 |
+
|
| 308 |
+
const planActions = actionData.planner_data["planner_next-1.json"];
|
| 309 |
+
return planActions.map((action, index) => ({
|
| 310 |
+
title: action.charAt(0).toUpperCase() + action.slice(1).replace(/([0-9.]+)m/, '$1m'),
|
| 311 |
+
description: action,
|
| 312 |
+
ranking: index + 1 // 1st, 2nd, 3rd choice based on original ordering
|
| 313 |
+
}));
|
| 314 |
+
}
|
| 315 |
+
|
| 316 |
+
const samplePlans = [
|
| 317 |
+
{ title: "Go Straight", description: "go straight for 0.20m", ranking: 1 },
|
| 318 |
+
{ title: "Turn Right", description: "turn right 22.5 degrees", ranking: 2 },
|
| 319 |
+
{ title: "Turn Left", description: "turn left 22.5 degrees", ranking: 3 }
|
| 320 |
+
];
|
| 321 |
+
|
| 322 |
+
function loadScenario(){
|
| 323 |
+
const select = document.getElementById('scenarioSelect');
|
| 324 |
+
currentScenario = scenarios[parseInt(select.value)];
|
| 325 |
+
document.getElementById('scenarioInfo').innerHTML = `🎯 Target: <strong>${currentScenario.target}</strong> | 📝 Prompt: "${currentScenario.prompt}"`;
|
| 326 |
+
totalFramesCount = currentScenario.frames;
|
| 327 |
+
if (isRunning){
|
| 328 |
+
if (isPlaying) togglePlayback();
|
| 329 |
+
document.getElementById('timelineContainer').style.display = 'none';
|
| 330 |
+
document.getElementById('overviewPanel').style.display = 'none';
|
| 331 |
+
document.querySelector('.demo-container').classList.remove('expanded');
|
| 332 |
+
isRunning = false;
|
| 333 |
+
currentActiveStep = 0;
|
| 334 |
+
const display = document.getElementById('iterationDisplay');
|
| 335 |
+
display.innerHTML = `<div class="iteration-header"><div class="iteration-title">Ready to Start</div><div class="iteration-status">Waiting...</div></div><div style="flex:1;display:flex;align-items:center;justify-content:center;color:#666;font-size:1.2em;">👆 Click "Begin Closed Loop Process" to start the demonstration</div>`;
|
| 336 |
+
display.classList.remove('active');
|
| 337 |
+
}
|
| 338 |
+
}
|
| 339 |
+
|
| 340 |
+
async function startDemo(){
|
| 341 |
+
if (isRunning) return;
|
| 342 |
+
|
| 343 |
+
// Load real action data first
|
| 344 |
+
console.log("Loading action data...");
|
| 345 |
+
await loadActionData();
|
| 346 |
+
console.log("Action data loaded:", realActionData);
|
| 347 |
+
|
| 348 |
+
isRunning = true;
|
| 349 |
+
currentActiveStep = 1;
|
| 350 |
+
document.querySelector('.demo-container').classList.add('expanded');
|
| 351 |
+
document.getElementById('overviewPanel').style.display = 'flex';
|
| 352 |
+
document.getElementById('timelineContainer').style.display = 'block';
|
| 353 |
+
|
| 354 |
+
const frameKeys = ["A000", "A001", "A002", "A003", "A004", "A005", "A006"];
|
| 355 |
+
|
| 356 |
+
frames = Array.from({length: totalFramesCount}, (_, i) => {
|
| 357 |
+
const frameKey = frameKeys[Math.min(i, frameKeys.length - 1)];
|
| 358 |
+
const actionData = realActionData[frameKey];
|
| 359 |
+
|
| 360 |
+
return {
|
| 361 |
+
frameNumber: i + 1,
|
| 362 |
+
frameKey: frameKey,
|
| 363 |
+
status: i === 0 ? 'current' : 'pending',
|
| 364 |
+
observation: `Frame ${i + 1} - ${currentScenario.environment} view`,
|
| 365 |
+
plans: convertActionToPlans(actionData),
|
| 366 |
+
selectedPlan: null,
|
| 367 |
+
completed: false,
|
| 368 |
+
currentStep: 0,
|
| 369 |
+
actionData: actionData
|
| 370 |
+
};
|
| 371 |
+
});
|
| 372 |
+
|
| 373 |
+
currentFrameIndex = 0;
|
| 374 |
+
document.getElementById('totalFrames').textContent = totalFramesCount;
|
| 375 |
+
createTimeline();
|
| 376 |
+
displayFrame(0);
|
| 377 |
+
setTimeout(() => { processCurrentFrame(); }, 1000);
|
| 378 |
+
}
|
| 379 |
+
|
| 380 |
+
function processCurrentFrame(){
|
| 381 |
+
const frame = frames[currentFrameIndex];
|
| 382 |
+
if (frame.completed) return;
|
| 383 |
+
|
| 384 |
+
frame.status = 'current';
|
| 385 |
+
frame.currentStep = 1;
|
| 386 |
+
currentActiveStep = 1;
|
| 387 |
+
displayFrame(currentFrameIndex);
|
| 388 |
+
|
| 389 |
+
// Step 1: Observation (1 second)
|
| 390 |
+
setTimeout(() => {
|
| 391 |
+
frame.currentStep = 2;
|
| 392 |
+
currentActiveStep = 2;
|
| 393 |
+
displayFrame(currentFrameIndex);
|
| 394 |
+
|
| 395 |
+
// Step 2: VLM Planning (1.5 seconds)
|
| 396 |
+
setTimeout(() => {
|
| 397 |
+
frame.currentStep = 3;
|
| 398 |
+
currentActiveStep = 3;
|
| 399 |
+
displayFrame(currentFrameIndex);
|
| 400 |
+
|
| 401 |
+
// Step 3: World Model Simulation (1.5 seconds)
|
| 402 |
+
setTimeout(() => {
|
| 403 |
+
frame.currentStep = 4;
|
| 404 |
+
currentActiveStep = 4;
|
| 405 |
+
displayFrame(currentFrameIndex);
|
| 406 |
+
|
| 407 |
+
// Step 4: Plan Selection (1 second)
|
| 408 |
+
setTimeout(() => {
|
| 409 |
+
const bestPlan = frame.plans[0]; // First plan is highest ranked
|
| 410 |
+
selectPlan(currentFrameIndex, 0);
|
| 411 |
+
frame.completed = true;
|
| 412 |
+
frame.status = 'completed';
|
| 413 |
+
frame.currentStep = 0;
|
| 414 |
+
currentActiveStep = 0;
|
| 415 |
+
displayFrame(currentFrameIndex);
|
| 416 |
+
}, 1000);
|
| 417 |
+
}, 1500);
|
| 418 |
+
}, 1500);
|
| 419 |
+
}, 1000);
|
| 420 |
+
}
|
| 421 |
+
|
| 422 |
+
function selectPlan(frameIndex, planIndex){
|
| 423 |
+
const frame = frames[frameIndex];
|
| 424 |
+
frame.selectedPlan = frame.plans[planIndex];
|
| 425 |
+
displayFrame(frameIndex);
|
| 426 |
+
}
|
| 427 |
+
|
| 428 |
+
function jumpToFrame(frameIndex){
|
| 429 |
+
if (isPlaying) togglePlayback();
|
| 430 |
+
displayFrame(frameIndex);
|
| 431 |
+
if (frames[frameIndex].status === 'pending' && frameIndex <= currentFrameIndex + 1){
|
| 432 |
+
currentActiveStep = 1;
|
| 433 |
+
processCurrentFrame();
|
| 434 |
+
}
|
| 435 |
+
}
|
| 436 |
+
|
| 437 |
+
function previousFrame(){ if (currentFrameIndex > 0) displayFrame(currentFrameIndex - 1); }
|
| 438 |
+
function nextFrame(){ if (currentFrameIndex < totalFramesCount - 1){ const nextIndex = currentFrameIndex + 1; displayFrame(nextIndex); if (frames[nextIndex].status === 'pending'){ currentActiveStep = 1; processCurrentFrame(); } } }
|
| 439 |
+
|
| 440 |
+
function togglePlayback(){
|
| 441 |
+
const playBtn = document.getElementById('playBtn');
|
| 442 |
+
if (isPlaying){ clearInterval(playInterval); playBtn.textContent = '▶️ Play'; isPlaying = false; }
|
| 443 |
+
else { playBtn.textContent = '⏸️ Pause'; isPlaying = true; playInterval = setInterval(() => { if (currentFrameIndex < totalFramesCount - 1) nextFrame(); else togglePlayback(); }, 3000); }
|
| 444 |
+
}
|
| 445 |
+
|
| 446 |
+
function updateNavigationButtons(){
|
| 447 |
+
document.getElementById('prevBtn').disabled = currentFrameIndex === 0;
|
| 448 |
+
document.getElementById('nextBtn').disabled = currentFrameIndex === totalFramesCount - 1;
|
| 449 |
+
}
|
| 450 |
+
|
| 451 |
+
function createTimeline(){
|
| 452 |
+
const markersContainer = document.getElementById('timelineMarkers');
|
| 453 |
+
markersContainer.innerHTML = '';
|
| 454 |
+
for (let i = 0; i < totalFramesCount; i++){
|
| 455 |
+
const marker = document.createElement('div');
|
| 456 |
+
marker.className = 'frame-marker';
|
| 457 |
+
marker.textContent = i + 1;
|
| 458 |
+
marker.style.left = `${(i / (totalFramesCount - 1)) * 100}%`;
|
| 459 |
+
marker.onclick = () => jumpToFrame(i);
|
| 460 |
+
if (i === 0) marker.classList.add('current');
|
| 461 |
+
markersContainer.appendChild(marker);
|
| 462 |
+
}
|
| 463 |
+
}
|
| 464 |
+
|
| 465 |
+
function updateTimeline(){
|
| 466 |
+
const progress = ((currentFrameIndex + 1) / totalFramesCount) * 100;
|
| 467 |
+
document.getElementById('timelineProgress').style.width = progress + '%';
|
| 468 |
+
document.getElementById('currentFrame').textContent = currentFrameIndex + 1;
|
| 469 |
+
const markers = document.querySelectorAll('.frame-marker');
|
| 470 |
+
markers.forEach((marker, index) => {
|
| 471 |
+
marker.className = 'frame-marker';
|
| 472 |
+
if (index < currentFrameIndex) marker.classList.add('completed');
|
| 473 |
+
else if (index === currentFrameIndex) marker.classList.add('current');
|
| 474 |
+
});
|
| 475 |
+
}
|
| 476 |
+
|
| 477 |
+
function displayFrame(frameIndex){
|
| 478 |
+
if (frameIndex < 0 || frameIndex >= totalFramesCount) return;
|
| 479 |
+
currentFrameIndex = frameIndex;
|
| 480 |
+
const frame = frames[frameIndex];
|
| 481 |
+
updateTimeline();
|
| 482 |
+
updateNavigationButtons();
|
| 483 |
+
updateResults();
|
| 484 |
+
const display = document.getElementById('iterationDisplay');
|
| 485 |
+
|
| 486 |
+
// NEW: Create sequence indicator
|
| 487 |
+
const sequenceIndicatorHTML = `
|
| 488 |
+
<div class="sequence-indicator">
|
| 489 |
+
<div class="sequence-title">🔄 Processing Sequence</div>
|
| 490 |
+
<div class="sequence-flow">
|
| 491 |
+
<div class="sequence-step ${frame.currentStep === 1 ? 'active' : ''}">
|
| 492 |
+
<div class="sequence-number">1</div>
|
| 493 |
+
<span>Observe</span>
|
| 494 |
+
</div>
|
| 495 |
+
<div class="sequence-arrow">→</div>
|
| 496 |
+
<div class="sequence-step ${frame.currentStep === 2 ? 'active' : ''}">
|
| 497 |
+
<div class="sequence-number">2</div>
|
| 498 |
+
<span>Plan</span>
|
| 499 |
+
</div>
|
| 500 |
+
<div class="sequence-arrow">→</div>
|
| 501 |
+
<div class="sequence-step ${frame.currentStep === 3 ? 'active' : ''}">
|
| 502 |
+
<div class="sequence-number">3</div>
|
| 503 |
+
<span>Simulate</span>
|
| 504 |
+
</div>
|
| 505 |
+
<div class="sequence-arrow">→</div>
|
| 506 |
+
<div class="sequence-step ${frame.currentStep === 4 ? 'active' : ''}">
|
| 507 |
+
<div class="sequence-number">4</div>
|
| 508 |
+
<span>Select</span>
|
| 509 |
+
</div>
|
| 510 |
+
</div>
|
| 511 |
+
</div>`;
|
| 512 |
+
|
| 513 |
+
// Build the shared Step 4 + side column HTML
|
| 514 |
+
const step4WithPlans = `
|
| 515 |
+
<div class="step4-wrap">
|
| 516 |
+
<div class="step-card ${(frame.status === 'current' || frame.completed) && frame.currentStep === 4 ? 'active processing' : (frame.status === 'current' || frame.completed) ? 'active' : ''} step4-card">
|
| 517 |
+
<div class="step-header">
|
| 518 |
+
<div class="step-number ${frame.currentStep === 4 ? 'active-number' : ''}">4</div>
|
| 519 |
+
<div class="step-title">Best Plan Selection</div>
|
| 520 |
+
</div>
|
| 521 |
+
<div class="step-content">
|
| 522 |
+
⭐ ${frame.selectedPlan ? 'Plan Selected' : 'Evaluating options'}<br/>
|
| 523 |
+
<small>${frame.selectedPlan ? frame.selectedPlan.title : 'Choosing optimal action'}</small>
|
| 524 |
+
</div>
|
| 525 |
+
</div>
|
| 526 |
+
<div class="plan-list">
|
| 527 |
+
${frame.plans.map((plan, idx) => `
|
| 528 |
+
<div class="plan-card ${frame.selectedPlan === plan ? 'selected' : ''}" onclick="selectPlan(${frameIndex}, ${idx})">
|
| 529 |
+
<div class="plan-title">${plan.title}</div>
|
| 530 |
+
<div style="font-size:.9em;color:#666;margin-bottom:10px;">${plan.description}</div>
|
| 531 |
+
<div style="text-align:center;padding:8px;background:#f0f0f0;border-radius:6px;font-weight:bold;color:#333;">
|
| 532 |
+
${plan.ranking === 1 ? '🥇 1st Choice' : plan.ranking === 2 ? '🥈 2nd Choice' : '🥉 3rd Choice'}
|
| 533 |
+
</div>
|
| 534 |
+
</div>
|
| 535 |
+
`).join('')}
|
| 536 |
+
</div>
|
| 537 |
+
</div>`;
|
| 538 |
+
|
| 539 |
+
if (frameIndex === 0){
|
| 540 |
+
display.innerHTML = `
|
| 541 |
+
<div class="iteration-header">
|
| 542 |
+
<div class="iteration-title">Frame ${frame.frameNumber} - Closed Loop Iteration (${frame.frameKey})</div>
|
| 543 |
+
<div class="iteration-status">${frame.completed ? 'Completed' : frame.status === 'current' ? 'Processing...' : 'Ready'}</div>
|
| 544 |
+
</div>
|
| 545 |
+
${frame.status === 'current' ? sequenceIndicatorHTML : ''}
|
| 546 |
+
<div class="step-grid">
|
| 547 |
+
<div class="step-card ${(frame.status === 'current' || frame.completed) && frame.currentStep === 1 ? 'active processing' : (frame.status === 'current' || frame.completed) ? 'active' : ''}">
|
| 548 |
+
<div class="step-header">
|
| 549 |
+
<div class="step-number ${frame.currentStep === 1 ? 'active-number' : ''}">1</div>
|
| 550 |
+
<div class="step-title">Current Observation</div>
|
| 551 |
+
</div>
|
| 552 |
+
<div class="step-content" style="padding:8px;">
|
| 553 |
+
<img src="https://huggingface.co/datasets/zonszer/demo_source_data/resolve/main/AR/FTwan21_lora/5ZKStnWn8Zo/E014/${frame.frameKey}/real_obs_bbox.png" alt="Current Observation" style="width:100%;max-height:200px;object-fit:contain;border-radius:6px;margin-bottom:8px;"/>
|
| 554 |
+
<small style="color:#666;">First-Person Camera View with Bounding Boxes</small>
|
| 555 |
+
</div>
|
| 556 |
+
</div>
|
| 557 |
+
<div class="step-card ${(frame.status === 'current' || frame.completed) && frame.currentStep === 2 ? 'active processing' : (frame.status === 'current' || frame.completed) ? 'active' : ''}">
|
| 558 |
+
<div class="step-header">
|
| 559 |
+
<div class="step-number ${frame.currentStep === 2 ? 'active-number' : ''}">2</div>
|
| 560 |
+
<div class="step-title">VLM Planning</div>
|
| 561 |
+
</div>
|
| 562 |
+
<div class="step-content">🧠 Generated ${frame.plans.length} plans<br/><small>Target: ${currentScenario.target}</small></div>
|
| 563 |
+
</div>
|
| 564 |
+
<div class="step-card ${(frame.status === 'current' || frame.completed) && frame.currentStep === 3 ? 'active processing' : (frame.status === 'current' || frame.completed) ? 'active' : ''}">
|
| 565 |
+
<div class="step-header">
|
| 566 |
+
<div class="step-number ${frame.currentStep === 3 ? 'active-number' : ''}">3</div>
|
| 567 |
+
<div class="step-title">World Model Simulation</div>
|
| 568 |
+
</div>
|
| 569 |
+
<div class="step-content" style="padding:8px;">
|
| 570 |
+
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:8px;">
|
| 571 |
+
<div>
|
| 572 |
+
<video src="https://huggingface.co/datasets/zonszer/demo_source_data/resolve/main/AR/FTwan21_lora/5ZKStnWn8Zo/E014/${frame.frameKey}/world_model_gen/obj_centered_gen_video_1.mp4" controls style="width:100%;height:140px;object-fit:contain;border-radius:4px;"></video>
|
| 573 |
+
<div style="text-align:center;font-size:0.8em;color:#888;margin-top:4px;">Prediction 1</div>
|
| 574 |
+
</div>
|
| 575 |
+
<div>
|
| 576 |
+
<video src="https://huggingface.co/datasets/zonszer/demo_source_data/resolve/main/AR/FTwan21_lora/5ZKStnWn8Zo/E014/${frame.frameKey}/world_model_gen/obj_centered_gen_video_2.mp4" controls style="width:100%;height:140px;object-fit:contain;border-radius:4px;"></video>
|
| 577 |
+
<div style="text-align:center;font-size:0.8em;color:#888;margin-top:4px;">Prediction 2</div>
|
| 578 |
+
</div>
|
| 579 |
+
</div>
|
| 580 |
+
<small style="color:#666;">Generated Future Views (Object-Centered)</small>
|
| 581 |
+
</div>
|
| 582 |
+
</div>
|
| 583 |
+
${step4WithPlans}
|
| 584 |
+
</div>`;
|
| 585 |
+
} else {
|
| 586 |
+
display.innerHTML = `
|
| 587 |
+
<div class="iteration-header">
|
| 588 |
+
<div class="iteration-title">Frame ${frame.frameNumber} - Closed Loop Iteration (${frame.frameKey})</div>
|
| 589 |
+
<div class="iteration-status">${frame.completed ? 'Completed' : frame.status === 'current' ? 'Processing...' : 'Ready'}</div>
|
| 590 |
+
</div>
|
| 591 |
+
${frame.status === 'current' ? sequenceIndicatorHTML : ''}
|
| 592 |
+
<div class="step-grid">
|
| 593 |
+
<div class="step-card ${(frame.status === 'current' || frame.completed) && frame.currentStep === 1 ? 'active processing' : (frame.status === 'current' || frame.completed) ? 'active' : ''}">
|
| 594 |
+
<div class="step-header">
|
| 595 |
+
<div class="step-number ${frame.currentStep === 1 ? 'active-number' : ''}">1</div>
|
| 596 |
+
<div class="step-title">Current Observation</div>
|
| 597 |
+
</div>
|
| 598 |
+
<div class="step-content" style="padding:8px;">
|
| 599 |
+
<img src="https://huggingface.co/datasets/zonszer/demo_source_data/resolve/main/AR/FTwan21_lora/5ZKStnWn8Zo/E014/${frame.frameKey}/real_obs_bbox.png" alt="Current Observation" style="width:100%;max-height:200px;object-fit:contain;border-radius:6px;margin-bottom:8px;"/>
|
| 600 |
+
<small style="color:#666;">First-Person Camera View with Bounding Boxes</small>
|
| 601 |
+
</div>
|
| 602 |
+
</div>
|
| 603 |
+
<div class="step-card ${(frame.status === 'current' || frame.completed) && frame.currentStep === 2 ? 'active processing' : (frame.status === 'current' || frame.completed) ? 'active' : ''}">
|
| 604 |
+
<div class="step-header">
|
| 605 |
+
<div class="step-number ${frame.currentStep === 2 ? 'active-number' : ''}">2</div>
|
| 606 |
+
<div class="step-title">VLM Planning</div>
|
| 607 |
+
</div>
|
| 608 |
+
<div class="step-content">🧠 Generated ${frame.plans.length} plans<br/><small>Target: ${currentScenario.target}</small></div>
|
| 609 |
+
</div>
|
| 610 |
+
<div class="step-card ${(frame.status === 'current' || frame.completed) && frame.currentStep === 3 ? 'active processing' : (frame.status === 'current' || frame.completed) ? 'active' : ''}">
|
| 611 |
+
<div class="step-header">
|
| 612 |
+
<div class="step-number ${frame.currentStep === 3 ? 'active-number' : ''}">3</div>
|
| 613 |
+
<div class="step-title">World Model Simulation</div>
|
| 614 |
+
</div>
|
| 615 |
+
<div class="step-content" style="padding:8px;">
|
| 616 |
+
<div style="display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:8px;">
|
| 617 |
+
<div>
|
| 618 |
+
<video src="https://huggingface.co/datasets/zonszer/demo_source_data/resolve/main/AR/FTwan21_lora/5ZKStnWn8Zo/E014/${frame.frameKey}/world_model_gen/obj_centered_gen_video_1.mp4" controls style="width:100%;height:140px;object-fit:contain;border-radius:4px;"></video>
|
| 619 |
+
<div style="text-align:center;font-size:0.8em;color:#888;margin-top:4px;">Prediction 1</div>
|
| 620 |
+
</div>
|
| 621 |
+
<div>
|
| 622 |
+
<video src="https://huggingface.co/datasets/zonszer/demo_source_data/resolve/main/AR/FTwan21_lora/5ZKStnWn8Zo/E014/${frame.frameKey}/world_model_gen/obj_centered_gen_video_2.mp4" controls style="width:100%;height:140px;object-fit:contain;border-radius:4px;"></video>
|
| 623 |
+
<div style="text-align:center;font-size:0.8em;color:#888;margin-top:4px;">Prediction 2</div>
|
| 624 |
+
</div>
|
| 625 |
+
</div>
|
| 626 |
+
<small style="color:#666;">Generated Future Views (Object-Centered)</small>
|
| 627 |
+
</div>
|
| 628 |
+
</div>
|
| 629 |
+
${step4WithPlans}
|
| 630 |
+
</div>`;
|
| 631 |
+
}
|
| 632 |
+
|
| 633 |
+
if (frame.status === 'current' || frame.completed) display.classList.add('active');
|
| 634 |
+
else display.classList.remove('active');
|
| 635 |
+
}
|
| 636 |
+
|
| 637 |
+
function updateResults(){
|
| 638 |
+
const completedFrames = frames.filter(f => f.completed).length;
|
| 639 |
+
if (completedFrames === totalFramesCount){
|
| 640 |
+
const success = Math.random() > 0.2;
|
| 641 |
+
const statusElement = document.getElementById('statusDisplay');
|
| 642 |
+
const finalVideo = document.getElementById('finalVideo');
|
| 643 |
+
if (success){
|
| 644 |
+
statusElement.textContent = 'Mission Success!';
|
| 645 |
+
statusElement.className = 'final-status-display success';
|
| 646 |
+
} else {
|
| 647 |
+
statusElement.textContent = 'Mission Failed';
|
| 648 |
+
statusElement.className = 'final-status-display failure';
|
| 649 |
+
}
|
| 650 |
+
finalVideo.style.display = 'block';
|
| 651 |
+
} else if (completedFrames > 0){
|
| 652 |
+
const statusElement = document.getElementById('statusDisplay');
|
| 653 |
+
statusElement.textContent = 'In Progress...';
|
| 654 |
+
statusElement.className = 'final-status-display pending';
|
| 655 |
+
document.getElementById('finalVideo').style.display = 'none';
|
| 656 |
+
}
|
| 657 |
+
}
|
| 658 |
+
</script>
|
| 659 |
+
</body>
|
| 660 |
+
</html>
|