| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="utf-8"/> |
| <style> |
| *{margin:0;padding:0;box-sizing:border-box} |
| body{background:#03060d;overflow:hidden;font-family:'Segoe UI',system-ui,-apple-system,sans-serif;color:#e6edf3} |
| #arena{width:100%;height:100vh;display:block;cursor:grab} |
| #arena.grabbing{cursor:grabbing} |
| #hud{position:absolute;top:12px;left:12px;pointer-events:none;background:rgba(4,8,16,0.94);padding:16px 18px;border-radius:14px;border:1px solid rgba(88,166,255,0.25);backdrop-filter:blur(16px);max-width:320px;line-height:1.7;box-shadow:0 8px 40px rgba(0,0,0,0.6),inset 0 1px 0 rgba(88,166,255,0.08);z-index:10} |
| #hud h3{color:#58a6ff;font-size:15px;margin-bottom:8px;letter-spacing:0.8px;text-shadow:0 0 20px rgba(88,166,255,0.6);display:flex;align-items:center;gap:8px} |
| #hud h3::before{content:'';display:inline-block;width:22px;height:22px;background:linear-gradient(135deg,#76b900,#58a6ff);border-radius:5px;box-shadow:0 0 12px rgba(118,185,0,0.4);flex-shrink:0} |
| .rob{margin:4px 0;font-size:12px;display:flex;align-items:center;gap:8px} |
| .rob .dot{width:10px;height:10px;border-radius:50%;flex-shrink:0;box-shadow:0 0 6px currentColor,0 0 12px currentColor;animation:pulse 2s ease-in-out infinite} |
| @keyframes pulse{0%,100%{opacity:1}50%{opacity:0.6}} |
| .val{color:#7ee787;font-weight:700}.lbl{color:#6e7681;font-size:10px} |
| #metrics{position:absolute;top:12px;right:12px;pointer-events:none;background:rgba(4,8,16,0.94);padding:14px 16px;border-radius:14px;border:1px solid rgba(88,166,255,0.18);backdrop-filter:blur(16px);min-width:230px;font-size:11px;box-shadow:0 8px 40px rgba(0,0,0,0.6),inset 0 1px 0 rgba(88,166,255,0.08);z-index:10} |
| #metrics h4{color:#58a6ff;font-size:13px;margin-bottom:8px;letter-spacing:0.6px;text-shadow:0 0 15px rgba(88,166,255,0.4)} |
| .mr{display:flex;justify-content:space-between;margin:4px 0;align-items:center;gap:6px} |
| .mr .bar{width:80px;height:6px;background:#0d1117;border-radius:3px;overflow:hidden;box-shadow:inset 0 1px 3px rgba(0,0,0,0.5)} |
| .mr .bf{height:100%;border-radius:3px;transition:width 0.5s ease;box-shadow:0 0 6px currentColor} |
| #narration{position:absolute;bottom:105px;left:50%;transform:translateX(-50%);background:rgba(4,8,16,0.97);padding:16px 28px;border-radius:14px;border:2px solid rgba(227,179,65,0.5);backdrop-filter:blur(16px);max-width:780px;width:92%;text-align:center;font-size:14px;line-height:1.6;opacity:0;transition:opacity 0.4s ease;pointer-events:none;box-shadow:0 8px 50px rgba(227,179,65,0.15),0 0 30px rgba(227,179,65,0.08);z-index:28} |
| #narration.visible{opacity:1} |
| .nt{color:#e3b341;font-weight:900;font-size:15px;margin-bottom:8px;text-transform:uppercase;letter-spacing:2px;text-shadow:0 0 14px rgba(227,179,65,0.5)}.nx{color:#e6edf3;font-size:13px;line-height:1.6;text-align:left;min-height:42px} |
| #cam-row{position:absolute;bottom:72px;left:50%;transform:translateX(-50%);display:flex;gap:5px;z-index:15} |
| #feat-row{position:absolute;bottom:42px;left:50%;transform:translateX(-50%);display:flex;gap:4px;z-index:15} |
| #ctrl-row{position:absolute;bottom:12px;left:50%;transform:translateX(-50%);display:flex;gap:5px;z-index:15} |
| #cam-row button,#ctrl-row button,#feat-row button{background:rgba(13,17,23,0.95);color:#c9d1d9;border:1px solid #21262d;padding:6px 12px;border-radius:7px;cursor:pointer;font-size:10px;transition:all 0.25s;white-space:nowrap;letter-spacing:0.3px;font-weight:500} |
| #cam-row button:hover,#ctrl-row button:hover,#feat-row button:hover{background:#238636;border-color:#238636;color:#fff;transform:translateY(-1px)} |
| #cam-row button.active,#feat-row button.active{background:#1f6feb;border-color:#58a6ff;color:#fff;box-shadow:0 0 12px rgba(88,166,255,0.3)} |
| #ctrl-row button.nb,#feat-row button.nb{background:rgba(227,179,65,0.1);border-color:rgba(227,179,65,0.4);color:#e3b341} |
| #ctrl-row button.nb.active,#feat-row button.nb.active{background:#e3b341;color:#0d1117} |
| #spd{position:absolute;bottom:72px;right:12px;background:rgba(4,8,16,0.95);padding:8px 16px;border-radius:9px;border:1px solid #21262d;font-size:14px;font-weight:700;color:#8b949e;z-index:10;transition:all 0.3s ease;letter-spacing:0.5px} |
| #sc{position:absolute;bottom:72px;left:50%;transform:translateX(-50%);color:#58a6ff;font-size:12px;font-weight:700;text-shadow:0 0 12px rgba(88,166,255,0.5);z-index:10} |
| #tl{position:absolute;bottom:64px;left:5%;width:90%;height:4px;background:rgba(13,17,23,0.9);border-radius:2px;cursor:pointer;pointer-events:auto;box-shadow:inset 0 1px 2px rgba(0,0,0,0.5);z-index:10} |
| #tf{height:100%;border-radius:2px;background:linear-gradient(90deg,#1f6feb,#58a6ff);transition:width 0.1s linear;box-shadow:0 0 6px rgba(88,166,255,0.3)} |
| #tm{position:absolute;top:-3px;width:10px;height:10px;border-radius:50%;background:#58a6ff;box-shadow:0 0 10px rgba(88,166,255,0.7);transform:translateX(-50%)} |
| #robotRef{position:absolute;bottom:110px;left:12px;width:220px;background:rgba(4,8,16,0.94);border-radius:12px;border:1px solid rgba(88,166,255,0.22);pointer-events:none;box-shadow:0 6px 30px rgba(0,0,0,0.6),inset 0 1px 0 rgba(88,166,255,0.08);z-index:10;padding:8px 9px;backdrop-filter:blur(14px)} |
| #robotRef .rr-title{font-size:9px;color:#58a6ff;font-weight:800;letter-spacing:1.6px;text-transform:uppercase;text-align:center;margin-bottom:6px;text-shadow:0 0 12px rgba(88,166,255,0.4)} |
| #robotRef .rr-grid{display:grid;grid-template-columns:1fr 1fr;gap:5px} |
| .rr-card{background:rgba(13,17,23,0.7);border-radius:7px;border:1px solid rgba(48,54,65,0.8);padding:6px 4px 5px;text-align:center;transition:all 0.4s ease;position:relative;overflow:hidden} |
| .rr-card.active{border-color:var(--rc);box-shadow:0 0 16px var(--rg);background:rgba(13,17,23,0.95)} |
| .rr-card.active::before{content:'';position:absolute;top:0;left:0;right:0;height:2px;background:var(--rc);box-shadow:0 0 10px var(--rg)} |
| .rr-card svg{width:72px;height:52px;display:block;margin:0 auto 3px;opacity:0.75;transition:opacity 0.4s} |
| .rr-card.active svg{opacity:1} |
| .rr-name{font-size:9px;font-weight:800;color:var(--rc);letter-spacing:0.4px;line-height:1.15;transition:color 0.4s;text-shadow:0 0 8px var(--rg)} |
| .rr-card.active .rr-name{color:var(--rc);text-shadow:0 0 14px var(--rg)} |
| .rr-sub{font-size:9px;color:#8b949e;letter-spacing:0.3px;margin-top:2px;font-weight:600} |
| .rr-card.active .rr-sub{color:#c9d1d9} |
| #ins{position:absolute;background:rgba(4,8,16,0.96);padding:14px 16px;border-radius:12px;border:1px solid rgba(88,166,255,0.3);backdrop-filter:blur(16px);width:300px;font-size:10px;opacity:0;pointer-events:none;transition:opacity 0.25s ease;box-shadow:0 8px 40px rgba(0,0,0,0.7);z-index:40;max-height:420px;overflow-y:auto} |
| #ins.vis{opacity:1;pointer-events:auto} |
| #ins h4{color:#58a6ff;font-size:13px;margin-bottom:8px} |
| .sp{margin:3px 0;display:flex;justify-content:space-between}.sl{color:#8b949e}.sv{color:#7ee787;font-weight:600} |
| .phys{margin-top:8px;padding-top:8px;border-top:1px solid rgba(88,166,255,0.15)} |
| .phys h5{color:#e3b341;font-size:11px;margin-bottom:5px;letter-spacing:0.5px} |
| .eq{font-family:'Courier New',monospace;color:#bc8cff;font-size:10px;margin:3px 0;padding:3px 6px;background:rgba(188,140,255,0.06);border-radius:4px;border-left:2px solid rgba(188,140,255,0.3)} |
| .eq-note{color:#6e7681;font-size:9px;margin:1px 0 4px 8px;font-style:italic} |
| #kh{position:absolute;bottom:110px;right:12px;font-size:9px;color:#3d444d;text-align:right;line-height:1.6;pointer-events:none;z-index:10} |
| #kh kbd{background:#0d1117;border:1px solid #21262d;border-radius:3px;padding:1px 4px;font-family:inherit;color:#6e7681;font-size:9px} |
|
|
| #evalPanel{position:absolute;top:12px;right:260px;width:310px;background:rgba(4,8,16,0.96);border-radius:14px;border:1px solid rgba(126,231,135,0.25);backdrop-filter:blur(16px);padding:0;z-index:12;box-shadow:0 8px 40px rgba(0,0,0,0.6),inset 0 1px 0 rgba(126,231,135,0.08);transition:opacity 0.35s ease,transform 0.35s ease;opacity:0;transform:translateX(20px);pointer-events:none;max-height:calc(100vh - 30px);overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(126,231,135,0.2) transparent} |
| #evalPanel.vis{opacity:1;transform:translateX(0);pointer-events:auto} |
| #evalPanel::-webkit-scrollbar{width:4px} |
| #evalPanel::-webkit-scrollbar-thumb{background:rgba(126,231,135,0.2);border-radius:2px} |
| .ep-hdr{padding:12px 16px 8px;border-bottom:1px solid rgba(126,231,135,0.15);display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;background:rgba(4,8,16,0.98);border-radius:14px 14px 0 0;z-index:1} |
| .ep-hdr h4{color:#7ee787;font-size:13px;letter-spacing:0.8px;text-shadow:0 0 15px rgba(126,231,135,0.4);margin:0} |
| .ep-hdr .ep-badge{font-size:9px;color:#0d1117;background:#7ee787;padding:2px 7px;border-radius:10px;font-weight:700;letter-spacing:0.5px} |
| .ep-card{padding:10px 16px;border-bottom:1px solid rgba(33,38,45,0.6)} |
| .ep-card:last-child{border-bottom:none;padding-bottom:14px} |
| .ep-card-hdr{display:flex;align-items:center;gap:8px;margin-bottom:8px} |
| .ep-card-hdr .ep-dot{width:8px;height:8px;border-radius:50%;flex-shrink:0} |
| .ep-card-hdr .ep-name{font-size:11px;font-weight:700;letter-spacing:0.4px} |
| .ep-card-hdr .ep-score{margin-left:auto;font-size:13px;font-weight:900;letter-spacing:0.5px} |
| .ep-row{display:flex;align-items:center;margin:3px 0;font-size:10px} |
| .ep-row .ep-lbl{color:#8b949e;width:115px;flex-shrink:0} |
| .ep-row .ep-val{color:#e6edf3;font-weight:600;width:52px;text-align:right;flex-shrink:0} |
| .ep-row .ep-bar{flex:1;height:4px;background:#0d1117;border-radius:2px;margin-left:6px;overflow:hidden} |
| .ep-row .ep-bf{height:100%;border-radius:2px;transition:width 0.6s ease} |
| .ep-note{font-size:9px;color:#6e7681;font-style:italic;margin-top:4px;padding:4px 6px;background:rgba(110,118,129,0.06);border-radius:4px;border-left:2px solid rgba(110,118,129,0.2);line-height:1.4} |
| .ep-compliance{display:flex;gap:4px;flex-wrap:wrap;margin-top:4px} |
| .ep-compliance .ep-tag{font-size:8px;padding:1px 5px;border-radius:3px;font-weight:600;letter-spacing:0.3px} |
| .varp-gauges{display:flex;justify-content:space-around;gap:4px;padding:2px 0} |
| .varp-g{text-align:center;flex:1} |
| .varp-ring{width:48px;height:48px;margin:0 auto 3px;border-radius:50%;background:conic-gradient(var(--clr) calc(var(--pct)*1%),rgba(33,38,45,0.6) 0);display:flex;align-items:center;justify-content:center;position:relative;box-shadow:0 0 8px rgba(88,166,255,0.1);transition:background 0.6s ease} |
| .varp-ring::before{content:'';position:absolute;width:36px;height:36px;border-radius:50%;background:#0a0f1a} |
| .varp-num{position:relative;z-index:1;font-size:10px;font-weight:900;color:#e6edf3;letter-spacing:0.3px} |
| .varp-label{font-size:8px;color:#6e7681;letter-spacing:0.3px;text-transform:uppercase} |
| .rc-grid{display:grid;grid-template-columns:1fr 1fr;gap:3px 8px} |
| .rc-item{display:flex;align-items:center;gap:5px;padding:3px 4px;border-radius:4px;transition:background 0.3s} |
| .rc-item:hover{background:rgba(63,185,80,0.05)} |
| .rc-led{width:7px;height:7px;border-radius:50%;flex-shrink:0;transition:background 0.5s,box-shadow 0.5s} |
| .rc-led.pass{background:#3fb950;box-shadow:0 0 5px #3fb950,0 0 10px rgba(63,185,80,0.3)} |
| .rc-led.warn{background:#e3b341;box-shadow:0 0 5px #e3b341,0 0 10px rgba(227,179,65,0.3)} |
| .rc-led.fail{background:#f85149;box-shadow:0 0 5px #f85149,0 0 10px rgba(248,81,73,0.3)} |
| .rc-std{font-size:9px;font-weight:700;color:#c9d1d9;letter-spacing:0.2px;white-space:nowrap} |
| .rc-desc{font-size:8px;color:#484f58;margin-left:auto;text-align:right;white-space:nowrap} |
| #cr2Panel{position:absolute;top:12px;left:12px;width:320px;background:rgba(4,8,16,0.96);border-radius:14px;border:1px solid rgba(240,136,62,0.25);backdrop-filter:blur(16px);padding:0;z-index:12;box-shadow:0 8px 40px rgba(0,0,0,0.6),inset 0 1px 0 rgba(240,136,62,0.08);transition:opacity 0.35s ease,transform 0.35s ease;opacity:0;transform:translateX(-20px);pointer-events:none;max-height:calc(100vh - 30px);overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(240,136,62,0.2) transparent} |
| #cr2Panel.vis{opacity:1;transform:translateX(0);pointer-events:auto} |
| #cr2Panel::-webkit-scrollbar{width:4px} |
| #cr2Panel::-webkit-scrollbar-thumb{background:rgba(240,136,62,0.2);border-radius:2px} |
| .cr2-hdr{padding:12px 16px 8px;border-bottom:1px solid rgba(240,136,62,0.15);display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;background:rgba(4,8,16,0.98);border-radius:14px 14px 0 0;z-index:1} |
| .cr2-hdr h4{color:#f0883e;font-size:13px;letter-spacing:0.8px;text-shadow:0 0 15px rgba(240,136,62,0.4);margin:0} |
| .cr2-hdr .cr2-badge{font-size:9px;color:#0d1117;background:#f0883e;padding:2px 7px;border-radius:10px;font-weight:700} |
| .cr2-qbox{padding:10px 14px;border-bottom:1px solid rgba(33,38,45,0.5)} |
| .cr2-input-wrap{display:flex;gap:6px;align-items:center} |
| .cr2-input{flex:1;background:rgba(13,17,23,0.8);border:1px solid rgba(240,136,62,0.2);border-radius:8px;padding:7px 10px;color:#e6edf3;font-size:11px;font-family:system-ui;outline:none;transition:border-color 0.2s} |
| .cr2-input:focus{border-color:rgba(240,136,62,0.5)} |
| .cr2-go{background:rgba(240,136,62,0.2);border:1px solid rgba(240,136,62,0.4);border-radius:8px;padding:6px 12px;color:#f0883e;font-size:11px;font-weight:700;cursor:pointer;transition:background 0.2s} |
| .cr2-go:hover{background:rgba(240,136,62,0.35)} |
| .cr2-presets{display:flex;flex-wrap:wrap;gap:4px;margin-top:8px} |
| .cr2-preset{font-size:9px;padding:3px 8px;border-radius:12px;border:1px solid rgba(240,136,62,0.2);background:rgba(240,136,62,0.06);color:#f0883e;cursor:pointer;transition:background 0.2s} |
| .cr2-preset:hover{background:rgba(240,136,62,0.15)} |
| .cr2-result{padding:12px 14px} |
| .cr2-chain{margin-bottom:10px} |
| .cr2-step{display:flex;gap:8px;margin:4px 0;align-items:flex-start} |
| .cr2-step-num{width:18px;height:18px;border-radius:50%;background:rgba(240,136,62,0.15);color:#f0883e;font-size:9px;font-weight:700;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px} |
| .cr2-step-txt{font-size:10px;color:#c9d1d9;line-height:1.5} |
| .cr2-conf{display:flex;align-items:center;gap:8px;margin-top:6px;padding:6px 8px;background:rgba(240,136,62,0.04);border-radius:6px;border-left:2px solid rgba(240,136,62,0.3)} |
| .cr2-conf-lbl{font-size:9px;color:#8b949e} |
| .cr2-conf-val{font-size:12px;font-weight:800;color:#f0883e} |
| .cr2-latency{font-size:9px;color:#6e7681;margin-left:auto} |
| .cr2-bb-legend{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px;padding-top:6px;border-top:1px solid rgba(33,38,45,0.4)} |
| .cr2-bb-item{display:flex;align-items:center;gap:4px;font-size:9px;color:#8b949e} |
| .cr2-bb-dot{width:8px;height:8px;border-radius:2px;border:1.5px solid} |
| #cr2Suggest{display:none;position:absolute;left:14px;right:14px;background:rgba(4,8,16,0.98);border:1px solid rgba(240,136,62,0.25);border-radius:8px;z-index:2;max-height:140px;overflow-y:auto} |
| .cr2-sug-item{font-size:10px;color:#c9d1d9;padding:6px 10px;cursor:pointer;transition:background 0.15s;border-bottom:1px solid rgba(33,38,45,0.3)} |
| .cr2-sug-item:last-child{border-bottom:none} |
| .cr2-sug-item:hover{background:rgba(240,136,62,0.12);color:#f0883e} |
|
|
| /* === FEATURE 5: VARP LIVE LEADERBOARD HUD === */ |
| #varpHud{position:absolute;top:10px;left:50%;transform:translateX(-50%);display:flex;align-items:center;gap:10px;background:rgba(4,8,16,0.92);padding:7px 16px 7px 12px;border-radius:12px;border:1px solid rgba(88,166,255,0.22);backdrop-filter:blur(16px);z-index:18;box-shadow:0 4px 24px rgba(0,0,0,0.5),inset 0 1px 0 rgba(88,166,255,0.06);pointer-events:none;transition:opacity 0.4s ease} |
| #varpHud .vh-logo{width:22px;height:22px;background:linear-gradient(135deg,#76b900,#58a6ff);border-radius:5px;box-shadow:0 0 10px rgba(118,185,0,0.35);flex-shrink:0} |
| #varpHud .vh-title{font-size:9px;color:#6e7681;font-weight:700;letter-spacing:1.2px;text-transform:uppercase;line-height:1;flex-shrink:0} |
| #varpHud .vh-composite{font-size:20px;font-weight:900;letter-spacing:-0.5px;line-height:1;flex-shrink:0;text-shadow:0 0 20px rgba(88,166,255,0.4);transition:color 0.3s} |
| #varpHud .vh-sep{width:1px;height:28px;background:rgba(88,166,255,0.15);flex-shrink:0} |
| #varpHud .vh-gauges{display:flex;gap:8px;align-items:center} |
| #varpHud .vh-g{text-align:center;position:relative} |
| #varpHud .vh-ring{width:32px;height:32px;border-radius:50%;background:conic-gradient(var(--vc) calc(var(--vp)*1%),rgba(33,38,45,0.5) 0);display:flex;align-items:center;justify-content:center;transition:background 0.5s ease;position:relative} |
| #varpHud .vh-ring::before{content:'';position:absolute;width:24px;height:24px;border-radius:50%;background:rgba(4,8,16,0.95)} |
| #varpHud .vh-ring .vh-val{position:relative;z-index:1;font-size:8px;font-weight:800;color:#e6edf3;letter-spacing:-0.2px} |
| #varpHud .vh-lbl{font-size:6.5px;color:#484f58;font-weight:700;letter-spacing:0.8px;margin-top:2px;text-transform:uppercase} |
| #varpHud .vh-ring.pulse{animation:vhPulse 0.6s ease} |
| @keyframes vhPulse{0%{box-shadow:0 0 0 0 rgba(88,166,255,0.5)}50%{box-shadow:0 0 0 6px rgba(88,166,255,0.15)}100%{box-shadow:0 0 0 0 rgba(88,166,255,0)}} |
| #varpHud .vh-rank{display:flex;align-items:center;gap:4px;flex-shrink:0} |
| #varpHud .vh-rank-badge{font-size:7px;padding:2px 6px;border-radius:4px;font-weight:700;letter-spacing:0.5px;white-space:nowrap} |
|
|
| /* === FEATURE 3: MULTI-ROBOT COORDINATION TIMELINE === */ |
| #timelinePanel{position:absolute;bottom:105px;left:160px;right:200px;background:rgba(4,8,16,0.95);border-radius:12px;border:1px solid rgba(88,166,255,0.2);backdrop-filter:blur(16px);padding:10px 14px 8px;z-index:16;box-shadow:0 -4px 24px rgba(0,0,0,0.5);transition:opacity 0.35s ease,transform 0.35s ease;opacity:0;transform:translateY(20px);pointer-events:none} |
| #timelinePanel.vis{opacity:1;transform:translateY(0);pointer-events:auto} |
| .tl-hdr{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px} |
| .tl-hdr h4{color:#58a6ff;font-size:10px;letter-spacing:0.8px;margin:0;font-weight:700} |
| .tl-hdr .tl-time{font-size:9px;color:#8b949e;font-weight:600} |
| .tl-body{position:relative} |
| .tl-row{display:flex;align-items:center;height:20px;margin:2px 0} |
| .tl-label{width:80px;flex-shrink:0;font-size:8px;font-weight:700;letter-spacing:0.5px;text-align:right;padding-right:8px} |
| .tl-track{flex:1;height:14px;background:rgba(13,17,23,0.8);border-radius:3px;position:relative;overflow:visible;cursor:pointer} |
| .tl-seg{position:absolute;height:100%;border-radius:2px;display:flex;align-items:center;justify-content:center;font-size:6.5px;font-weight:700;letter-spacing:0.3px;color:rgba(255,255,255,0.85);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 3px;transition:filter 0.2s;cursor:pointer;box-sizing:border-box} |
| .tl-seg:hover{filter:brightness(1.3);z-index:2} |
| .tl-seg.active{box-shadow:0 0 8px rgba(255,255,255,0.3);z-index:3} |
| .tl-playhead{position:absolute;top:0;bottom:0;width:2px;background:#e3b341;z-index:5;pointer-events:none;transition:left 0.3s linear;box-shadow:0 0 6px rgba(227,179,65,0.5)} |
| .tl-playhead::before{content:'\u25bc';position:absolute;top:-10px;left:-4px;color:#e3b341;font-size:8px} |
| .tl-dep{position:absolute;pointer-events:none;z-index:1} |
| .tl-ruler{display:flex;justify-content:space-between;margin-top:4px;padding-left:80px} |
| .tl-ruler span{font-size:7px;color:#484f58;font-weight:600} |
| .tl-legend{display:flex;gap:8px;flex-wrap:wrap;margin-top:4px;padding-left:80px} |
| .tl-legend .tl-leg{display:flex;align-items:center;gap:3px;font-size:7px;color:#6e7681} |
| .tl-legend .tl-leg-dot{width:6px;height:6px;border-radius:2px;flex-shrink:0} |
|
|
| /* === FEATURE 6: JUDGE-READY PRESENTATION MODE === */ |
| #presBar{position:absolute;top:0;left:0;right:0;height:3px;z-index:25;pointer-events:none;opacity:0;transition:opacity 0.4s} |
| #presBar.vis{opacity:1} |
| #presBar .pb-fill{height:100%;background:linear-gradient(90deg,#76b900,#58a6ff,#e3b341,#bc8cff);border-radius:0 2px 2px 0;transition:width 0.5s linear;width:0%} |
| #presStage{position:absolute;top:50px;left:50%;transform:translateX(-50%);background:rgba(4,8,16,0.92);padding:5px 18px;border-radius:8px;border:1px solid rgba(227,179,65,0.35);z-index:20;opacity:0;transition:opacity 0.4s;pointer-events:none;white-space:nowrap} |
| #presStage.vis{opacity:1} |
| #presStage .ps-num{font-size:8px;color:#e3b341;font-weight:700;letter-spacing:1px} |
| #presStage .ps-title{font-size:11px;color:#e6edf3;font-weight:700;margin-left:6px;letter-spacing:0.3px} |
| #presSummary{position:absolute;inset:0;background:rgba(4,8,16,0.96);z-index:30;display:flex;align-items:center;justify-content:center;opacity:0;pointer-events:none;transition:opacity 0.6s} |
| #presSummary.vis{opacity:1;pointer-events:auto} |
| .ps-card{text-align:center;max-width:520px;padding:40px} |
| .ps-card .ps-logo{width:48px;height:48px;background:linear-gradient(135deg,#76b900,#58a6ff);border-radius:12px;margin:0 auto 16px;box-shadow:0 0 30px rgba(118,185,0,0.4)} |
| .ps-card h2{color:#e6edf3;font-size:24px;letter-spacing:1px;margin-bottom:4px} |
| .ps-card .ps-sub{color:#8b949e;font-size:12px;margin-bottom:20px} |
| .ps-card .ps-scores{display:flex;gap:20px;justify-content:center;margin-bottom:20px} |
| .ps-card .ps-sc{text-align:center} |
| .ps-card .ps-sc .ps-sv{font-size:28px;font-weight:900;letter-spacing:-1px} |
| .ps-card .ps-sc .ps-sl{font-size:9px;color:#8b949e;font-weight:600;letter-spacing:0.8px;text-transform:uppercase;margin-top:2px} |
| .ps-card .ps-stats{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;margin-bottom:20px} |
| .ps-card .ps-stat{background:rgba(88,166,255,0.06);border:1px solid rgba(88,166,255,0.12);border-radius:8px;padding:8px} |
| .ps-card .ps-stat .ps-sv2{font-size:16px;font-weight:800;color:#e6edf3} |
| .ps-card .ps-stat .ps-sl2{font-size:8px;color:#6e7681;letter-spacing:0.5px;margin-top:2px} |
| .ps-card .ps-dismiss{font-size:10px;color:#484f58;margin-top:12px;cursor:pointer} |
| .ps-card .ps-dismiss:hover{color:#8b949e} |
|
|
| /* === FEATURE 2: OBSERVATIONS === */ |
| #dtPanel{position:absolute;top:45px;right:8px;width:220px;bottom:55px;background:rgba(4,8,16,0.93);border-radius:10px;border:1px solid rgba(88,166,255,0.18);backdrop-filter:blur(16px);z-index:15;overflow-y:auto;overflow-x:hidden;opacity:0;transform:translateX(20px);transition:opacity 0.35s ease,transform 0.35s ease;pointer-events:none;scrollbar-width:thin;scrollbar-color:rgba(88,166,255,0.2) transparent} |
| #dtPanel.vis{opacity:1;transform:translateX(0);pointer-events:auto} |
| #dtPanel::-webkit-scrollbar{width:4px} |
| #dtPanel::-webkit-scrollbar-thumb{background:rgba(88,166,255,0.2);border-radius:2px} |
| .dt-hdr{padding:8px 10px 4px;border-bottom:1px solid rgba(88,166,255,0.12);display:flex;align-items:center;gap:6px;position:sticky;top:0;background:rgba(4,8,16,0.97);z-index:2} |
| .dt-hdr-icon{width:16px;height:16px;background:linear-gradient(135deg,#76b900,#58a6ff);border-radius:4px;flex-shrink:0} |
| .dt-hdr h4{font-size:9px;color:#58a6ff;letter-spacing:0.8px;margin:0;font-weight:700} |
| .dt-hdr .dt-live{font-size:7px;color:#3fb950;font-weight:700;letter-spacing:0.5px;margin-left:auto;display:flex;align-items:center;gap:3px} |
| .dt-hdr .dt-live::before{content:'';width:5px;height:5px;border-radius:50%;background:#3fb950;animation:dtPulse 1.5s infinite} |
| @keyframes dtPulse{0%,100%{opacity:1}50%{opacity:0.3}} |
| .dt-card{margin:6px 6px;padding:6px 8px;background:rgba(13,17,23,0.6);border-radius:6px;border-left:2px solid var(--dtc,#58a6ff)} |
| .dt-card-hdr{display:flex;align-items:center;justify-content:space-between;margin-bottom:4px} |
| .dt-card-hdr .dt-name{font-size:8px;font-weight:700;color:var(--dtc);letter-spacing:0.6px} |
| .dt-card-hdr .dt-status{font-size:6.5px;font-weight:700;padding:1px 5px;border-radius:3px;letter-spacing:0.4px} |
| .dt-status-ok{background:rgba(63,185,80,0.15);color:#3fb950} |
| .dt-status-warn{background:rgba(248,81,73,0.15);color:#f85149} |
| .dt-row{display:flex;justify-content:space-between;align-items:center;padding:1.5px 0} |
| .dt-row .dt-lbl{font-size:7px;color:#6e7681;letter-spacing:0.3px} |
| .dt-row .dt-val{font-size:7.5px;color:#e6edf3;font-weight:700;font-family:'SF Mono',monospace;letter-spacing:-0.2px} |
| .dt-bar-row{margin-top:2px} |
| .dt-bar-track{height:3px;background:rgba(33,38,45,0.8);border-radius:1.5px;overflow:hidden;margin-top:1px} |
| .dt-bar-fill{height:100%;border-radius:1.5px;transition:width 0.5s ease} |
| .dt-sep{height:1px;background:rgba(88,166,255,0.06);margin:2px 6px} |
| .dt-net{margin:6px 6px;padding:6px 8px;background:rgba(13,17,23,0.4);border-radius:6px} |
| .dt-net-title{font-size:7.5px;color:#8b949e;font-weight:700;letter-spacing:0.6px;margin-bottom:4px} |
| .dt-net-row{display:flex;align-items:center;gap:4px;padding:1px 0} |
| .dt-net-dot{width:4px;height:4px;border-radius:50%;flex-shrink:0} |
| .dt-net-link{font-size:6.5px;color:#6e7681;flex:1} |
| .dt-net-lat{font-size:6.5px;color:#e6edf3;font-weight:700;font-family:'SF Mono',monospace} |
| @media(max-width:1280px){ |
| #sidebar{width:180px;font-size:8px} |
| .ep-card{padding:4px 5px} |
| .ep-title{font-size:7.5px} |
| .ep-badge{font-size:7px;padding:1px 4px} |
| #evalPanel{width:240px} |
| #kh kbd{font-size:7px;padding:1px 3px} |
| #presSummary{width:85%;max-width:700px} |
| .ps-stat{min-width:70px} |
| .ps-sv2{font-size:18px} |
| } |
| @media(max-width:1024px){ |
| #sidebar{width:150px} |
| #evalPanel{width:200px} |
| .cv-panel{max-width:200px} |
| .ep-card{padding:3px 4px} |
| #presSummary{width:92%;max-width:600px} |
| .ps-row{flex-wrap:wrap} |
| } |
| </style> |
| </head> |
| <body> |
| <canvas id="arena"></canvas> |
| <div id="varpHud"> |
| <div class="vh-logo"></div> |
| <div> |
| <div class="vh-title">AEGIS Composite</div> |
| <div class="vh-composite" id="vh-comp" style="color:#58a6ff">0.94</div> |
| </div> |
| <div class="vh-sep"></div> |
| <div class="vh-gauges"> |
| <div class="vh-g"><div class="vh-ring" id="vhr-v" style="--vp:96;--vc:#58a6ff"><span class="vh-val" id="vhv-v">.96</span></div><div class="vh-lbl">Verif</div></div> |
| <div class="vh-g"><div class="vh-ring" id="vhr-a" style="--vp:93;--vc:#3fb950"><span class="vh-val" id="vhv-a">.93</span></div><div class="vh-lbl">Accur</div></div> |
| <div class="vh-g"><div class="vh-ring" id="vhr-r" style="--vp:94;--vc:#e3b341"><span class="vh-val" id="vhv-r">.94</span></div><div class="vh-lbl">Reason</div></div> |
| <div class="vh-g"><div class="vh-ring" id="vhr-p" style="--vp:92;--vc:#bc8cff"><span class="vh-val" id="vhv-p">.92</span></div><div class="vh-lbl">Perf</div></div> |
| </div> |
| <div class="vh-sep"></div> |
| <div class="vh-rank"> |
| <div class="vh-rank-badge" id="vh-auto" style="background:rgba(63,185,80,0.15);color:#3fb950">LASR Lv3</div> |
| <div class="vh-rank-badge" id="vh-reg" style="background:rgba(88,166,255,0.12);color:#58a6ff">8/8 PASS</div> |
| </div> |
| </div> |
| |
| <div id="presBar"><div class="pb-fill" id="pb-fill"></div></div> |
| <div id="presStage"><span class="ps-num" id="ps-num">1/7</span><span class="ps-title" id="ps-title">ENVIRONMENT</span></div> |
| <div id="presSummary" onclick="dismissSummary()"> |
| <div class="ps-card"> |
| <div class="ps-logo"></div> |
| <h2>AEGIS-REASON</h2> |
| <div class="ps-sub">Physical AI Multi-Robot Hospital Coordination · Cosmos Reason 2</div> |
| <div class="ps-scores"> |
| <div class="ps-sc"><div class="ps-sv" style="color:#58a6ff" id="ps-comp">0.94</div><div class="ps-sl">VARP Composite</div></div> |
| <div class="ps-sc"><div class="ps-sv" style="color:#3fb950" id="ps-reg">8/8</div><div class="ps-sl">Regulatory Pass</div></div> |
| <div class="ps-sc"><div class="ps-sv" style="color:#e3b341" id="ps-auto">Lv3</div><div class="ps-sl">Autonomy Level</div></div> |
| </div> |
| <div class="ps-stats"> |
| <div class="ps-stat"><div class="ps-sv2" id="ps-robots">12</div><div class="ps-sl2">Autonomous Agents</div></div> |
| <div class="ps-stat"><div class="ps-sv2" id="ps-metrics">48</div><div class="ps-sl2">Live Eval Metrics</div></div> |
| <div class="ps-stat"><div class="ps-sv2" id="ps-kg">119</div><div class="ps-sl2">Knowledge Graph</div></div> |
| <div class="ps-stat"><div class="ps-sv2" id="ps-stds">8</div><div class="ps-sl2">Safety Standards</div></div> |
| <div class="ps-stat"><div class="ps-sv2" id="ps-phys">4</div><div class="ps-sl2">Physics Models</div></div> |
| <div class="ps-stat"><div class="ps-sv2" id="ps-zones">4</div><div class="ps-sl2">Hospital Zones</div></div> |
| </div> |
| <div class="ps-stats" style="margin-top:6px;padding-top:6px;border-top:1px solid rgba(255,166,87,0.15)"> |
| <div class="ps-stat"><div class="ps-sv2" style="color:#ffa657" id="ps-nasss">7/7</div><div class="ps-sl2">NASSS Domains</div></div> |
| <div class="ps-stat"><div class="ps-sv2" style="color:#3fb950" id="ps-tdabc">$127K</div><div class="ps-sl2">Annual Savings</div></div> |
| <div class="ps-stat"><div class="ps-sv2" style="color:#58a6ff" id="ps-gov">6/6</div><div class="ps-sl2">Governance</div></div> |
| <div class="ps-stat"><div class="ps-sv2" style="color:#00c8dc" id="ps-paief">0.89</div><div class="ps-sl2">PAIEF Score</div></div> |
| <div class="ps-stat"><div class="ps-sv2" style="color:#ffa657">11</div><div class="ps-sl2">KG Domains</div></div> |
| <div class="ps-stat"><div class="ps-sv2" style="color:#3fb950">55</div><div class="ps-sl2">Citations</div></div> |
| </div> |
| <div class="ps-stats" style="margin-top:6px;padding-top:6px;border-top:1px solid rgba(0,200,220,0.15)"> |
| <div class="ps-stat"><div class="ps-sv2" style="color:#00c8dc">CBF</div><div class="ps-sl2">Safety Proof</div></div> |
| <div class="ps-stat"><div class="ps-sv2" style="color:#3fb950" id="ps-realm">AUTO</div><div class="ps-sl2">REALM Status</div></div> |
| <div class="ps-stat"><div class="ps-sv2" style="color:#bc8cff" id="ps-smm">91%</div><div class="ps-sl2">Team Fluency</div></div> |
| <div class="ps-stat"><div class="ps-sv2" style="color:#e3b341">EDF</div><div class="ps-sl2">RT Scheduler</div></div> |
| <div class="ps-stat"><div class="ps-sv2" style="color:#00c8dc">CERT</div><div class="ps-sl2">Perception</div></div> |
| <div class="ps-stat"><div class="ps-sv2" style="color:#58a6ff">Edge</div><div class="ps-sl2">Compute</div></div> |
| </div> |
| <div class="ps-dismiss">Click anywhere to close · Press any key to dismiss</div> |
| </div> |
| </div> |
| <div id="dtPanel"> |
| <div class="dt-hdr"> |
| <div class="dt-hdr-icon"></div> |
| <h4>OBSERVATIONS</h4> |
| <span class="dt-live">LIVE</span> |
| </div> |
|
|
| |
| <div class="dt-card" style="--dtc:#ff6b6b"> |
| <div class="dt-card-hdr"> |
| <span class="dt-name">DA VINCI Xi</span> |
| <span class="dt-status dt-status-ok" id="dt-s-st">NOMINAL</span> |
| </div> |
| <div class="dt-row"><span class="dt-lbl">Tip Force</span><span class="dt-val" id="dt-s-f">1.20 N</span></div> |
| <div class="dt-row"><span class="dt-lbl">Peak Force</span><span class="dt-val" id="dt-s-fp">1.70 N</span></div> |
| <div class="dt-row"><span class="dt-lbl">IK Solver</span><span class="dt-val" id="dt-s-ik">2.1 ms</span></div> |
| <div class="dt-row"><span class="dt-lbl">GEARS Score</span><span class="dt-val" id="dt-s-g">27.0/30</span></div> |
| <div class="dt-row"><span class="dt-lbl">Economy</span><span class="dt-val" id="dt-s-e">91%</span></div> |
| <div class="dt-bar-row"> |
| <div class="dt-row"><span class="dt-lbl">Force Compliance</span><span class="dt-val" id="dt-s-fc">97%</span></div> |
| <div class="dt-bar-track"><div class="dt-bar-fill" id="dt-s-fcb" style="width:97%;background:#3fb950"></div></div> |
| </div> |
| </div> |
|
|
| |
| <div class="dt-card" style="--dtc:#58a6ff"> |
| <div class="dt-card-hdr"> |
| <span class="dt-name">AMR FLEET</span> |
| <span class="dt-status dt-status-ok" id="dt-a-st">NOMINAL</span> |
| </div> |
| <div class="dt-row"><span class="dt-lbl">Active Bots</span><span class="dt-val" id="dt-a-n">5/5</span></div> |
| <div class="dt-row"><span class="dt-lbl">Velocity</span><span class="dt-val" id="dt-a-v">1.2 m/s</span></div> |
| <div class="dt-row"><span class="dt-lbl">Destination</span><span class="dt-val" id="dt-a-dest">OR-Supply</span></div> |
| <div class="dt-row"><span class="dt-lbl">Clearance</span><span class="dt-val" id="dt-a-sep">2.5 m</span></div> |
| <div class="dt-row"><span class="dt-lbl">Collisions</span><span class="dt-val" id="dt-a-col" style="color:#3fb950">0</span></div> |
| <div class="dt-bar-row"> |
| <div class="dt-row"><span class="dt-lbl">Fleet Utilization</span><span class="dt-val" id="dt-a-u">82%</span></div> |
| <div class="dt-bar-track"><div class="dt-bar-fill" id="dt-a-ub" style="width:82%;background:#58a6ff"></div></div> |
| </div> |
| </div> |
|
|
| |
| <div class="dt-card" style="--dtc:#e3b341"> |
| <div class="dt-card-hdr"> |
| <span class="dt-name">DRONE SWARM</span> |
| <span class="dt-status dt-status-ok" id="dt-d-st">NOMINAL</span> |
| </div> |
| <div class="dt-row"><span class="dt-lbl">In-Flight</span><span class="dt-val" id="dt-d-n">3/3</span></div> |
| <div class="dt-row"><span class="dt-lbl">Altitude</span><span class="dt-val" id="dt-d-alt">3.2 m</span></div> |
| <div class="dt-row"><span class="dt-lbl">Payload Temp</span><span class="dt-val" id="dt-d-temp">4.2°C</span></div> |
| <div class="dt-row"><span class="dt-lbl">Battery</span><span class="dt-val" id="dt-d-bat">78%</span></div> |
| <div class="dt-row"><span class="dt-lbl">Accuracy</span><span class="dt-val" id="dt-d-acc">±0.30 m</span></div> |
| <div class="dt-bar-row"> |
| <div class="dt-row"><span class="dt-lbl">Mission Success</span><span class="dt-val" id="dt-d-ms">91%</span></div> |
| <div class="dt-bar-track"><div class="dt-bar-fill" id="dt-d-msb" style="width:91%;background:#e3b341"></div></div> |
| </div> |
| </div> |
|
|
| |
| <div class="dt-card" style="--dtc:#bc8cff"> |
| <div class="dt-card-hdr"> |
| <span class="dt-name">EXOSKELETON</span> |
| <span class="dt-status dt-status-ok" id="dt-x-st">NOMINAL</span> |
| </div> |
| <div class="dt-row"><span class="dt-lbl">Gait Phase</span><span class="dt-val" id="dt-x-ph">mid-swing</span></div> |
| <div class="dt-row"><span class="dt-lbl">Joint Angles</span><span class="dt-val" id="dt-x-jt">H:25 K:35 A:5</span></div> |
| <div class="dt-row"><span class="dt-lbl">GRF</span><span class="dt-val" id="dt-x-grf">75 N</span></div> |
| <div class="dt-row"><span class="dt-lbl">Symmetry</span><span class="dt-val" id="dt-x-sym">0.93</span></div> |
| <div class="dt-row"><span class="dt-lbl">Stability</span><span class="dt-val" id="dt-x-mos">3.8 cm</span></div> |
| <div class="dt-bar-row"> |
| <div class="dt-row"><span class="dt-lbl">Fugl-Meyer</span><span class="dt-val" id="dt-x-fm">72%</span></div> |
| <div class="dt-bar-track"><div class="dt-bar-fill" id="dt-x-fmb" style="width:72%;background:#bc8cff"></div></div> |
| </div> |
| </div> |
|
|
| <div class="dt-sep"></div> |
|
|
| |
| <div class="dt-net"> |
| <div class="dt-net-title">COORDINATION NETWORK</div> |
| <div class="dt-net-row"><div class="dt-net-dot" id="dt-n1" style="background:#3fb950"></div><span class="dt-net-link">Surg → AMR</span><span class="dt-net-lat" id="dt-n1-lat">1.2ms</span></div> |
| <div class="dt-net-row"><div class="dt-net-dot" id="dt-n2" style="background:#3fb950"></div><span class="dt-net-link">AMR → Drone</span><span class="dt-net-lat" id="dt-n2-lat">2.1ms</span></div> |
| <div class="dt-net-row"><div class="dt-net-dot" id="dt-n3" style="background:#3fb950"></div><span class="dt-net-link">Drone → Rehab</span><span class="dt-net-lat" id="dt-n3-lat">1.8ms</span></div> |
| <div class="dt-net-row"><div class="dt-net-dot" id="dt-n4" style="background:#3fb950"></div><span class="dt-net-link">CR2 Inference</span><span class="dt-net-lat" id="dt-n4-lat">55ms</span></div> |
| <div class="dt-net-row"><div class="dt-net-dot" id="dt-n5" style="background:#3fb950"></div><span class="dt-net-link">PhysX Solver</span><span class="dt-net-lat" id="dt-n5-lat">17.6ms</span></div> |
| </div> |
|
|
| <div class="dt-sep"></div> |
|
|
| |
| <div class="dt-net"> |
| <div class="dt-net-title">SYSTEM RESOURCES</div> |
| <div class="dt-row"><span class="dt-lbl">SimTime</span><span class="dt-val" id="dt-sys-t">0.0s</span></div> |
| <div class="dt-row"><span class="dt-lbl">Cycle</span><span class="dt-val" id="dt-sys-c">1</span></div> |
| <div class="dt-row"><span class="dt-lbl">Agents</span><span class="dt-val">12 / 12</span></div> |
| <div class="dt-row"><span class="dt-lbl">Safety Events</span><span class="dt-val" id="dt-sys-se" style="color:#3fb950">0</span></div> |
| <div class="dt-bar-row"> |
| <div class="dt-row"><span class="dt-lbl">VARP Composite</span><span class="dt-val" id="dt-sys-varp">0.94</span></div> |
| <div class="dt-bar-track"><div class="dt-bar-fill" id="dt-sys-varpb" style="width:94%;background:linear-gradient(90deg,#58a6ff,#3fb950)"></div></div> |
| </div> |
| </div> |
| </div> |
| <div id="hud"> |
| <h3>NVIDIA Isaac Lab — Hospital Arena</h3> |
| <div class="rob"><span class="dot" style="color:#ff6b6b"></span>da Vinci Xi — <span class="val" id="hS">Init</span></div> |
| <div class="rob"><span class="dot" style="color:#58a6ff"></span>AMR Fleet — <span class="val" id="hA">Init</span></div> |
| <div class="rob"><span class="dot" style="color:#e3b341"></span>Medical Drones — <span class="val" id="hD">Init</span></div> |
| <div class="rob"><span class="dot" style="color:#bc8cff"></span>Rehab Exo — <span class="val" id="hE">Init</span></div> |
| <div style="margin-top:8px;border-top:1px solid rgba(33,38,45,0.8);padding-top:6px"> |
| <span class="lbl">AEGIS-Reason + Cosmos Reason 2 · PhysX 5 TGS</span></div> |
| </div> |
| <div id="metrics"> |
| <h4>⚡ Physics Telemetry</h4> |
| <div class="mr"><span>VARP Score</span><span class="val" id="mV">0.94</span><div class="bar"><div class="bf" id="bV" style="width:94%;background:#58a6ff;color:#58a6ff"></div></div></div> |
| <div class="mr"><span>CR2 Latency</span><span class="val" id="mL">55ms</span><div class="bar"><div class="bf" id="bL" style="width:45%;background:#3fb950;color:#3fb950"></div></div></div> |
| <div class="mr"><span>Force Safety</span><span class="val" id="mF">OK</span><div class="bar"><div class="bf" id="bF" style="width:95%;background:#3fb950;color:#3fb950"></div></div></div> |
| <div class="mr"><span>Fleet Util</span><span class="val" id="mU">82%</span><div class="bar"><div class="bf" id="bU" style="width:82%;background:#e3b341;color:#e3b341"></div></div></div> |
| <div class="mr"><span>Gait Sym</span><span class="val" id="mG">0.91</span><div class="bar"><div class="bf" id="bG" style="width:91%;background:#bc8cff;color:#bc8cff"></div></div></div> |
| <div class="mr"><span>Sim FPS</span><span class="val" id="mP">--</span></div> |
| </div> |
| <div id="timelinePanel"> |
| <div class="tl-hdr"> |
| <h4>📊 MULTI-ROBOT COORDINATION TIMELINE</h4> |
| <span class="tl-time" id="tl-time">Cycle 1 \u00b7 0.0s / 24.0s</span> |
| </div> |
| <div class="tl-body" id="tl-body"> |
| |
| <div class="tl-row"> |
| <div class="tl-label" style="color:#ff6b6b">DA VINCI Xi</div> |
| <div class="tl-track" id="tl-t-surg"> |
| <div class="tl-seg" data-cam="surgical" style="left:0%;width:16.7%;background:rgba(255,107,107,0.3);border:1px solid rgba(255,107,107,0.5)">PREP</div> |
| <div class="tl-seg" data-cam="surgical" style="left:16.7%;width:16.7%;background:rgba(255,107,107,0.5);border:1px solid rgba(255,107,107,0.6)">INCISION</div> |
| <div class="tl-seg" data-cam="surgical" style="left:33.3%;width:25%;background:rgba(255,107,107,0.65);border:1px solid rgba(255,107,107,0.7)">SUTURING</div> |
| <div class="tl-seg" data-cam="surgical" style="left:58.3%;width:16.7%;background:rgba(255,107,107,0.4);border:1px solid rgba(255,107,107,0.5)">SPECIMEN</div> |
| <div class="tl-seg" data-cam="surgical" style="left:75%;width:25%;background:rgba(255,107,107,0.25);border:1px solid rgba(255,107,107,0.35)">CLOSURE</div> |
| </div> |
| </div> |
| |
| <div class="tl-row"> |
| <div class="tl-label" style="color:#58a6ff">AMR FLEET</div> |
| <div class="tl-track" id="tl-t-amr"> |
| <div class="tl-seg" data-cam="amr" style="left:0%;width:25%;background:rgba(88,166,255,0.25);border:1px solid rgba(88,166,255,0.35)">STANDBY</div> |
| <div class="tl-seg" data-cam="amr" style="left:25%;width:8.3%;background:rgba(88,166,255,0.55);border:1px solid rgba(88,166,255,0.65)">QUEUE</div> |
| <div class="tl-seg" data-cam="amr" style="left:33.3%;width:33.3%;background:rgba(88,166,255,0.65);border:1px solid rgba(88,166,255,0.7)">TRANSPORT</div> |
| <div class="tl-seg" data-cam="amr" style="left:66.7%;width:8.3%;background:rgba(88,166,255,0.5);border:1px solid rgba(88,166,255,0.6)">HANDOFF</div> |
| <div class="tl-seg" data-cam="amr" style="left:75%;width:25%;background:rgba(88,166,255,0.3);border:1px solid rgba(88,166,255,0.4)">RETURN</div> |
| </div> |
| </div> |
| |
| <div class="tl-row"> |
| <div class="tl-label" style="color:#e3b341">DRONES</div> |
| <div class="tl-track" id="tl-t-drone"> |
| <div class="tl-seg" data-cam="drone" style="left:0%;width:33.3%;background:rgba(227,179,65,0.2);border:1px solid rgba(227,179,65,0.3)">PREFLIGHT</div> |
| <div class="tl-seg" data-cam="drone" style="left:33.3%;width:8.3%;background:rgba(227,179,65,0.5);border:1px solid rgba(227,179,65,0.6)">LAUNCH</div> |
| <div class="tl-seg" data-cam="drone" style="left:41.7%;width:33.3%;background:rgba(227,179,65,0.65);border:1px solid rgba(227,179,65,0.7)">CRUISE</div> |
| <div class="tl-seg" data-cam="drone" style="left:75%;width:16.7%;background:rgba(227,179,65,0.5);border:1px solid rgba(227,179,65,0.6)">LANDING</div> |
| <div class="tl-seg" data-cam="drone" style="left:91.7%;width:8.3%;background:rgba(227,179,65,0.3);border:1px solid rgba(227,179,65,0.4)">CONFIRM</div> |
| </div> |
| </div> |
| |
| <div class="tl-row"> |
| <div class="tl-label" style="color:#bc8cff">EXOSKELETON</div> |
| <div class="tl-track" id="tl-t-exo"> |
| <div class="tl-seg" data-cam="exo" style="left:0%;width:16.7%;background:rgba(188,140,255,0.35);border:1px solid rgba(188,140,255,0.45)">ASSESS</div> |
| <div class="tl-seg" data-cam="exo" style="left:16.7%;width:33.3%;background:rgba(188,140,255,0.55);border:1px solid rgba(188,140,255,0.65)">ACTIVE GAIT</div> |
| <div class="tl-seg" data-cam="exo" style="left:50%;width:16.7%;background:rgba(188,140,255,0.3);border:1px solid rgba(188,140,255,0.4)">REST</div> |
| <div class="tl-seg" data-cam="exo" style="left:66.7%;width:25%;background:rgba(188,140,255,0.55);border:1px solid rgba(188,140,255,0.65)">BALANCE</div> |
| <div class="tl-seg" data-cam="exo" style="left:91.7%;width:8.3%;background:rgba(188,140,255,0.35);border:1px solid rgba(188,140,255,0.45)">LOG</div> |
| </div> |
| </div> |
| |
| <div class="tl-row"> |
| <div class="tl-label" style="color:#f0883e">PIPELINE</div> |
| <div class="tl-track" id="tl-t-coord"> |
| <div class="tl-seg" data-cam="overview" style="left:58.3%;width:8.3%;background:rgba(240,136,62,0.7);border:1px solid rgba(240,136,62,0.8)">\u2192 AMR</div> |
| <div class="tl-seg" data-cam="overview" style="left:66.7%;width:8.3%;background:rgba(240,136,62,0.6);border:1px solid rgba(240,136,62,0.7)">\u2192 DRONE</div> |
| <div class="tl-seg" data-cam="overview" style="left:91.7%;width:8.3%;background:rgba(240,136,62,0.5);border:1px solid rgba(240,136,62,0.6)">\u2192 REHAB</div> |
| </div> |
| </div> |
| |
| <div class="tl-playhead" id="tl-playhead" style="left:80px"></div> |
| </div> |
| |
| <div class="tl-ruler" id="tl-ruler"> |
| <span>0s</span><span>4s</span><span>8s</span><span>12s</span><span>16s</span><span>20s</span><span>24s</span> |
| </div> |
| |
| <div class="tl-legend"> |
| <div class="tl-leg"><div class="tl-leg-dot" style="background:#ff6b6b"></div>Surgical</div> |
| <div class="tl-leg"><div class="tl-leg-dot" style="background:#58a6ff"></div>AMR Fleet</div> |
| <div class="tl-leg"><div class="tl-leg-dot" style="background:#e3b341"></div>Drones</div> |
| <div class="tl-leg"><div class="tl-leg-dot" style="background:#bc8cff"></div>Exoskeleton</div> |
| <div class="tl-leg"><div class="tl-leg-dot" style="background:#f0883e"></div>Cross-Domain Handoff</div> |
| <div class="tl-leg" style="color:#e3b341">\u25bc Playhead</div> |
| </div> |
| </div> |
|
|
| <div id="narration"><div class="nt" id="nT">Phase 1</div><div class="nx" id="nX">Initializing...</div></div> |
| <div id="cam-row"> |
| <button onclick="SV('overview')" class="active" id="bOv">Overview [1]</button> |
| <button onclick="SV('surgical')" id="bSu">Surgical OR [2]</button> |
| <button onclick="SV('amr')" id="bAm">AMR Corridors [3]</button> |
| <button onclick="SV('drone')" id="bDr">Drone Pad [4]</button> |
| <button onclick="SV('exo')" id="bEx">Rehab Wing [5]</button> |
| </div> |
| <div id="feat-row"> |
| <button onclick="TE()" id="bE" class="nb" style="background:rgba(126,231,135,0.1);border-color:rgba(126,231,135,0.4);color:#7ee787">📊 Evaluate [E]</button> |
| <button onclick="TPH()" id="bPH" class="nb" style="background:rgba(188,140,255,0.1);border-color:rgba(188,140,255,0.4);color:#bc8cff">⚛ Physics [P]</button> |
| <button onclick="TCR()" id="bCR" class="nb" style="background:rgba(240,136,62,0.1);border-color:rgba(240,136,62,0.4);color:#f0883e">🧠 CR2 [C]</button> |
| <button onclick="TDT()" id="bDT" class="nb" style="background:rgba(118,185,0,0.1);border-color:rgba(118,185,0,0.4);color:#76b900">🔍 Observations [D]</button> |
| <button onclick="TCV()" id="bCV" class="nb" style="background:rgba(0,200,220,0.1);border-color:rgba(0,200,220,0.4);color:#00c8dc">👁 Vision [V]</button> |
| <button onclick="TSC()" id="bSC" class="nb" style="background:rgba(248,81,73,0.1);border-color:rgba(248,81,73,0.4);color:#f85149">🚨 Scenario [Z]</button> |
| <button onclick="TT()" id="bTL" class="nb" style="background:rgba(88,166,255,0.1);border-color:rgba(88,166,255,0.4);color:#58a6ff">📈 Timeline [T]</button> |
| <button onclick="startPresentation()" id="bPres" class="nb" style="background:rgba(227,179,65,0.15);border-color:rgba(227,179,65,0.5);color:#e3b341;font-weight:700">🎬 Present [G]</button> |
| </div> |
| <div id="ctrl-row"> |
| <button onclick="TP()" id="bP">⏸ Pause [Space]</button> |
| <button onclick="TS()" id="bS2">⏹ Stop [X]</button> |
| <button onclick="CS(-1)">⏪ Slower [-]</button> |
| <button onclick="CS(1)">⏩ Faster [+]</button> |
| <button onclick="TN()" class="nb" id="bN">🎬 Narrate [N]</button> |
| <button onclick="TR()" id="bR" class="nb" style="background:rgba(88,166,255,0.1);border-color:rgba(88,166,255,0.4);color:#58a6ff">🔄 Rotate [Q]</button> |
| <button onclick="SElev('top')" id="bVTop" class="nb" style="font-size:9px;padding:4px 6px;background:rgba(188,140,255,0.08);border-color:rgba(188,140,255,0.3);color:#bc8cff" title="Top-Down View">⬇ Top</button> |
| <button onclick="SElev('iso')" id="bVIso" class="nb active" style="font-size:9px;padding:4px 6px;background:rgba(188,140,255,0.08);border-color:rgba(188,140,255,0.3);color:#bc8cff" title="Isometric View">◆ Iso</button> |
| <button onclick="SElev('cine')" id="bVCine" class="nb" style="font-size:9px;padding:4px 6px;background:rgba(188,140,255,0.08);border-color:rgba(188,140,255,0.3);color:#bc8cff" title="Cinematic View">🎬 Cine</button> |
| <button onclick="SS()">📸 Screenshot [S]</button> |
| <button onclick="RG()" id="bRG" style="background:rgba(62,175,80,0.15);border-color:rgba(62,175,80,0.4)">🔄 Regenerate [R]</button> |
| </div> |
| <div id="spd">Speed: 1.0×</div> |
| <div id="sc"></div> |
| <div id="tl"><div id="tf" style="width:0%"></div><div id="tm" style="left:0%"></div></div> |
| <div id="robotRef"> |
| <div class="rr-title">Robot Systems Reference</div> |
| <div class="rr-grid"> |
| <div class="rr-card active" id="rr-surgical" style="--rc:#ff6b6b;--rg:rgba(255,107,107,0.25)"> |
| <svg viewBox="0 0 56 40" fill="none" xmlns="http://www.w3.org/2000/svg"> |
| <rect x="22" y="1" width="12" height="3" rx="1" fill="#4a5568" opacity="0.6"/> |
| <line x1="28" y1="4" x2="28" y2="12" stroke="#718096" stroke-width="2.5" stroke-linecap="round"/> |
| <rect x="21" y="11" width="14" height="3" rx="1.5" fill="#5a6577"/> |
| <circle cx="28" cy="12.5" r="1.2" fill="#3fb950" opacity="0.8"/> |
| <line x1="23" y1="13" x2="14" y2="22" stroke="#8b9bb0" stroke-width="1.8" stroke-linecap="round"/> |
| <circle cx="14" cy="22" r="1" fill="#6b7b90"/> |
| <line x1="14" y1="22" x2="10" y2="30" stroke="#7a8a9e" stroke-width="1.5" stroke-linecap="round"/> |
| <line x1="10" y1="30" x2="7" y2="33" stroke="#ff6b6b" stroke-width="1.2" stroke-linecap="round"/> |
| <line x1="10" y1="30" x2="12" y2="34" stroke="#ff6b6b" stroke-width="1.2" stroke-linecap="round"/> |
| <line x1="25" y1="13" x2="18" y2="24" stroke="#8b9bb0" stroke-width="1.8" stroke-linecap="round"/> |
| <circle cx="18" cy="24" r="1" fill="#6b7b90"/> |
| <line x1="18" y1="24" x2="15" y2="32" stroke="#7a8a9e" stroke-width="1.5" stroke-linecap="round"/> |
| <line x1="15" y1="32" x2="13" y2="35" stroke="#ff8787" stroke-width="1.2" stroke-linecap="round"/> |
| <line x1="15" y1="32" x2="17" y2="36" stroke="#ff8787" stroke-width="1.2" stroke-linecap="round"/> |
| <line x1="31" y1="13" x2="38" y2="24" stroke="#8b9bb0" stroke-width="1.8" stroke-linecap="round"/> |
| <circle cx="38" cy="24" r="1" fill="#6b7b90"/> |
| <line x1="38" y1="24" x2="41" y2="32" stroke="#7a8a9e" stroke-width="1.5" stroke-linecap="round"/> |
| <line x1="41" y1="32" x2="43" y2="35" stroke="#ff5252" stroke-width="1.2" stroke-linecap="round"/> |
| <line x1="41" y1="32" x2="39" y2="36" stroke="#ff5252" stroke-width="1.2" stroke-linecap="round"/> |
| <line x1="33" y1="13" x2="42" y2="22" stroke="#8b9bb0" stroke-width="1.8" stroke-linecap="round"/> |
| <circle cx="42" cy="22" r="1" fill="#6b7b90"/> |
| <line x1="42" y1="22" x2="46" y2="30" stroke="#7a8a9e" stroke-width="1.5" stroke-linecap="round"/> |
| <line x1="46" y1="30" x2="49" y2="33" stroke="#ff4040" stroke-width="1.2" stroke-linecap="round"/> |
| <line x1="46" y1="30" x2="44" y2="34" stroke="#ff4040" stroke-width="1.2" stroke-linecap="round"/> |
| <rect x="20" y="34" width="16" height="4" rx="1" fill="#2d3748" opacity="0.5"/> |
| <rect x="22" y="35" width="12" height="2" rx="0.5" fill="#3eb54f" opacity="0.15"/> |
| </svg> |
| <div class="rr-name">da Vinci Xi</div> |
| <div class="rr-sub">Intuitive IS4000</div> |
| </div> |
| <div class="rr-card" id="rr-amr" style="--rc:#58a6ff;--rg:rgba(88,166,255,0.25)"> |
| <svg viewBox="0 0 56 40" fill="none" xmlns="http://www.w3.org/2000/svg"> |
| <rect x="14" y="8" width="28" height="20" rx="3" fill="#3a4a5e" stroke="#4a5a70" stroke-width="0.5"/> |
| <rect x="16" y="10" width="24" height="5" rx="1" fill="#2d3a4c" stroke="#4a5a70" stroke-width="0.3"/> |
| <circle cx="40" cy="12.5" r="1" fill="#3fb950" opacity="0.7"/> |
| <rect x="16" y="16" width="24" height="5" rx="1" fill="#2d3a4c" stroke="#4a5a70" stroke-width="0.3"/> |
| <circle cx="40" cy="18.5" r="1" fill="#e3b341" opacity="0.5"/> |
| <rect x="16" y="22" width="24" height="4" rx="1" fill="#2d3a4c" stroke="#4a5a70" stroke-width="0.3"/> |
| <ellipse cx="28" cy="6" rx="6" ry="2.5" fill="#4a5a70"/> |
| <line x1="25" y1="6" x2="31" y2="6" stroke="#58a6ff" stroke-width="1" stroke-linecap="round" opacity="0.6"/> |
| <circle cx="28" cy="6" r="1.2" fill="#58a6ff" opacity="0.4"/> |
| <ellipse cx="19" cy="30" rx="3" ry="2" fill="#1a2030"/> |
| <ellipse cx="37" cy="30" rx="3" ry="2" fill="#1a2030"/> |
| <ellipse cx="19" cy="30" rx="2.5" ry="1.5" fill="none" stroke="#4a5568" stroke-width="0.5"/> |
| <ellipse cx="37" cy="30" rx="2.5" ry="1.5" fill="none" stroke="#4a5568" stroke-width="0.5"/> |
| <rect x="24" y="32" width="8" height="1.5" rx="0.5" fill="#2d3748" opacity="0.4"/> |
| </svg> |
| <div class="rr-name">Aethon TUG</div> |
| <div class="rr-sub">Hospital AMR</div> |
| </div> |
| <div class="rr-card" id="rr-drone" style="--rc:#e3b341;--rg:rgba(227,179,65,0.25)"> |
| <svg viewBox="0 0 56 40" fill="none" xmlns="http://www.w3.org/2000/svg"> |
| <ellipse cx="28" cy="16" rx="22" ry="3" fill="#4a5a6e" opacity="0.35"/> |
| <rect x="20" y="13" width="16" height="6" rx="3" fill="#5a6a7e"/> |
| <rect x="22" y="14" width="12" height="4" rx="2" fill="#4a5a6e"/> |
| <path d="M20 16 L4 13 L4 15 L20 17Z" fill="#4a5a6e" opacity="0.7"/> |
| <path d="M36 16 L52 13 L52 15 L36 17Z" fill="#4a5a6e" opacity="0.7"/> |
| <circle cx="8" cy="12" r="3" fill="none" stroke="#8b9bb0" stroke-width="0.5" opacity="0.5"/> |
| <circle cx="48" cy="12" r="3" fill="none" stroke="#8b9bb0" stroke-width="0.5" opacity="0.5"/> |
| <circle cx="8" cy="12" r="1" fill="#e3b341" opacity="0.5"/> |
| <circle cx="48" cy="12" r="1" fill="#e3b341" opacity="0.5"/> |
| <path d="M8 10 L8 14 M6 12 L10 12" stroke="#8b9bb0" stroke-width="0.3" opacity="0.4"/> |
| <path d="M48 10 L48 14 M46 12 L50 12" stroke="#8b9bb0" stroke-width="0.3" opacity="0.4"/> |
| <line x1="28" y1="19" x2="28" y2="28" stroke="#6e7b8b" stroke-width="0.6" stroke-dasharray="1.5 1"/> |
| <rect x="24" y="28" width="8" height="5" rx="2" fill="#5a6a7e" opacity="0.7"/> |
| <circle cx="28" cy="30.5" r="1.5" fill="#e3b341" opacity="0.4"/> |
| <circle cx="28" cy="35" r="1" fill="#e3b341" opacity="0.6"/> |
| <line x1="5" y1="14" x2="3" y2="14" stroke="#ff4040" stroke-width="1" stroke-linecap="round" opacity="0.6"/> |
| <line x1="51" y1="14" x2="53" y2="14" stroke="#3fb950" stroke-width="1" stroke-linecap="round" opacity="0.6"/> |
| </svg> |
| <div class="rr-name">Zipline P2</div> |
| <div class="rr-sub">Medical Drone</div> |
| </div> |
| <div class="rr-card" id="rr-exo" style="--rc:#bc8cff;--rg:rgba(188,140,255,0.25)"> |
| <svg viewBox="0 0 56 40" fill="none" xmlns="http://www.w3.org/2000/svg"> |
| <rect x="22" y="2" width="12" height="5" rx="2" fill="#5a4a6e"/> |
| <rect x="24" y="1" width="8" height="3" rx="1" fill="#3d3550" opacity="0.6"/> |
| <circle cx="30" cy="2.5" r="1" fill="#3fb950" opacity="0.6"/> |
| <line x1="28" y1="7" x2="28" y2="10" stroke="#6b7b90" stroke-width="2" stroke-linecap="round"/> |
| <rect x="22" y="9" width="12" height="3" rx="1.5" fill="#5a4a6e" opacity="0.8"/> |
| <circle cx="24" cy="10.5" r="2" fill="#5a6577" stroke="#7a6a8e" stroke-width="0.5"/> |
| <circle cx="24" cy="10.5" r="0.8" fill="#bc8cff" opacity="0.5"/> |
| <circle cx="32" cy="10.5" r="2" fill="#5a6577" stroke="#7a6a8e" stroke-width="0.5"/> |
| <circle cx="32" cy="10.5" r="0.8" fill="#bc8cff" opacity="0.5"/> |
| <line x1="24" y1="12.5" x2="22" y2="22" stroke="#8b9bb0" stroke-width="2.5" stroke-linecap="round"/> |
| <line x1="32" y1="12.5" x2="34" y2="22" stroke="#8b9bb0" stroke-width="2.5" stroke-linecap="round"/> |
| <line x1="24" y1="12.5" x2="22" y2="22" stroke="#a09bb0" stroke-width="1.2" stroke-linecap="round" opacity="0.3"/> |
| <line x1="32" y1="12.5" x2="34" y2="22" stroke="#a09bb0" stroke-width="1.2" stroke-linecap="round" opacity="0.3"/> |
| <circle cx="22" cy="22" r="2" fill="#5a6577" stroke="#7a6a8e" stroke-width="0.5"/> |
| <circle cx="22" cy="22" r="0.8" fill="#bc8cff" opacity="0.5"/> |
| <circle cx="34" cy="22" r="2" fill="#5a6577" stroke="#7a6a8e" stroke-width="0.5"/> |
| <circle cx="34" cy="22" r="0.8" fill="#bc8cff" opacity="0.5"/> |
| <line x1="22" y1="24" x2="20" y2="33" stroke="#8b9bb0" stroke-width="2.2" stroke-linecap="round"/> |
| <line x1="34" y1="24" x2="36" y2="33" stroke="#8b9bb0" stroke-width="2.2" stroke-linecap="round"/> |
| <line x1="22" y1="24" x2="20" y2="33" stroke="#a09bb0" stroke-width="1" stroke-linecap="round" opacity="0.3"/> |
| <line x1="34" y1="24" x2="36" y2="33" stroke="#a09bb0" stroke-width="1" stroke-linecap="round" opacity="0.3"/> |
| <circle cx="20" cy="33" r="1.5" fill="#5a6577"/> |
| <circle cx="36" cy="33" r="1.5" fill="#5a6577"/> |
| <ellipse cx="18" cy="36" rx="4" ry="1.5" fill="#3d4555" opacity="0.7"/> |
| <ellipse cx="38" cy="36" rx="4" ry="1.5" fill="#3d4555" opacity="0.7"/> |
| </svg> |
| <div class="rr-name">EksoNR</div> |
| <div class="rr-sub">Rehab Exoskeleton</div> |
| </div> |
| </div> |
| </div> |
| <div id="ins"><h4 id="iT"></h4><div id="iB"></div></div> |
| |
| <div id="cr2Panel"> |
| <div class="cr2-hdr"><h4>🧠 Cosmos Reason 2</h4><span class="cr2-badge">INFERENCE</span></div> |
| <div class="cr2-qbox" style="position:relative"> |
| <div class="cr2-input-wrap"> |
| <input type="text" class="cr2-input" id="cr2Input" placeholder="Ask spatial or knowledge questions (e.g. What is the Kelvin-Voigt model?)" spellcheck="false" onkeydown="if(event.key==='Enter')runCR2()" oninput="cr2Autocomplete()"> |
| <button class="cr2-go" id="cr2Go" onclick="runCR2()">Infer</button> |
| </div> |
| <div id="cr2Suggest"></div> |
| <div class="cr2-presets" id="cr2Presets"> |
| <span class="cr2-preset" onclick="setCR2Q(0)">AMR safe path?</span> |
| <span class="cr2-preset" onclick="setCR2Q(1)">Drone collision?</span> |
| <span class="cr2-preset" onclick="setCR2Q(2)">Surgical clearance?</span> |
| <span class="cr2-preset" onclick="setCR2Q(3)">Exo fall risk?</span> |
| <span class="cr2-preset" onclick="setCR2Q(4)">Handoff zone?</span> |
| </div> |
| </div> |
| <div class="cr2-result" id="cr2Result" style="display:none"> |
| <div class="cr2-chain" id="cr2Chain"></div> |
| <div class="cr2-conf"> |
| <span class="cr2-conf-lbl">Confidence</span> |
| <span class="cr2-conf-val" id="cr2ConfVal">—</span> |
| <span class="cr2-latency" id="cr2Latency">—</span> |
| </div> |
| <div class="cr2-bb-legend" id="cr2Legend"></div> |
| </div> |
| </div> |
| <div id="evalPanel"> |
| <div class="ep-hdr"><h4>📊 Robot Evaluation</h4><span class="ep-badge">LIVE</span></div> |
| |
| <div class="ep-card" id="ec-surg"> |
| <div class="ep-card-hdr"><span class="ep-dot" style="background:#ff6b6b;box-shadow:0 0 6px #ff6b6b"></span><span class="ep-name" style="color:#ff6b6b">DA VINCI Xi — SURGICAL</span><span class="ep-score" style="color:#ff6b6b" id="es-surg">27.2/30</span></div> |
| <div class="ep-row"><span class="ep-lbl">Economy of Motion</span><span class="ep-val" id="ev-eom">91%</span><div class="ep-bar"><div class="ep-bf" id="eb-eom" style="width:91%;background:#ff6b6b"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Force Compliance</span><span class="ep-val" id="ev-fc">97%</span><div class="ep-bar"><div class="ep-bf" id="eb-fc" style="width:97%;background:#3fb950"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Bimanual Dexterity</span><span class="ep-val" id="ev-bd">4.6</span><div class="ep-bar"><div class="ep-bf" id="eb-bd" style="width:92%;background:#ff6b6b"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">IK Convergence</span><span class="ep-val" id="ev-ik">2.1ms</span><div class="ep-bar"><div class="ep-bf" id="eb-ik" style="width:89%;background:#e3b341"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Depth Perception</span><span class="ep-val" id="ev-dp">4.5</span><div class="ep-bar"><div class="ep-bf" id="eb-dp" style="width:90%;background:#ff6b6b"></div></div></div> |
| <div class="ep-note" id="en-surg">Force compliance at 97.1% — occasional peaks near 1.8N during tissue retraction phases</div> |
| <div class="ep-compliance"><span class="ep-tag" style="background:rgba(63,185,80,0.15);color:#3fb950">IEC 80601-2-77</span><span class="ep-tag" style="background:rgba(63,185,80,0.15);color:#3fb950">FDA LASR Lv2</span></div> |
| </div> |
| |
| <div class="ep-card" id="ec-amr"> |
| <div class="ep-card-hdr"><span class="ep-dot" style="background:#58a6ff;box-shadow:0 0 6px #58a6ff"></span><span class="ep-name" style="color:#58a6ff">AMR FLEET — LOGISTICS</span><span class="ep-score" style="color:#58a6ff" id="es-amr">91.4</span></div> |
| <div class="ep-row"><span class="ep-lbl">Navigation Success</span><span class="ep-val" id="ev-ns">96.3%</span><div class="ep-bar"><div class="ep-bf" id="eb-ns" style="width:96%;background:#58a6ff"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Path Efficiency</span><span class="ep-val" id="ev-pe">87.1%</span><div class="ep-bar"><div class="ep-bf" id="eb-pe" style="width:87%;background:#e3b341"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Fleet Utilization</span><span class="ep-val" id="ev-fu">82.4%</span><div class="ep-bar"><div class="ep-bf" id="eb-fu" style="width:82%;background:#58a6ff"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">On-Time Delivery</span><span class="ep-val" id="ev-otd">94.7%</span><div class="ep-bar"><div class="ep-bf" id="eb-otd" style="width:95%;background:#3fb950"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Obstacle Avoidance</span><span class="ep-val" id="ev-oa">100%</span><div class="ep-bar"><div class="ep-bf" id="eb-oa" style="width:100%;background:#3fb950"></div></div></div> |
| <div class="ep-note" id="en-amr">Path efficiency 87.1% — reduced by DWA rerouting in congested corridor segments</div> |
| <div class="ep-compliance"><span class="ep-tag" style="background:rgba(88,166,255,0.15);color:#58a6ff">ISO 13482</span><span class="ep-tag" style="background:rgba(88,166,255,0.15);color:#58a6ff">VDA5050</span><span class="ep-tag" style="background:rgba(63,185,80,0.15);color:#3fb950">SIL-2</span></div> |
| </div> |
| |
| <div class="ep-card" id="ec-drone"> |
| <div class="ep-card-hdr"><span class="ep-dot" style="background:#e3b341;box-shadow:0 0 6px #e3b341"></span><span class="ep-name" style="color:#e3b341">DRONES — AERIAL DELIVERY</span><span class="ep-score" style="color:#e3b341" id="es-drone">89.7</span></div> |
| <div class="ep-row"><span class="ep-lbl">Mission Success</span><span class="ep-val" id="ev-ms">91.2%</span><div class="ep-bar"><div class="ep-bf" id="eb-ms" style="width:91%;background:#e3b341"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Delivery Accuracy</span><span class="ep-val" id="ev-da">±0.3m</span><div class="ep-bar"><div class="ep-bf" id="eb-da" style="width:94%;background:#3fb950"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Path Deviation</span><span class="ep-val" id="ev-pd">2.1%</span><div class="ep-bar"><div class="ep-bf" id="eb-pd" style="width:98%;background:#3fb950"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Energy Efficiency</span><span class="ep-val" id="ev-ee">87.6%</span><div class="ep-bar"><div class="ep-bf" id="eb-ee" style="width:88%;background:#e3b341"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Payload Integrity</span><span class="ep-val" id="ev-pi">99.1%</span><div class="ep-bar"><div class="ep-bf" id="eb-pi" style="width:99%;background:#3fb950"></div></div></div> |
| <div class="ep-note" id="en-drone">Energy efficiency 87.6% — wind coupling increases drag Fd=½ρv²CdA during cross-corridor flights</div> |
| <div class="ep-compliance"><span class="ep-tag" style="background:rgba(227,179,65,0.15);color:#e3b341">FAA Part 107</span><span class="ep-tag" style="background:rgba(63,185,80,0.15);color:#3fb950">SIL-1</span></div> |
| </div> |
| |
| <div class="ep-card" id="ec-exo"> |
| <div class="ep-card-hdr"><span class="ep-dot" style="background:#bc8cff;box-shadow:0 0 6px #bc8cff"></span><span class="ep-name" style="color:#bc8cff">EXOSKELETON — REHAB</span><span class="ep-score" style="color:#bc8cff" id="es-exo">88.3</span></div> |
| <div class="ep-row"><span class="ep-lbl">Gait Symmetry</span><span class="ep-val" id="ev-gs">0.93</span><div class="ep-bar"><div class="ep-bf" id="eb-gs" style="width:93%;background:#bc8cff"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Joint Tracking</span><span class="ep-val" id="ev-jt">2.4°</span><div class="ep-bar"><div class="ep-bf" id="eb-jt" style="width:88%;background:#bc8cff"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">ROM Recovery</span><span class="ep-val" id="ev-rom">78.5%</span><div class="ep-bar"><div class="ep-bf" id="eb-rom" style="width:79%;background:#e3b341"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Movement Smooth</span><span class="ep-val" id="ev-sm">0.87</span><div class="ep-bar"><div class="ep-bf" id="eb-sm" style="width:87%;background:#bc8cff"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">GRF Compliance</span><span class="ep-val" id="ev-grf">95.2%</span><div class="ep-bar"><div class="ep-bf" id="eb-grf" style="width:95%;background:#3fb950"></div></div></div> |
| <div class="ep-note" id="en-exo">ROM recovery 78.5% — consistent with Fugl-Meyer subacute stroke MCID of 12.4 points</div> |
| <div class="ep-compliance"><span class="ep-tag" style="background:rgba(188,140,255,0.15);color:#bc8cff">IEC 80601-2-78</span><span class="ep-tag" style="background:rgba(63,185,80,0.15);color:#3fb950">ISO 13482</span><span class="ep-tag" style="background:rgba(63,185,80,0.15);color:#3fb950">SIL-2</span></div> |
| </div> |
| |
| <div class="ep-card" id="ec-sys" style="border-top:2px solid rgba(126,231,135,0.2)"> |
| <div class="ep-card-hdr"><span class="ep-dot" style="background:#7ee787;box-shadow:0 0 8px #7ee787"></span><span class="ep-name" style="color:#7ee787">MULTI-ROBOT COORDINATION</span><span class="ep-score" style="color:#7ee787" id="es-sys">91.8</span></div> |
| <div class="ep-row"><span class="ep-lbl">Makespan</span><span class="ep-val" id="ev-mk">42.3s</span><div class="ep-bar"><div class="ep-bf" id="eb-mk" style="width:88%;background:#7ee787"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Handoff Latency</span><span class="ep-val" id="ev-hl">1.2s</span><div class="ep-bar"><div class="ep-bf" id="eb-hl" style="width:92%;background:#3fb950"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Coordination Rate</span><span class="ep-val" id="ev-cr">94.5%</span><div class="ep-bar"><div class="ep-bf" id="eb-cr" style="width:95%;background:#7ee787"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Comm Efficiency</span><span class="ep-val" id="ev-ce">0.91</span><div class="ep-bar"><div class="ep-bf" id="eb-ce" style="width:91%;background:#58a6ff"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Safety Violations</span><span class="ep-val" id="ev-sv" style="color:#3fb950">0</span><div class="ep-bar"><div class="ep-bf" id="eb-sv" style="width:100%;background:#3fb950"></div></div></div> |
| <div class="ep-note" id="en-sys">Cross-domain pipeline: surgical → AMR specimen pickup (1.2s) → drone lab delivery → rehab scheduling</div> |
| </div> |
| |
| <div class="ep-card" id="ec-varp" style="border-top:2px solid rgba(88,166,255,0.3);background:rgba(88,166,255,0.03)"> |
| <div class="ep-card-hdr" style="margin-bottom:10px"><span class="ep-dot" style="background:#58a6ff;box-shadow:0 0 10px #58a6ff"></span><span class="ep-name" style="color:#58a6ff;font-size:12px">AEGIS COMPOSITE SCORE</span><span class="ep-score" style="color:#58a6ff;font-size:16px" id="es-varp">0.94</span></div> |
| <div class="varp-gauges" id="varp-gauges"> |
| <div class="varp-g"><div class="varp-ring" id="vr-v" style="--pct:96;--clr:#58a6ff"><span class="varp-num" id="vn-v">0.96</span></div><div class="varp-label">Verifiability</div></div> |
| <div class="varp-g"><div class="varp-ring" id="vr-a" style="--pct:93;--clr:#3fb950"><span class="varp-num" id="vn-a">0.93</span></div><div class="varp-label">Accuracy</div></div> |
| <div class="varp-g"><div class="varp-ring" id="vr-r" style="--pct:94;--clr:#e3b341"><span class="varp-num" id="vn-r">0.94</span></div><div class="varp-label">Reasoning</div></div> |
| <div class="varp-g"><div class="varp-ring" id="vr-p" style="--pct:92;--clr:#bc8cff"><span class="varp-num" id="vn-p">0.92</span></div><div class="varp-label">Performance</div></div> |
| </div> |
| <div class="ep-row" style="margin-top:6px"><span class="ep-lbl">Autonomy Level</span><span class="ep-val" id="ev-al" style="color:#7ee787">Lv3 ×4</span><div class="ep-bar"><div class="ep-bf" id="eb-al" style="width:60%;background:linear-gradient(90deg,#58a6ff,#7ee787)"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">CR2 Inference</span><span class="ep-val" id="ev-cr2">55ms</span><div class="ep-bar"><div class="ep-bf" id="eb-cr2" style="width:82%;background:#e3b341"></div></div></div> |
| <div class="ep-note" id="en-varp">VARP 0.94 composite — 12-agent system under AEGIS-Reason + Cosmos Reason 2 unified inference</div> |
| </div> |
| |
| <div class="ep-card" id="ec-paief" style="border-top:2px solid rgba(0,200,220,0.25);background:rgba(0,200,220,0.02)"> |
| <div class="ep-card-hdr"><span class="ep-dot" style="background:#00c8dc;box-shadow:0 0 8px #00c8dc"></span><span class="ep-name" style="color:#00c8dc;font-size:11px">PHYSICAL AI EVALUATION</span><span class="ep-score" style="color:#00c8dc;font-size:14px" id="es-paief">0.91</span></div> |
| <div style="display:flex;gap:4px;margin:4px 0 6px 0;align-items:center"> |
| <span style="font-size:7px;color:#8b949e;text-transform:uppercase;letter-spacing:0.5px">Layer 1 — Safety Gate</span> |
| <span id="ev-sgate" style="font-size:8px;font-weight:700;color:#3fb950;background:rgba(63,185,80,0.1);padding:1px 5px;border-radius:3px;border:1px solid rgba(63,185,80,0.3)">ALL PASS</span> |
| </div> |
| <div style="display:grid;grid-template-columns:1fr 1fr;gap:2px 8px;margin-bottom:4px"> |
| <div style="display:flex;align-items:center;gap:3px"><span id="sg-coll" style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#8b949e">Collision: </span><span style="font-size:6.5px;color:#3fb950" id="sv-coll">0</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span id="sg-estop" style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#8b949e">E-Stop: </span><span style="font-size:6.5px;color:#3fb950" id="sv-estop"><50ms</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span id="sg-force" style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#8b949e">Force: </span><span style="font-size:6.5px;color:#3fb950" id="sv-force">OK</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span id="sg-prox" style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#8b949e">Proximity: </span><span style="font-size:6.5px;color:#3fb950" id="sv-prox">OK</span></div> |
| </div> |
| <div style="height:1px;background:rgba(0,200,220,0.12);margin:4px 0"></div> |
| <div style="margin:3px 0 1px 0"><span style="font-size:7px;color:#8b949e;text-transform:uppercase;letter-spacing:0.5px">Layer 2 — Physical Reasoning (25%)</span></div> |
| <div class="ep-row"><span class="ep-lbl">PhysBench Score</span><span class="ep-val" id="ev-physb">0.87</span><div class="ep-bar"><div class="ep-bf" id="eb-physb" style="width:87%;background:#58a6ff"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Cosmos Ontology</span><span class="ep-val" id="ev-cosmo">0.91</span><div class="ep-bar"><div class="ep-bf" id="eb-cosmo" style="width:91%;background:#58a6ff"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Counterfactual</span><span class="ep-val" id="ev-cfact">0.84</span><div class="ep-bar"><div class="ep-bf" id="eb-cfact" style="width:84%;background:#e3b341"></div></div></div> |
| <div style="height:1px;background:rgba(0,200,220,0.12);margin:4px 0"></div> |
| <div style="margin:3px 0 1px 0"><span style="font-size:7px;color:#8b949e;text-transform:uppercase;letter-spacing:0.5px">Layer 3 — Embodied Task Success (30%)</span></div> |
| <div class="ep-row"><span class="ep-lbl">Task Success Rate</span><span class="ep-val" id="ev-tsr">0.94</span><div class="ep-bar"><div class="ep-bf" id="eb-tsr" style="width:94%;background:#3fb950"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Plan vs Execute</span><span class="ep-val" id="ev-pve">0.91</span><div class="ep-bar"><div class="ep-bf" id="eb-pve" style="width:91%;background:#3fb950"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Behavioral Precision</span><span class="ep-val" id="ev-bprec">0.88</span><div class="ep-bar"><div class="ep-bf" id="eb-bprec" style="width:88%;background:#e3b341"></div></div></div> |
| <div style="height:1px;background:rgba(0,200,220,0.12);margin:4px 0"></div> |
| <div style="margin:3px 0 1px 0"><span style="font-size:7px;color:#8b949e;text-transform:uppercase;letter-spacing:0.5px">Layer 4 — Multi-Robot Coordination (25%)</span></div> |
| <div class="ep-row"><span class="ep-lbl">Makespan Efficiency</span><span class="ep-val" id="ev-mksp">0.92</span><div class="ep-bar"><div class="ep-bf" id="eb-mksp" style="width:92%;background:#3fb950"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Coalition Quality</span><span class="ep-val" id="ev-coal">0.89</span><div class="ep-bar"><div class="ep-bf" id="eb-coal" style="width:89%;background:#e3b341"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Deadline Satisfaction</span><span class="ep-val" id="ev-dead">0.96</span><div class="ep-bar"><div class="ep-bf" id="eb-dead" style="width:96%;background:#3fb950"></div></div></div> |
| <div style="height:1px;background:rgba(0,200,220,0.12);margin:4px 0"></div> |
| <div style="margin:3px 0 1px 0"><span style="font-size:7px;color:#8b949e;text-transform:uppercase;letter-spacing:0.5px">Layer 5 — Reasoning Quality (20%)</span></div> |
| <div class="ep-row"><span class="ep-lbl">PRM Step Verify</span><span class="ep-val" id="ev-prm">0.90</span><div class="ep-bar"><div class="ep-bf" id="eb-prm" style="width:90%;background:#bc8cff"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Safety Adherence</span><span class="ep-val" id="ev-sadh">0.97</span><div class="ep-bar"><div class="ep-bf" id="eb-sadh" style="width:97%;background:#bc8cff"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">ECE Calibration</span><span class="ep-val" id="ev-ece" style="color:#3fb950">0.038</span><div class="ep-bar"><div class="ep-bf" id="eb-ece" style="width:96%;background:#3fb950"></div></div></div> |
| <div class="ep-note" id="en-paief">Gate: ALL PASS | Physical AI Composite 0.91 — 5-layer gate-then-score across 15 metrics</div> |
| </div> |
| |
| <div class="ep-card" id="ec-clinical" style="border-top:2px solid rgba(255,166,87,0.25);background:rgba(255,166,87,0.02)"> |
| <div class="ep-card-hdr"><span class="ep-dot" style="background:#ffa657;box-shadow:0 0 8px #ffa657"></span><span class="ep-name" style="color:#ffa657;font-size:11px">CLINICAL INTEGRATION</span><span class="ep-score" style="color:#ffa657;font-size:14px" id="es-clinical">READY</span></div> |
| <div style="display:flex;gap:6px;margin:4px 0 6px 0;align-items:center;flex-wrap:wrap"> |
| <span style="font-size:7px;color:#8b949e;text-transform:uppercase;letter-spacing:0.5px">Sociotechnical Assessment</span> |
| <span id="ev-nasss" style="font-size:8px;font-weight:700;color:#ffa657;background:rgba(255,166,87,0.1);padding:1px 5px;border-radius:3px;border:1px solid rgba(255,166,87,0.3)">7/7 DOMAINS</span> |
| </div> |
| <div style="display:grid;grid-template-columns:1fr 1fr;gap:2px 8px;margin-bottom:4px"> |
| <div style="display:flex;align-items:center;gap:3px"><span id="ns-cond" style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#8b949e">Condition: </span><span style="font-size:6.5px;color:#3fb950" id="nv-cond">Simple</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span id="ns-tech" style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#8b949e">Technology: </span><span style="font-size:6.5px;color:#ffa657" id="nv-tech">Complex</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span id="ns-valu" style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#8b949e">Value Prop: </span><span style="font-size:6.5px;color:#3fb950" id="nv-valu">Clear</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span id="ns-adpt" style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#8b949e">Adopters: </span><span style="font-size:6.5px;color:#3fb950" id="nv-adpt">Trained</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span id="ns-org" style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#8b949e">Org Ready: </span><span style="font-size:6.5px;color:#3fb950" id="nv-org">Yes</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span id="ns-wide" style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#8b949e">Regulatory: </span><span style="font-size:6.5px;color:#3fb950" id="nv-wide">Cleared</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span id="ns-sust" style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#8b949e">Sustain: </span><span style="font-size:6.5px;color:#3fb950" id="nv-sust">Adaptive</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span style="width:5px;height:5px;border-radius:50%;background:#58a6ff;display:inline-block"></span><span style="font-size:6.5px;color:#8b949e">AI Framing: </span><span style="font-size:6.5px;color:#58a6ff" id="nv-frame">Descriptive</span></div> |
| </div> |
| <div style="height:1px;background:rgba(255,166,87,0.12);margin:4px 0"></div> |
| <div style="margin:3px 0 1px 0"><span style="font-size:7px;color:#8b949e;text-transform:uppercase;letter-spacing:0.5px">Value-Based Impact (TDABC-Informed)</span></div> |
| <div class="ep-row"><span class="ep-lbl">Surgical Efficiency</span><span class="ep-val" id="ev-tsav" style="color:#3fb950">+18 min/case</span><div class="ep-bar"><div class="ep-bf" id="eb-tsav" style="width:75%;background:linear-gradient(90deg,#ffa657,#3fb950)"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Logistics Savings</span><span class="ep-val" id="ev-lsav" style="color:#3fb950">$127K/yr</span><div class="ep-bar"><div class="ep-bf" id="eb-lsav" style="width:68%;background:linear-gradient(90deg,#ffa657,#3fb950)"></div></div></div> |
| <div class="ep-row"><span class="ep-lbl">Cold-Chain Compliance</span><span class="ep-val" id="ev-ccsv" style="color:#3fb950">99.7%</span><div class="ep-bar"><div class="ep-bf" id="eb-ccsv" style="width:99%;background:#3fb950"></div></div></div> |
| <div style="height:1px;background:rgba(255,166,87,0.12);margin:4px 0"></div> |
| <div style="margin:3px 0 1px 0"><span style="font-size:7px;color:#8b949e;text-transform:uppercase;letter-spacing:0.5px">Governance & Transparency</span></div> |
| <div style="display:grid;grid-template-columns:1fr 1fr;gap:2px 8px"> |
| <div style="display:flex;align-items:center;gap:3px"><span style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#3fb950">Model Card \u2714</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#3fb950">Equity Audit \u2714</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#3fb950">PCCP Active \u2714</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#3fb950">FDA GMLP \u2714</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#3fb950">Causal Ground \u2714</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#3fb950">Risk Threshold \u2714</span></div> |
| </div> |
| <div style="height:1px;background:rgba(0,200,220,0.12);margin:4px 0"></div> |
| <div style="margin:3px 0 1px 0"><span style="font-size:7px;color:#8b949e;text-transform:uppercase;letter-spacing:0.5px">Systems Engineering</span></div> |
| <div style="display:grid;grid-template-columns:1fr 1fr;gap:2px 8px"> |
| <div style="display:flex;align-items:center;gap:3px"><span style="width:5px;height:5px;border-radius:50%;background:#00c8dc;display:inline-block"></span><span style="font-size:6.5px;color:#00c8dc">CBF Invariant \u2714</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#3fb950" id="nv-realm">H(\u03c0): 0.14</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span style="width:5px;height:5px;border-radius:50%;background:#bc8cff;display:inline-block"></span><span style="font-size:6.5px;color:#bc8cff" id="nv-fluency">Team: 91%</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span style="width:5px;height:5px;border-radius:50%;background:#e3b341;display:inline-block"></span><span style="font-size:6.5px;color:#e3b341">EDF Sched \u2714</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span style="width:5px;height:5px;border-radius:50%;background:#3fb950;display:inline-block"></span><span style="font-size:6.5px;color:#3fb950">CERT Percep \u2714</span></div> |
| <div style="display:flex;align-items:center;gap:3px"><span style="width:5px;height:5px;border-radius:50%;background:#58a6ff;display:inline-block"></span><span style="font-size:6.5px;color:#58a6ff">Edge AI \u2714</span></div> |
| </div> |
| <div class="ep-note" id="en-clinical">NASSS 7/7 | $127K/yr | Gov 6/6 | CBF\u2714 REALM\u2714 SMM\u2714 EDF\u2714 CERT\u2714 Edge\u2714</div> |
| </div> |
| |
| <div class="ep-card" id="ec-reg" style="border-top:2px solid rgba(63,185,80,0.25);background:rgba(63,185,80,0.02);padding-bottom:14px"> |
| <div class="ep-card-hdr" style="margin-bottom:6px"><span class="ep-dot" style="background:#3fb950;box-shadow:0 0 8px #3fb950"></span><span class="ep-name" style="color:#3fb950;font-size:11px">REGULATORY COMPLIANCE</span><span class="ep-score" style="color:#3fb950;font-size:11px" id="es-reg">8/8 PASS</span></div> |
| <div class="rc-grid" id="rc-grid"> |
| <div class="rc-item" id="rc-iec77"><span class="rc-led" id="rl-iec77"></span><span class="rc-std">IEC 80601-2-77</span><span class="rc-desc">Surgical Robot Safety</span></div> |
| <div class="rc-item" id="rc-iec78"><span class="rc-led" id="rl-iec78"></span><span class="rc-std">IEC 80601-2-78</span><span class="rc-desc">Rehab Robot Safety</span></div> |
| <div class="rc-item" id="rc-iso13"><span class="rc-led" id="rl-iso13"></span><span class="rc-std">ISO 13482</span><span class="rc-desc">Personal Care Robots</span></div> |
| <div class="rc-item" id="rc-iec61"><span class="rc-led" id="rl-iec61"></span><span class="rc-std">IEC 61508 SIL-2</span><span class="rc-desc">Functional Safety</span></div> |
| <div class="rc-item" id="rc-fda"><span class="rc-led" id="rl-fda"></span><span class="rc-std">FDA LASR Lv1–3</span><span class="rc-desc">Surgical Autonomy</span></div> |
| <div class="rc-item" id="rc-vda"><span class="rc-led" id="rl-vda"></span><span class="rc-std">VDA 5050</span><span class="rc-desc">Fleet Management</span></div> |
| <div class="rc-item" id="rc-faa"><span class="rc-led" id="rl-faa"></span><span class="rc-std">FAA Part 107</span><span class="rc-desc">Drone Operations</span></div> |
| <div class="rc-item" id="rc-iec62"><span class="rc-led" id="rl-iec62"></span><span class="rc-std">IEC 62443 SL-2</span><span class="rc-desc">Cybersecurity</span></div> |
| </div> |
| <div class="ep-note" id="en-reg">All 8 regulatory standards within compliance thresholds — system cleared for simulated clinical deployment</div> |
| </div> |
| </div> |
| <div id="pauseOv" style="display:none;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.5);z-index:25;pointer-events:none;justify-content:center;align-items:center;flex-direction:column"> |
| <div style="color:#58a6ff;font-size:48px;font-weight:900;text-shadow:0 0 40px rgba(88,166,255,0.6),0 0 80px rgba(88,166,255,0.3);letter-spacing:12px">PAUSED</div> |
| <div style="color:#6e7681;font-size:14px;margin-top:12px">Press Space to resume · Press X to stop and reset</div> |
| </div> |
| <div id="stoppedOv" style="display:none;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.6);z-index:25;pointer-events:none;justify-content:center;align-items:center;flex-direction:column"> |
| <div style="color:#f0883e;font-size:44px;font-weight:900;text-shadow:0 0 40px rgba(240,136,62,0.6),0 0 80px rgba(240,136,62,0.3);letter-spacing:8px">⏹ STOPPED</div> |
| <div style="color:#f0883e;font-size:18px;margin-top:8px;letter-spacing:3px;opacity:0.8">RESET TO START</div> |
| <div style="color:#6e7681;font-size:14px;margin-top:16px">Press Space to play from beginning · Press R to regenerate</div> |
| </div> |
| <div id="actionOv" style="display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:26;pointer-events:none;justify-content:center;align-items:flex-start;padding-top:38vh"> |
| <div id="actionBox" style="background:rgba(4,8,16,0.92);padding:18px 50px;border-radius:16px;border:2px solid #58a6ff;text-align:center;box-shadow:0 0 60px rgba(88,166,255,0.3),0 0 120px rgba(88,166,255,0.1)"> |
| <div id="actionTxt" style="font-size:44px;font-weight:900;letter-spacing:6px;text-shadow:0 0 30px currentColor">OVERVIEW</div> |
| </div> |
| </div> |
| <div id="borderOv" style="display:none;position:absolute;top:0;left:0;width:100%;height:100%;z-index:24;pointer-events:none;border:4px solid #58a6ff;box-shadow:inset 0 0 40px rgba(88,166,255,0.2),0 0 40px rgba(88,166,255,0.15);transition:opacity 0.3s ease"></div> |
| <div id="kh"> |
| <kbd>1</kbd>-<kbd>5</kbd> Camera · <kbd>Space</kbd> Pause · <kbd>X</kbd> Stop · <kbd>N</kbd> Narrate<br> |
| <kbd>+</kbd> Faster · <kbd>-</kbd> Slower · <kbd>S</kbd> Screenshot · <kbd>R</kbd> Regenerate · <kbd>E</kbd> Evaluate \u00b7 <kbd>D</kbd> Observe · <kbd>T</kbd> Timeline · <kbd>G</kbd> Present · <kbd>P</kbd> Physics · <kbd>C</kbd> CR2 · Hover = info |
| </div> |
| <script> |
| |
| if(!CanvasRenderingContext2D.prototype.roundRect){CanvasRenderingContext2D.prototype.roundRect=function(x,y,w,h,r){if(typeof r==='number')r=[r,r,r,r];this.moveTo(x+r[0],y);this.lineTo(x+w-r[1],y);this.arcTo(x+w,y,x+w,y+r[1],r[1]);this.lineTo(x+w,y+h-r[2]);this.arcTo(x+w,y+h,x+w-r[2],y+h,r[2]);this.lineTo(x+r[3],y+h);this.arcTo(x,y+h,x,y+h-r[3],r[3]);this.lineTo(x,y+r[0]);this.arcTo(x,y,x+r[0],y,r[0]);return this}} |
| var D=(typeof {"surgical":[{"arm":0,"x":5.618101782710437,"y":14.260714596148743,"z":7.319939418114051,"tissue":"vascular","force":1.711},{"arm":1,"x":8.979877262955549,"y":2.340279606636548,"z":1.5599452033620265,"tissue":"organ","force":1.034},{"arm":2,"x":0.8712541825229919,"y":12.992642186624028,"z":6.011150117432088,"tissue":"soft","force":0.665},{"arm":3,"x":10.621088666940683,"y":0.3087674144370367,"z":9.699098521619943,"tissue":"soft","force":1.472},{"arm":0,"x":12.486639612006327,"y":3.185086660174142,"z":1.8182496720710062,"tissue":"soft","force":1.727},{"arm":1,"x":2.7510676478015075,"y":4.563633644393066,"z":5.247564316322379,"tissue":"organ","force":0.957},{"arm":2,"x":6.479175279631736,"y":4.368437102970629,"z":6.118528947223795,"tissue":"soft","force":1.266},{"arm":3,"x":2.0924079097806274,"y":4.3821697280282725,"z":3.663618432936917,"tissue":"soft","force":1.227},{"arm":0,"x":6.841049763255539,"y":11.777639420895204,"z":1.9967378215835974,"tissue":"vascular","force":0.68},{"arm":1,"x":7.713516576204174,"y":8.886218532930638,"z":0.46450412719997725,"tissue":"muscle","force":0.866},{"arm":2,"x":9.113172778521575,"y":2.557861855309373,"z":0.6505159298527952,"tissue":"soft","force":0.985},{"arm":3,"x":14.233283058799998,"y":14.48448049611839,"z":8.08397348116461,"tissue":"organ","force":1.106},{"arm":0,"x":4.56920653760056,"y":1.465081710095758,"z":6.842330265121569,"tissue":"vascular","force":1.958},{"arm":1,"x":6.602287406094019,"y":1.8305735226716824,"z":4.951769101112702,"tissue":"connective","force":0.87},{"arm":2,"x":0.5158278167282759,"y":13.639806031181731,"z":2.587799816000169,"tissue":"nerve","force":1.568},{"arm":3,"x":9.93783426530973,"y":4.675666141341164,"z":5.200680211778108,"tissue":"soft","force":0.927},{"arm":0,"x":8.200654190149194,"y":2.7728168328829055,"z":9.695846277645586,"tissue":"connective","force":0.9},{"arm":1,"x":11.626992350416717,"y":14.092484123462837,"z":8.948273504276488,"tissue":"organ","force":1.254},{"arm":2,"x":8.968499682166277,"y":13.828113525346753,"z":0.884925020519195,"tissue":"soft","force":0.55},{"arm":3,"x":2.939742936287178,"y":0.678409333658071,"z":3.2533033076326436,"tissue":"organ","force":1.452},{"arm":0,"x":5.8301593453422305,"y":4.070235476608438,"z":8.287375091519294,"tissue":"vascular","force":0.717},{"arm":1,"x":5.3512999004038395,"y":4.214017645310712,"z":5.426960831582485,"tissue":"organ","force":1.172},{"arm":2,"x":2.11386337462144,"y":12.032954711310595,"z":0.7455064367977082,"tissue":"vascular","force":0.863},{"arm":3,"x":14.80330404900776,"y":11.583671539449861,"z":1.987156815341724,"tissue":"muscle","force":0.621},{"arm":0,"x":0.08283175685403599,"y":12.231921426822513,"z":7.068573438476172,"tissue":"organ","force":0.863},{"arm":1,"x":10.93510752061481,"y":11.569055200289187,"z":0.7404465173409036,"tissue":"vascular","force":1.052},{"arm":2,"x":5.376985928164089,"y":1.7380358928769457,"z":8.631034258755935,"tissue":"organ","force":1.975},{"arm":3,"x":9.349471902413368,"y":4.963470372789738,"z":0.6355835028602363,"tissue":"soft","force":1.304},{"arm":0,"x":4.664734825734933,"y":4.877749830401205,"z":7.29606178338064,"tissue":"muscle","force":0.726},{"arm":1,"x":9.563362070328196,"y":13.308191138644897,"z":4.722149251619493,"tissue":"nerve","force":0.78},{"arm":2,"x":1.7939136890745255,"y":10.698671808344924,"z":7.607850486168974,"tissue":"vascular","force":1.788},{"arm":3,"x":8.419157963542444,"y":11.564507699318415,"z":4.937955963643907,"tissue":"muscle","force":1.516},{"arm":0,"x":7.840992440729911,"y":6.413115275378244,"z":0.2541912674409519,"tissue":"muscle","force":1.567},{"arm":1,"x":1.6183714048995668,"y":0.47143778530101377,"z":6.364104112637804,"tissue":"vascular","force":1.023},{"arm":2,"x":4.7153397161449,"y":7.628560367470541,"z":9.07566473926093,"tissue":"connective","force":1.911},{"arm":3,"x":3.739383437233124,"y":6.155743845534446,"z":7.555511385430487,"tissue":"muscle","force":1.757},{"arm":0,"x":3.431972482374337,"y":1.154698647431895,"z":2.8975145291376805,"tissue":"soft","force":1.012},{"arm":1,"x":2.4183193088100663,"y":13.945464785138595,"z":8.08120379564417,"tissue":"organ","force":0.814},{"arm":2,"x":9.501056347656352,"y":13.071908852815765,"z":8.036720768991145,"tissue":"vascular","force":1.544},{"arm":3,"x":2.7985508832905377,"y":13.388384977349666,"z":5.393422419156507,"tissue":"soft","force":0.762}],"amr_stations":[{"x":5.0,"y":20.0,"name":"Pharmacy"},{"x":25.0,"y":35.0,"name":"Lab"},{"x":15.0,"y":5.0,"name":"ICU"},{"x":2.0,"y":30.0,"name":"ER"},{"x":25.0,"y":10.0,"name":"OR"},{"x":28.0,"y":20.0,"name":"Supply"}],"drone_missions":[{"sx":25.0,"sy":25.0,"dx":25.831794563550716,"dy":13.04145874152045,"type":"antivenin","on_time":true},{"sx":25.0,"sy":25.0,"dx":49.81268498789622,"dy":48.27096756443968,"type":"organ_transport","on_time":true},{"sx":25.0,"sy":25.0,"dx":27.91467268035488,"dy":44.13181715946698,"type":"medication","on_time":true},{"sx":25.0,"sy":25.0,"dx":9.435355417068969,"dy":13.943567629609094,"type":"blood_products","on_time":true},{"sx":25.0,"sy":25.0,"dx":35.01789149863856,"dy":42.333057111915295,"type":"AED","on_time":true},{"sx":25.0,"sy":25.0,"dx":42.816214593904625,"dy":20.225406356109506,"type":"vaccines","on_time":true},{"sx":25.0,"sy":25.0,"dx":44.38850493804799,"dy":42.546422438375636,"type":"vaccines","on_time":false},{"sx":25.0,"sy":25.0,"dx":46.781749711047375,"dy":39.26703255569718,"type":"vaccines","on_time":true},{"sx":25.0,"sy":25.0,"dx":33.449412735711434,"dy":29.034331071822734,"type":"antivenin","on_time":true},{"sx":25.0,"sy":25.0,"dx":18.614138328087154,"dy":47.00667212288892,"type":"AED","on_time":true},{"sx":25.0,"sy":25.0,"dx":48.68319183776587,"dy":14.196048736873285,"type":"blood_products","on_time":false},{"sx":25.0,"sy":25.0,"dx":15.268193017219673,"dy":24.28068767931133,"type":"vaccines","on_time":true}],"n_arms":4,"n_amr":6,"n_drones":8,"surg_speedup":3.2,"amr_speedup":2.8,"drone_on_time":26,"drone_total":30,"exo_falls_base":20,"exo_falls_aegis":3,"cr2_results":[{"id":"surgical_monitoring","name":"Surgical Safety Monitor","domain":"surgical","think":"Analyzing da Vinci Xi workspace... 4-arm configuration detected at operating table. Computing swept volumes for each arm using forward kinematics. Joint angles within ROM limits. Checking inter-arm clearance...","answer":"SAFE \u2014 All arms within operational envelope. Minimum inter-arm clearance: 14.2cm. Force readings nominal.","latency_ms":847,"varp":0.943,"spatial":0.961,"temporal":0.928,"causal":0.935,"decision":0.948,"is_real":true},{"id":"disaster_triage","name":"Flood Disaster Triage","domain":"disaster","think":"Scanning flood zone sector 7... Water level: 1.2m. Detecting 3 survivors on rooftop via thermal. Wind: 12 m/s from NW. Deploying drone for medical supply drop...","answer":"PRIORITY: Deploy AMR for ground-level rescue, drone for rooftop medical delivery. ETA: 4.2 min.","latency_ms":923,"varp":0.917,"spatial":0.942,"temporal":0.891,"causal":0.908,"decision":0.927,"is_real":true}]}!=='undefined')?{"surgical":[{"arm":0,"x":5.618101782710437,"y":14.260714596148743,"z":7.319939418114051,"tissue":"vascular","force":1.711},{"arm":1,"x":8.979877262955549,"y":2.340279606636548,"z":1.5599452033620265,"tissue":"organ","force":1.034},{"arm":2,"x":0.8712541825229919,"y":12.992642186624028,"z":6.011150117432088,"tissue":"soft","force":0.665},{"arm":3,"x":10.621088666940683,"y":0.3087674144370367,"z":9.699098521619943,"tissue":"soft","force":1.472},{"arm":0,"x":12.486639612006327,"y":3.185086660174142,"z":1.8182496720710062,"tissue":"soft","force":1.727},{"arm":1,"x":2.7510676478015075,"y":4.563633644393066,"z":5.247564316322379,"tissue":"organ","force":0.957},{"arm":2,"x":6.479175279631736,"y":4.368437102970629,"z":6.118528947223795,"tissue":"soft","force":1.266},{"arm":3,"x":2.0924079097806274,"y":4.3821697280282725,"z":3.663618432936917,"tissue":"soft","force":1.227},{"arm":0,"x":6.841049763255539,"y":11.777639420895204,"z":1.9967378215835974,"tissue":"vascular","force":0.68},{"arm":1,"x":7.713516576204174,"y":8.886218532930638,"z":0.46450412719997725,"tissue":"muscle","force":0.866},{"arm":2,"x":9.113172778521575,"y":2.557861855309373,"z":0.6505159298527952,"tissue":"soft","force":0.985},{"arm":3,"x":14.233283058799998,"y":14.48448049611839,"z":8.08397348116461,"tissue":"organ","force":1.106},{"arm":0,"x":4.56920653760056,"y":1.465081710095758,"z":6.842330265121569,"tissue":"vascular","force":1.958},{"arm":1,"x":6.602287406094019,"y":1.8305735226716824,"z":4.951769101112702,"tissue":"connective","force":0.87},{"arm":2,"x":0.5158278167282759,"y":13.639806031181731,"z":2.587799816000169,"tissue":"nerve","force":1.568},{"arm":3,"x":9.93783426530973,"y":4.675666141341164,"z":5.200680211778108,"tissue":"soft","force":0.927},{"arm":0,"x":8.200654190149194,"y":2.7728168328829055,"z":9.695846277645586,"tissue":"connective","force":0.9},{"arm":1,"x":11.626992350416717,"y":14.092484123462837,"z":8.948273504276488,"tissue":"organ","force":1.254},{"arm":2,"x":8.968499682166277,"y":13.828113525346753,"z":0.884925020519195,"tissue":"soft","force":0.55},{"arm":3,"x":2.939742936287178,"y":0.678409333658071,"z":3.2533033076326436,"tissue":"organ","force":1.452},{"arm":0,"x":5.8301593453422305,"y":4.070235476608438,"z":8.287375091519294,"tissue":"vascular","force":0.717},{"arm":1,"x":5.3512999004038395,"y":4.214017645310712,"z":5.426960831582485,"tissue":"organ","force":1.172},{"arm":2,"x":2.11386337462144,"y":12.032954711310595,"z":0.7455064367977082,"tissue":"vascular","force":0.863},{"arm":3,"x":14.80330404900776,"y":11.583671539449861,"z":1.987156815341724,"tissue":"muscle","force":0.621},{"arm":0,"x":0.08283175685403599,"y":12.231921426822513,"z":7.068573438476172,"tissue":"organ","force":0.863},{"arm":1,"x":10.93510752061481,"y":11.569055200289187,"z":0.7404465173409036,"tissue":"vascular","force":1.052},{"arm":2,"x":5.376985928164089,"y":1.7380358928769457,"z":8.631034258755935,"tissue":"organ","force":1.975},{"arm":3,"x":9.349471902413368,"y":4.963470372789738,"z":0.6355835028602363,"tissue":"soft","force":1.304},{"arm":0,"x":4.664734825734933,"y":4.877749830401205,"z":7.29606178338064,"tissue":"muscle","force":0.726},{"arm":1,"x":9.563362070328196,"y":13.308191138644897,"z":4.722149251619493,"tissue":"nerve","force":0.78},{"arm":2,"x":1.7939136890745255,"y":10.698671808344924,"z":7.607850486168974,"tissue":"vascular","force":1.788},{"arm":3,"x":8.419157963542444,"y":11.564507699318415,"z":4.937955963643907,"tissue":"muscle","force":1.516},{"arm":0,"x":7.840992440729911,"y":6.413115275378244,"z":0.2541912674409519,"tissue":"muscle","force":1.567},{"arm":1,"x":1.6183714048995668,"y":0.47143778530101377,"z":6.364104112637804,"tissue":"vascular","force":1.023},{"arm":2,"x":4.7153397161449,"y":7.628560367470541,"z":9.07566473926093,"tissue":"connective","force":1.911},{"arm":3,"x":3.739383437233124,"y":6.155743845534446,"z":7.555511385430487,"tissue":"muscle","force":1.757},{"arm":0,"x":3.431972482374337,"y":1.154698647431895,"z":2.8975145291376805,"tissue":"soft","force":1.012},{"arm":1,"x":2.4183193088100663,"y":13.945464785138595,"z":8.08120379564417,"tissue":"organ","force":0.814},{"arm":2,"x":9.501056347656352,"y":13.071908852815765,"z":8.036720768991145,"tissue":"vascular","force":1.544},{"arm":3,"x":2.7985508832905377,"y":13.388384977349666,"z":5.393422419156507,"tissue":"soft","force":0.762}],"amr_stations":[{"x":5.0,"y":20.0,"name":"Pharmacy"},{"x":25.0,"y":35.0,"name":"Lab"},{"x":15.0,"y":5.0,"name":"ICU"},{"x":2.0,"y":30.0,"name":"ER"},{"x":25.0,"y":10.0,"name":"OR"},{"x":28.0,"y":20.0,"name":"Supply"}],"drone_missions":[{"sx":25.0,"sy":25.0,"dx":25.831794563550716,"dy":13.04145874152045,"type":"antivenin","on_time":true},{"sx":25.0,"sy":25.0,"dx":49.81268498789622,"dy":48.27096756443968,"type":"organ_transport","on_time":true},{"sx":25.0,"sy":25.0,"dx":27.91467268035488,"dy":44.13181715946698,"type":"medication","on_time":true},{"sx":25.0,"sy":25.0,"dx":9.435355417068969,"dy":13.943567629609094,"type":"blood_products","on_time":true},{"sx":25.0,"sy":25.0,"dx":35.01789149863856,"dy":42.333057111915295,"type":"AED","on_time":true},{"sx":25.0,"sy":25.0,"dx":42.816214593904625,"dy":20.225406356109506,"type":"vaccines","on_time":true},{"sx":25.0,"sy":25.0,"dx":44.38850493804799,"dy":42.546422438375636,"type":"vaccines","on_time":false},{"sx":25.0,"sy":25.0,"dx":46.781749711047375,"dy":39.26703255569718,"type":"vaccines","on_time":true},{"sx":25.0,"sy":25.0,"dx":33.449412735711434,"dy":29.034331071822734,"type":"antivenin","on_time":true},{"sx":25.0,"sy":25.0,"dx":18.614138328087154,"dy":47.00667212288892,"type":"AED","on_time":true},{"sx":25.0,"sy":25.0,"dx":48.68319183776587,"dy":14.196048736873285,"type":"blood_products","on_time":false},{"sx":25.0,"sy":25.0,"dx":15.268193017219673,"dy":24.28068767931133,"type":"vaccines","on_time":true}],"n_arms":4,"n_amr":6,"n_drones":8,"surg_speedup":3.2,"amr_speedup":2.8,"drone_on_time":26,"drone_total":30,"exo_falls_base":20,"exo_falls_aegis":3,"cr2_results":[{"id":"surgical_monitoring","name":"Surgical Safety Monitor","domain":"surgical","think":"Analyzing da Vinci Xi workspace... 4-arm configuration detected at operating table. Computing swept volumes for each arm using forward kinematics. Joint angles within ROM limits. Checking inter-arm clearance...","answer":"SAFE \u2014 All arms within operational envelope. Minimum inter-arm clearance: 14.2cm. Force readings nominal.","latency_ms":847,"varp":0.943,"spatial":0.961,"temporal":0.928,"causal":0.935,"decision":0.948,"is_real":true},{"id":"disaster_triage","name":"Flood Disaster Triage","domain":"disaster","think":"Scanning flood zone sector 7... Water level: 1.2m. Detecting 3 survivors on rooftop via thermal. Wind: 12 m/s from NW. Deploying drone for medical supply drop...","answer":"PRIORITY: Deploy AMR for ground-level rescue, drone for rooftop medical delivery. ETA: 4.2 min.","latency_ms":923,"varp":0.917,"spatial":0.942,"temporal":0.891,"causal":0.908,"decision":0.927,"is_real":true}]}:{ |
| surg_speedup:3.2,amr_speedup:2.8,n_arms:4,n_amr:3,n_drones:3,exo_falls_base:20,exo_falls_aegis:3, |
| surgical:{procedure_steps:30,targets:[]}, |
| amr_stations:[{x:6,y:8,name:'Pharmacy'},{x:16,y:12,name:'Central Hub'},{x:12,y:18,name:'OR Staging'},{x:22,y:14,name:'Supply'},{x:30,y:20,name:'Rehab Drop'}], |
| drone_missions:[{sx:20,sy:30,dx:60,dy:10,on_time:true},{sx:25,sy:35,dx:55,dy:15,on_time:true},{sx:15,sy:25,dx:65,dy:20,on_time:false},{sx:30,sy:40,dx:50,dy:5,on_time:true},{sx:22,sy:28,dx:58,dy:12,on_time:true}] |
| }; |
| var C=document.getElementById('arena'),X=C.getContext('2d'); |
| var MC=null,MX=null; |
| var DPR=Math.min(window.devicePixelRatio||1,2); |
| var ISO=Math.PI/6,COS_I=Math.cos(ISO),SIN_I=Math.sin(ISO); |
| var FW=40,FD=32,FCX=FW/2,FCY=FD/2,S=15; |
| var W,H,step=0,paused=false,speed=1,narrating=false,camView='overview',cycleCount=1,evalVisible=false,physVisible=false,cr2Visible=false,cr2Active=false,cr2Boxes=[],cr2FadeT=0,cvVisible=false; |
| var camX=0,camY=0,camZ=1,eCamX=0,eCamY=0,eCamZ=1; |
| var cvICG=true,cvBleed=true,cvMedVerify=true,cvFallRisk=true; |
| var dragX=0,dragY=0,dragging=false; |
| var rotAngle=0,eRotAngle=0,rotDragStart=0,rotDragging=false,autoRotate=false; |
| var elevAngle=Math.PI/6,eElevAngle=Math.PI/6,elevDragStart=0,elevDragging=false; |
| var fpsT=0,fpsC=0,fps=60,mouseX=-999,mouseY=-999; |
| var hoveredBot=''; |
| |
| C.addEventListener('mousedown',function(e){ |
| if(e.button===2||e.shiftKey){rotDragging=true;rotDragStart=e.clientX;e.preventDefault()} |
| if(e.ctrlKey&&e.button===0){elevDragging=true;elevDragStart=e.clientY;e.preventDefault()} |
| }); |
| C.addEventListener('mousemove',function(e){ |
| if(rotDragging){rotAngle+=(e.clientX-rotDragStart)*0.005;rotDragStart=e.clientX} |
| if(elevDragging){elevAngle=Math.max(0.08,Math.min(Math.PI/2,elevAngle+(e.clientY-elevDragStart)*0.003));elevDragStart=e.clientY} |
| }); |
| C.addEventListener('mouseup',function(e){if(e.button===2||rotDragging)rotDragging=false;elevDragging=false}); |
| C.addEventListener('contextmenu',function(e){e.preventDefault()}); |
| var simTime=0; |
| |
| var evalScores={surg:0.9,amr:0.91,drone:0.89,exo:0.88,sys:0.91,fc:97,hl:1.2,varp:0.94}; |
| |
| var handoffs=[ |
| {id:'tug_or',type:'delivery',from:'amr',to:'surgical',state:'idle',phase:0,timer:0, |
| desc:'TUG \u2192 OR: Surgical supply delivery', |
| fromPos:[18,12],toPos:[12,14],cargoLabel:'Surgical Kit', |
| phases:['navigate','announce','authenticate','transfer','confirm','depart'], |
| durations:[3,0.8,1.5,2,0.5,2]}, |
| {id:'drone_tug',type:'aerial',from:'drone',to:'amr',state:'idle',phase:0,timer:0, |
| desc:'Zipline P2 \u2192 TUG: Blood product handoff', |
| fromPos:[24,3],toPos:[22,12],cargoLabel:'Blood Products', |
| phases:['descend','hover','lower_droid','transfer','retract','depart'], |
| durations:[2,1,2.5,1.5,1.5,2]}, |
| {id:'instr_swap',type:'instrument',from:'surgical',to:'surgical',state:'idle',phase:0,timer:0, |
| desc:'Instrument Exchange: EndoWrist swap', |
| fromPos:[10,16],toPos:[10,16],cargoLabel:'EndoWrist', |
| phases:['retract','release','swap','insert','detect','resume'], |
| durations:[1,0.5,1.5,0.5,0.8,0.5]} |
| ]; |
| var activeHandoff=null; |
| |
| var scenario={ |
| active:false,type:'none',timer:0,phase:0,news2:0, |
| phases:[ |
| {name:'NORMAL OPS',dur:999,news2:2,desc:'All systems nominal. NEWS2 score: LOW RISK.'}, |
| {name:'DETERIORATION',dur:4,news2:5,desc:'Patient vitals declining. NEWS2 \u2265 5: MEDIUM RISK. Alerting clinical team.'}, |
| {name:'CODE BLUE',dur:3,news2:9,desc:'Cardiac arrest detected! NEWS2 \u2265 7: HIGH RISK. Dispatching all robots.'}, |
| {name:'ROBOT DISPATCH',dur:8,news2:9,desc:'TUG rushing crash cart from pharmacy. Zipline drone delivering O-neg blood. Exo session safely paused. OR on standby.'}, |
| {name:'RESUSCITATION',dur:6,news2:7,desc:'ACLS protocol active. Epinephrine administered. Defibrillation cycle 2.'}, |
| {name:'ROSC ACHIEVED',dur:4,news2:4,desc:'Return of spontaneous circulation! Patient stabilizing. Preparing ICU transfer.'}, |
| {name:'ICU TRANSFER',dur:5,news2:3,desc:'Multi-robot corridor coordination for ICU transport. TUG escorts. AMR fleet yields priority.'}, |
| {name:'RESOLVED',dur:3,news2:2,desc:'Patient in ICU. All robots returning to normal operations. Debrief initiated.'} |
| ] |
| }; |
| function TSC(){ |
| if(scenario.active){ |
| scenario.active=false;scenario.phase=0;scenario.timer=0; |
| document.getElementById('bSC').classList.remove('active'); |
| showOverlay('SCENARIO STOPPED','#8b949e',1500);return; |
| } |
| scenario.active=true;scenario.phase=1;scenario.timer=0; |
| document.getElementById('bSC').classList.add('active'); |
| showOverlay('\u{1f6a8} SCENARIO: CODE BLUE ACTIVATED','#f85149',3000); |
| } |
| function updateScenario(dt){ |
| if(!scenario.active)return; |
| var ph=scenario.phases[scenario.phase]; |
| scenario.timer+=dt;scenario.news2=ph.news2; |
| if(scenario.timer>=ph.dur&&scenario.phase<scenario.phases.length-1){ |
| scenario.phase++;scenario.timer=0; |
| var np=scenario.phases[scenario.phase]; |
| showOverlay('\u{1f4cb} '+np.name,scenario.phase<=3?'#f85149':scenario.phase<=5?'#e3b341':'#3fb950',2500); |
| |
| if(scenario.phase===3&&activeHandoff===null)triggerHandoff(0); |
| if(scenario.phase===4&&activeHandoff===null)triggerHandoff(1); |
| } |
| if(scenario.phase>=scenario.phases.length-1&&scenario.timer>=ph.dur){ |
| scenario.active=false;scenario.phase=0;scenario.timer=0; |
| document.getElementById('bSC').classList.remove('active'); |
| showOverlay('\u2705 SCENARIO COMPLETE \u2014 All systems nominal','#3fb950',3000); |
| } |
| } |
| var handoffLog=[]; |
| function triggerHandoff(idx){ |
| if(activeHandoff!==null)return; |
| var h=handoffs[idx];h.state='active';h.phase=0;h.timer=0;activeHandoff=idx; |
| handoffLog.push({t:simTime,id:h.id,event:'started'}); |
| showOverlay('\u{1f91d} HANDOFF: '+h.desc,'#f0883e',2500); |
| } |
| function updateHandoffs(dt){ |
| if(activeHandoff===null)return; |
| var h=handoffs[activeHandoff]; |
| if(h.state!=='active')return; |
| h.timer+=dt; |
| if(h.timer>=h.durations[h.phase]){ |
| h.timer=0;h.phase++; |
| if(h.phase>=h.phases.length){ |
| h.state='idle';h.phase=0;handoffLog.push({t:simTime,id:h.id,event:'completed'}); |
| showOverlay('\u2705 HANDOFF COMPLETE: '+h.desc,'#3fb950',2000);activeHandoff=null; |
| } |
| } |
| } |
| |
| var botScreenPos={surgical:[-999,-999],amr:[-999,-999],drone:[-999,-999],exo:[-999,-999]}; |
| |
| function iso(x,y,z){var dx=x-FCX,dy=y-FCY;var cr=Math.cos(eRotAngle),sr=Math.sin(eRotAngle);var rx=dx*cr-dy*sr,ry=dx*sr+dy*cr;var cosE=Math.cos(eElevAngle),sinE=Math.sin(eElevAngle);return[W/2+(rx-ry)*cosE*eCamZ*S+eCamX,H/2+(rx+ry)*sinE*eCamZ*S-z*eCamZ*S*Math.max(0.3,cosE*1.5)+eCamY]} |
| function resize(){W=window.innerWidth;H=window.innerHeight;C.width=W*DPR;C.height=H*DPR;C.style.width=W+'px';C.style.height=H+'px';X.setTransform(DPR,0,0,DPR,0,0)} |
| window.addEventListener('resize',resize);resize(); |
| var cams={overview:{x:0,y:-1,z:0.75},surgical:{x:5,y:9,z:2.8},amr:{x:-12,y:-8,z:2.5},drone:{x:3,y:-10,z:2.6},exo:{x:14,y:5,z:3.0}}; |
| function SV(v){camView=v;var c=cams[v];camX=c.x;camY=c.y;camZ=c.z; |
| eCamX=camX*S;eCamY=camY*S;eCamZ=camZ; |
| document.querySelectorAll('#cam-row button').forEach(function(b){b.classList.remove('active')});var m={overview:'bOv',surgical:'bSu',amr:'bAm',drone:'bDr',exo:'bEx'};if(m[v])document.getElementById(m[v]).classList.add('active'); |
| var labels={overview:'OVERVIEW',surgical:'SURGICAL OR',amr:'AMR CORRIDORS',drone:'DRONE PAD',exo:'REHAB WING'}; |
| var colors={overview:'#58a6ff',surgical:'#3fb950',amr:'#58a6ff',drone:'#e3b341',exo:'#bc8cff'}; |
| showOverlay(labels[v]||v,colors[v]||'#58a6ff',1500);updateRobotRef()} |
| function TR(){autoRotate=!autoRotate;document.getElementById('bR').classList.toggle('active',autoRotate);if(autoRotate)showOverlay('AUTO-ROTATE ON \u2014 Right-click drag to rotate manually','#58a6ff',2000);else showOverlay('AUTO-ROTATE OFF','#8b949e',1000)} |
| function SElev(mode){ |
| var presets={top:{e:Math.PI/2.05,label:'TOP-DOWN'},iso:{e:Math.PI/6,label:'ISOMETRIC'},cine:{e:0.15,label:'CINEMATIC'}}; |
| var p=presets[mode];if(!p)return;elevAngle=p.e; |
| ['bVTop','bVIso','bVCine'].forEach(function(id){var el=document.getElementById(id);if(el)el.classList.remove('active')}); |
| var m={top:'bVTop',iso:'bVIso',cine:'bVCine'};if(m[mode]){var el=document.getElementById(m[mode]);if(el)el.classList.add('active')} |
| showOverlay(p.label+' VIEW','#bc8cff',1800); |
| } |
| function TP(){paused=!paused;document.getElementById('bP').textContent=paused?'\u25b6 Play [Space]':'\u23f8 Pause [Space]';var po=document.getElementById('pauseOv');if(po){po.style.display=paused?'flex':'none'}var so=document.getElementById('stoppedOv');if(so&&!paused)so.style.display='none'} |
| function CS(d){var sp=[0.05,0.1,0.25,0.5,1,2,4,8,16],i=sp.indexOf(speed);if(i<0)i=4;i=Math.max(0,Math.min(sp.length-1,i+d));speed=sp[i];document.getElementById('spd').textContent='Speed: '+speed+'\u00d7';document.getElementById('spd').style.color=speed>4?'#f85149':speed<0.25?'#58a6ff':'#8b949e';document.getElementById('spd').style.fontSize=speed>4||speed<0.25?'16px':'11px'; |
| var c=speed>4?'#f85149':speed<0.25?'#58a6ff':'#7ee787'; |
| showOverlay(speed<1?'SLOW MOTION '+speed+'\u00d7':'SPEED '+speed+'\u00d7',c,1200)} |
| function TN(){narrating=!narrating;document.getElementById('bN').classList.toggle('active'); |
| var nb=document.getElementById('narration'); |
| nb.classList.toggle('visible',narrating); |
| if(narrating){ |
| narWallStart=performance.now(); |
| lastNarPhase=-1; |
| narTypeIdx=0; |
| |
| document.getElementById('nT').textContent='\u{1f3ac} '+narPhases[0].title; |
| document.getElementById('nX').textContent='\u2588'; |
| showOverlay('\u{1f3ac} NARRATION STARTED','#e3b341',800); |
| } else { |
| showOverlay('NARRATION OFF','#6e7681',800); |
| } |
| } |
| |
| |
| function TE(){evalVisible=!evalVisible;document.getElementById('evalPanel').classList.toggle('vis',evalVisible);document.getElementById('bE').classList.toggle('active',evalVisible); |
| if(evalVisible){showOverlay('\u{1f4ca} EVALUATION PANEL','#7ee787',700)}else{showOverlay('EVALUATION OFF','#6e7681',500)} |
| } |
| |
| function TPH(){physVisible=!physVisible;document.getElementById('bPH').classList.toggle('active',physVisible); |
| if(physVisible){showOverlay('\u269b PHYSICS EQUATIONS','#bc8cff',700)}else{showOverlay('PHYSICS OFF','#6e7681',500)} |
| } |
| |
| function TCR(){cr2Visible=!cr2Visible;document.getElementById('cr2Panel').classList.toggle('vis',cr2Visible);document.getElementById('bCR').classList.toggle('active',cr2Visible); |
| if(cr2Visible){showOverlay('\u{1f9e0} COSMOS REASON 2','#f0883e',700)}else{showOverlay('CR2 OFF','#6e7681',500);cr2Active=false;cr2Boxes=[]} |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| var cr2Queries=[ |
| {q:'Where should the AMR navigate to avoid the exoskeleton patient?', |
| chain:['Detect exoskeleton patient position at rehab zone (grid 4-8, 22-28)', |
| 'Compute 2.0m safety exclusion radius around active gait cycle', |
| 'Identify AMR current heading toward pharmacy station', |
| 'Calculate DWA-compliant alternate corridor via grid row 18', |
| 'Verify clearance: alternate path maintains 3.2m minimum separation'], |
| conf:0.94,boxes:[ |
| {type:'exo',label:'Patient Safety Zone',color:'#bc8cff',zone:[4,22,8,28]}, |
| {type:'amr',label:'AMR Reroute Path',color:'#58a6ff',zone:[10,18,25,20]}, |
| {type:'clear',label:'3.2m Clearance',color:'#3fb950',zone:[8,20,10,24]} |
| ]}, |
| {q:'Is there a collision risk between the drone and surgical equipment?', |
| chain:['Locate active drone altitude: 3.2m above corridor centerline', |
| 'Map surgical OR ceiling clearance: 3.8m at equipment zone', |
| 'Compute minimum vertical separation: 0.6m (above 0.5m threshold)', |
| 'Check lateral deviation from planned Bezier trajectory: 0.18m', |
| 'Assessment: LOW RISK \u2014 vertical and lateral margins within tolerance'], |
| conf:0.97,boxes:[ |
| {type:'drone',label:'Drone Flight Envelope',color:'#e3b341',zone:[12,8,20,14]}, |
| {type:'surg',label:'OR Equipment Zone',color:'#ff6b6b',zone:[14,4,22,8]}, |
| {type:'clear',label:'Separation Margin',color:'#3fb950',zone:[12,6,20,10]} |
| ]}, |
| {q:'Does the surgical workspace have adequate clearance for arm rotation?', |
| chain:['Map da Vinci Xi arm workspace: 4-arm configuration at OR table', |
| 'Compute swept volume for each arm: 0.8m radius at current joint config', |
| 'Check inter-arm clearance: min 12cm between arms 2 and 3', |
| 'Verify no overlap with sterile field boundary (0.3m margin maintained)', |
| 'Result: ADEQUATE \u2014 all arms within safe operational envelope, Jacobian non-singular'], |
| conf:0.96,boxes:[ |
| {type:'surg',label:'Arm Swept Volume',color:'#ff6b6b',zone:[14,3,22,9]}, |
| {type:'surg',label:'Sterile Field',color:'#f0883e',zone:[16,5,20,7]}, |
| {type:'clear',label:'Inter-arm Gap',color:'#3fb950',zone:[17,6,19,6.5]} |
| ]}, |
| {q:'What is the exoskeleton patient fall risk during current gait phase?', |
| chain:['Read gait phase: mid-swing on right leg, stance on left', |
| 'Compute center of mass projection vs base of support polygon', |
| 'CoM deviation: 4.2cm lateral (threshold: 8cm for assisted gait)', |
| 'Ground reaction force: 78N within expected range for body weight', |
| 'Fall risk assessment: LOW (margin of stability = 3.8cm, symmetry 0.93)'], |
| conf:0.92,boxes:[ |
| {type:'exo',label:'Base of Support',color:'#bc8cff',zone:[4,24,8,27]}, |
| {type:'exo',label:'CoM Projection',color:'#e3b341',zone:[5.5,25,6.5,26]}, |
| {type:'clear',label:'Stability Margin',color:'#3fb950',zone:[4.5,24.5,7.5,26.5]} |
| ]}, |
| {q:'Is the specimen handoff zone clear for AMR pickup?', |
| chain:['Locate surgical-to-logistics handoff zone at corridor junction (24,12)', |
| 'Scan for AMR fleet occupancy: 1 unit queued at adjacent station', |
| 'Verify specimen container on transfer shelf (temperature: 4.2C nominal)', |
| 'Check corridor traffic: no conflicting drone flight paths in zone', |
| 'Handoff zone status: CLEAR \u2014 AMR unit 2 can proceed to pickup position'], |
| conf:0.98,boxes:[ |
| {type:'amr',label:'Handoff Zone',color:'#58a6ff',zone:[22,10,26,14]}, |
| {type:'surg',label:'Specimen Origin',color:'#ff6b6b',zone:[20,6,24,10]}, |
| {type:'amr',label:'AMR Queue Position',color:'#58a6ff',zone:[26,12,28,14]} |
| ]} |
| ]; |
| |
| |
| var cr2Entities={ |
| surgical:{kw:['surgical','surgery','surgeon','davinci','da vinci','arm','scalpel','suture','incision','tissue','force','sterile','operating','retract','clamp','cauteri','dissect','biopsy','specimen','or zone','instrument'],color:'#ff6b6b',zone:[14,3,22,9],label:'Surgical Zone'}, |
| amr:{kw:['amr','fleet','logistics','deliver','transport','cart','mobile','navigate','corridor','path','route','pharmacy','supply','pickup','drop','carrier','dispatch','station'],color:'#58a6ff',zone:[22,12,30,20],label:'AMR Fleet Zone'}, |
| drone:{kw:['drone','aerial','fly','flight','uav','altitude','rotor','propel','airspace','landing','takeoff','hover','payload','blood','sample','meds','air','wing'],color:'#e3b341',zone:[12,8,22,16],label:'Drone Airspace'}, |
| exo:{kw:['exo','exoskeleton','patient','rehab','gait','walk','stride','limb','knee','hip','ankle','fall','balance','therapy','recovery','assist','muscle','joint','step','leg'],color:'#bc8cff',zone:[4,22,8,28],label:'Rehab Zone'}, |
| handoff:{kw:['handoff','hand-off','transfer','pickup','junction','interface','exchange','relay','staging','queue','pickup zone'],color:'#f0883e',zone:[22,10,26,14],label:'Handoff Zone'}, |
| corridor:{kw:['corridor','hallway','passage','intersection','traffic','congestion','bottleneck','throughput','flow','main hall'],color:'#6e7681',zone:[10,16,30,22],label:'Corridor Network'} |
| }; |
| |
| |
| var cr2Intents={ |
| safety:{kw:['safe','danger','risk','hazard','collision','crash','avoid','protect','harm','injury','emergency','alert','warning','violation','threat','clearance','okay','secure'],label:'SAFETY'}, |
| navigation:{kw:['navigate','path','route','where','direction','go','move','travel','reach','approach','head','plan','optimal','shortest','fastest','detour','reroute','toward'],label:'NAVIGATION'}, |
| status:{kw:['status','state','current','what','how','condition','check','monitor','reading','level','report','update','info','tell','show','describe'],label:'STATUS'}, |
| proximity:{kw:['near','close','distance','far','separation','between','overlap','adjacent','next to','proximity','radius','range','clearance','gap','margin','space','room'],label:'PROXIMITY'}, |
| capacity:{kw:['capacity','load','full','empty','available','utilization','throughput','busy','idle','queue','wait','bottleneck','overload','efficiency','battery','energy','power'],label:'CAPACITY'}, |
| coordination:{kw:['coordinate','handoff','sync','together','pipeline','sequence','order','schedule','timing','latency','delay','workflow','depend','trigger','after','before','ready','when'],label:'COORDINATION'}, |
| optimize:{kw:['optimize','improve','best','better','faster','efficient','reduce','minimize','maximize','increase','enhance','speed'],label:'OPTIMIZATION'} |
| }; |
| |
| |
| var cr2ChainModules={ |
| surgical_safety:['Map da Vinci Xi workspace: '+D.n_arms+'-arm config at grid (14-22, 3-9)','Read end-effector forces: F={f}N across all arms (threshold <2N)','Check sterile field integrity: {m}m boundary margin maintained','Verify Jacobian condition number: {j} (non-singular, well-conditioned)','Safety assessment: {verdict} \u2014 all force and clearance constraints satisfied'], |
| surgical_status:['Query da Vinci Xi telemetry at current simulation time','Arm positions: '+D.n_arms+' arms active, joint angles within ROM limits','Force sensor readings: mean {f}N, peak {fp}N (limit 2.0N)','IK solver convergence: {ik}ms per frame (target <3ms)','Status: OPERATIONAL \u2014 GEARS composite {g}/30, economy of motion {e}%'], |
| surgical_navigation:['Identify target tissue region in surgical workspace','Compute optimal arm trajectory via inverse kinematics','Verify collision-free path between arms 1-4: min clearance {m}cm','Check approach angle against tissue surface normal','Path validated: Jacobian transpose control engaged, F={f}N approach force'], |
| surgical_proximity:['Map da Vinci Xi arm envelope: '+D.n_arms+' arms at grid (14-22, 3-9)','Compute inter-arm separation: minimum {m}m between adjacent arms','Measure distance to sterile field boundary: {m}m margin','Check proximity to overhead lighting: {a}m vertical clearance','Proximity: {verdict} \u2014 all separation margins within operational limits'], |
| amr_safety:['Scan AMR fleet positions across hospital corridor network','Detect obstacles within 3.0m radius of each unit: {n} detected','Verify DWA velocity constraints: v\u2208[0,{v}m/s], \u03c9\u2208[-1,1]rad/s','Check corridor intersection arbitration: priority protocol active','Safety: {verdict} \u2014 obstacle avoidance 100%, SLAM drift <0.02m'], |
| amr_navigation:['Query AMR fleet routing table for optimal path assignment','Current fleet utilization: {u}% across {n} active units','Compute shortest path via Dijkstra on hospital grid graph','Check corridor congestion: segment occupancy {c}% (threshold 80%)','Route computed: path efficiency {p}%, ETA {t}s via corridor row {r}'], |
| amr_status:['Poll AMR fleet management system for unit status','Active units: {n}/4 operational, {q} queued for tasks','Fleet utilization: {u}%, on-time delivery rate: {d}%','Battery levels: unit 1 at {b1}%, unit 2 at {b2}%, all above 20%','Fleet status: NOMINAL \u2014 next pickup in {t}s at {s}'], |
| amr_capacity:['Analyze fleet task queue depth: {q} pending deliveries','Corridor throughput: {t} transits/min (capacity: 8 transits/min)','Station queue lengths: pharmacy {p}, OR-supply {o}, ICU {i}, lab {l}','Identify bottleneck: {zone} station at {pct}% capacity','Capacity: within limits \u2014 redistribute {rt} units to balance load'], |
| drone_safety:['Map active drone flight envelope: altitude {a}m, speed {v}m/s','Check vertical separation from ceiling: min {a}m clearance above','Verify no-fly zone compliance: {n} restricted areas checked','Scan for cross-traffic: {ct} other aerial objects in sector','Safety: {verdict} \u2014 all airspace constraints satisfied'], |
| drone_navigation:['Plot B\u00e9zier trajectory: P=(1-t)\u00b2P\u2080+2t(1-t)P\u2081+t\u00b2P\u2082','Origin: drone pad (15,20) \u2192 Destination: {dest} ({dx},{dy})','Compute altitude profile: cruise at {a}m, descent at {da}m/s','Wind drag estimate: F_d=\u00bd\u03c1v\u00b2C_dA = {fd}N','Trajectory validated: deviation <{pd}%, energy budget {e}% of capacity'], |
| drone_status:['Query drone swarm telemetry for active missions','Active missions: {n}/3 in-flight, {q} completed this cycle','Current altitudes: drone 1 at {a1}m, drone 2 at {a2}m','Payload status: temperature {temp}\u00b0C (nominal 2-8\u00b0C)','Fleet status: mission success {ms}%, accuracy \u00b1{da2}m'], |
| drone_capacity:['Check drone battery and payload capacity','Current energy reserves: {e}% capacity remaining','Payload weight vs max: well within {u}% utilization','Estimate remaining flight time: {t}s at current draw rate','Capacity: SUFFICIENT \u2014 {n} additional deliveries feasible this cycle'], |
| exo_safety:['Read exoskeleton IMU and joint encoder data','Compute center of mass projection vs support polygon','CoM lateral deviation: {mos}cm (threshold: 8cm for assisted gait)','Ground reaction force: {grf}N, symmetry index: {sym}','Fall risk: LOW \u2014 margin of stability = {mos}cm, gait phase: {phase}'], |
| exo_status:['Query rehabilitation exoskeleton telemetry','Joint angles: hip {hip}\u00b0, knee {knee}\u00b0, ankle {ankle}\u00b0','Gait phase: {phase}, cycle frequency: {freq}Hz','ROM recovery: {rom}%, movement smoothness (SAL): {sal}','Rehab status: Fugl-Meyer progression at {fm}% of target'], |
| exo_navigation:['Map patient intended walking trajectory in rehab zone','Obstacle-free corridor available: 4.0m width','Compute assistive torque profile: \u03c4={tau}N\u00b7m for terrain','Verify stability throughout planned gait cycles: margin {mos}cm','Path: {verdict} \u2014 {n} gait cycles feasible at current assist level'], |
| handoff_coordination:['Identify cross-domain handoff at junction grid (24,12)','Surgical phase: {sp}% complete, specimen ready in {t}s','AMR unit queued at ({ax},{ay}), ETA to pickup: {et}s','Verify specimen container: temp {temp}\u00b0C, seal integrity OK','Coordination: pipeline latency {lat}s, all dependencies satisfied'], |
| corridor_capacity:['Scan full corridor network occupancy map','Active agents: {n} AMRs + {ct} drones in corridor network','Intersection density: {den} agents/min at junction ({jx},{jy})','Congestion hotspot: segment ({sx},{sy})\u2192({ex},{ey}) at {pct}%','Corridor: {verdict} \u2014 reroute {rt} units to reduce load'], |
| general_multi:['Scan hospital environment: {n} active agents across {z} zones','Identify relevant entities: {entities}','Compute spatial relationships: min separation {sep}m between pairs','Check system-wide safety: {sv} violations, {w} active warnings','Assessment: {verdict} \u2014 multi-robot coordination within AEGIS parameters'] |
| }; |
| |
| |
| function cr2Val(key){ |
| var t=simTime||1; |
| var vals={ |
| f:(1.2+0.5*Math.sin(t*0.7)).toFixed(2), fp:(1.7+0.2*Math.sin(t*0.5)).toFixed(2), |
| m:(0.3+0.05*Math.sin(t*0.3)).toFixed(2), j:(12.4+2*Math.sin(t*0.4)).toFixed(1), |
| g:(27+1.5*Math.sin(t*0.31)).toFixed(1), e:(91+3*Math.sin(t*0.2)).toFixed(0), |
| ik:(2.1+0.4*Math.sin(t*0.37)).toFixed(1), v:(1.2+0.3*Math.sin(t*0.25)).toFixed(1), |
| u:(82+5*Math.sin(t*0.25)).toFixed(0), n:Math.floor(3+Math.sin(t*0.15)), |
| c:(45+15*Math.sin(t*0.2)).toFixed(0), p:(87+3*Math.sin(t*0.18)).toFixed(0), |
| t:(42+4*Math.sin(t*0.22)).toFixed(0), r:Math.floor(16+2*Math.sin(t*0.3)), |
| d:(94+3*Math.sin(t*0.29)).toFixed(0), q:Math.floor(2+Math.sin(t*0.2)), |
| b1:(78+10*Math.sin(t*0.1)).toFixed(0), b2:(65+12*Math.sin(t*0.12)).toFixed(0), |
| s:['Pharmacy','OR-Supply','ICU','Lab'][Math.floor(t*0.1)%4], |
| a:(3.0+0.8*Math.sin(t*0.2)).toFixed(1), da:(0.5+0.1*Math.sin(t*0.3)).toFixed(1), |
| fd:(0.5*1.225*Math.pow(1.5,2)*0.02*0.04).toFixed(4), |
| pd:(2.1+1*Math.sin(t*0.26)).toFixed(1), ms:(91+3*Math.sin(t*0.2)).toFixed(0), |
| temp:(4.2+0.5*Math.sin(t*0.15)).toFixed(1), |
| a1:(3.2+0.5*Math.sin(t*0.18)).toFixed(1), a2:(2.8+0.6*Math.sin(t*0.22)).toFixed(1), |
| da2:(0.3+0.1*Math.sin(t*0.33)).toFixed(2), |
| dest:['Pharmacy','ICU','Lab','Storage'][Math.floor(t*0.08)%4], |
| dx:Math.floor(25+5*Math.sin(t*0.1)), dy:Math.floor(10+8*Math.sin(t*0.12)), |
| grf:(75+10*Math.sin(t*0.6)).toFixed(0), sym:(0.93+0.03*Math.sin(t*0.24)).toFixed(2), |
| hip:(25+10*Math.sin(t*0.8)).toFixed(0), knee:(35+15*Math.sin(t*0.8)).toFixed(0), |
| ankle:(5+3*Math.sin(t*0.9)).toFixed(0), |
| phase:['mid-swing','heel-strike','stance','toe-off'][Math.floor(t*0.8)%4], |
| freq:(0.8+0.15*Math.sin(t*0.3)).toFixed(2), rom:(78+5*Math.sin(t*0.16)).toFixed(0), |
| sal:(0.87+0.05*Math.sin(t*0.22)).toFixed(2), fm:(72+6*Math.sin(t*0.14)).toFixed(0), |
| tau:(12+4*Math.sin(t*0.7)).toFixed(1), mos:(3.8+1.2*Math.sin(t*0.5)).toFixed(1), |
| w:Math.floor(Math.sin(t*0.4)>0.9?1:0), sp:(65+20*Math.sin(t*0.15)).toFixed(0), |
| et:(3+2*Math.sin(t*0.3)).toFixed(1), ax:24, ay:13, |
| lat:(1.2+0.5*Math.sin(t*0.35)).toFixed(1), ct:Math.floor(Math.sin(t*0.2)>0.7?1:0), |
| sep:(2.5+1*Math.sin(t*0.3)).toFixed(1), sv:0, |
| den:(4+2*Math.sin(t*0.25)).toFixed(0), jx:24, jy:18, |
| sx:22, sy:16, ex:28, ey:20, pct:(55+20*Math.sin(t*0.2)).toFixed(0), |
| rt:Math.floor(1+Math.sin(t*0.3)), |
| o:Math.floor(1+Math.sin(t*0.15)), i:Math.floor(2+Math.sin(t*0.2)), |
| l:Math.floor(1+Math.sin(t*0.18)), z:4, zone:'OR-Supply' |
| }; |
| vals.verdict=(parseFloat(vals.sep)>1.5&&vals.sv===0)?'NOMINAL':'CAUTION'; |
| vals.entities=''; |
| return vals[key]!==undefined?vals[key]:key; |
| } |
| function fillTemplate(tmpl,vals){ |
| return tmpl.replace(/\{(\w+)\}/g,function(_,k){return vals&&vals[k]!==undefined?vals[k]:cr2Val(k)}); |
| } |
| |
| |
| var cr2Suggestions=[ |
| 'Where is the nearest AMR to the surgical zone?', |
| 'What is the current drone altitude and payload status?', |
| 'Is the exoskeleton patient at risk of falling?', |
| 'Can the AMR safely pass through the main corridor?', |
| 'What is the force reading on the surgical arms?', |
| 'How long until the specimen handoff completes?', |
| 'Is there enough clearance for the drone to land?', |
| 'What is the corridor congestion level?', |
| 'Are all robots operating within safety limits?', |
| 'What is the current fleet utilization rate?', |
| 'Is the rehab zone clear of other robots?', |
| 'What is the surgical procedure completion status?', |
| 'Can the drone deliver blood to the ICU now?', |
| 'Where should the AMR queue for the next pickup?', |
| 'What is the gait symmetry of the exoskeleton patient?', |
| 'Is the sterile field around the OR intact?', |
| 'How many AMR units are currently idle?', |
| 'What is the battery level of the AMR fleet?', |
| 'Is there a scheduling conflict at the handoff zone?', |
| 'What is the overall system coordination latency?', |
| 'What is the Kelvin-Voigt tissue model?', |
| 'How does the Dynamic Window Approach work?', |
| 'What is Cosmos Reason 2?', |
| 'Explain GEARS surgical assessment', |
| 'What is PhysX 5 and how does it work?', |
| 'How does Isaac Lab work?', |
| 'What is the Fugl-Meyer Assessment?', |
| 'What is the VARP evaluation framework?', |
| 'How does sim-to-real transfer work?', |
| 'What is the da Vinci 5 force feedback?', |
| 'Explain the inverted pendulum gait model', |
| 'What are surgical autonomy levels?', |
| 'How does VDA 5050 fleet management work?', |
| 'What is NVIDIA GR00T?', |
| 'How does this demo work?', |
| 'What is NVIDIA Omniverse?', |
| 'Explain Bezier curve trajectory planning', |
| 'What are SIL safety integrity levels?', |
| 'What is the DARPA SubT Challenge?' |
| ]; |
| |
| |
| |
| |
| |
| |
| var cr2KnowledgeGraph=[ |
| |
| {id:'cosmos_reason2',domain:'NVIDIA Platform',kw:['cosmos reason','cr2','cosmos reason 2','reason2','reason 2','nvidia reason','what is cosmos','vlm','vision language'], |
| title:'NVIDIA Cosmos Reason 2 Architecture', |
| answer:'Cosmos Reason 2 is a multimodal vision-language model built on the Qwen3-VL architecture, consisting of a Vision Transformer encoder paired with a Dense Transformer LLM backbone. Released December 19, 2025, it ships in 2B and 8B parameter sizes (the 8B contains exactly 8,767,123,696 parameters). CR2 is post-trained from Qwen3-VL-Instruct checkpoints via supervised fine-tuning and reinforcement learning on physical common-sense and embodied reasoning data.', |
| facts:['Architecture: Qwen3-VL (ViT + Dense Transformer)','Sizes: 2B and 8B parameters','VRAM: 24 GB min (2B), 32 GB (8B)','License: NVIDIA Open Model License (commercial OK)','Hardware: Hopper, Blackwell, DGX Spark, Jetson AGX'], |
| related:['cr2_chain_of_thought','cr2_context_window','cr2_benchmarks','cr2_vs_cr1'],refs:['NVIDIA Cosmos Docs','HuggingFace nvidia/Cosmos-Reason2-8B']}, |
| |
| {id:'cr2_chain_of_thought',domain:'NVIDIA Platform',kw:['chain of thought','cot','reasoning chain','think','spatial reasoning','how does cr2 reason','reasoning pipeline','system 2'], |
| title:'CR2 Chain-of-Thought Spatial Inference', |
| answer:'CR2 performs spatial reasoning through a structured chain-of-thought pipeline where the model generates explicit <think> reasoning blocks before producing an <answer> block. The pipeline processes video at 4 FPS through the ViT encoder, combines visual tokens with text prompts, and feeds them through the core LLM for deliberate System 2 reasoning about physical context, causality, and intent. CR2 supports 2D/3D point localization, bounding-box extraction, trajectory prediction, and OCR.', |
| facts:['Output: <think>{reasoning}</think><answer>{answer}</answer>','Video input: 4 FPS (training config)','Recommended max tokens: 4,096+','Supports: 2D/3D point localization, bounding boxes, OCR, set-of-mark'], |
| related:['cosmos_reason2','cr2_context_window','physics_alignment'],refs:['NVIDIA Cosmos Reason 2 GitHub','Cosmos Cookbook post-training guide']}, |
| |
| {id:'cr2_context_window',domain:'NVIDIA Platform',kw:['256k','context window','token','token limit','context length','how many tokens','long context'], |
| title:'256K Token Context Window', |
| answer:'CR2 supports up to 256,000 input tokens, a 16-fold improvement over Cosmos Reason 1\'s 16K limit. This expansion enables analysis of much longer video sequences and complex multi-frame reasoning tasks critical for processing extended autonomous driving sequences, industrial surveillance footage, and multi-step robot planning scenarios.', |
| facts:['CR2 context: 256K tokens','CR1 context: 16K tokens','Improvement: 16\u00d7 expansion','Enables: long video analysis, multi-step planning'], |
| related:['cosmos_reason2','cr2_benchmarks'],refs:['HuggingFace nvidia/Cosmos-Reason2-8B']}, |
| |
| {id:'cr2_benchmarks',domain:'NVIDIA Platform',kw:['benchmark','av-vqa','score','accuracy','performance','65.1','75.7','80.1','how good','leaderboard'], |
| title:'CR2 AV-VQA Benchmark Performance', |
| answer:'On the custom AV-VQA benchmark co-developed by NVIDIA and Uber, CR2-8B achieves an overall zero-shot accuracy of 80.1% across 5,050 predictions on 455 videos with 100% parseable rate. The headline scores of 65.1% (Spatial and Temporal) and 75.7% (Ego Behavior) represent per-category scores for the model\'s weakest areas. The strongest category, Characters and Interactions, scores 89.5%. After SFT post-training, LingoQA improved 13.8 percentage points.', |
| facts:['Overall: 80.1% (CR2-8B)','Spatial & Temporal: 65.1%','Ego Behavior: 75.7%','Characters & Interactions: 89.5% (best)','Post-SFT LingoQA: +13.8pp (63.2%\u219277.0%)'], |
| related:['cosmos_reason2','cr2_vs_cr1'],refs:['Cosmos Reason 2 Model Card','NVIDIA/Uber AV-VQA benchmark']}, |
| |
| {id:'cr2_vs_cr1',domain:'NVIDIA Platform',kw:['reason 1','cr1','difference','compare','upgrade','improvement','versus','vs cr1','vs reason 1','previous'], |
| title:'Cosmos Reason 2 vs Reason 1', |
| answer:'CR1 was available in 7B, 8B, and 56B sizes with 16K token context. The 7B used Qwen2.5-VL-7B-Instruct (Dense Transformer); the 8B/56B used Nemotron-H hybrid Mamba-MLP-Transformer. CR2 unifies on a pure Dense Transformer on Qwen3-VL, delivers 256K token context, and adds 2D/3D point localization, OCR, set-of-mark understanding, and visual critics for AI-generated video assessment. CR2 tops the Physical AI Bench and Physical Reasoning leaderboards as the top open model.', |
| facts:['CR1-7B: Qwen2.5-VL Dense; 8B/56B: Nemotron-H Mamba hybrid','CR2: Dense Transformer, 256K ctx, Qwen3-VL','New in CR2: point localization, OCR, visual critics','CR1-7B: 87.3% RoboVQA, 70.8% AV dataset'], |
| related:['cosmos_reason2','cr2_benchmarks','cosmos_wfm'],refs:['HuggingFace CR1/CR2 Model Cards','NVIDIA Blog']}, |
| |
| {id:'cosmos_wfm',domain:'NVIDIA Platform',kw:['world foundation','wfm','cosmos predict','video generation','synthetic','3d world','world model','generate world'], |
| title:'Cosmos World Foundation Models', |
| answer:'Cosmos WFMs use two transformer architectures \u2014 autoregressive and diffusion \u2014 to generate physics-aware videos predicting future world states. Training consumed 9,000 trillion tokens from 20 million hours of driving, robotics, and real-world data with pre-training on 200 million clips. The Cosmos Tokenizer delivers 8\u00d7 more compression and 12\u00d7 faster processing than prior state-of-the-art with +4 dB PSNR improvement on DAVIS benchmarks.', |
| facts:['Training: 9,000 trillion tokens, 20M hours video','Pre-training: 200 million clips','Tokenizer: 8\u00d7 compression, 12\u00d7 faster, +4 dB PSNR','Video generation: up to 30 seconds','Predict sizes: 2B and 14B'], |
| related:['3d_consistency','physics_alignment','sim_to_real','cosmos_reason2'],refs:['NVIDIA Cosmos Technical Blog','arXiv 2501.03575']}, |
| |
| {id:'3d_consistency',domain:'NVIDIA Platform',kw:['3d consistency','sampson','psnr','ssim','lpips','3d','consistency metric','quality metric'], |
| title:'3D Consistency Metrics (Cosmos WFM)', |
| answer:'The 3D consistency benchmarks apply to Cosmos World Foundation Models (video generation), not Cosmos Reason 2. Evaluated on 500 static-scene videos from RealEstate10K, the Cosmos Diffusion Text2World 7B model achieved Sampson error 0.355, PSNR 33.02 dB, SSIM 0.939, and LPIPS 0.070 \u2014 substantially outperforming the VideoLDM baseline. Real video reference values are Sampson 0.431 and PSNR 35.38 dB.', |
| facts:['Sampson error: 0.355 (baseline 0.841, real 0.431)','PSNR: 33.02 dB (baseline 26.23, real 35.38)','SSIM: 0.939 (baseline 0.783)','LPIPS: 0.070 (baseline 0.135)'], |
| related:['cosmos_wfm','physics_alignment'],refs:['NVIDIA Cosmos arXiv paper','RealEstate10K benchmark']}, |
| |
| {id:'physics_alignment',domain:'NVIDIA Platform',kw:['physics alignment','physics scenario','gravity','collision','torque','inertia','physics eval','physx scenario'], |
| title:'Eight Physics Alignment Scenarios', |
| answer:'Eight controlled scenarios generated using NVIDIA PhysX and Isaac Sim evaluate properties including gravity, collision, torque, and inertia. Evaluation uses pixel-level metrics (PSNR, SSIM), feature-level metrics (DreamSim), and object-level metrics (IoU). With 9-frame conditioning, the Cosmos Diff V2W 7B achieves PSNR 21.06, SSIM 0.69, and average IoU 0.592. Known limitations include object impermanence and implausible physics violations.', |
| facts:['Scenarios: gravity, collision, torque, inertia (8 total)','PSNR: 21.06, SSIM: 0.69, IoU: 0.592','Conditioning: 9 frames','Limitations: object impermanence, physics violations'], |
| related:['cosmos_wfm','physx5','3d_consistency'],refs:['NVIDIA Cosmos Technical Report']}, |
| |
| {id:'isaac_lab',domain:'NVIDIA Platform',kw:['isaac lab','isaac laboratory','robot learning','parallel environment','gpu accelerated','rl training','reinforcement learning framework'], |
| title:'NVIDIA Isaac Lab', |
| answer:'Isaac Lab is an open-source modular framework for robot learning built on Isaac Sim, providing GPU-accelerated environments for running thousands of parallel RL and imitation learning simulations. It uses PhysX\'s Direct-GPU API to expose simulation results directly as PyTorch CUDA tensors, keeping the entire agent-environment loop on GPU and eliminating CPU-GPU transfer bottlenecks. Isaac Lab supports 30+ ready-to-train environments across locomotion (11 robot morphologies), manipulation, and dexterous hand tasks.', |
| facts:['Default parallel envs: 4,096 simultaneous on one GPU','RL libraries: SKRL, RSL-RL, RL-Games, SB3, Ray','Physics: PhysX, NVIDIA Warp, MuJoCo','Latest: Isaac Lab 2.3 (Isaac Sim 6.0 compatible)'], |
| related:['isaac_lab_arena','isaac_sim','physx5','sim_to_real'],refs:['NVIDIA Isaac Lab GitHub','Isaac Lab technical paper']}, |
| |
| {id:'isaac_lab_arena',domain:'NVIDIA Platform',kw:['isaac arena','lab arena','policy evaluation','parallel benchmark','scalable evaluation','benchmark task'], |
| title:'Isaac Lab-Arena Parallel Evaluation', |
| answer:'Isaac Lab-Arena is an open-source framework for scalable policy evaluation co-developed with Lightwheel. It provides streamlined APIs for task curation, automated diversification, and GPU-accelerated parallel benchmarking. Evaluating GR00T N1.5 across 4,096 environments per task on 8\u00d7 RTX 6000D GPUs, it completed a complex 10-task RoboCasa suite in 0.76 hours compared to 34.9 hours sequentially \u2014 a 40\u00d7 speedup.', |
| facts:['Speedup: 40\u00d7 vs sequential','4,096 parallel envs per task','Hardware: 8\u00d7 RTX 6000D','10-task RoboCasa: 0.76 hours (vs 34.9h)'], |
| related:['isaac_lab','isaac_sim','groot'],refs:['NVIDIA Developer Blog','Isaac Lab-Arena paper']}, |
| |
| {id:'isaac_sim',domain:'NVIDIA Platform',kw:['isaac sim','simulation','benchmark','fps','physics step','ros2','render speed','sim performance'], |
| title:'Isaac Sim Benchmarking', |
| answer:'Isaac Sim is the open-source robotics simulation application on Omniverse. Key performance data for an RTX 4090 with 2 Nova Carter robots: physics frametime 17.61 ms (about 56.8 physics steps per second), ROS2 rendering at 51.7 FPS mean with Real Time Factor 0.849. Default physics runs at 60 steps per second (commonly 120 steps/s with 60 FPS rendering). RL training throughput reaches approximately 82,000\u201394,000 environment FPS with 4,096 parallel environments.', |
| facts:['Physics: 60 steps/s default (configurable to 120)','ROS2 render: 51.7 FPS, RTF 0.849','Multi-GPU: 72\u201389% speedup with 2 GPUs','RL throughput: ~82K\u201394K env FPS at 4,096 parallel'], |
| related:['isaac_lab','physx5','omniverse','sim_to_real'],refs:['Isaac Sim Benchmarks docs','Performance Optimization Handbook']}, |
| |
| {id:'physx5',domain:'NVIDIA Platform',kw:['physx','physx 5','physics engine','rigid body','gpu physics','simulation engine','nvidia physics'], |
| title:'NVIDIA PhysX 5', |
| answer:'PhysX 5 (latest version 5.6.1) is NVIDIA\'s open-source real-time physics engine under BSD-3 license. GPU acceleration covers broad-phase collision detection, contact generation, constraint solving, and shape/body management. Signed Distance Field collision handles non-convex shapes without convex decomposition. Environment IDs enable built-in filtering for parallel environment isolation in RL training, routinely supporting 4,096+ simultaneous physics environments on a single GPU.', |
| facts:['Version: 5.6.1','License: BSD-3 (open source)','Default buffer: ~10,000 rigid bodies (tunable)','Parallel envs: 4,096+ on single GPU','SDF collision for non-convex shapes'], |
| related:['physx_articulations','physx_softbody','physx_friction','isaac_sim'],refs:['PhysX 5 Documentation','NVIDIA Developer']}, |
| |
| {id:'physx_articulations',domain:'NVIDIA Platform',kw:['articulation','featherstone','reduced coordinate','joint solver','joint error','articulation solver','kinematic chain'], |
| title:'PhysX 5 Articulation Solvers', |
| answer:'PhysX simulates articulations in reduced coordinates using Featherstone\'s algorithm with linear-time complexity. Configuration is determined by root-body pose and joint angles rather than world poses of each body, providing zero joint error by design and handling larger mass ratios than standard rigid-body joints. Supported joint types include revolute, prismatic, spherical, D6, fixed, and mimic joints. Joint drives use an implicit formulation that handles very large gains without instability.', |
| facts:['Algorithm: Featherstone (linear-time)','Zero joint error by design','Joints: revolute, prismatic, spherical, D6, fixed, mimic','Implicit drive formulation (large gains stable)'], |
| related:['physx5','davinci_xi','jacobian_transpose'],refs:['PhysX Articulations docs']}, |
| |
| {id:'physx_softbody',domain:'NVIDIA Platform',kw:['soft body','fem','pbd','deformable','cloth','fluid','tetrahedral','position based'], |
| title:'PhysX 5 FEM and PBD Soft Bodies', |
| answer:'FEM soft-body simulation models deformable materials using tetrahedral meshes with separate collision and simulation meshes, evaluating stress at each tetrahedron per timestep. Material properties include Young\'s Modulus, dynamic friction, and Poisson\'s ratio. PBD (Position-Based Dynamics) simulates fluids, granular materials, cloth, and inflatables. Both FEM and PBD are GPU-only (CUDA required). PBD was inherited from the NVIDIA FLeX framework.', |
| facts:['FEM: tetrahedral mesh, per-tetrahedron stress','PBD: fluids, granular, cloth, inflatables','Both GPU-only (CUDA required)','Material: Young\'s Modulus, friction, Poisson ratio'], |
| related:['physx5','kelvin_voigt'],refs:['PhysX Soft Bodies docs','CG Channel']}, |
| |
| {id:'physx_friction',domain:'NVIDIA Platform',kw:['joint friction','coulomb friction','viscous friction','friction model','joint drag'], |
| title:'PhysX 5 Joint Friction Models', |
| answer:'PhysX 5.6+ articulation joint friction combines Coulomb friction (static and dynamic) with viscous friction. For each joint DOF, the system evaluates whether the joint can be brought to rest using static friction alone by comparing the required impulse to staticFrictionEffort. If sufficient, the joint is held at rest; otherwise all available friction impulse slows it down. Earlier versions used a simpler Coulomb model where friction impulse equals joint forces multiplied by friction coefficient.', |
| facts:['Types: Coulomb (static + dynamic) + viscous','Static check: compare impulse to staticFrictionEffort','5.6+: combined Coulomb + viscous model','Pre-5.6: simple Coulomb only'], |
| related:['physx5','physx_articulations'],refs:['PhysX 5.6 Articulations docs']}, |
| |
| {id:'groot',domain:'NVIDIA Platform',kw:['groot','gr00t','humanoid','foundation model','humanoid robot','n1','n1.6','robot brain'], |
| title:'NVIDIA GR00T Foundation Model', |
| answer:'GR00T (Generalist Robot 00 Technology) is NVIDIA\'s foundation model for humanoid robots, announced at GTC March 2024. The GR00T N1 model uses a dual-system architecture: System 2 is an Eagle-2 VLM running at approximately 10 Hz for reasoning, while System 1 is a Diffusion Transformer generating motor actions at 120 Hz via action flow matching. GR00T N1.6 (CoRL 2025) upgrades to Cosmos-Reason-2B VLM with 32 DiT layers and adds full-body loco-manipulation.', |
| facts:['N1: Eagle-2 VLM (~10 Hz) + DiT (120 Hz)','N1-2B pretraining: ~50,000 H100 GPU hours','N1.6: Cosmos-Reason-2B VLM, 32 DiT layers','Partners: 1X, Agility, Boston Dynamics, Figure AI'], |
| related:['cosmos_reason2','isaac_lab','sim_to_real','omniverse'],refs:['NVIDIA GR00T announcement','GR00T N1.6 blog']}, |
| |
| {id:'omniverse',domain:'NVIDIA Platform',kw:['omniverse','digital twin','openusd','usd','universal scene','nucleus','kit sdk','3d platform'], |
| title:'NVIDIA Omniverse Architecture', |
| answer:'Omniverse is a platform of libraries, microservices, and APIs built on OpenUSD for developing physical AI applications including industrial digital twins and robotics simulation. Core components include Nucleus (database and collaboration engine), RTX Renderer (real-time ray-tracing), PhysX (physics simulation), and Kit SDK 107 (extensible application framework). OpenUSD, invented by Pixar and open-sourced in 2016, uses composition arcs following LIVRPS strength ordering.', |
| facts:['Built on OpenUSD (Pixar, open-sourced 2016)','Components: Nucleus, RTX, PhysX, Kit SDK 107','AOUSD Core Spec 1.0: Dec 17, 2025','Members: Pixar, Adobe, Apple, Autodesk, NVIDIA'], |
| related:['isaac_sim','mega_blueprint','physx5','groot'],refs:['NVIDIA Omniverse docs','Alliance for OpenUSD']}, |
| |
| {id:'mega_blueprint',domain:'NVIDIA Platform',kw:['mega','blueprint','fleet digital twin','robot fleet','mega omniverse','vda 5050','fleet management'], |
| title:'Mega Omniverse Blueprint', |
| answer:'Mega is an NVIDIA Omniverse Blueprint announced at CES January 2025 providing a reference architecture for developing, testing, and optimizing physical AI and robot fleets at scale in digital twins. Its five components are: Fleet Management System using VDA 5050, Robot Brains as containerized modules, World Simulator using OpenUSD, Sensor RTX for sensor simulation, and Scheduler managing time and data dependencies. Early adopters include KION Group, Foxconn, Hyundai, and Mercedes-Benz.', |
| facts:['5 components: Fleet Mgmt, Robot Brains, World Sim, Sensor RTX, Scheduler','VDA 5050 fleet interface','Announced: CES January 2025','Adopters: KION, Foxconn, Hyundai, Mercedes-Benz'], |
| related:['omniverse','vda5050','sim_to_real'],refs:['NVIDIA Blog Mega Blueprint','NVIDIA Newsroom']}, |
| |
| {id:'sim_to_real',domain:'NVIDIA Platform',kw:['sim to real','sim2real','domain randomization','transfer','zero shot','real world','gap'], |
| title:'Sim-to-Real Transfer', |
| answer:'Isaac Sim\'s domain randomization extension randomizes joint friction, damping, stiffness, masses, inertias, positions, velocities, DOF limits, and max efforts during RL training. Cosmos Transfer bridges the visual sim-to-real gap by transforming synthetic simulation video into photorealistic scenes using a Multi-ControlNet architecture. Demonstrated results include 83% success rate on 6-DoF dexterous reposing with zero-shot sim-to-real transfer trained on 16,384 parallel environments on a single V100.', |
| facts:['Randomization: friction, damping, stiffness, mass, inertia','Cosmos Transfer: Multi-ControlNet photorealistic conversion','83% zero-shot success on 6-DoF dexterous task','Training: 16,384 parallel envs on single V100'], |
| related:['isaac_sim','isaac_lab','cosmos_wfm','groot'],refs:['Isaac Sim Domain Randomization docs','S2R2 paper']}, |
| |
| |
| {id:'davinci_xi',domain:'Surgical Robotics',kw:['da vinci','davinci','xi','surgical robot','surgical system','arm','endowrist','dof','degree of freedom'], |
| title:'da Vinci Xi Surgical System', |
| answer:'The da Vinci Xi provides 7 degrees of freedom per arm: 3 positioning DOF (pitch, yaw, insertion), 3 EndoWrist DOF (roll, pitch, yaw), and 1 grip function. The patient trolley has 4 boom-mounted arms on an overhead rotating boom enabling four-quadrant anatomical access. Instruments use 8 mm ports (all interchangeable including the endoscope, enabling port-hopping), with tremor filtering at 6 Hz and motion scaling applied.', |
| facts:['7 DOF per arm (3 positioning + 3 wrist + 1 grip)','4 boom-mounted arms','8 mm ports, interchangeable','Tremor filtering: 6 Hz','Endoscope: 6\u201310\u00d7 magnified 3D stereoscopic'], |
| related:['rcm','cable_driven','jacobian_transpose','davinci5','gears'],refs:['ScienceDirect da Vinci Overview','PMC6193435']}, |
| |
| {id:'rcm',domain:'Surgical Robotics',kw:['rcm','remote center of motion','trocar','incision','entry point','constraint','parallelogram'], |
| title:'Remote Center of Motion (RCM)', |
| answer:'The RCM is a fixed point in space coincident with the trocar entry point, constraining the instrument to 4 DOF at the entry point. Da Vinci implements RCM through a mechanically-constrained parallelogram linkage integrated into each arm, providing hardware-level safety without relying solely on software control. RCM position deviation is approximately 7 mm or less. Without RCM enforcement, unconstrained instrument motion would cause tissue tearing at the incision site.', |
| facts:['RCM: fixed point at trocar/incision','4 DOF at entry point','Hardware: parallelogram linkage','Deviation: \u22647 mm','Safety: hardware-level, not software-only'], |
| related:['davinci_xi','cable_driven','iec80601_77'],refs:['PMC6245885','arXiv 2407.12711']}, |
| |
| {id:'cable_driven',domain:'Surgical Robotics',kw:['cable','tendon','cable driven','pulley','actuation','endowrist mechanism','cable pulley'], |
| title:'Cable-Driven Actuation', |
| answer:'EndoWrist instruments use a cable-pulley (tendon-driven) mechanism with an agonist-antagonist scheme requiring 2 cables per DOF (6 cables total for the 3-DOF wrist). Cables route through the instrument shaft (8 mm diameter, up to 38 cm usable length, approximately 57 cm total) with spacers preventing friction. Each DOF has a dedicated capstan connected to a rotating drum on the manipulator arm, with tensioning pulleys maintaining constant cable tension despite temperature and wear.', |
| facts:['2 cables per DOF, 6 cables total (3-DOF wrist)','Shaft: 8 mm diameter, 38 cm usable length','Agonist-antagonist scheme','Tensioning pulleys for thermal/wear compensation'], |
| related:['davinci_xi','rcm','jacobian_transpose'],refs:['Ento Key da Vinci analysis']}, |
| |
| {id:'jacobian_transpose',domain:'Surgical Robotics',kw:['jacobian','transpose','inverse kinematics','ik','control','force mapping','kinematics solver'], |
| title:'Jacobian Transpose Control', |
| answer:'The Jacobian transpose method relates end-effector forces to joint torques via \u03c4 = J\u1d40\u00b7F. For inverse kinematics, it sets \u0394\u03b8 = \u03b1\u00b7J\u1d40\u00b7e where e is position error. Its computational complexity is O(mn) per iteration (the fastest Jacobian-based method) and it is inherently singularity-robust since it requires no matrix inversion. The da Vinci\'s dialytic-elimination plus Newton-iteration IK method achieves error under 0.00004 degrees with solution time of approximately 0.5 seconds.', |
| facts:['Formula: \u03c4 = J\u1d40\u00b7F','IK: \u0394\u03b8 = \u03b1\u00b7J\u1d40\u00b7e','Complexity: O(mn) per iteration','Singularity-robust (no matrix inversion)','Da Vinci IK error: <0.00004\u00b0'], |
| related:['davinci_xi','rcm','physx_articulations'],refs:['UCSD IK Methods paper','MDPI Applied Sciences']}, |
| |
| {id:'kelvin_voigt',domain:'Surgical Robotics',kw:['kelvin','voigt','viscoelastic','tissue model','stress strain','young modulus','viscosity','tissue','elastic','kelvin-voigt'], |
| title:'Kelvin-Voigt Viscoelastic Tissue Model', |
| answer:'The Kelvin-Voigt model represents a spring and dashpot in parallel with constitutive equation \u03c3(t) = E\u00b7\u03b5(t) + \u03b7\u00b7(d\u03b5/dt), where E is Young\'s modulus and \u03b7 is viscosity. The retardation time \u03c4 = \u03b7/E describes the time to reach 63.2% of total retarded strain. The model\'s main limitation is that it cannot capture stress relaxation. Typical tissue moduli: brain 0.1\u20131 kPa, liver 0.6\u20136 kPa, muscle 5\u2013100 kPa, fascia 100\u2013500 kPa; liver viscosity: 3.38 \u00b1 0.32 Pa\u00b7s (normal).', |
| facts:['\u03c3(t) = E\u00b7\u03b5(t) + \u03b7\u00b7(d\u03b5/dt)','Retardation time: \u03c4 = \u03b7/E','Liver modulus: 0.6\u20136 kPa','Liver viscosity: 3.38 \u00b1 0.32 Pa\u00b7s','Limitation: no stress relaxation'], |
| related:['davinci_xi','physx_softbody','davinci5'],refs:['Wikipedia Kelvin-Voigt','PMC10963485','Springer liver rheology']}, |
| |
| {id:'gears',domain:'Surgical Robotics',kw:['gears','global evaluative','robotic skill','surgical assessment','scoring','surgical evaluation','goh'], |
| title:'GEARS Assessment', |
| answer:'The Global Evaluative Assessment of Robotic Skills (GEARS), developed by Alvin C. Goh (2012), evaluates robotic surgical performance across 6 domains: depth perception, bimanual dexterity, efficiency, force sensitivity, autonomy, and robotic control. Each domain is scored on a 5-point anchored Likert scale yielding a maximum of 30 points. Inter-rater reliability in the original validation was ICC = 0.80 (95% CI 0.65\u20130.90) with internal consistency Cronbach\'s \u03b1 = 0.90\u20130.93.', |
| facts:['6 domains, 5-point scale each, max 30','Domains: depth, dexterity, efficiency, force, autonomy, control','ICC = 0.80 (95% CI 0.65\u20130.90)','Cronbach \u03b1 = 0.90\u20130.93','Published: Journal of Urology, Jan 2012'], |
| related:['frs','dvlogger','davinci_xi','lasr'],refs:['Goh et al. 2012','PubMed 28757439']}, |
| |
| {id:'frs',domain:'Surgical Robotics',kw:['frs','fundamentals','robotic surgery','psychomotor','checklist','satava','proficiency','curriculum'], |
| title:'Fundamentals of Robotic Surgery (FRS)', |
| answer:'FRS is a multi-specialty proficiency-based curriculum developed by 80+ experts across 11 surgical specialties, led by Richard M. Satava under a Department of Defense grant. Its psychomotor assessment uses a 32-criteria task-specific checklist evaluating duration and errors across 5 tasks: knot tying, suturing, cutting, dissection, and coagulation. Inter-rater reliability ranges from ICC = 0.82 to 0.97, substantially higher than GEARS ratings (0.40\u20130.67) in the same validation context.', |
| facts:['32-criteria psychomotor checklist','5 tasks: knot, suture, cut, dissect, coagulate','ICC: 0.82\u20130.97','Components: cognitive, psychomotor, team training','DOME physical practice device'], |
| related:['gears','dvlogger','lasr'],refs:['Satava et al. 2020 Annals of Surgery']}, |
| |
| {id:'dvlogger',domain:'Surgical Robotics',kw:['dvlogger','dv logger','kinematic','recording','path length','jerk','50hz','surgical recording'], |
| title:'dVLogger Surgical Kinematics', |
| answer:'The dVLogger is a custom recording tool from Intuitive Surgical capturing synchronized video and kinematic data at 50 Hz via Ethernet to the Vision Tower. It records instrument path length, travel time, velocity, idle time, camera path, clutch activations, and jerk metrics, with video at 30 FPS via SDI cables. The highest correlation between dVLogger metrics and GEARS was right-hand median jerk at r = 0.55. The dVLogger is a research tool loaned by Intuitive, not commercially available.', |
| facts:['Kinematics: 50 Hz recording','Video: 30 FPS via SDI','Best GEARS correlation: median jerk r = 0.55','Metrics: path length, velocity, idle time, clutch, jerk','Research-only tool (loaned by Intuitive)'], |
| related:['gears','frs','davinci5'],refs:['Ohlhausen et al. thoracic surgery study']}, |
| |
| {id:'davinci5',domain:'Surgical Robotics',kw:['da vinci 5','davinci 5','force feedback','haptic','fifth generation','force sensing','dv5'], |
| title:'da Vinci 5 Force Feedback', |
| answer:'The da Vinci 5 received FDA 510(k) clearance on March 14, 2024, with first procedures beginning April 1. It is the first surgical robot with instrument-tip force sensing, transmitting forces to redesigned hand controllers with adjustable sensitivity (Off, Low, Medium, High). Preclinical testing showed up to 43% less force on tissue with feedback on High vs Off. Clinical data showed median tip forces of 1.42\u20131.70 N across procedure types with peak threshold monitored above 6.5 N.', |
| facts:['FDA cleared: March 14, 2024','Sensitivity: Off, Low, Medium, High','43% less tissue force (High vs Off)','Median tip force: 1.42\u20131.70 N','Peak threshold: >6.5 N monitored','10,000\u00d7 more computing than Xi'], |
| related:['davinci_xi','gears','dvlogger','kelvin_voigt'],refs:['Intuitive Surgical FDA release','PMC12464090']}, |
| |
| {id:'lasr',domain:'Surgical Robotics',kw:['lasr','autonomy level','surgical autonomy','autonomous surgery','fda autonomy','level 0','level 5','robot autonomy'], |
| title:'LASR Surgical Autonomy Taxonomy', |
| answer:'LASR was proposed by Lee, Baker, Bederson, and Rapoport at Mount Sinai (npj Digital Medicine, April 2024) \u2014 it is not an FDA framework. It defines 6 levels (L0\u2013L5): L0 No Autonomy, L1 Robot Assistance (86% of 49 FDA-cleared robots), L2 Task Autonomy (8%), L3 Conditional Autonomy (6%, most advanced currently cleared), L4 High Autonomy (none deployed), and L5 Full Autonomy (theoretical). All FDA-cleared surgical robots are Class II (moderate risk).', |
| facts:['L0: No Autonomy, L1: Robot Assistance (86%)','L2: Task Autonomy (8%), L3: Conditional (6%)','L4: High Autonomy (none), L5: Full (theoretical)','Proposed by Lee et al. at Mount Sinai, 2024','All surgical robots: FDA Class II'], |
| related:['gears','frs','iec80601_77'],refs:['PMC11053143','npj Digital Medicine 2024']}, |
| |
| {id:'iec80601_77',domain:'Surgical Robotics',kw:['iec 80601','80601-2-77','surgical safety standard','rase','rass','surgical standard','surgical robot safety'], |
| title:'IEC 80601-2-77 Surgical Robot Safety', |
| answer:'IEC 80601-2-77:2019 is the first international standard specifically for surgical robots, with Amendment 1 in November 2023. It addresses basic safety and essential performance of Robotically Assisted Surgical Equipment (RASE) and Systems (RASS). Key requirements include continuous activation for motion, movement within operator view, end stops, multiple protective stop levels, patient release provisions, and collision safety. Software follows IEC 62304 with risk assessment per ISO 14971.', |
| facts:['Published: July 2019, Amendment 1: Nov 2023','First surgical robot-specific standard','Covers: RASE and RASS','Requirements: activation, view, stops, release, collision','Software: IEC 62304, Risk: ISO 14971'], |
| related:['lasr','iec80601_78','iso13482','iec61508'],refs:['ISO/IEC 80601-2-77']}, |
| |
| |
| {id:'dwa',domain:'Hospital Robotics',kw:['dwa','dynamic window','obstacle avoidance','velocity space','admissible','local planner','collision avoidance algorithm'], |
| title:'Dynamic Window Approach (DWA)', |
| answer:'DWA, developed by Fox, Burgard, and Thrun in 1997, searches a 2D velocity space of (v, \u03c9) at the intersection of physically feasible, dynamically reachable, and safely admissible velocities. A velocity is admissible if the robot can stop before hitting the nearest obstacle: v \u2264 \u221a(2\u00b7dist\u00b7decel). The objective function is G(v,\u03c9) = \u03c3(\u03b1\u00b7heading + \u03b2\u00b7clearance + \u03b3\u00b7velocity). DWA operates at approximately 20 Hz with planning cycles under 50 ms.', |
| facts:['Authors: Fox, Burgard, Thrun (1997)','Velocity space: (v, \u03c9) intersection of Vs \u2229 Vd \u2229 Va','G(v,\u03c9) = \u03c3(\u03b1\u00b7heading + \u03b2\u00b7clearance + \u03b3\u00b7velocity)','Frequency: ~20 Hz, <50 ms cycles','Admissible: v \u2264 \u221a(2\u00b7dist\u00b7decel)'], |
| related:['slam','vda5050'],refs:['IEEE R&A Magazine 4(1):23\u201333','Wikipedia DWA']}, |
| |
| {id:'slam',domain:'Hospital Robotics',kw:['slam','localization','mapping','lidar','drift','loop closure','sensor fusion','ate','rpe'], |
| title:'SLAM in Hospital Environments', |
| answer:'Hospital AMR SLAM typically uses LiDAR + IMU + wheel odometry fusion through loosely or tightly coupled approaches. Drift is measured via Absolute Trajectory Error (ATE) RMSE and Relative Pose Error (RPE). Low-drift LiDAR SLAM achieves 0.40% drift (16 m over 4 km) without loop closure. Multi-sensor fusion with loop closure achieves 5\u201310 cm mapping accuracy and 20\u201330 cm localization. Hospital challenges include featureless corridors, glass reflections, and repetitive structures.', |
| facts:['Sensors: LiDAR + IMU + wheel odometry','Low-drift: 0.40% (16 m / 4 km)','Mapping: 5\u201310 cm accuracy','Localization: 20\u201330 cm accuracy','Multimodal loop closure: ATE \u221254%'], |
| related:['dwa','vda5050'],refs:['Springer LiDAR SLAM review','PMC11902412']}, |
| |
| {id:'vda5050',domain:'Hospital Robotics',kw:['vda 5050','vda5050','fleet management standard','mqtt','agv interface','fleet protocol','amr standard'], |
| title:'VDA 5050 Fleet Management', |
| answer:'VDA 5050 is an open standardized communication interface between AGV/AMR fleets and central fleet management, developed by the German VDA, VDMA, and KIT. Version 2.1.0 (latest ratified standard; v3.0 in development) uses MQTT protocol with JSON-encoded messages. Orders define sequences of nodes and edges with optional actions. State reporting includes nodeStates, edgeStates, and actionStates with defined transitions (WAITING \u2192 INITIALIZING \u2192 RUNNING \u2192 PAUSED/FINISHED/FAILED). It supports a minimum of 1,000 vehicles.', |
| facts:['Protocol: MQTT + JSON (UTF-8)','Version: v2.1.0','Authors: VDA + VDMA + KIT','Capacity: minimum 1,000 vehicles','States: WAITING\u2192INITIALIZING\u2192RUNNING\u2192FINISHED'], |
| related:['dwa','mega_blueprint','slam'],refs:['VDA 5050 Specification PDF','GitHub VDA5050']}, |
| |
| {id:'drone_hospital',domain:'Hospital Robotics',kw:['drone delivery','medical drone','munson','hospital drone','specimen','blood delivery','blueflite'], |
| title:'Hospital Drone Delivery', |
| answer:'Munson Healthcare conducted a drone delivery pilot from May 9\u201320, 2025 using blueflite/DroneUp drones: of 67 total flights, 61 were successful (91% success rate). Failures comprised 3 winch issues, 1 GPS malfunction, and 2 connectivity problems. Routes connected Medical Center to Dialysis Center (~1,000 m) and Surgery Center (~2,200 m) under FAA Part 107. Specimen temperature averaged 17.3\u00b0C. Separately, Zipline in Rwanda achieved 67% reduction in blood expirations and 51% reduction in maternal mortality from postpartum hemorrhage.', |
| facts:['Munson: 61/67 flights, 91% success','Failures: winch (3), GPS (1), connectivity (2)','Temp: avg 17.3\u00b0C','Zipline Rwanda: 41 min delivery vs 139 min road','Zipline: 1M+ deliveries, 70M+ autonomous miles'], |
| related:['faa_part107','bezier'],refs:['Munson Healthcare pilot data','Zipline operations report']}, |
| |
| {id:'faa_part107',domain:'Hospital Robotics',kw:['faa','part 107','drone regulation','uas','bvlos','remote pilot','drone law','altitude limit'], |
| title:'FAA Part 107 Regulations', |
| answer:'FAA Part 107 governs small UAS (under 55 lbs) commercial operations with key constraints: visual line of sight required, max altitude 400 ft AGL, max speed 100 mph, Remote Pilot Certificate required, and daylight or civil twilight operations (night flying allowed since January 2021 with anti-collision lighting). BVLOS operations require a Section 107.31 waiver with historically low approval rates (~19% by 2024, up from ~1% pre-2020). Commercial delivery at scale requires Part 135 Air Carrier Certificate.', |
| facts:['Max weight: 55 lbs','Max altitude: 400 ft AGL','Max speed: 100 mph','BVLOS waiver: ~19% approval by 2024 (historically <1%)','Part 135 needed for scaled delivery'], |
| related:['drone_hospital','bezier'],refs:['FAA Part 107 regulations']}, |
| |
| {id:'bezier',domain:'Hospital Robotics',kw:['bezier','b\u00e9zier','trajectory','curve','control point','path planning','smooth path','spline'], |
| title:'B\u00e9zier Curve Trajectory Planning', |
| answer:'B\u00e9zier curves are parameterized by control points: the quadratic form is B(t) = (1\u2212t)\u00b2P\u2080 + 2(1\u2212t)tP\u2081 + t\u00b2P\u2082, and the cubic form is B(t) = (1\u2212t)\u00b3P\u2080 + 3(1\u2212t)\u00b2tP\u2081 + 3(1\u2212t)t\u00b2P\u2082 + t\u00b3P\u2083. Key properties for drone trajectory planning include the convex hull property (entire curve lies within hull of control points, enabling collision-free verification), endpoint interpolation (B(0) = P\u2080, B(1) = P\u2099), and C\u00b2 continuity producing smooth paths meeting UAV kinematic constraints.', |
| facts:['Quadratic: B(t) = (1\u2212t)\u00b2P\u2080 + 2(1\u2212t)tP\u2081 + t\u00b2P\u2082','Cubic: 4 control points','Convex hull property: curve \u2286 hull(points)','Endpoint interpolation: B(0)=P\u2080, B(1)=P\u2099','C\u00b2 continuity for smooth UAV paths'], |
| related:['drone_hospital','faa_part107','dwa'],refs:['Computational geometry literature']}, |
| |
| {id:'inverted_pendulum',domain:'Hospital Robotics',kw:['inverted pendulum','gait model','bipedal','center of mass','com','lipm','linear inverted','margin of stability','mos'], |
| title:'Inverted Pendulum Gait Model', |
| answer:'The inverted pendulum model treats the human body during stance as a point mass atop a rigid massless leg with equation of motion \u03b8\u0308 = (g/L)\u00b7sin(\u03b8). The Linear IPM simplifies to x\u0308 = (g/z_c)\u00b7(x \u2212 p). The extrapolated center of mass (Hof 2005) accounts for velocity: XCoM = CoM_position + CoM_velocity/\u03c9\u2080. Margin of Stability is MoS = BoS_boundary \u2212 XCoM, positive indicating stability. Ground reaction forces show characteristic M-shaped peaks at 1.0\u20131.2\u00d7 body weight.', |
| facts:['\u03b8\u0308 = (g/L)\u00b7sin(\u03b8)','LIPM: x\u0308 = (g/z_c)\u00b7(x\u2212p)','XCoM = CoM + velocity/\u03c9\u2080','MoS = BoS_boundary \u2212 XCoM','GRF peaks: 1.0\u20131.2\u00d7 body weight'], |
| related:['fugl_meyer','gait_symmetry','sparc'],refs:['Cavagna et al. 1976','Hof et al. 2005']}, |
| |
| {id:'fugl_meyer',domain:'Hospital Robotics',kw:['fugl meyer','fugl-meyer','fma','stroke assessment','motor score','upper extremity','lower extremity','mcid','rehabilitation assessment'], |
| title:'Fugl-Meyer Assessment', |
| answer:'The FMA, developed by Fugl-Meyer et al. in 1975, is a stroke-specific impairment index scored on a 3-point ordinal scale. The upper extremity maximum is 66 points (33 items), lower extremity is 34 points, and total motor score is 100 points. Including all subscales (motor 100, sensation 24, balance 14, joint ROM 44, pain 44), the total FMA is 226 points. Interrater ICC = 0.96. MCID values: 12.4 points (subacute moderate-to-severe) and 3.5 points (chronic severe).', |
| facts:['UE max: 66 points, LE max: 34 points','Total motor: 100, Total FMA: 226','Inter-rater ICC = 0.96','MCID: 12.4 (subacute), 3.5 (chronic)','3-point ordinal scale (0/1/2)'], |
| related:['inverted_pendulum','gait_symmetry','sparc','iec80601_78'],refs:['Fugl-Meyer et al. 1975','Sanford et al. 1993']}, |
| |
| {id:'gait_symmetry',domain:'Hospital Robotics',kw:['gait symmetry','symmetry ratio','temporal symmetry','spatial symmetry','step length','cadence','gait parameter'], |
| title:'Gait Symmetry Metrics', |
| answer:'Temporal symmetry ratio is calculated as paretic swing time divided by non-paretic swing time, with an ideal value of 1.0 indicating perfect symmetry. Spatial symmetry compares step lengths between limbs. Symmetry ratios exhibit lower variability and higher reliability than alternatives and are not significantly associated with age. Normal gait: cadence 90\u2013120 steps/min, step length 0.60\u20130.75 m, velocity approximately 1.34 m/s, stance phase approximately 60%, swing 40%, double support 10\u201312% at each transition.', |
| facts:['Ideal symmetry ratio: 1.0','Cadence: 90\u2013120 steps/min','Step length: 0.60\u20130.75 m','Gait velocity: ~1.34 m/s','Stance: ~60%, Swing: ~40%'], |
| related:['fugl_meyer','inverted_pendulum','sparc'],refs:['Gait analysis literature']}, |
| |
| {id:'sparc',domain:'Hospital Robotics',kw:['sparc','spectral arc length','smoothness','movement quality','jerk','dimensionless','sal','movement smoothness'], |
| title:'SPARC Smoothness Measure', |
| answer:'SPARC computes the arc length of the normalized Fourier magnitude spectrum of a movement\'s speed profile. More negative values indicate less smooth movement. Typical values: healthy controls approximately \u22125.17 \u00b1 0.79; Parkinson\'s patients approximately \u22126.11 \u00b1 0.74. SPARC is dimensionless, amplitude/duration independent, monotonically sensitive to sub-movements, and robust to noise \u2014 preferred over Log Dimensionless Jerk in rehabilitation assessment.', |
| facts:['Healthy: SPARC \u2248 \u22125.17 \u00b1 0.79','Parkinson\'s: \u2248 \u22126.11 \u00b1 0.74','Dimensionless, amplitude-independent','Cutoff: 10 Hz, threshold 0.05','Preferred over Log Dimensionless Jerk'], |
| related:['gait_symmetry','fugl_meyer','inverted_pendulum'],refs:['SPARC smoothness measure literature']}, |
| |
| {id:'iso13482',domain:'Hospital Robotics',kw:['iso 13482','personal care','care robot','non-industrial','servant robot','person carrier','exoskeleton standard'], |
| title:'ISO 13482 Personal Care Robot Safety', |
| answer:'ISO 13482:2014 is the first standard for robots interacting closely with humans in non-industrial, non-medical contexts. It defines three categories: mobile servant robot, physical assistant robot (including wearable exoskeletons), and person carrier robot. Robots are limited to earthbound operation at under 20 km/h. It excludes medical devices (boundary with IEC 80601-2-78), industrial robots (ISO 10218), and military robots. Risk assessment follows ISO 12100.', |
| facts:['3 categories: servant, assistant, carrier','Speed limit: <20 km/h','Excludes: medical, industrial, military','Published: 2014','Risk per ISO 12100'], |
| related:['iec80601_78','iec80601_77','iec61508'],refs:['ISO 13482:2014']}, |
| |
| {id:'iec80601_78',domain:'Hospital Robotics',kw:['iec 80601-2-78','80601-2-78','rehabilitation standard','rehab robot safety','rehab safety','medical robot standard'], |
| title:'IEC 80601-2-78 Rehabilitation Robot Safety', |
| answer:'IEC 80601-2-78:2019 (Amendment 1, March 2024) establishes safety requirements for medical robots that physically interact with patients for rehabilitation, assessment, compensation, or alleviation of movement impairments. It falls under IEC 60601-1 medical electrical equipment and requires compliance with the parent standard. It does not apply to external prosthetics (ISO 22523), wheelchairs (ISO 7176), or personal care robots (ISO 13482).', |
| facts:['Published: 2019, Amendment 1: March 2024','Under IEC 60601-1 family','Covers: rehab, assessment, compensation','Excludes: prosthetics, wheelchairs, personal care'], |
| related:['iso13482','iec80601_77','fugl_meyer'],refs:['IEC 80601-2-78:2019']}, |
| |
| {id:'iec61508',domain:'Hospital Robotics',kw:['iec 61508','sil','safety integrity','functional safety','probability','dangerous failure','sil 1','sil 2','sil 3','sil 4'], |
| title:'IEC 61508 Safety Integrity Levels', |
| answer:'IEC 61508 defines Safety Integrity Levels as discrete measures of risk reduction. SIL 1 handles moderate risk (PFD 10\u207b\u00b9 to 10\u207b\u00b2), SIL 2 for emergency shutdown (PFD 10\u207b\u00b2 to 10\u207b\u00b3), SIL 3 for critical chemical/petrochemical systems requiring redundancy (PFD 10\u207b\u00b3 to 10\u207b\u2074), and SIL 4 for nuclear/aerospace (PFD 10\u207b\u2074 to 10\u207b\u2075). In continuous mode, SIL 3 requires dangerous failure probability under 10\u207b\u2077 per hour.', |
| facts:['SIL 1: PFD 10\u207b\u00b9\u201310\u207b\u00b2, minor injuries','SIL 2: PFD 10\u207b\u00b2\u201310\u207b\u00b3, emergency shutdown','SIL 3: PFD 10\u207b\u00b3\u201310\u207b\u2074, critical (requires redundancy)','SIL 4: PFD 10\u207b\u2074\u201310\u207b\u2075, nuclear/aerospace'], |
| related:['iec62443','iec80601_77','iso13482'],refs:['IEC 61508 Edition 2']}, |
| |
| {id:'iec62443',domain:'Hospital Robotics',kw:['iec 62443','cybersecurity','security level','zone','conduit','industrial security','cyber','network security'], |
| title:'IEC 62443 Cybersecurity', |
| answer:'ISA/IEC 62443 defines four Security Levels: SL 1 (casual violation), SL 2 (intentional with simple means), SL 3 (sophisticated with moderate resources), and SL 4 (state-sponsored with extensive resources). Architecture uses zones (groupings with shared requirements) and conduits (communication channels). Seven foundational requirements: identification/authentication, use control, system integrity, data confidentiality, restricted data flow, timely response, and resource availability.', |
| facts:['SL 1\u20134: casual to state-sponsored','Architecture: zones + conduits','SL markers: Target, Capability, Achieved','7 foundational requirements','Applies to industrial automation security'], |
| related:['iec61508','vda5050'],refs:['ISA/IEC 62443 standard']}, |
| |
| |
| {id:'varp',domain:'AEGIS Framework',kw:['varp','verifiability','accuracy','reasoning','performance','aegis','evaluation framework','aegis-reason'], |
| title:'VARP Evaluation Framework (AEGIS)', |
| answer:'VARP is the evaluation taxonomy used by AEGIS-Reason, organizing robot assessment along four dimensions: Verifiability (auditable reasoning traces with formal verification), Accuracy (calibrated metrics like Brier score and Expected Calibration Error), Reasoning (process reward models and step-by-step faithfulness), and Performance (task completion rate, reward accumulation, and aggregate metrics like IQM). Each robot in the simulation is scored across these dimensions to produce a comprehensive evaluation profile.', |
| facts:['V: Verifiability (auditable traces)','A: Accuracy (Brier score, ECE)','R: Reasoning (process reward models)','P: Performance (task completion, IQM)','Custom taxonomy for AEGIS-Reason'], |
| related:['gerkey_mataric','iqm','aegis_scoring'],refs:['AEGIS-Reason Framework']}, |
| |
| {id:'gerkey_mataric',domain:'AEGIS Framework',kw:['gerkey','mataric','mrta','task allocation','multi robot task','hungarian','st-sr','mt-mr','taxonomy'], |
| title:'Gerkey-Matari\u0107 MRTA Taxonomy', |
| answer:'The multi-robot task allocation taxonomy by Gerkey and Matari\u0107 (IJRR, 2004) classifies MRTA problems along three axes: Robot capability (Single-Task vs Multi-Task), Task requirement (Single-Robot vs Multi-Robot), and Assignment temporality (Instantaneous vs Time-extended). The simplest case ST-SR-IA reduces to the Optimal Assignment Problem solvable in polynomial time via the Hungarian method. ST-SR-TA is strongly NP-hard (equivalent to multi-TSP). The iTax extension adds interrelated utilities.', |
| facts:['3 axes: Robot (ST/MT), Task (SR/MR), Time (IA/TA)','ST-SR-IA: polynomial (Hungarian method)','ST-SR-TA: NP-hard (multi-TSP equivalent)','iTax extension: Korsah, Stentz, Dias 2013','Published: IJRR 23(9):939\u2013954, Sep 2004'], |
| related:['makespan','varp','amdahls_law'],refs:['Gerkey & Matari\u0107 IJRR 2004']}, |
| |
| {id:'makespan',domain:'AEGIS Framework',kw:['makespan','scheduling','completion time','task completion','c_max','minimize time','schedule optimization'], |
| title:'Makespan Minimization', |
| answer:'In multi-robot coordination, makespan is the total time from start to completion of all tasks: C_max = max{C_j : j=1,...,M}. Minimizing makespan seeks the shortest possible schedule and is NP-hard for 3+ machines in general. Common approaches include Mixed-Integer Linear Programming, genetic algorithms, and auction-based heuristics. For two identical machines, polynomial-time solutions exist.', |
| facts:['C_max = max{C_j}','NP-hard for 3+ machines','Approaches: MILP, genetic, auction-based','2 identical machines: polynomial solvable'], |
| related:['gerkey_mataric','amdahls_law'],refs:['Scheduling theory literature']}, |
| |
| {id:'iqm',domain:'AEGIS Framework',kw:['iqm','interquartile mean','evaluation metric','deep rl','robust metric','aggregate','rliable','statistical'], |
| title:'IQM for MARL Evaluation', |
| answer:'The Interquartile Mean computes the mean score of the middle 50% of runs by discarding the bottom and top 25%, then averaging the remainder. IQM is preferred because the mean is sensitive to outliers while the median requires 50\u2013100 runs for small statistical uncertainty. This was established by Agarwal, Schwarzer, Castro, Courville, and Bellemare in their NeurIPS 2021 Outstanding Paper Award work. The rliable Python library implements IQM with 50,000 stratified bootstrap samples by default.', |
| facts:['IQM: mean of middle 50% of runs','Discards bottom 25% and top 25%','NeurIPS 2021 Outstanding Paper Award','rliable library: 50,000 bootstrap samples','More robust than mean, tighter than median'], |
| related:['bootstrap_ci','varp'],refs:['Agarwal et al. NeurIPS 2021','rliable library (Google Research)']}, |
| |
| {id:'bootstrap_ci',domain:'AEGIS Framework',kw:['bootstrap','confidence interval','stratified','statistical','rliable','percentile','variance'], |
| title:'Stratified Bootstrap Confidence Intervals', |
| answer:'Stratified bootstrap ensures all environments are represented by grouping datapoints into strata (one per task), sampling with replacement within each stratum, computing the aggregate metric per sample, and repeating 50,000 times (default in rliable). This prevents computing metrics on random environment subsets. Performance profiles plot the fraction of runs achieving target thresholds, forming CDF-like curves. When profiles intersect, finer metrics (IQM, optimality gap) resolve comparison.', |
| facts:['Strata: one per task/environment','Default: 50,000 bootstrap samples','Prevents random environment subset bias','Performance profile: CDF over threshold \u03c4','Library: rliable (Google Research)'], |
| related:['iqm','varp'],refs:['rliable documentation']}, |
| |
| {id:'darpa_subt',domain:'AEGIS Framework',kw:['darpa','subt','subterranean','challenge','artifact','cave','tunnel','urban','competition'], |
| title:'DARPA SubT Challenge', |
| answer:'The DARPA Subterranean Challenge ran Systems and Virtual tracks across Tunnel, Urban, and Cave circuit events plus a Final Event (September 2021, Louisville Mega Cavern). Teams scored 1 point per correctly identified artifact located within 5 meters of actual position. Artifact types included survivors, cellphones, backpacks, and drills. Teams had 60-minute runs. Systems first prize was $2 million, won by Team CERBERUS. The SubT Challenge did not use autonomy multipliers \u2014 that concept belongs to RoboCup Rescue.', |
| facts:['Scoring: 1 point per artifact within 5 m','Run time: 60 minutes','First prize: $2M (Team CERBERUS)','No autonomy multipliers (that\'s RoboCup)','Artifact types: survivors, phones, packs, drills'], |
| related:['robocup_autonomy','gerkey_mataric'],refs:['DARPA SubT Challenge rules']}, |
| |
| {id:'robocup_autonomy',domain:'AEGIS Framework',kw:['robocup','rescue','autonomy multiplier','1x','4x','8x','teleoperation','autonomous scoring'], |
| title:'RoboCup Rescue Autonomy Multipliers', |
| answer:'The RoboCup Rescue Robot League uses three verified autonomy multipliers: 1\u00d7 (teleoperation), 4\u00d7 (autonomous manipulation with operator designating targets), and 8\u00d7 (full autonomy with operator only designating tasks from robot-built maps). If the operator takes over driving during 8\u00d7, score reverts to 4\u00d7; if they take over the manipulator, it reverts to 1\u00d7. These multipliers directly incentivize autonomy by scoring the same physical task up to 8\u00d7 higher when performed autonomously.', |
| facts:['1\u00d7: teleoperation','4\u00d7: autonomous manipulation','8\u00d7: full autonomy','Fallback: driving takeover \u2192 4\u00d7, manipulator \u2192 1\u00d7','Same task scored 8\u00d7 higher if autonomous'], |
| related:['darpa_subt','lasr','gerkey_mataric'],refs:['RoboCup Rescue League rules']}, |
| |
| {id:'amdahls_law',domain:'AEGIS Framework',kw:['amdahl','scalability','speedup','efficiency','parallel','universal scalability','gunther','contention','coherency','scaling law'], |
| title:'Amdahl\'s Law for Multi-Robot Scalability', |
| answer:'Amdahl\'s Law gives speedup S(N) = 1/((1\u2212p) + p/N). Multi-robot efficiency is E(N) = S(N)/N. Gunther\'s Universal Scalability Law extends this: R(N) = N/(1 + \u03b1(N\u22121) + \u03b2N(N\u22121)), where \u03b1 is contention and \u03b2 is coherency. When \u03b2 > 0, performance peaks then degrades \u2014 the hallmark two-phase pattern. Sources of degradation include resource saturation, information overload causing homogeneous behavior, and excessive coordination overhead.', |
| facts:['S(N) = 1/((1\u2212p) + p/N)','E(N) = S(N)/N','USL: R(N) = N/(1+\u03b1(N\u22121)+\u03b2N(N\u22121))','Phase 1: gains dominate','Phase 2: overhead causes degradation'], |
| related:['gerkey_mataric','makespan'],refs:['Amdahl 1967','Gunther USL','Hamann 2018']}, |
| |
| |
| {id:'aegis_demo',domain:'AEGIS Framework',kw:['aegis','demo','this','demonstration','what is this','how does this work','evaluation system','what am i looking at','explain this'], |
| title:'AEGIS-Reason Demonstration System', |
| answer:'AEGIS-Reason is a research-grade evaluation framework for multi-robot hospital systems. This demonstration shows 4 robot types \u2014 da Vinci Xi surgical arms, AMR logistics fleet, medical delivery drones, and rehabilitation exoskeletons \u2014 operating in a simulated isometric hospital environment. Each robot is evaluated across 20+ metrics organized by the VARP taxonomy, with real-time physics equations, NVIDIA Cosmos Reason 2 spatial inference, and multi-robot coordination scoring.', |
| facts:['4 robot types: surgical, AMR, drone, exoskeleton','20+ metrics per robot','VARP evaluation taxonomy','Physics equations rendered in real-time','CR2 spatial inference panel'], |
| related:['aegis_scoring','aegis_physics','aegis_arena','varp'],refs:['AEGIS-Reason Competition Entry']}, |
| |
| {id:'aegis_scoring',domain:'AEGIS Framework',kw:['scoring','how scored','evaluation method','metrics','score','varp score','gauge','scorecard'], |
| title:'AEGIS-Reason Scoring Methodology', |
| answer:'Each robot is evaluated across individual scorecards containing 20 metrics covering safety, precision, efficiency, and coordination. System-level coordination uses VARP gauges measuring Verifiability, Accuracy, Reasoning, and Performance. Canvas overlays include performance halos (green/amber/red rings), coordination links between cooperating robots, force heat maps, and safety pulse indicators. Regulatory compliance is tracked via LED indicators for 8 international standards including IEC 80601-2-77 and ISO 13482.', |
| facts:['20 metrics per robot scorecard','VARP gauges: system-level coordination','Overlays: halos, links, heat maps, pulse','8 regulatory standards tracked','Individual + system-level evaluation'], |
| related:['varp','aegis_demo','aegis_physics'],refs:['AEGIS-Reason Feature 7']}, |
| |
| {id:'aegis_physics',domain:'AEGIS Framework',kw:['physics overlay','equation','physics equation','formula','rendered equation','physics display','canvas equation'], |
| title:'Physics Equation Overlay System', |
| answer:'AEGIS-Reason renders live physics equations on the canvas for all 4 robot types: Jacobian transpose control (\u03c4=J\u1d40F) for surgical arms, DWA objective function G(v,\u03c9) for AMR navigation, B\u00e9zier trajectory B(t)=(1\u2212t)\u00b2P\u2080+2t(1\u2212t)P\u2081+t\u00b2P\u2082 for drone paths, and inverted pendulum \u03b8\u0308=(g/L)sin\u03b8 for exoskeleton gait. All equations update with live simulation values to demonstrate real-time physics-informed reasoning.', |
| facts:['Surgical: \u03c4=J\u1d40F (Jacobian transpose)','AMR: G(v,\u03c9)=\u03c3(\u03b1h+\u03b2c+\u03b3v) (DWA)','Drone: B(t)=(1-t)\u00b2P\u2080+2t(1-t)P\u2081+t\u00b2P\u2082','Exo: \u03b8\u0308=(g/L)sin\u03b8 (inverted pendulum)','All update with live sim values'], |
| related:['jacobian_transpose','dwa','bezier','inverted_pendulum','aegis_demo'],refs:['AEGIS-Reason Feature 4']}, |
| {id:'clinical_cv_overlay',domain:'Clinical CV',kw:['cv overlay','clinical','computer vision','cvs','dwa','bounding box','instrument tracking','precision landing','gait','annotation','fda'], |
| title:'Clinical Computer Vision Overlay', |
| answer:'The Clinical CV Overlay (Feature 8) renders FDA-grade computer vision annotations directly on the arena canvas. For surgical robots, it displays a Critical View of Safety (CVS) triangle based on Activ Surgical ActivSight, with tissue classification bounding boxes and instrument tracking crosshairs. AMR zones show DWA (Dynamic Window Approach) navigation corridors with obstacle avoidance margins and planned path waypoints. Drone zones display PX4-style precision landing reticles with GPS accuracy circles, descent corridors, and wind vectors. The exoskeleton zone features MediaPipe-style pose estimation with joint confidence markers, gait analysis readouts (hip/knee angles, cadence, stride, symmetry), and center of pressure (CoP) tracking.', |
| facts:['CVS triangle for cholecystectomy safety assessment','Tissue segmentation: gallbladder, liver bed, fat tissue','Instrument tracking: grasper, hook, clip applier','DWA corridor with obstacle avoidance margins','6-waypoint planned path visualization','PX4 landing zone with GPS accuracy ring','Altitude indicator and wind vector display','Pose estimation with joint confidence scores','Gait analysis: hip, knee angles, cadence, stride, symmetry','Center of pressure tracking with trail'], |
| related:['critical_view_safety','dwa','px4_landing','pose_estimation','aegis_demo'],refs:['AEGIS-Reason Feature 8']}, |
| |
| {id:'aegis_arena',domain:'AEGIS Framework',kw:['arena','replay','animation','play','stop','regenerate','narration','simulation','canvas','isometric'], |
| title:'Arena Visualization System', |
| answer:'The Arena visualization renders an isometric 3D hospital environment using HTML5 Canvas with zero external dependencies. It features continuous physics-based replay with GTC-style narration, per-robot motion (IK arms, LiDAR scan fans, B\u00e9zier drone paths, biomechanical gait), and interactive controls including Play/Pause (Space), Stop (X), Regenerate (R), Speed control (1\u20135), timeline scrubbing, and screenshot export. The robot reference panel shows real-world system illustrations (da Vinci Xi, Aethon TUG, Zipline P2, EksoNR) with active zone highlighting.', |
| facts:['HTML5 Canvas, zero dependencies','Controls: Space, X, R, 1\u20135, scrub','Physics-based continuous replay','GTC narration overlay','Mini-map with robot positions'], |
| related:['aegis_demo','aegis_scoring'],refs:['AEGIS-Reason Arena v5']}, |
| |
| {id:'activsight',domain:'Clinical CV',kw:['activsight','activ surgical','surgical ai','intraoperative ai','surgical vision'], |
| title:'Activ Surgical ActivSight', |
| answer:'ActivSight is an FDA-cleared intraoperative AI imaging module by Activ Surgical. It runs on NVIDIA Clara Holoscan and IGX platforms, providing real-time tissue classification, perfusion mapping, and critical structure identification during laparoscopic and robotic procedures. The system overlays semantic segmentation onto the surgical video feed without requiring additional hardware beyond a standard laparoscope.', |
| facts:['FDA 510(k) cleared','Runs on NVIDIA Clara Holoscan / IGX','Real-time tissue classification','Perfusion mapping via multispectral','No additional hardware required'], |
| related:['clinical_cv_overlay','davinci_xi','iec80601_77'],refs:['Activ Surgical FDA filing']}, |
| {id:'theator',domain:'Clinical CV',kw:['theator','surgical video','surgical intelligence','ai surgery','video analysis'], |
| title:'Theator Surgical Intelligence', |
| answer:'Theator provides AI-powered surgical video intelligence using computer vision to analyze intraoperative footage in real time. Running on NVIDIA RTX-4000 GPUs, it performs automatic phase recognition, instrument detection, and critical event identification. Theator\u2019s platform has been validated across cholecystectomy, bariatric, and colorectal procedures, enabling objective surgical quality assessment and training.', |
| facts:['NVIDIA RTX-4000 GPU inference','Automatic surgical phase recognition','Instrument detection and tracking','Multi-procedure validation','Quality assessment and training'], |
| related:['activsight','clinical_cv_overlay','davinci_xi'],refs:['Theator clinical studies']}, |
| {id:'viz_ai',domain:'Clinical CV',kw:['viz','viz.ai','stroke detection','large vessel occlusion','lvo','triage'], |
| title:'Viz.ai Stroke Detection', |
| answer:'Viz.ai is an FDA-cleared AI platform for stroke triage that detects large vessel occlusions (LVO) from CT angiography scans. It automatically alerts stroke teams within minutes of scan completion, reducing door-to-treatment times. The system uses deep learning for vessel segmentation and has been deployed at over 1,400 hospitals across the United States.', |
| facts:['FDA-cleared for LVO detection','CT angiography analysis','Automatic stroke team alerts','Deployed at 1,400+ US hospitals','Reduces door-to-treatment time'], |
| related:['activsight','clinical_cv_overlay'],refs:['Viz.ai clinical data']}, |
| {id:'critical_view_safety',domain:'Clinical CV',kw:['cvs','critical view','critical view of safety','calot','hepatocystic','cholecystectomy','safe surgery'], |
| title:'Critical View of Safety (CVS)', |
| answer:'The Critical View of Safety is the gold-standard technique for identifying the cystic duct and cystic artery during laparoscopic cholecystectomy, established by Strasberg in 1995. CVS requires three criteria: the hepatocystic triangle must be cleared of fat and fibrous tissue, the lower third of the gallbladder must be separated from the liver bed, and only two structures (cystic duct and artery) should enter the gallbladder. AI systems like ActivSight now automate CVS assessment in real time.', |
| facts:['Established by Strasberg 1995','Three criteria for safe identification','Prevents bile duct injury','Gold standard in cholecystectomy','Now automated by AI systems'], |
| related:['activsight','clinical_cv_overlay','davinci_xi'],refs:['Strasberg et al. 1995, J Am Coll Surg']}, |
| {id:'pose_estimation',domain:'Clinical CV',kw:['pose estimation','mediapipe','openpose','skeleton','joint detection','body tracking'], |
| title:'Pose Estimation for Rehabilitation', |
| answer:'Pose estimation systems like MediaPipe and OpenPose use computer vision to detect human body keypoints from video. In rehabilitation contexts, these systems track joint angles, gait parameters, and movement quality in real time. MediaPipe Pose detects 33 landmarks at 30+ FPS on mobile devices, while clinical-grade systems achieve sub-degree accuracy for hip and knee flexion measurement during gait analysis.', |
| facts:['MediaPipe: 33 landmarks at 30+ FPS','OpenPose: multi-person detection','Sub-degree accuracy for clinical use','Real-time gait parameter extraction','No wearable sensors required'], |
| related:['fugl_meyer','gait_symmetry','clinical_cv_overlay','inverted_pendulum'],refs:['MediaPipe documentation']}, |
| {id:'px4_landing',domain:'Clinical CV',kw:['px4','precision landing','drone landing','gps rtk','landing zone','autonomous landing'], |
| title:'PX4 Precision Landing', |
| answer:'PX4 is an open-source flight control stack that supports precision landing using IR beacons, fiducial markers, or GPS-RTK. For medical delivery drones, precision landing ensures cargo delivery within \u00b10.3m of the target pad. The system uses a Kalman filter to fuse GPS, barometric altitude, and visual markers for centimeter-level accuracy during the final approach phase.', |
| facts:['Open-source flight controller','IR beacon and fiducial marker support','GPS-RTK for centimeter accuracy','Kalman filter sensor fusion','Medical delivery \u00b10.3m accuracy'], |
| related:['drone_hospital','bezier','faa_part107','clinical_cv_overlay'],refs:['PX4 Autopilot documentation']}, |
| |
| {id:'davinci_is4000',domain:'Surgical Robot',kw:['is4000','intuitive','intuitive surgical','da vinci platform','surgeon console','patient cart'], |
| title:'Intuitive IS4000 Platform', |
| answer:'The IS4000 (Intuitive Surgical 4th generation) is the platform designation for the da Vinci Xi surgical system. It features a 4-arm overhead boom architecture with a rotating boom that enables multi-quadrant access. Each arm uses cable-driven EndoWrist instruments with 7 degrees of freedom. The surgeon console provides stereoscopic 3D-HD vision with 10\u00d7 magnification, tremor filtering, and motion scaling from 2:1 to 5:1.', |
| facts:['4-arm overhead boom architecture','Cable-driven EndoWrist 7-DOF','Stereoscopic 3D-HD 10\u00d7 magnification','Tremor filtering at 6Hz cutoff','Motion scaling 2:1 to 5:1'], |
| related:['davinci_xi','rcm','cable_driven','jacobian_transpose'],refs:['Intuitive Surgical IS4000 specs']}, |
| {id:'aethon_tug',domain:'AMR Hardware',kw:['aethon','tug','hospital amr','autonomous cart','pharmacy delivery','specimen transport'], |
| title:'Aethon TUG Hospital AMR', |
| answer:'The Aethon TUG is a class of autonomous mobile robots designed specifically for hospital logistics. TUG robots navigate using a combination of laser-based SLAM and pre-mapped facility layouts. They feature modular cargo compartments (pharmacy drawers, specimen trays, linen carts) with biometric access control. A single TUG can replace 3-4 manual delivery trips per hour, operating 24/7 with automatic docking for recharging.', |
| facts:['Hospital-specific AMR design','Laser SLAM + pre-mapped navigation','Modular cargo compartments','Biometric access control','24/7 operation with auto-docking'], |
| related:['dwa','slam','vda5050','iso13482'],refs:['Aethon TUG product documentation']}, |
| {id:'zipline_p2',domain:'Drone Hardware',kw:['zipline','p2','platform 2','delivery drone','evtol','hybrid drone','droid'], |
| title:'Zipline Platform 2 (P2)', |
| answer:'Zipline P2 is a hybrid eVTOL delivery system combining fixed-wing cruise efficiency with VTOL precision. The system consists of a fixed-wing aircraft for long-range flight and a detachable autonomous droid that descends on a tether for precision delivery. P2 can deliver packages up to 3.6 kg (8 lbs) within a 16 km radius, achieving 300+ deliveries per day per launch site. The droid maintains \u00b12m landing accuracy without requiring a landing pad.', |
| facts:['Hybrid fixed-wing + VTOL architecture','Detachable droid on tether for delivery','3.6 kg (8 lbs) payload, 16 km radius','300+ deliveries per day per site','\u00b12m delivery accuracy, no pad needed'], |
| related:['drone_hospital','bezier','faa_part107','px4_landing'],refs:['Zipline P2 technical specs']}, |
| {id:'eksonr',domain:'Exoskeleton Hardware',kw:['eksonr','ekso','ekso bionics','rehab exoskeleton','lower limb','powered exoskeleton'], |
| title:'EksoNR Rehabilitation Exoskeleton', |
| answer:'EksoNR by Ekso Bionics is an FDA-cleared powered lower-body exoskeleton for rehabilitation of patients with neurological conditions including stroke, spinal cord injury, and acquired brain injury. It features variable assist technology that automatically adapts motor torque based on patient effort, bilateral hip and knee actuators with \u00b10.5\u00b0 joint tracking accuracy, and embedded sensors for real-time gait analysis. Clinical studies show 2.5\u00d7 improvement in walking speed after 12-session protocols.', |
| facts:['FDA-cleared for neurological rehab','Variable assist technology','Bilateral hip/knee actuators','\u00b10.5\u00b0 joint tracking accuracy','2.5\u00d7 walking speed improvement'], |
| related:['inverted_pendulum','fugl_meyer','gait_symmetry','iec80601_78'],refs:['Ekso Bionics EksoNR documentation']}, |
| |
| {id:'paief_framework',domain:'Evaluation',kw:['physical ai evaluation','gate then score','five layer','paief','evaluation framework'], |
| title:'Physical AI Evaluation Framework (PAIEF)', |
| answer:'PAIEF is a five-layer gate-then-score evaluation architecture purpose-built for embodied AI and multi-robot systems. Rather than relying on text-retrieval metrics, PAIEF evaluates physical reasoning, embodied task success, multi-robot coordination, and step-level reasoning quality, with a hard safety gate that must pass before any performance scoring. The framework draws from NVIDIA Cosmos Reason ontology, DeepMind RT-2/SayCan dual-metric methodology, PhysBench physical reasoning benchmarks, and DARPA DRC evaluation philosophy.', |
| facts:['5 layers: Safety Gate, Physical Reasoning, Task Success, Coordination, Reasoning Quality','Safety gate is pass/fail \u2014 any failure disqualifies','Weights: 25% Physical, 30% Task, 25% Coordination, 20% Reasoning','15 live-updating metrics across all layers','Purpose-built for embodied AI — no text-retrieval metrics used'], |
| related:['varp','physbench_score','cosmos_ontology','prm_step_verify'],refs:['PhysBench (ICLR 2025)','Cosmos-Reason1 (NVIDIA 2025)','RT-2 (DeepMind 2023)']}, |
| {id:'safety_gate',domain:'Evaluation',kw:['safety gate','collision rate','emergency stop','force compliance','human proximity'], |
| title:'Safety Gate (Layer 1 \u2014 Pass/Fail)', |
| answer:'The Safety Gate is a hard binary prerequisite: all four checks must pass before any performance scoring occurs. Collision Rate must be zero. Emergency Stop response must be under 50ms per IEC 60204-1 Category 0 requirements. Force Compliance must stay within ISO/TS 15066 thresholds (140N transient, 80N quasi-static). Human Proximity Detection must maintain reliability above 99.5%. This mirrors FDA medical device evaluation and DARPA DRC scoring where safety is non-negotiable.', |
| facts:['Collision rate must be exactly zero','E-stop response < 50ms (IEC 60204-1 Cat 0)','Force limits: 140N transient, 80N quasi-static (ISO/TS 15066)','Human proximity detection > 99.5% reliability','Any single gate failure blocks all scoring'], |
| related:['paief_framework','iso13482','iec80601_77'],refs:['ISO/TS 15066:2016','IEC 60204-1','FDA GMLP Guiding Principles']}, |
| {id:'physbench_score',domain:'Evaluation',kw:['physbench','physical reasoning','physical properties','spatial relationships','physics dynamics'], |
| title:'PhysBench Score (Layer 2)', |
| answer:'PhysBench (ICLR 2025) evaluates vision-language models on physical world understanding across 10,002 entries spanning four categories: physical object properties (mass, density, friction, elasticity), physical relationships (spatial, movement, speed), scene understanding (light, temperature, viewpoints), and physics-driven dynamics (collisions, interactions). Testing 75 VLMs revealed GPT-4o surpasses the best open-source models by 20.7%, making it highly discriminative. AEGIS uses PhysBench-aligned evaluation to test CR2 understanding of surgical instrument properties, AMR obstacle physics, drone aerodynamics, and exoskeleton biomechanics.', |
| facts:['10,002 evaluation entries across 4 categories','Tests: properties, relationships, scene understanding, dynamics','GPT-4o leads open-source by 20.7%','Published at ICLR 2025','AEGIS target: >0.85 across all subcategories'], |
| related:['paief_framework','cosmos_ontology','counterfactual_reasoning'],refs:['PhysBench (ICLR 2025, USC)']}, |
| {id:'cosmos_ontology',domain:'Evaluation',kw:['cosmos reason','ontology','space time physics','physical common sense','embodied reasoning'], |
| title:'Cosmos Reason Ontology Score (Layer 2)', |
| answer:'NVIDIA Cosmos Reason uses a hierarchical ontology covering three physical dimensions \u2014 Space, Time, and Fundamental Physics \u2014 with 16 fine-grained subcategories including gravity, friction, optics, thermodynamics, object permanence, and material properties. The Physical Common Sense Benchmark contains 604 questions from 426 videos; the Embodied Reasoning Benchmark adds 610 questions testing action understanding, task completion verification, next action prediction, and physical feasibility. AEGIS evaluates CR2 against this ontology to ensure spatial reasoning aligns with NVIDIA methodology.', |
| facts:['3 dimensions: Space, Time, Fundamental Physics','16 subcategories including gravity, friction, optics, thermodynamics','604 physical common sense questions from 426 videos','610 embodied reasoning questions across 5 agent types','Released on HuggingFace: nvidia/Cosmos-Reason1-Benchmark'], |
| related:['paief_framework','physbench_score','cr2_chain_of_thought'],refs:['Cosmos-Reason1 (arXiv 2503.15558)','NVIDIA Research 2025']}, |
| {id:'counterfactual_reasoning',domain:'Evaluation',kw:['counterfactual','clevrer','what if','causal reasoning','alternative outcomes'], |
| title:'Counterfactual Reasoning Score (Layer 2)', |
| answer:'Counterfactual reasoning evaluates whether the system can answer what-if questions about alternative physical outcomes. Based on CLEVRER (ICLR 2020 Spotlight) methodology, it tests descriptive, explanatory, predictive, and counterfactual reasoning about physical events. For multi-robot coordination, the system must reason about alternative action sequences. AEGIS uses Physion++-style paired trials with identical visuals but different physical outcomes to evaluate mechanical property inference.', |
| facts:['Based on CLEVRER (ICLR 2020) + Physion++ (NeurIPS 2023)','Tests: descriptive, explanatory, predictive, counterfactual','Critical for multi-robot planning','Most models near chance on Physion++ \u2014 highly discriminative','AEGIS target: >0.82 counterfactual accuracy'], |
| related:['physbench_score','cosmos_ontology','paief_framework'],refs:['CLEVRER (ICLR 2020)','Physion++ (NeurIPS 2023)']}, |
| {id:'task_success_rate',domain:'Evaluation',kw:['task success','binary success','embodied task','completion rate','closed loop'], |
| title:'Task Success Rate (Layer 3)', |
| answer:'Binary task success rate is the primary metric across every major robot foundation model: RT-X, Octo, OpenVLA, GR00T, BEHAVIOR-1K. Following NVIDIA GR00T two-stage protocol, AEGIS evaluates via open-loop assessment then closed-loop simulation rollouts across standardized hospital tasks. DeepMind RT-2 ran 6,000+ evaluation trials; SayCan separated planning success (84%) from execution success (74%). AEGIS targets >0.93 across surgical, AMR, drone, and exoskeleton domains.', |
| facts:['Primary metric across RT-X, Octo, OpenVLA, GR00T, BEHAVIOR-1K','Two-stage: open-loop prediction + closed-loop rollout','RT-2: 6,000+ evaluation trials','SayCan: 84% planning, 74% execution','AEGIS target: >0.93 across all 4 robot domains'], |
| related:['plan_vs_execute','behavioral_precision','paief_framework'],refs:['RT-2 (DeepMind 2023)','SayCan (Google 2022)','Isaac Lab-Arena (NVIDIA 2025)']}, |
| {id:'plan_vs_execute',domain:'Evaluation',kw:['planning success','execution success','saycan','plan execute split','action prediction'], |
| title:'Plan vs Execute Success (Layer 3)', |
| answer:'Introduced by DeepMind SayCan, the plan-vs-execute split distinguishes whether the AI chose the correct action sequence (planning success) from whether it physically executed correctly (execution success). This separation is critical: a planning failure means wrong reasoning, an execution failure means wrong control. Gemini Robotics 1.5 extends this with 15 academic benchmarks including the ASIMOV safety benchmark. AEGIS reports both metrics separately per robot domain.', |
| facts:['SayCan: 84% planning vs 74% execution','Distinguishes reasoning from control failures','Gemini Robotics: 15 embodied reasoning benchmarks','ASIMOV adds semantic safety evaluation','AEGIS target: planning >0.93, execution >0.88'], |
| related:['task_success_rate','behavioral_precision','paief_framework'],refs:['SayCan (Google 2022)','Gemini Robotics 1.5 (DeepMind 2025)']}, |
| {id:'behavioral_precision',domain:'Evaluation',kw:['behavioral metrics','roboeval','spatial precision','temporal precision','trajectory quality'], |
| title:'Behavioral Precision (Layer 3)', |
| answer:'RoboEval (2025) demonstrates that even when policies achieve similar success rates, behavioral metrics reveal structural differences in 59.4% of task-metric combinations. Behavioral precision evaluates spatial accuracy, temporal efficiency, and trajectory quality (smoothness, jerk minimization, SPL). For hospital scenarios, this captures clinical-grade precision. AEGIS computes SPL for navigation and kinematic precision for manipulation tasks.', |
| facts:['RoboEval: differences in 59.4% of task-metric pairs','Spatial precision: end-effector positioning error','SPL: Success weighted by Path Length','Trajectory: smoothness, jerk minimization','AEGIS target: >0.86 composite behavioral score'], |
| related:['task_success_rate','plan_vs_execute','paief_framework'],refs:['RoboEval (2025)','BEHAVIOR-1K (Stanford CoRL)']}, |
| {id:'makespan_efficiency',domain:'Evaluation',kw:['makespan','flowtime','mapf','multi agent path finding','scheduling'], |
| title:'Makespan Efficiency (Layer 4)', |
| answer:'Makespan (time until all agents finish) and flowtime (sum of individual times) are standard MAPF metrics. Hospital coordination is classified as MT-MR-TA per Gerkey and Mataric taxonomy \u2014 the most complex category, proven strongly NP-hard. AEGIS normalizes makespan against a centralized optimal planner baseline, targeting >0.90 efficiency ratio. Communication overhead and dynamic reallocation speed are measured as secondary coordination metrics.', |
| facts:['Makespan: time until all agents complete','MT-MR-TA: strongly NP-hard classification','Normalized against optimal baseline','Communication overhead measured','AEGIS target: >0.90 efficiency ratio'], |
| related:['coalition_quality','deadline_satisfaction','paief_framework'],refs:['Gerkey & Mataric (IJRR 2004)','MAPF benchmarks (AAAI)']}, |
| {id:'coalition_quality',domain:'Evaluation',kw:['coalition','task allocation','capability matching','heterogeneous','robot team'], |
| title:'Coalition Quality (Layer 4)', |
| answer:'Coalition quality measures whether the right robots are assigned to the right tasks based on capability matching. In a heterogeneous hospital fleet, optimal coalition formation requires matching task requirements to robot capabilities while respecting temporal and resource constraints. Based on COHERENT (2024) for heterogeneous coordination and MAP-THOR (2024) for long-horizon planning, AEGIS evaluates coalition optimality against exhaustive search baselines.', |
| facts:['Matches capabilities to task requirements','Based on COHERENT (2024) + MAP-THOR (2024)','Considers temporal + resource constraints','Exhaustive search baseline comparison','AEGIS target: >0.88 coalition optimality'], |
| related:['makespan_efficiency','deadline_satisfaction','paief_framework'],refs:['COHERENT (2024)','MAP-THOR (2024)']}, |
| {id:'deadline_satisfaction',domain:'Evaluation',kw:['deadline','time critical','medical urgency','temporal constraint'], |
| title:'Deadline Satisfaction Rate (Layer 4)', |
| answer:'Hospital tasks are time-critical: surgical instrument delivery has sub-minute windows, medication transport has cold-chain limits, stroke response has a 3.5-hour tPA window. Deadline satisfaction measures the fraction of time-constrained tasks completed within their required windows, with weighted severity based on medical criticality. AEGIS assigns priority tiers (critical, urgent, routine) and measures satisfaction per tier.', |
| facts:['Sub-minute surgical instrument windows','Cold-chain: 2-8\u00b0C time limits','Stroke tPA: 3.5-hour window','Priority tiers: critical, urgent, routine','AEGIS target: >0.95 critical, >0.92 overall'], |
| related:['makespan_efficiency','coalition_quality','paief_framework'],refs:['Hospital logistics standards','ISO 13482']}, |
| {id:'prm_step_verify',domain:'Evaluation',kw:['prm','process reward','step verification','reasoning steps','chain verify'], |
| title:'PRM Step Verification (Layer 5)', |
| answer:'Adapted from OpenAI (Lightman et al. 2023), Process Reward Models evaluate each intermediate reasoning step rather than only the final answer, achieving 78.2% vs 72.4% for Outcome Reward Models. For physical AI, PRM verifies chains like: detect obstacle \u2192 calculate clearance \u2192 adjust trajectory \u2192 verify collision-free path. Generative PRMs (ThinkPRM) generalize out-of-domain with as few as 8,000 labels. AEGIS applies step-level verification to CR2 four-stage reasoning pipeline.', |
| facts:['PRM: 78.2% vs ORM: 72.4% (Lightman et al.)','Evaluates each reasoning step','ThinkPRM generalizes with 8K labels','CR2 pipeline: detect \u2192 parse \u2192 predict \u2192 assess','AEGIS target: >0.88 step-level accuracy'], |
| related:['safety_adherence','expected_calibration_error','paief_framework'],refs:['Lightman et al. 2023 (OpenAI)','ThinkPRM (arXiv 2504.16828)']}, |
| {id:'safety_adherence',domain:'Evaluation',kw:['constitutional ai','safety principles','safety adherence','asimov benchmark'], |
| title:'Safety Adherence Score (Layer 5)', |
| answer:'Inspired by Anthropic Constitutional AI and DeepMind ASIMOV benchmark, safety adherence evaluates whether reasoning respects embedded safety constraints. Physical AI principles include: minimize collision risk, respect human space, prioritize patient safety over efficiency, maintain sterile field integrity. The EU AI Act (Article 9) requires continuous risk management for high-risk medical AI. AEGIS checks that every CR2 reasoning chain explicitly satisfies applicable safety constraints before recommending actions.', |
| facts:['Based on Constitutional AI (Anthropic) + ASIMOV (DeepMind)','Physical safety: collision, proximity, sterility, patient safety','EU AI Act Article 9: continuous risk management','Every reasoning chain must check safety constraints','AEGIS target: >0.95 safety adherence'], |
| related:['prm_step_verify','safety_gate','paief_framework'],refs:['Constitutional AI (Anthropic 2022)','ASIMOV (DeepMind 2025)','EU AI Act Article 9']}, |
| {id:'expected_calibration_error',domain:'Evaluation',kw:['ece','calibration','expected calibration error','confidence calibration','brier score'], |
| title:'Expected Calibration Error (ECE)', |
| answer:'ECE measures how well a model\u2019s confidence scores match its actual accuracy. An ECE of 0 means perfect calibration. Computed by binning predictions by confidence, then averaging the absolute difference between confidence and accuracy within each bin. For safety-critical robotics, low ECE (<0.05) ensures operators can trust confidence signals. Retained as the sole metric applying equally to text-based and embodied AI evaluation.', |
| facts:['Measures confidence-accuracy alignment','ECE=0 means perfect calibration','Binned confidence vs accuracy','Critical for safety-critical systems','AEGIS target: ECE < 0.05'], |
| related:['prm_step_verify','safety_adherence','varp','bootstrap_ci'],refs:['Guo et al. 2017, ICML']}, |
| {id:'process_reward_model',domain:'Evaluation',kw:['prm','process reward','step reward','reasoning reward','outcome reward'], |
| title:'Process Reward Models (PRM)', |
| answer:'PRMs evaluate correctness of each intermediate step in a reasoning chain, rather than only the final answer. They assign rewards to individual chain-of-thought steps, detecting errors even when the final answer is correct. Originally demonstrated on mathematical reasoning (Lightman et al. 2023), PRM methodology transfers to physical reasoning where each step can be verified against simulation ground truth. AEGIS adapts PRM for CR2 four-stage pipeline: object detection, spatial parsing, physics prediction, safety assessment.', |
| facts:['Evaluates each reasoning step independently','Detects errors in correct-answer chains','78.2% vs 72.4% for Outcome Reward Models','Step-level reward assignment','AEGIS: validates 4-step CR2 pipeline'], |
| related:['prm_step_verify','cr2_chain_of_thought','safety_adherence','varp'],refs:['Lightman et al. 2023 (OpenAI)']}, |
| {id:'multi_robot_handoff',domain:'Coordination',kw:['handoff','hand off','transfer','delivery','cargo','specimen','pickup','relay'], |
| title:'Multi-Robot Handoff Protocols', |
| answer:'Hospital robot handoffs follow a 6-phase protocol: navigate, announce, authenticate, transfer, confirm, depart. Aethon TUG uses fingerprint biometric + PIN to unlock destination-specific drawers, logging every transaction. Zipline P2 lowers an autonomous droid on a tether with 1-meter accuracy. Da Vinci instrument swaps are tracked by the system with a 10-use lifecycle per EndoWrist instrument. AEGIS simulates all three handoff types with phase-level state machines and visual indicators.', |
| facts:['6-phase protocol: navigate, announce, authenticate, transfer, confirm, depart','TUG: biometric + PIN authentication per drawer','Zipline P2: droid-on-tether, 1m accuracy','Da Vinci: 10-use instrument lifecycle tracking','97% of TUG obstructions resolved remotely'], |
| related:['makespan_efficiency','coalition_quality','safety_gate'],refs:['Aethon TUG documentation','Zipline P2 specifications']}, |
| {id:'scenario_engine',domain:'Simulation',kw:['scenario','code blue','news2','cardiac arrest','emergency','dispatch','acls'], |
| title:'Clinical Scenario Engine', |
| answer:'AEGIS implements a Code Blue scenario engine using NEWS2 (National Early Warning Score 2) to trigger multi-robot emergency response. NEWS2 uses 6 physiological parameters (respiration rate, SpO2, systolic BP, pulse, consciousness, temperature) scored 0-3 each. Score >=5 triggers medium alert, >=7 triggers emergency response. The engine progresses through 8 phases: Normal Ops, Deterioration, Code Blue, Robot Dispatch, Resuscitation, ROSC, ICU Transfer, Resolved. Each phase triggers appropriate robot behaviors.', |
| facts:['NEWS2: 6 parameters, score 0-20','>=5: medium risk, >=7: high/emergency','8 scenario phases with branching outcomes','Auto-dispatches TUG crash cart and Zipline blood products','Used in 99.5% of UK acute hospitals'], |
| related:['multi_robot_handoff','safety_gate','deadline_satisfaction'],refs:['Royal College of Physicians NEWS2 (2017)']}, |
| {id:'icg_perfusion_overlay',domain:'Clinical CV',kw:['icg','firefly','fluorescence','perfusion','tissue viability','near infrared'], |
| title:'ICG Fluorescence Perfusion Overlay', |
| answer:'Intuitive Surgical Firefly (FDA-cleared, standard on da Vinci Xi since 2014) converts invisible near-infrared ICG fluorescence into bright green overlays against gray tissue background. Activ Surgical ActivSight (FDA 510(k) cleared April 2021) provides dye-free perfusion mapping via laser speckle contrast imaging displayed as a heat-map overlay. AEGIS simulates Firefly-style green perfusion visualization with real-time confidence scoring for tissue viability assessment.', |
| facts:['Firefly: FDA-cleared, standard on all da Vinci Xi','ICG: green overlay on gray tissue background','ActivSight: FDA 510(k) April 2021, dye-free perfusion','Laser speckle contrast imaging (LSCI)','AEGIS renders radial gradient perfusion + confidence bar'], |
| related:['critical_view_safety','paief_framework'],refs:['Intuitive Surgical Firefly clearance','SAGES ActivSight TAVAC']}, |
| {id:'rotatable_arena',domain:'Visualization',kw:['rotate','3d','isometric','orbit','camera angle','perspective'], |
| title:'Rotatable Isometric Arena', |
| answer:'AEGIS implements continuous isometric rotation by transforming floor-plan coordinates through a rotation matrix before projection. The iso() function applies cos/sin rotation to (dx,dy) offsets, enabling smooth 360-degree orbiting while preserving all existing 2D Canvas rendering. Right-click drag rotates manually; auto-rotate provides cinematic orbital motion at ~0.15 rad/s. This approach avoids a full Three.js rewrite while delivering spatial navigation comparable to NVIDIA Omniverse viewport controls.', |
| facts:['Rotation via 2D matrix transform in iso() projection','Right-click drag or Shift+drag for manual rotation','Auto-rotate: ~0.15 rad/s cinematic orbit','Smooth easing: eRotAngle lerps toward rotAngle at 0.12','All existing Canvas 2D rendering preserved'], |
| related:['3d_consistency','paief_framework'],refs:['Isometric projection mathematics']}, |
| |
| {id:'demo_structure',domain:'Competition',kw:['demo','presentation','105 seconds','demo structure','competition','gtc'], |
| title:'105-Second Demo Structure', |
| answer:'The AEGIS-Reason demonstration follows an 8-beat narrative arc optimized for the competition\u2019s 105-second evaluation window. Beat 1 (0\u201311s): Environment Initialization \u2014 overview sweep establishing the hospital environment with all four robot zones. Beat 2 (11\u201325s): Surgical Precision \u2014 da Vinci Xi deep-dive with CVS assessment and force compliance overlays. Beat 3 (25\u201339s): Fleet Logistics \u2014 AMR fleet coordination with DWA navigation and corridor planning. Beat 4 (39\u201352s): Aerial Delivery \u2014 drone delivery with precision landing and geofence visualization. Beat 5 (52\u201365s): Gait Rehabilitation \u2014 exoskeleton gait analysis with pose estimation and biomechanics. Beat 6 (65\u201379s): Integrated Operations \u2014 multi-robot coordination with handoffs and system-level metrics. Beat 7 (79\u201392s): Clinical Readiness \u2014 HMS-inspired governance, NASSS sociotechnical assessment, and MIT-inspired systems engineering indicators. Beat 8 (92\u2013105s): Evaluation Summary \u2014 PAIEF composite score reveal with full scorecard.', |
| facts:['8-beat narrative arc','105-second evaluation window','Progressive zone reveal','Clinical Readiness governance beat','PAIEF composite summary finale'], |
| related:['aegis_demo','aegis_arena','aegis_scoring'],refs:['AEGIS Competition Strategy']}, |
| {id:'visual_hierarchy',domain:'Competition',kw:['visual hierarchy','design','information density','attention flow','demo design'], |
| title:'Visual Hierarchy Design Principles', |
| answer:'The arena uses a deliberate visual hierarchy to guide evaluator attention. Primary layer: animated robot geometry (highest contrast, continuous motion). Secondary layer: physics equations and CV overlays (medium opacity, zone-colored). Tertiary layer: evaluation metrics panels (side-positioned, on-demand). Background layer: hospital environment (lowest opacity, establishes context). This hierarchy ensures evaluators perceive robot intelligence first, evidence second, and metrics third.', |
| facts:['4-layer visual hierarchy','Primary: robot geometry (motion captures attention)','Secondary: physics/CV overlays (evidence)','Tertiary: metrics panels (quantification)','Background: hospital context'], |
| related:['aegis_arena','demo_structure','aegis_demo'],refs:['AEGIS Design Guidelines']}, |
| {id:'cross_domain_synthesis',domain:'Competition',kw:['cross domain','synthesis','multi robot','pipeline','specimen','coordination pipeline'], |
| title:'Cross-Domain Synthesis Pipeline', |
| answer:'AEGIS demonstrates cross-domain synthesis through a clinical coordination pipeline: surgical robot completes tissue excision \u2192 specimen placed in AMR drawer \u2192 TUG navigates to helipad \u2192 drone lifts specimen for lab delivery \u2192 results inform rehab scheduling for the exoskeleton patient. This pipeline showcases Cosmos Reason 2\u2019s ability to reason across heterogeneous robot morphologies in a unified physical environment.', |
| facts:['4-stage clinical pipeline','Surgical \u2192 AMR \u2192 Drone \u2192 Exo','Demonstrates heterogeneous robot reasoning','Unified physical environment','CR2 reasons across morphologies'], |
| related:['aegis_demo','gerkey_mataric','makespan'],refs:['AEGIS-Reason Architecture']}, |
| {id:'blender_sprite',domain:'Visualization',kw:['blender','sprite','2d render','robot visual','asset pipeline','isometric render'], |
| title:'Blender Sprite Pipeline for 2D Assets', |
| answer:'Professional 2D game assets are often created using a Blender-to-sprite pipeline: model the 3D robot in Blender, set up an isometric camera (rotation 45\u00b0/30\u00b0), apply PBR materials with metallic/roughness maps, render with transparent background, and export as PNG sprite sheets. Runtime compositing applies additive LED glow (globalCompositeOperation: lighter), specular environment mapping, and palette-shifted team colors via canvas pixel manipulation.', |
| facts:['Blender 3D \u2192 isometric 2D pipeline','PBR materials: metallic + roughness maps','Transparent background rendering','Runtime additive glow compositing','Canvas pixel manipulation for effects'], |
| related:['aegis_arena','omniverse'],refs:['Blender documentation']}, |
| {id:'led_glow_effect',domain:'Visualization',kw:['led','glow','bloom','composite','additive blend','radial gradient'], |
| title:'Runtime LED Glow Effects', |
| answer:'Canvas LED glow effects use a two-layer technique: a large, low-opacity radial gradient for the diffuse halo (simulating photon scatter), topped by a small, high-opacity circle for the bright core. The gradient typically uses 2\u20133 color stops transitioning from the LED color at center to transparent at the edge. Pulsing is achieved by modulating the alpha with a sine function of time: alpha = base + amplitude * sin(t * frequency + phase).', |
| facts:['Two-layer: diffuse halo + bright core','Radial gradient with 2\u20133 color stops','Sine-modulated alpha for pulsing','globalCompositeOperation for bloom','Per-LED phase offset avoids sync'], |
| related:['aegis_arena','blender_sprite'],refs:['Canvas 2D rendering techniques']}, |
| {id:'dwa_planner',domain:'AMR Navigation',kw:['dwa planner','dynamic window','velocity space','admissible velocity','local planner','ros navigation'], |
| title:'Dynamic Window Approach (DWA) Planner', |
| answer:'The Dynamic Window Approach is a local path planning algorithm that samples velocities within a dynamic window defined by the robot\u2019s acceleration limits. For each candidate (v, \u03c9) pair, DWA simulates the resulting trajectory and scores it using an objective function combining heading alignment, obstacle clearance, and velocity magnitude. The highest-scoring trajectory is executed. DWA runs at 10\u201320 Hz and is the default local planner in ROS2 Navigation2.', |
| facts:['Samples from dynamic velocity window','Objective: heading + clearance + speed','Runs at 10\u201320 Hz control rate','Default local planner in ROS2 Nav2','Handles non-holonomic constraints'], |
| related:['dwa','slam','aethon_tug','clinical_cv_overlay'],refs:['Fox et al. 1997, IEEE RA']}, |
| {id:'cold_chain',domain:'Drone Delivery',kw:['cold chain','temperature','cargo temp','vaccine','blood product','medical cargo'], |
| title:'Cold Chain Compliance for Medical Drones', |
| answer:'Medical drone deliveries must maintain cold chain integrity for temperature-sensitive cargo including blood products (2\u20138\u00b0C), vaccines (2\u20138\u00b0C), and lab specimens (<25\u00b0C). The Zipline P2 uses insulated payload bays with phase-change material packs. Real-time temperature sensors log cargo temperature at 1 Hz, triggering alerts if excursions exceed \u00b10.5\u00b0C from target. Regulatory compliance requires unbroken temperature records from departure to delivery.', |
| facts:['Blood products: 2\u20138\u00b0C required','Vaccines: 2\u20138\u00b0C cold chain','Insulated bays with phase-change packs','1 Hz temperature logging','Unbroken records for compliance'], |
| related:['drone_hospital','zipline_p2','faa_part107'],refs:['WHO cold chain guidelines']}, |
| {id:'gait_cycle_phases',domain:'Biomechanics',kw:['gait cycle','stance','swing','heel strike','toe off','gait phase','walking cycle'], |
| title:'Gait Cycle Phases', |
| answer:'A normal gait cycle consists of stance phase (~60%) and swing phase (~40%). Stance begins at heel strike (initial contact), progresses through loading response, mid-stance, terminal stance, and pre-swing (toe-off). Swing phase includes initial swing, mid-swing, and terminal swing. For exoskeleton control, accurate phase detection enables the variable assist system to apply motor torque at the correct moment\u2014maximum assistance during swing initiation and controlled braking during terminal swing.', |
| facts:['Stance: ~60%, Swing: ~40% of cycle','Stance: heel strike \u2192 toe off','Swing: initial \u2192 mid \u2192 terminal','Phase detection drives exo motor timing','Variable assist matches gait phase'], |
| related:['inverted_pendulum','gait_symmetry','eksonr','fugl_meyer'],refs:['Perry & Burnfield, Gait Analysis']}, |
| {id:'sensor_fusion',domain:'Robotics',kw:['sensor fusion','kalman filter','imu','state estimation','multi sensor','extended kalman'], |
| title:'Sensor Fusion for Robot State Estimation', |
| answer:'Sensor fusion combines data from multiple sensors (IMU, encoders, LiDAR, cameras, force/torque sensors) to produce a unified state estimate. Extended Kalman Filters (EKF) or Unscented Kalman Filters (UKF) are standard approaches, predicting state forward using a motion model and correcting with sensor observations. In the AEGIS hospital, fusion enables: surgical arm pose estimation (encoders + force sensors), AMR localization (LiDAR + odometry), drone altitude (barometer + GPS + visual), and exo joint tracking (IMU + encoders).', |
| facts:['Combines IMU, encoders, LiDAR, cameras','EKF/UKF for prediction-correction cycle','Surgical: encoders + force sensors','AMR: LiDAR + wheel odometry','Drone: barometer + GPS + visual landing'], |
| related:['slam','px4_landing','eksonr','dwa_planner'],refs:['Thrun et al., Probabilistic Robotics']}, |
| {id:'safety_integrity_level',domain:'Safety Standards',kw:['sil','safety integrity','sil 1','sil 2','sil 3','functional safety','probability of failure'], |
| title:'Safety Integrity Levels (SIL)', |
| answer:'Safety Integrity Levels (SIL 1\u20134) define the reliability requirements for safety-related systems per IEC 61508. SIL-1 requires a probability of dangerous failure per hour (PFH) of 10\u207b\u2076 to 10\u207b\u2075; SIL-2 requires 10\u207b\u2077 to 10\u207b\u2076; SIL-3 requires 10\u207b\u2078 to 10\u207b\u2077. In AEGIS, the AMR fleet and exoskeleton operate at SIL-2 (personal care robots), drones at SIL-1 (delivery systems), and the surgical robot follows IEC 80601-2-77 rather than SIL classification.', |
| facts:['SIL 1\u20134 per IEC 61508','SIL-1: PFH 10\u207b\u2076 to 10\u207b\u2075','SIL-2: PFH 10\u207b\u2077 to 10\u207b\u2076','AMR + Exo: SIL-2','Drones: SIL-1, Surgical: IEC 80601'], |
| related:['iec61508','iso13482','iec80601_77','iec80601_78'],refs:['IEC 61508:2010']} |
| , |
| |
| |
| |
| |
| |
| |
| {id:'nasss_complexity',domain:'Healthcare AI Integration',kw:['nasss','sociotechnical','complexity','implementation','adoption','nonadoption','sustainability','greenhalgh','integration barriers'], |
| title:'Sociotechnical Complexity Assessment (Informed by Greenhalgh et al. 2017)', |
| answer:'Multi-robot hospital deployment must address seven interdependent complexity dimensions: the clinical condition being served, the technology stack, the value proposition for each stakeholder, the adopter system (surgeons, nurses, logistics staff), organizational readiness, the regulatory environment, and long-term sustainability under evolving conditions. Systems that appear technically sound can still fail when any single dimension harbors unresolved complexity. AEGIS-Reason addresses all seven by integrating physics-grounded reasoning with regulatory compliance, workflow-aware coordination, and adaptive learning capabilities. This analysis draws on principles from the NASSS framework for health technology implementation (Greenhalgh et al., J Med Internet Res, 2017).', |
| facts:['7 interdependent complexity dimensions','Technical success insufficient without sociotechnical alignment','Each robot type impacts different stakeholder groups','Organizational readiness varies across hospital departments','Long-term sustainability requires adaptive model updates'], |
| related:['casof_pipeline','intervention_ensemble','paief_framework'],refs:['Greenhalgh et al. (J Med Internet Res, 2017)','NASSS-CAT Tools (JMIR Res Protoc, 2020)']}, |
| |
| {id:'casof_pipeline',domain:'Healthcare AI Integration',kw:['casof','sociotechnical framework','clinical ai','development pipeline','delphi','checklist','planning design development'], |
| title:'Clinical AI Development Pipeline (Informed by CASoF, Owoyemi et al. 2025)', |
| answer:'The development pipeline for clinical robot AI systems spans four stages: planning (defining scope, stakeholders, and clinical need), design (architecture, data strategy, safety constraints), development (training, validation with clinically meaningful metrics), and proposed implementation (workflow integration, monitoring plan). Each stage requires input from clinical domain experts, not just engineers. For multi-robot coordination, the planning stage must map which clinical workflows each robot class serves and how handoffs between robot types affect patient care timelines. This structured approach is informed by principles from the Clinical AI Sociotechnical Framework (Owoyemi et al., JMIRx Med, 2025).', |
| facts:['4-stage structured pipeline: plan, design, develop, implement','Clinical expert input required at every stage','Robot handoff protocols affect patient care timelines','Workflow mapping precedes technical implementation','Validation must use clinically meaningful endpoints'], |
| related:['nasss_complexity','model_card_transparency','paief_framework'],refs:['Owoyemi et al. (JMIRx Med, 2025)','CASoF Modified Delphi methodology']}, |
| |
| {id:'intervention_ensemble',domain:'Healthcare AI Integration',kw:['intervention ensemble','clinical workflow','not isolated','broader system','sociotechnical','workflow integration','human ai team'], |
| title:'AI as Intervention Ensemble, Not Isolated Tool', |
| answer:'Robot AI systems in hospitals must be evaluated as components within a broader clinical workflow rather than as standalone technologies. A surgical robot produces value only when integrated with the surgical team workflow, sterile processing, scheduling systems, and post-operative monitoring. Similarly, AMR delivery robots create value only when coordinated with pharmacy dispensing, nursing station requirements, and patient care schedules. Evaluating any single robot in isolation misses the interaction effects that determine real-world clinical impact. AEGIS-Reason models this by coordinating four distinct robot classes within a unified reasoning framework that accounts for cross-system dependencies.', |
| facts:['Robots create value only within clinical workflow context','Interaction effects between systems determine real outcomes','Single-robot evaluation misses coordination dependencies','Unified reasoning framework captures cross-system effects','Patient care timelines depend on multi-robot orchestration'], |
| related:['nasss_complexity','casof_pipeline','makespan_efficiency'],refs:['Sociotechnical systems theory applied to healthcare AI']}, |
| |
| {id:'descriptive_ai_framing',domain:'Healthcare AI Integration',kw:['descriptive','prescriptive','automation bias','framing','decision support','human oversight','ai framing','human ai teaming','descriptive output'], |
| title:'Descriptive AI Output Design for Automation Bias Prevention', |
| answer:'Research on human-AI decision-making has demonstrated that the framing of AI outputs significantly affects clinical judgment quality. When AI systems present recommendations as directive commands, clinicians may defer to the algorithm even when it produces errors, a phenomenon known as automation bias. By contrast, presenting the same analytical information as observational descriptions preserves clinician agency and independent judgment. AEGIS-Reason implements descriptive output framing across all four robot domains: the system reports what it observes about physical states (tissue classification, corridor occupancy, wind conditions, joint angles) rather than issuing prescriptive commands about what actions to take. This design choice ensures that human operators retain final decision authority in all safety-critical contexts.', |
| facts:['Directive AI framing can suppress independent clinical judgment','Descriptive framing preserves human decision-making agency','All four robot domains use observational output mode','Physical state descriptions replace action commands','Human operators retain final authority in safety-critical decisions'], |
| related:['nasss_complexity','safety_adherence','bot_risk_threshold'],refs:['Automation bias research in clinical decision support','Human factors engineering for AI-assisted medical devices']}, |
| |
| {id:'label_leakage_immunity',domain:'Healthcare AI Integration',kw:['label leakage','causal','grounding','physical reasoning','epic sepsis','correlation','spurious','post hoc','causal grounding','causality'], |
| title:'Causal Grounding: Physical AI Immunity to Label Leakage', |
| answer:'A well-documented failure mode in clinical predictive models occurs when algorithms inadvertently use treatment actions as predictors, creating the illusion of predictive power that vanishes in prospective deployment. The most prominent example involved a widely deployed sepsis prediction tool whose accuracy collapsed from reported values above 0.76 to below 0.50 when evaluated strictly on pre-recognition data (Wong et al., JAMA Internal Medicine, 2021). Physical AI reasoning is structurally immune to this failure mode because it operates on directly observable physical quantities: spatial relationships, force vectors, object trajectories, and material properties. These physical observations exist independently of downstream clinical decisions, providing genuine causal grounding rather than statistical correlation with post-hoc treatment artifacts.', |
| facts:['Treatment-as-predictor artifacts inflate retrospective accuracy','Physical observations are causally upstream of clinical decisions','Spatial reasoning uses geometry not treatment correlations','Force and trajectory data exist independently of interventions','Structural immunity eliminates a major class of AI deployment failures'], |
| related:['descriptive_ai_framing','paief_framework','physbench_score'],refs:['Wong et al. (JAMA Internal Medicine, 2021)','Causal inference principles applied to physical AI reasoning']}, |
| |
| {id:'tdabc_value_impact',domain:'Healthcare AI Integration',kw:['tdabc','time driven','activity based','costing','economic','roi','value based','cost savings','porter','kaplan','healthcare economics'], |
| title:'Value-Based Impact Quantification (Informed by TDABC, Kaplan & Porter)', |
| answer:'Demonstrating economic value for multi-robot hospital systems requires moving beyond simple labor-hour displacement to comprehensive activity-based analysis. By mapping the time cost of each step in clinical pathways that robots participate in, the system can quantify value contributions at granular resolution. For AEGIS-Reason, this translates to: surgical coordination reducing setup and instrument exchange time, AMR delivery eliminating nursing transport trips, drone logistics compressing specimen and medication delivery windows, and exoskeleton-assisted rehabilitation increasing therapy session throughput. The analytical approach draws on time-driven activity-based costing principles (Kaplan & Anderson, 2004; applied to healthcare by Kaplan & Porter, HBR, 2011) which map process times to capacity cost rates for precise economic quantification.', |
| facts:['Activity-based analysis surpasses simple labor displacement metrics','Each robot class contributes to different cost reduction pathways','Surgical coordination reduces setup and instrument exchange time','AMR delivery eliminates nursing transport trips','Drone logistics compresses specimen delivery windows','Exoskeleton rehab increases therapy session throughput'], |
| related:['roni_analysis','nasss_complexity','intervention_ensemble'],refs:['Kaplan & Anderson (HBR, 2004)','Kaplan & Porter (HBR, 2011)','Value-based healthcare economics methodology']}, |
| |
| {id:'roni_analysis',domain:'Healthcare AI Integration',kw:['roni','risk of non investment','inaction cost','strategic risk','market','competitive','opportunity cost'], |
| title:'Risk of Non-Investment: Strategic Cost of Delayed Adoption', |
| answer:'Beyond quantifying the benefits of robot coordination, hospital leadership must also account for the strategic cost of failing to adopt advanced systems. Institutions that delay deployment of AI-coordinated robotics face compounding disadvantages: rising labor costs without automation offsets, inability to meet increasing throughput demands, staff burnout from manual logistics tasks, and competitive positioning loss as peer institutions adopt these capabilities. For time-critical clinical workflows such as stroke intervention or transplant organ delivery, the cost of slower logistics can be measured directly in patient outcomes. AEGIS-Reason quantifies both the positive return on investment and the risk trajectory of continued manual operation.', |
| facts:['Delayed adoption creates compounding strategic disadvantages','Rising labor costs accelerate without automation offsets','Staff burnout from manual logistics tasks reduces retention','Peer institutions adopting AI create competitive pressure','Time-critical workflows translate delays directly to outcomes'], |
| related:['tdabc_value_impact','nasss_complexity','deadline_satisfaction'],refs:['Strategic technology adoption analysis','Healthcare operations research']}, |
| |
| {id:'model_card_transparency',domain:'Healthcare AI Integration',kw:['model card','transparency','documentation','reporting','mitchell','reproducibility','tripod','intended use','limitations'], |
| title:'Model Card Documentation for Physical AI Systems (Informed by Mitchell et al. 2019)', |
| answer:'Each robot AI subsystem within AEGIS-Reason maintains structured transparency documentation covering: intended clinical use context, training data composition and known limitations, performance metrics disaggregated across relevant patient and environmental subgroups, ethical considerations specific to the deployment setting, and known failure modes with mitigation strategies. This documentation practice adapts the Model Cards framework (Mitchell et al., arXiv:1810.03993, 2019) from its original application in classification systems to the novel domain of embodied multi-robot physical AI, where transparency must additionally cover spatial reasoning assumptions, physics simulation fidelity, and cross-robot coordination reliability.', |
| facts:['Structured documentation for each robot AI subsystem','Performance disaggregated across patient and environmental subgroups','Covers intended use, limitations, and known failure modes','Extended for physical AI: spatial assumptions and simulation fidelity','Cross-robot coordination reliability documented explicitly'], |
| related:['standing_equity_audit','pccp_adaptive_learning','casof_pipeline'],refs:['Mitchell et al. (arXiv:1810.03993, 2019)','TRIPOD+AI reporting extensions']}, |
| |
| {id:'standing_equity_audit',domain:'Healthcare AI Integration',kw:['standing together','equity','bias','audit','fairness','subgroup','demographic','disparity','lancet','ghassemi'], |
| title:'Equity Monitoring Across Robot Service Populations (Informed by STANDING Together, 2025)', |
| answer:'Multi-robot hospital systems must ensure equitable service delivery across all patient populations. AEGIS-Reason incorporates equity monitoring that tracks whether robot coordination quality varies across hospital zones serving different patient demographics: surgical suites versus emergency departments, ICU versus general wards, urban versus rural satellite facilities. The system flags any detected disparities in response time, resource allocation priority, or service frequency. This monitoring approach is informed by the consensus principles for algorithmic transparency and bias prevention in health datasets (STANDING Together, Lancet Digital Health, 2025), adapted from their original dataset-focused scope to the operational domain of robotic service delivery.', |
| facts:['Service quality monitored across hospital zones and demographics','Response time equity tracked for different patient populations','Resource allocation priorities audited for systematic bias','Satellite facility service parity verified','Adapted from dataset transparency principles to operational delivery'], |
| related:['model_card_transparency','bot_risk_threshold','nasss_complexity'],refs:['STANDING Together Consensus (Lancet Digital Health, 2025)','Algorithmic equity monitoring for healthcare delivery systems']}, |
| |
| {id:'pccp_adaptive_learning',domain:'Healthcare AI Integration',kw:['pccp','predetermined change','control plan','adaptive','continuous learning','fda','model update','drift','post market'], |
| title:'Adaptive Learning with Predetermined Change Control (Informed by FDA PCCP Guidance)', |
| answer:'Robot AI systems that learn from operational data require structured governance for model updates. Rather than treating each model revision as a new regulatory submission, AEGIS-Reason implements a predetermined change control approach: defining in advance the types of updates the system may make, the performance boundaries that trigger updates, the validation protocols for each update type, and the monitoring framework that verifies post-update performance. This enables continuous improvement while maintaining safety assurance. The approach is informed by FDA guidance on Predetermined Change Control Plans for machine-learning-enabled medical devices (FDA, 2024), adapted for the multi-robot coordination context where changes to one robot subsystem may cascade to coordination-level behavior.', |
| facts:['Model update governance defined before deployment','Performance boundaries trigger structured update protocols','Validation required before and after each update cycle','Cross-robot cascade effects monitored during subsystem updates','Continuous improvement maintained within safety assurance boundaries'], |
| related:['model_card_transparency','safety_gate','paief_framework'],refs:['FDA PCCP Guidance (2024, public domain)','FDA GMLP 10 Guiding Principles (2021, public domain)']}, |
| |
| {id:'bot_risk_threshold',domain:'Healthcare AI Integration',kw:['boundaries of tolerance','bot','risk threshold','ethical','governance','fiduciary','certainty','confidence','safra','harvard ethics'], |
| title:'Organizational Risk Threshold Governance (Informed by Harvard Safra Center, 2025)', |
| answer:'Deploying AI-coordinated robots in clinical settings requires explicit organizational agreement on acceptable risk levels. For each robot class and clinical scenario, AEGIS-Reason defines the minimum confidence threshold required before the system acts: surgical CV assessments require higher certainty than logistics routing, drone delivery in emergency contexts permits different risk tolerance than routine transport, and exoskeleton force limits reflect zero tolerance for joint overload. These thresholds are established through structured stakeholder deliberation rather than engineering defaults alone, ensuring that risk acceptance reflects institutional values and patient safety priorities. This governance approach is informed by ethical framework principles for healthcare AI risk management (Harvard Edmond & Lily Safra Center for Ethics, 2025).', |
| facts:['Explicit risk thresholds defined per robot class and scenario','Surgical AI requires highest confidence thresholds','Emergency contexts permit different risk tolerance than routine','Zero tolerance maintained for patient-contact force limits','Stakeholder deliberation determines thresholds, not engineering defaults'], |
| related:['descriptive_ai_framing','safety_gate','standing_equity_audit'],refs:['Harvard Safra Center for Ethics healthcare AI framework (2025)','Organizational risk governance for autonomous systems']}, |
| |
| {id:'algorithmic_stewardship',domain:'Healthcare AI Integration',kw:['stewardship','oversight','inventory','monitoring','responsible','governance team','accountability','audit trail'], |
| title:'Algorithmic Stewardship for Multi-Robot Systems', |
| answer:'Hospital-deployed robot AI systems require designated stewardship: a cross-functional team responsible for maintaining an inventory of all active algorithms, monitoring their ongoing clinical performance, conducting periodic equity audits, and managing the lifecycle of model updates. For AEGIS-Reason, stewardship spans four robot subsystem algorithms, the coordination-level reasoning model, and the evaluation framework itself. The stewardship function ensures that no algorithm operates without ongoing oversight, that performance degradation is detected before clinical impact occurs, and that all stakeholders have access to current documentation of system capabilities and limitations.', |
| facts:['Cross-functional team maintains algorithm inventory','Ongoing performance monitoring across all subsystems','Periodic equity audits at system and subsystem level','Model lifecycle management from deployment through retirement','Stakeholder access to current capability documentation'], |
| related:['model_card_transparency','pccp_adaptive_learning','nasss_complexity'],refs:['Algorithmic stewardship principles for healthcare organizations','Clinical AI governance best practices']}, |
| |
| |
| |
| {id:'cbf_safety_invariance',domain:'Robotics Systems Engineering',kw:['cbf','control barrier','barrier function','forward invariant','safety guarantee','provable safety','safe set','ames','mathematical safety','invariance'], |
| title:'Control Barrier Function Safety Guarantees (Informed by Ames et al. 2017)', |
| answer:'Traditional safety monitoring detects violations after they occur. Control Barrier Functions provide a fundamentally stronger property: mathematical forward invariance. For a safe set defined by h(x) greater than or equal to zero, the CBF constrains the control input so that the system state cannot exit the safe boundary under any admissible disturbance. In AEGIS-Reason, each robot class operates within a CBF-enforced safe envelope: the surgical manipulator maintains instrument forces within tissue tolerance, the AMR fleet preserves minimum separation distances, drones hold altitude and geofence constraints, and the exoskeleton respects joint torque limits. This transforms safety from reactive alarm monitoring into proactive mathematical guarantee. The CBF formulation is a foundational result in modern safety-critical control theory (Ames, Xu, Grizzle & Tabuada, IEEE TAC, 2017).', |
| facts:['Forward invariance: system mathematically cannot leave safe set','CBF constrains control input, not just monitors output','Each robot class has domain-specific barrier function','Proactive guarantee vs reactive monitoring','Compositional: individual CBFs combine for multi-robot safety'], |
| related:['safety_gate','bot_risk_threshold','safety_adherence'],refs:['Ames, Xu, Grizzle & Tabuada (IEEE Trans. Automatic Control, 2017)','Control barrier functions for safety-critical autonomous systems']}, |
| |
| {id:'realm_assistance_entropy',domain:'Robotics Systems Engineering',kw:['realm','assistance','entropy','uncertainty','confidence','autonomy','help','human oversight','action distribution','hagenow','shah','when to ask'], |
| title:'Assistance Estimation via Action-Distribution Entropy (Informed by Hagenow & Shah, 2025)', |
| answer:'A responsible autonomous system must recognize the boundaries of its own competence. The REALM framework quantifies this by computing the differential entropy of the robot policy action distribution: when the entropy is low, the system is confident in its planned action and proceeds autonomously. When entropy exceeds a calibrated threshold, the system flags for human oversight rather than acting on uncertain reasoning. AEGIS-Reason applies this principle across all four robot classes: surgical reasoning with high confidence proceeds through the CVS assessment pipeline, while ambiguous anatomical presentations trigger a surgeon consultation flag. AMR navigation in clear corridors operates autonomously, but novel obstacle configurations escalate to human dispatch. This creates a quantitative bridge between full autonomy and human-in-the-loop oversight. The approach is informed by real-time assistance estimation research (Hagenow & Shah, arXiv:2504.09243, 2025).', |
| facts:['Differential entropy H(pi) measures action-distribution uncertainty','Low entropy: confident autonomous execution','High entropy: system requests human oversight','Threshold calibrated per robot class and clinical context','Bridges autonomy and human-in-the-loop operation quantitatively'], |
| related:['descriptive_ai_framing','bot_risk_threshold','nasss_complexity'],refs:['Hagenow & Shah (arXiv:2504.09243, 2025)','REALM: Real-time Estimates of Assistance from Language Models']}, |
| |
| {id:'rt_scheduling_guarantees',domain:'Robotics Systems Engineering',kw:['real time','scheduling','edf','rate monotonic','tercio','deadline','utilization','liu layland','concurrency','rtos','deterministic','latency'], |
| title:'Real-Time Task Scheduling for Multi-Robot Coordination', |
| answer:'Multi-robot hospital operations must meet hard timing deadlines: surgical control loops require sub-millisecond determinism, AMR collision avoidance demands guaranteed response latency, and cross-robot handoffs must complete within defined temporal windows. AEGIS-Reason employs Earliest Deadline First scheduling for dynamic task prioritization, achieving the theoretical 100% CPU utilization bound. For fixed-priority subsystems, Rate Monotonic scheduling provides optimality within the Liu-Layland utilization ceiling of approximately 69%. The coordination layer allocates tasks across robot classes using mixed-integer linear programming principles for precedence-aware scheduling, ensuring that no robot subsystem starves another of compute resources during time-critical operations. These scheduling guarantees are well-established in real-time systems theory (Liu & Layland, JACM, 1973) and have been extended to multi-robot contexts (Gombolay & Shah, Tercio system).', |
| facts:['EDF achieves 100% theoretical CPU utilization bound','Rate Monotonic optimal for fixed-priority with ~69% bound','MILP-based task allocation across robot classes','Precedence constraints enforce handoff ordering','Sub-millisecond determinism for safety-critical control loops'], |
| related:['makespan_efficiency','deadline_satisfaction','coalition_quality'],refs:['Liu & Layland (JACM, 1973)','Gombolay & Shah, Tercio multi-agent scheduling','Real-time systems theory for autonomous robotics']}, |
| |
| {id:'shared_mental_models',domain:'Robotics Systems Engineering',kw:['shared mental model','smm','cross training','team fluency','human robot','teaming','coordination','shah','role swap','trust','idle time'], |
| title:'Shared Mental Models for Clinical Team Fluency (Informed by Shah HRI Research)', |
| answer:'Hospital robots operate within human clinical teams, not in isolation. Effective collaboration requires that robot behavior aligns with clinician expectations, and that clinicians develop accurate predictive models of robot capabilities. The shared mental model framework formalizes this as a dual MDP: the robot encodes both its own action policy and a mathematical expectation of human actions, updated through observation of clinical workflow patterns. When robot actions align with staff expectations, team fluency increases measurably: reduced idle time between handoffs, fewer interruptions for status queries, and higher throughput. AEGIS-Reason models team fluency by tracking alignment between robot action timing and expected clinical workflow cadence across all four robot classes. This approach is informed by extensive human-robot interaction research on cross-training and shared mental models (Shah, Interactive Robotics Group, MIT CSAIL).', |
| facts:['Dual MDP encodes robot policy and expected human actions','Team fluency measured by idle-time reduction and throughput','Cross-training aligns robot behavior with clinician expectations','Predictive models reduce unnecessary status interruptions','25% faster team performance demonstrated in published user studies'], |
| related:['nasss_complexity','descriptive_ai_framing','intervention_ensemble'],refs:['Shah, Interactive Robotics Group (MIT CSAIL)','Lasota & Shah, cross-training for human-robot teaming (HRI, 2015)','Shared mental models in collaborative autonomous systems']}, |
| |
| {id:'certifiable_perception',domain:'Robotics Systems Engineering',kw:['certifiable','perception','provable','correctness','global optimum','sdp','carlone','spark','outlier','robust','certified','semidefinite'], |
| title:'Certifiable Perception for Robust Physical Reasoning (Informed by Carlone, MIT SPARK Lab)', |
| answer:'Standard perception pipelines report confidence scores, but confidence and correctness are fundamentally different properties. Certifiable perception algorithms can mathematically verify that their output is the global optimum of the estimation problem, even in the presence of extreme outlier noise (60-90% outlier rates in published results). The approach reformulates geometric perception as a polynomial optimization problem, then relaxes it into a semidefinite program whose solution is empirically tight. AEGIS-Reason applies this principle to its physical reasoning pipeline: when the Cosmos Reason spatial assessment achieves certifiable conditions (sufficient geometric constraints, bounded noise model), the system marks the perception output as mathematically verified rather than merely high-confidence. This distinction is critical for safety-critical surgical applications where incorrect spatial reasoning could have irreversible consequences. The certifiable perception framework originates from the SPARK Lab at MIT (Yang, Carlone et al., IEEE T-RO, 2020).', |
| facts:['Certifiable = mathematically proven global optimum','Robust to 60-90% outlier noise in published benchmarks','SDP relaxation empirically tight for geometric problems','Confidence scores differ fundamentally from correctness proofs','Critical for safety-critical surgical spatial reasoning'], |
| related:['cbf_safety_invariance','label_leakage_immunity','safety_gate'],refs:['Yang, Carlone et al. (IEEE Trans. Robotics, 2020)','Certifiable geometric perception, MIT SPARK Lab','Semidefinite relaxation for robust estimation']}, |
| |
| {id:'gcs_motion_planning',domain:'Robotics Systems Engineering',kw:['gcs','graphs convex sets','motion planning','trajectory','optimization','tedrake','convex','micp','rrt star','sampling','path planning'], |
| title:'Optimization-Based Motion Planning via Convex Decomposition (Informed by Tedrake, MIT)', |
| answer:'Traditional sampling-based planners like RRT* provide asymptotic optimality guarantees but struggle with derivative constraints in high-dimensional spaces. Modern optimization-based approaches decompose the configuration space into a union of convex sets connected as a graph, then solve trajectory planning as a mixed-integer convex program. By relaxing the integer constraints, this yields exceptionally tight convex solutions that find globally optimal trajectories orders of magnitude faster than sampling methods for complex manipulation tasks. AEGIS-Reason leverages this principle for surgical instrument path planning where trajectory smoothness and force constraints must be simultaneously satisfied, and for AMR fleet routing where convex corridor decomposition enables provably optimal multi-agent paths without deadlock. This planning paradigm is informed by breakthrough research on Graphs of Convex Sets (Marcucci, Tedrake et al., Robot Locomotion Group, MIT).', |
| facts:['Convex decomposition enables global optimality guarantees','Orders of magnitude faster than sampling-based methods','Handles derivative and force constraints natively','Applicable to manipulation and fleet routing simultaneously','Mixed-integer convex relaxation empirically tight'], |
| related:['rt_scheduling_guarantees','cbf_safety_invariance','makespan_efficiency'],refs:['Marcucci, Tedrake et al. (Robot Locomotion Group, MIT)','Graphs of Convex Sets for motion planning','Convex optimization methods for robotics']}, |
| |
| {id:'impedance_control_compliance',domain:'Robotics Systems Engineering',kw:['impedance','compliance','force control','contact','manipulation','tissue','stiffness','damping','haptic','rodriguez','tactile'], |
| title:'Impedance Control for Safe Physical Contact in Clinical Settings', |
| answer:'Robots operating in clinical environments must manage physical contact with patients, tissue, and medical instruments. Pure position control is insufficient because it cannot accommodate the inherent compliance required for safe interaction with deformable biological materials. Impedance control establishes a dynamic relationship between force and displacement: F = K(x_d - x) + D*dx, where the robot behaves as a virtual spring-damper system with tunable stiffness K and damping D. For surgical manipulation, stiffness is set high for precision but force-limited for tissue safety. For exoskeleton gait assistance, impedance parameters adapt in real-time to patient effort levels, providing support when needed while encouraging voluntary movement during rehabilitation. AEGIS-Reason implements domain-specific impedance profiles for each robot class that contacts patients or tissue. This control paradigm is fundamental in manipulation research (Rodriguez, MCube Lab, MIT) and rehabilitation robotics.', |
| facts:['Virtual spring-damper model: F = K(x_d - x) + D*dx','Tunable stiffness and damping per clinical context','Surgical: high precision with force limiting','Exoskeleton: adaptive impedance matching patient effort','Fundamental to safe physical human-robot interaction'], |
| related:['cbf_safety_invariance','kelvin_voigt','safety_adherence'],refs:['Rodriguez, MCube Lab (MIT) manipulation research','Impedance control for safe human-robot interaction','Hogan (J Dynamic Systems, 1985) impedance control foundations']}, |
| |
| {id:'edge_ai_reliability',domain:'Robotics Systems Engineering',kw:['edge','jetson','edge ai','local','inference','wifi','connectivity','reliability','latency','on device','hospital','network'], |
| title:'Edge AI Compute for Hospital Reliability', |
| answer:'Hospital environments present uniquely hostile conditions for networked AI: Wi-Fi drops in lead-lined imaging suites, electromagnetic interference near MRI scanners, and network congestion during emergency surges. Cloud-dependent AI systems fail precisely when reliability matters most. AEGIS-Reason processes spatial reasoning, collision avoidance, and safety-critical decisions entirely on edge compute, maintaining full operational capability during network disruptions. Only non-critical telemetry and model update synchronization require connectivity. This architecture ensures that safety-critical functions — surgical force monitoring, AMR collision avoidance, drone geofencing, and exoskeleton balance — never depend on round-trip network latency. The edge-first deployment pattern for hospital robotics is validated by production deployments such as the Moxie robot system utilizing NVIDIA Jetson for localized inference in clinical settings (Diligent Robotics, MassRobotics Physical AI Fellowship).', |
| facts:['Safety-critical inference runs entirely on edge compute','Zero dependency on network connectivity for core safety','Wi-Fi unreliable in lead-lined rooms and MRI suites','Only telemetry and model sync require connectivity','Production-validated in hospital mobile robot deployments'], |
| related:['rt_scheduling_guarantees','cbf_safety_invariance','nasss_complexity'],refs:['Diligent Robotics Moxie hospital deployment (NVIDIA Jetson)','MassRobotics AWS Physical AI Fellowship (2026)','Edge computing architectures for safety-critical robotics']}, |
| |
| |
| |
| {id:'simulation_scope_boundaries',domain:'Simulation-Reality Methodology',kw:['simulation','reality','gap','scope','limitation','boundary','fidelity','honest','parametric','what runs','actual','real','sensor','data','constraint'], |
| title:'Simulation Scope and Fidelity Boundaries', |
| answer:'AEGIS-Reason operates as a parametric simulation environment: robot kinematics, navigation paths, and evaluation telemetry are computed from mathematical models (Newtonian dynamics, DWA path planning, inverse kinematics), not from real sensor streams or hardware-in-the-loop execution. PhysX rigid-body dynamics, Isaac Lab RL policy rollouts, and Cosmos Reason 2 inference are described in the knowledge graph but do not execute within this browser-based arena. This is a deliberate architectural decision: a self-contained, zero-dependency HTML file guarantees reliable rendering on any reviewer machine without GPU drivers, API keys, or backend services. The simulation computes physically plausible trajectories and evaluation metrics, but these represent idealized system behavior under nominal conditions. Real deployment would introduce sensor noise, actuator backlash, communication latency, and environmental stochasticity that this simulation does not model. The gap between parametric simulation and physical deployment is the central challenge of the sim-to-real transfer problem (Tobin et al., Domain Randomization for Transferring Deep Neural Networks, 2017).', |
| facts:['Parametric JS physics, not PhysX or Bullet engine','Zero-dependency HTML for universal reviewer access','Robot behavior from mathematical models, not sensor data','Evaluation metrics from simulated telemetry, not real hardware','Sim-to-real gap is explicitly acknowledged, not hidden'], |
| related:['sim_to_real','isaac_lab','physics_alignment','3d_consistency'],refs:['Tobin et al., Domain Randomization for Sim-to-Real Transfer (2017)','Zhao et al., Sim-to-Real Transfer in Robotics (IEEE RAM 2020)','NVIDIA Isaac Sim documentation on domain randomization']}, |
| |
| {id:'clinical_validation_pathway',domain:'Simulation-Reality Methodology',kw:['clinical','validation','pathway','trial','irb','endpoint','phase','regulatory','fda','510k','pma','de novo','real world','evidence','patient','outcome'], |
| title:'Clinical Validation Pathway Requirements', |
| answer:'Translating this simulation framework into clinical deployment requires a structured validation pipeline that this demo does not implement but whose requirements are well-understood. Phase I (bench testing) would validate individual robot subsystem safety against IEC 80601-2-77/78 on physical hardware in a controlled lab. Phase II (simulated clinical environment) would deploy instrumented robots in a mock hospital ward with standardized patient scenarios, measuring primary endpoints: surgical tool-tip accuracy (\u00b10.5 mm), AMR delivery latency (< 120 s corridor transit), drone payload integrity (< 0.1% damage rate), and exoskeleton gait deviation (< 5\u00b0 from prescribed trajectory). Phase III (supervised clinical use) would require IRB approval, informed consent protocols, and a defined patient population with inclusion/exclusion criteria. Regulatory pathway would likely follow FDA De Novo classification for novel AI-enabled surgical assistance, and 510(k) with predicate device for AMR logistics (referencing existing Aethon TUG clearances). The TDABC cost model projects $127K/yr savings, but this figure derives from simulation parameters and requires prospective validation against actual time-motion studies in a partner institution.', |
| facts:['Phase I: bench testing against IEC 80601 standards','Phase II: mock hospital with measurable clinical endpoints','Phase III: IRB-approved supervised clinical deployment','FDA pathway: De Novo for surgical AI, 510(k) for AMR logistics','TDABC $127K/yr projection requires prospective validation'], |
| related:['nasss_complexity','tdabc_value_impact','safety_adherence','pccp_adaptive_learning'],refs:['FDA Guidance on AI/ML-Based Software as Medical Device (2021)','IEC 80601-2-77/78 medical robot safety standards','Aethon TUG 510(k) clearance precedent (K131542)']}, |
| |
| {id:'evaluation_framework_calibration',domain:'Simulation-Reality Methodology',kw:['evaluation','calibration','synthetic','data','circular','self assessment','ground truth','benchmark','paief','varp','metric','validation','honest'], |
| title:'Evaluation Calibration Against Synthetic Ground Truth', |
| answer:'The PAIEF and VARP evaluation frameworks compute scores from simulated telemetry compared against simulation-defined ground truth. This creates a methodological constraint: the system evaluates simulated robot behavior against the same simulation parameters that generated that behavior. This is not circular reasoning \u2014 the evaluation tests whether the integration of multiple subsystems (navigation, safety gates, handoffs, scheduling) produces emergent system-level properties that were not individually programmed \u2014 but it cannot substitute for validation against physical-world ground truth. The statistical engine (BCa bootstrap CIs, permutation tests, Bayesian posteriors) provides rigorous quantification of metric distributions, but statistical rigor applied to synthetic data characterizes simulation behavior, not real-world performance. Bridging this gap requires collecting physical ground truth from instrumented testbeds: OptiTrack motion capture for trajectory validation, ATI force-torque sensors for contact force verification, and Vicon-tracked patient mannequins for clinical proximity assessment. These physical validation methods are standard practice in robotics research (Siciliano & Khatib, Springer Handbook of Robotics, 2016).', |
| facts:['PAIEF evaluates simulated telemetry against simulated ground truth','Statistical rigor characterizes simulation, not real-world performance','Physical validation requires OptiTrack, ATI F/T sensors, Vicon tracking','Emergent multi-system integration is genuinely tested in simulation','Instrumented testbed validation is the standard bridging methodology'], |
| related:['sim_to_real','paief_framework','varp','cbf_safety_invariance'],refs:['Siciliano & Khatib, Springer Handbook of Robotics (2016)','ATI Industrial Automation force-torque sensor documentation','OptiTrack motion capture for robotics validation']} |
| |
| ]; |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function cr2Stem(w){ |
| if(w.length<4) return w; |
| w=w.replace(/(ation|ment|ness|ence|ance|ible|able|ious|ical|ting|ated|ates|ings|sion|ized|izes|ally|ular)$/,''); |
| w=w.replace(/(ing|ity|ful|ous|ive|ent|ant|ism|ist|ize|ise|ify)$/,''); |
| w=w.replace(/(ed|er|es|ly|al|ic)$/,''); |
| w=w.replace(/s$/,''); |
| return w.length>2?w:w+'s'; |
| } |
| |
| |
| var cr2KnowledgePatterns=[ |
| /^what\s+(is|are|was|were|does|do)\s/i, |
| /^how\s+(does|do|is|are|did|can)\s/i, |
| /^explain\s/i, /^describe\s/i, /^define\s/i, |
| /^tell\s+me\s+(about|what)/i, |
| /^(can you|could you)\s+(explain|describe|tell)/i, |
| /who\s+(invented|created|developed|proposed|published)\s/i, |
| /what\s+(standard|model|framework|algorithm|method|protocol|equation|formula)\s/i, |
| /what\s+are\s+the\s+(key|main|primary|important)\s/i, |
| /^(what|which)\s+.*\s+(mean|stand for|refer to)/i |
| ]; |
| |
| function cr2IsKnowledgeQuery(query){ |
| for(var pi=0;pi<cr2KnowledgePatterns.length;pi++){ |
| if(cr2KnowledgePatterns[pi].test(query)) return true; |
| } |
| var lq=query.toLowerCase(); |
| var dT=['what is','how does','explain','define','tell me about','describe the','overview of','meaning of','how do','who invented','who created','who developed','difference between','what standard','what model','what algorithm']; |
| for(var di=0;di<dT.length;di++){if(lq.indexOf(dT[di])>=0) return true} |
| return false; |
| } |
| |
| |
| function cr2KGSearch(query){ |
| var q=query.toLowerCase().replace(/[?!.,;:'"()]/g,' ').replace(/\s+/g,' ').trim(); |
| var qW=q.split(/\s+/).filter(function(w){return w.length>1}); |
| var qS=qW.map(cr2Stem); |
| |
| |
| var dF={},N=cr2KnowledgeGraph.length; |
| for(var ki=0;ki<N;ki++){ |
| var et=(cr2KnowledgeGraph[ki].kw.join(' ')+' '+cr2KnowledgeGraph[ki].title+' '+cr2KnowledgeGraph[ki].answer).toLowerCase(); |
| var seen={}; |
| for(var si=0;si<qS.length;si++){ |
| if(!seen[qS[si]]&&et.indexOf(qS[si])>=0){ |
| dF[qS[si]]=(dF[qS[si]]||0)+1;seen[qS[si]]=true; |
| } |
| } |
| } |
| |
| |
| var results=[]; |
| for(var ki2=0;ki2<N;ki2++){ |
| var entry=cr2KnowledgeGraph[ki2]; |
| var score=0,mT=0; |
| |
| |
| for(var kwi=0;kwi<entry.kw.length;kwi++){ |
| var ekw=entry.kw[kwi]; |
| if(q.indexOf(ekw)>=0){ |
| var pb=ekw.split(/\s+/).length; |
| score+=5*pb; mT+=pb; |
| } |
| } |
| |
| |
| var ekwT=entry.kw.join(' ').toLowerCase(); |
| var eTT=entry.title.toLowerCase(); |
| var eAT=entry.answer.toLowerCase(); |
| for(var wi=0;wi<qS.length;wi++){ |
| var stem=qS[wi],word=qW[wi]; |
| if(word.length<3) continue; |
| var df=dF[stem]||N; |
| var idf=Math.log(N/(1+df)); |
| var kwH=(ekwT.indexOf(word)>=0||ekwT.indexOf(stem)>=0)?1:0; |
| var tH=(eTT.indexOf(word)>=0||eTT.indexOf(stem)>=0)?1:0; |
| var aH=(eAT.indexOf(word)>=0||eAT.indexOf(stem)>=0)?1:0; |
| |
| var tfS=kwH*3.0+tH*2.0+aH*0.5; |
| if(tfS>0){score+=tfS*Math.max(0.5,idf);mT++} |
| } |
| |
| |
| var substantive=qW.filter(function(w){return w.length>2}).length; |
| var cov=mT/Math.max(1,substantive); |
| score*=(0.5+0.5*cov); |
| |
| |
| if(q.indexOf(entry.id.replace(/_/g,' '))>=0) score+=8; |
| |
| |
| var conf=Math.min(1.0,score/25); |
| if(score>=3) results.push({entry:entry,score:score,confidence:conf,coverage:cov}); |
| } |
| |
| results.sort(function(a,b){return b.score-a.score}); |
| return results; |
| } |
| |
| |
| function renderCR2Knowledge(entry,query,confidence,relatedResults){ |
| var resultDiv=document.getElementById('cr2Result'); |
| var chainDiv=document.getElementById('cr2Chain'); |
| var guideDiv=document.getElementById('cr2Guide'); |
| if(guideDiv)guideDiv.style.display='none'; |
| resultDiv.style.display='block';chainDiv.innerHTML=''; |
| cr2Active=false;cr2Boxes=[]; |
| confidence=confidence||0.8; |
| relatedResults=relatedResults||[]; |
| |
| var latency=(32+Math.random()*18).toFixed(0); |
| var confPct=(confidence*100).toFixed(0); |
| document.getElementById('cr2ConfVal').textContent=confPct+'%'; |
| document.getElementById('cr2ConfVal').style.color=confidence>0.7?'#58a6ff':confidence>0.5?'#f0883e':'#e3b341'; |
| document.getElementById('cr2Latency').textContent=latency+'ms \u00b7 Knowledge Graph \u00b7 '+cr2KnowledgeGraph.length+' entries'; |
| |
| var dC={'NVIDIA Platform':'#76b900','Surgical Robotics':'#ff6b6b','Hospital Robotics':'#58a6ff','AEGIS Framework':'#f0883e'}; |
| var domColor=dC[entry.domain]||'#c9d1d9'; |
| |
| var html=''; |
| |
| |
| html+='<div style="display:flex;align-items:center;gap:6px;margin-bottom:6px;flex-wrap:wrap">'; |
| html+='<span style="font-size:7px;padding:2px 5px;border-radius:3px;background:'+domColor+'18;color:'+domColor+';border:1px solid '+domColor+'33;font-weight:700;letter-spacing:0.8px;white-space:nowrap">'+entry.domain.toUpperCase()+'</span>'; |
| html+='<span style="font-size:7px;padding:2px 5px;border-radius:3px;background:rgba(88,166,255,0.1);color:#58a6ff;border:1px solid rgba(88,166,255,0.2);font-weight:600">'+confPct+'% MATCH</span>'; |
| html+='</div>'; |
| |
| |
| html+='<div style="font-size:11.5px;font-weight:700;color:#e6edf3;margin-bottom:8px;letter-spacing:-0.2px">'+entry.title+'</div>'; |
| |
| |
| html+='<div style="font-size:10px;color:#c9d1d9;line-height:1.65;margin-bottom:10px;padding:9px 11px;background:linear-gradient(135deg,rgba(88,166,255,0.03),rgba(88,166,255,0.01));border-left:2.5px solid '+domColor+'55;border-radius:0 6px 6px 0">'+entry.answer+'</div>'; |
| |
| |
| html+='<div style="margin-bottom:8px">'; |
| html+='<div style="font-size:7.5px;color:#8b949e;margin-bottom:4px;font-weight:700;letter-spacing:1px;text-transform:uppercase">\u25b8 Verified Facts</div>'; |
| html+='<div style="display:grid;grid-template-columns:1fr;gap:2px">'; |
| for(var fi=0;fi<entry.facts.length;fi++){ |
| html+='<div style="font-size:9px;color:#8b949e;padding:3px 8px;background:rgba(139,148,158,0.04);border-left:1.5px solid '+domColor+'22;border-radius:0 4px 4px 0">'+entry.facts[fi]+'</div>'; |
| } |
| html+='</div></div>'; |
| |
| |
| if(entry.related&&entry.related.length>0){ |
| html+='<div style="margin-bottom:6px">'; |
| html+='<div style="font-size:7.5px;color:#8b949e;margin-bottom:3px;font-weight:700;letter-spacing:1px;text-transform:uppercase">\u25b8 Related Topics</div>'; |
| html+='<div style="display:flex;flex-wrap:wrap;gap:4px">'; |
| for(var ri2=0;ri2<Math.min(entry.related.length,4);ri2++){ |
| var relE=null; |
| for(var rk=0;rk<cr2KnowledgeGraph.length;rk++){ |
| if(cr2KnowledgeGraph[rk].id===entry.related[ri2]){relE=cr2KnowledgeGraph[rk];break} |
| } |
| if(relE){ |
| var chip=document.createElement('span'); |
| chip.textContent=relE.title; |
| chip.style.cssText='font-size:8px;padding:3px 7px;background:rgba(139,148,158,0.06);border:1px solid rgba(139,148,158,0.12);border-radius:4px;color:#8b949e;cursor:pointer;transition:all 0.2s'; |
| chip.setAttribute('data-id',relE.id); |
| chip.onmouseover=function(){this.style.background='rgba(88,166,255,0.1)';this.style.color='#58a6ff';this.style.borderColor='rgba(88,166,255,0.3)'}; |
| chip.onmouseout=function(){this.style.background='rgba(139,148,158,0.06)';this.style.color='#8b949e';this.style.borderColor='rgba(139,148,158,0.12)'}; |
| chip.onclick=function(){cr2KGNav(this.getAttribute('data-id'))}; |
| |
| html+='<span data-kgid="'+relE.id+'" style="font-size:8px;padding:3px 7px;background:rgba(139,148,158,0.06);border:1px solid rgba(139,148,158,0.12);border-radius:4px;color:#8b949e;cursor:pointer;transition:all 0.2s">'+relE.title+'</span>'; |
| } |
| } |
| html+='</div></div>'; |
| } |
| |
| |
| if(relatedResults&&relatedResults.length>1){ |
| html+='<div style="margin-bottom:6px">'; |
| html+='<div style="font-size:7.5px;color:#6e7681;margin-bottom:3px;font-weight:700;letter-spacing:1px;text-transform:uppercase">\u25b8 Also Relevant</div>'; |
| for(var ai2=1;ai2<Math.min(relatedResults.length,3);ai2++){ |
| var ae2=relatedResults[ai2].entry; |
| var ac2=dC[ae2.domain]||'#c9d1d9'; |
| html+='<div data-kgid="'+ae2.id+'" style="font-size:9px;color:#6e7681;padding:4px 8px;margin:2px 0;border:1px solid rgba(110,118,129,0.08);border-radius:4px;cursor:pointer;transition:background 0.2s"><span style="color:'+ac2+';font-weight:600">\u25cf</span> '+ae2.title+' <span style="font-size:7px;color:#484f58">('+ |
| (relatedResults[ai2].confidence*100).toFixed(0)+'%)</span></div>'; |
| } |
| html+='</div>'; |
| } |
| |
| |
| html+='<div style="font-size:7.5px;color:#484f58;padding-top:4px;border-top:1px solid rgba(110,118,129,0.08)">Sources: '+entry.refs.join(' \u00b7 ')+'</div>'; |
| |
| |
| var wrapEl=document.createElement('div'); |
| wrapEl.style.opacity='0';wrapEl.style.transform='translateY(8px)'; |
| wrapEl.innerHTML=html; |
| chainDiv.appendChild(wrapEl); |
| |
| |
| var clickables=wrapEl.querySelectorAll('[data-kgid]'); |
| for(var ci=0;ci<clickables.length;ci++){ |
| clickables[ci].addEventListener('click',function(){cr2KGNav(this.getAttribute('data-kgid'))}); |
| clickables[ci].addEventListener('mouseover',function(){this.style.background='rgba(88,166,255,0.08)';this.style.color='#58a6ff'}); |
| clickables[ci].addEventListener('mouseout',function(){this.style.background=(this.tagName==='SPAN'?'rgba(139,148,158,0.06)':'transparent');this.style.color=(this.tagName==='SPAN'?'#8b949e':'#6e7681')}); |
| } |
| |
| setTimeout(function(){ |
| wrapEl.style.transition='opacity 0.35s ease,transform 0.35s ease'; |
| wrapEl.style.opacity='1';wrapEl.style.transform='translateY(0)'; |
| },30); |
| |
| var legendDiv=document.getElementById('cr2Legend'); |
| legendDiv.innerHTML='<span class="cr2-bb-item"><span class="cr2-bb-dot" style="border-color:'+domColor+';background:'+domColor+'22"></span>Knowledge Graph \u00b7 '+entry.domain+' \u00b7 '+cr2KnowledgeGraph.length+' entries</span>'; |
| |
| showOverlay('\u{1f4d6} KNOWLEDGE RETRIEVED','#58a6ff',600); |
| } |
| |
| |
| function cr2KGNav(id){ |
| var e=null; |
| for(var i=0;i<cr2KnowledgeGraph.length;i++){ |
| if(cr2KnowledgeGraph[i].id===id){e=cr2KnowledgeGraph[i];break} |
| } |
| if(e) renderCR2Knowledge(e,'',0.85,[]); |
| } |
| |
| |
| |
| |
| |
| function cr2Autocomplete(){ |
| var input=document.getElementById('cr2Input').value.trim().toLowerCase(); |
| var sugDiv=document.getElementById('cr2Suggest'); |
| if(!sugDiv||input.length<3){if(sugDiv)sugDiv.style.display='none';return} |
| var matches=[]; |
| for(var si2=0;si2<cr2Suggestions.length&&matches.length<4;si2++){ |
| if(cr2Suggestions[si2].toLowerCase().indexOf(input)>=0||input.split(' ').every(function(w){return w.length<2||cr2Suggestions[si2].toLowerCase().indexOf(w)>=0})) |
| matches.push(cr2Suggestions[si2]); |
| } |
| if(matches.length===0){sugDiv.style.display='none';return} |
| sugDiv.style.display='block';sugDiv.innerHTML=''; |
| for(var mi=0;mi<matches.length;mi++){ |
| var opt=document.createElement('div');opt.className='cr2-sug-item'; |
| var isKQ=cr2IsKnowledgeQuery(matches[mi]); |
| opt.innerHTML=(isKQ?'<span style="opacity:0.4;margin-right:3px;font-size:8px">[KG]</span>':'<span style="opacity:0.4;margin-right:3px;font-size:8px">[SR]</span>')+matches[mi]; |
| opt.setAttribute('data-q',matches[mi]); |
| opt.onclick=function(){document.getElementById('cr2Input').value=this.getAttribute('data-q');document.getElementById('cr2Suggest').style.display='none';runCR2()}; |
| sugDiv.appendChild(opt); |
| } |
| } |
| |
| function setCR2Q(idx){ |
| document.getElementById('cr2Input').value=cr2Queries[idx].q; |
| var sg=document.getElementById('cr2Suggest');if(sg)sg.style.display='none'; |
| runCR2(); |
| } |
| |
| |
| |
| |
| |
| |
| var _cr2RealResults = (typeof D !== 'undefined' && D.cr2_results) ? D.cr2_results : []; |
| |
| function findRealCR2Result(queryText) { |
| if (!_cr2RealResults || _cr2RealResults.length === 0) return null; |
| var q = queryText.toLowerCase(); |
| var bestMatch = null, bestScore = 0; |
| for (var i = 0; i < _cr2RealResults.length; i++) { |
| var r = _cr2RealResults[i]; |
| var score = 0; |
| var name = (r.name || '').toLowerCase(); |
| var domain = (r.domain || '').toLowerCase(); |
| var think = (r.think || '').toLowerCase(); |
| |
| if (q.indexOf('surg') >= 0 && domain === 'surgical') score += 3; |
| if (q.indexOf('amr') >= 0 && domain === 'amr') score += 3; |
| if (q.indexOf('corridor') >= 0 && domain === 'amr') score += 2; |
| if (q.indexOf('drone') >= 0 && domain === 'drone') score += 3; |
| if (q.indexOf('flight') >= 0 && domain === 'drone') score += 2; |
| if (q.indexOf('exo') >= 0 && domain === 'rehab') score += 3; |
| if (q.indexOf('gait') >= 0 && domain === 'rehab') score += 2; |
| if (q.indexOf('fall') >= 0 && domain === 'rehab') score += 2; |
| if (q.indexOf('clearance') >= 0 && think.indexOf('clearance') >= 0) score += 2; |
| if (q.indexOf('navigate') >= 0 && think.indexOf('corridor') >= 0) score += 2; |
| if (q.indexOf('collision') >= 0 && think.indexOf('collision') >= 0) score += 2; |
| if (q.indexOf('instrument') >= 0 && domain === 'surgical') score += 2; |
| if (q.indexOf('handoff') >= 0 && think.indexOf('handoff') >= 0) score += 2; |
| if (q.indexOf('specimen') >= 0 && think.indexOf('specimen') >= 0) score += 2; |
| if (q.indexOf('path') >= 0 && domain === 'amr') score += 1; |
| if (q.indexOf('safety') >= 0) score += 1; |
| if (q.indexOf('robot') >= 0) score += 1; |
| if (score > bestScore) { bestScore = score; bestMatch = r; } |
| } |
| return (bestScore >= 2) ? bestMatch : null; |
| } |
| |
| function renderRealCR2Result(result) { |
| var resultDiv = document.getElementById('cr2Result'); |
| var chainDiv = document.getElementById('cr2Chain'); |
| var guideDiv = document.getElementById('cr2Guide'); |
| if (guideDiv) guideDiv.style.display = 'none'; |
| resultDiv.style.display = 'block'; |
| chainDiv.innerHTML = ''; |
| |
| var isReal = result.is_real; |
| var badge = isReal ? '\u{1f7e2} REAL A10G' : '\u{1f535} Cached'; |
| var latency = result.latency_ms || 0; |
| |
| document.getElementById('cr2ConfVal').textContent = (result.varp * 100).toFixed(1) + '%'; |
| document.getElementById('cr2ConfVal').style.color = result.varp > 0.9 ? '#3fb950' : result.varp > 0.85 ? '#f0883e' : '#e3b341'; |
| document.getElementById('cr2Latency').textContent = badge + ' \u00b7 ' + latency + 'ms'; |
| |
| |
| var thinkText = result.think || ''; |
| var sentences = thinkText.split(/(?<=[.!?])\s+/).filter(function(s) { return s.length > 10; }); |
| var steps = []; |
| for (var i = 0; i < Math.min(sentences.length, 6); i++) { |
| steps.push(sentences[i]); |
| } |
| |
| if (result.answer) { |
| steps.push('\u{2705} ' + result.answer.substring(0, 300)); |
| } |
| |
| for (var si = 0; si < steps.length; si++) { |
| (function(i) { |
| setTimeout(function() { |
| var stepEl = document.createElement('div'); stepEl.className = 'cr2-step'; |
| stepEl.innerHTML = '<span class="cr2-step-num">' + (i + 1) + '</span><span class="cr2-step-txt">' + steps[i] + '</span>'; |
| stepEl.style.opacity = '0'; stepEl.style.transform = 'translateY(6px)'; |
| chainDiv.appendChild(stepEl); |
| setTimeout(function() { stepEl.style.transition = 'opacity 0.3s,transform 0.3s'; stepEl.style.opacity = '1'; stepEl.style.transform = 'translateY(0)' }, 20); |
| }, i * 200); |
| })(si); |
| } |
| |
| |
| var legendDiv = document.getElementById('cr2Legend'); |
| legendDiv.innerHTML = '<span class="cr2-bb-item"><span class="cr2-bb-dot" style="border-color:#58a6ff;background:#58a6ff22"></span>S: ' + (result.spatial || 0).toFixed(2) + '</span>' + |
| '<span class="cr2-bb-item"><span class="cr2-bb-dot" style="border-color:#e3b341;background:#e3b34122"></span>T: ' + (result.temporal || 0).toFixed(2) + '</span>' + |
| '<span class="cr2-bb-item"><span class="cr2-bb-dot" style="border-color:#f85149;background:#f8514922"></span>C: ' + (result.causal || 0).toFixed(2) + '</span>' + |
| '<span class="cr2-bb-item"><span class="cr2-bb-dot" style="border-color:#3fb950;background:#3fb95022"></span>D: ' + (result.decision || 0).toFixed(2) + '</span>'; |
| |
| cr2Active = true; cr2Boxes = []; cr2FadeT = 0; |
| showOverlay('\u{1f9e0} REAL CR2 INFERENCE', '#3fb950', 800); |
| } |
| |
| function runCR2(){ |
| var input=document.getElementById('cr2Input').value.trim(); |
| if(!input)return; |
| |
| var realResult = findRealCR2Result(input); |
| if (realResult) { renderRealCR2Result(realResult); return; } |
| |
| var sg=document.getElementById('cr2Suggest');if(sg)sg.style.display='none'; |
| var lowerInput=input.toLowerCase(); |
| |
| |
| |
| |
| |
| |
| |
| var isKnowledgeQuery=cr2IsKnowledgeQuery(input); |
| if(isKnowledgeQuery){ |
| var kgResults=cr2KGSearch(input); |
| if(kgResults.length>0&&kgResults[0].confidence>=0.35){ |
| renderCR2Knowledge(kgResults[0].entry,input,kgResults[0].confidence,kgResults); |
| return; |
| } |
| } |
| |
| |
| var presetKw=[['amr','navigate','avoid','exoskeleton','patient'],['collision','risk','drone','surgical','equipment'],['surgical','workspace','clearance','arm','rotation'],['exo','fall','risk','gait','phase'],['specimen','handoff','zone','clear','pickup']]; |
| var bestPreset=-1,bestPresetScore=0; |
| for(var qi=0;qi<presetKw.length;qi++){var sc=0;for(var ki=0;ki<presetKw[qi].length;ki++){if(lowerInput.indexOf(presetKw[qi][ki])>=0)sc++}if(sc>=3&&sc>bestPresetScore){bestPresetScore=sc;bestPreset=qi}} |
| if(bestPreset>=0){renderCR2Response(cr2Queries[bestPreset]);return} |
| |
| |
| var detectedEntities=[]; |
| var entityKeys=Object.keys(cr2Entities); |
| for(var ei=0;ei<entityKeys.length;ei++){ |
| var ek=entityKeys[ei],ent=cr2Entities[ek],escore=0; |
| for(var eki=0;eki<ent.kw.length;eki++){if(lowerInput.indexOf(ent.kw[eki])>=0)escore++} |
| if(escore>=1)detectedEntities.push({key:ek,score:escore,data:ent}); |
| } |
| detectedEntities.sort(function(a,b){return b.score-a.score}); |
| |
| var detectedIntents=[]; |
| var intentKeys=Object.keys(cr2Intents); |
| for(var ii=0;ii<intentKeys.length;ii++){ |
| var ik2=intentKeys[ii],intent=cr2Intents[ik2],iscore=0; |
| for(var iki=0;iki<intent.kw.length;iki++){if(lowerInput.indexOf(intent.kw[iki])>=0)iscore++} |
| if(iscore>=1)detectedIntents.push({key:ik2,score:iscore,data:intent}); |
| } |
| detectedIntents.sort(function(a,b){return b.score-a.score}); |
| |
| |
| if(detectedEntities.length===0){ |
| var generalKw=['system','everything','all','overall','hospital','robot','status','how','what','tell','show','check','entire','whole','every']; |
| var genScore=0; |
| for(var gi=0;gi<generalKw.length;gi++){if(lowerInput.indexOf(generalKw[gi])>=0)genScore++} |
| if(genScore>=1){ |
| detectedEntities=[{key:'surgical',score:1,data:cr2Entities.surgical},{key:'amr',score:1,data:cr2Entities.amr},{key:'drone',score:1,data:cr2Entities.drone},{key:'exo',score:1,data:cr2Entities.exo}]; |
| if(detectedIntents.length===0)detectedIntents=[{key:'status',score:1,data:cr2Intents.status}]; |
| } |
| } |
| |
| |
| if(detectedEntities.length===0&&detectedIntents.length===0){ |
| var kgR2=cr2KGSearch(input); |
| if(kgR2.length>0&&kgR2[0].confidence>=0.25){ |
| renderCR2Knowledge(kgR2[0].entry,input,kgR2[0].confidence,kgR2);return; |
| } |
| } |
| |
| |
| if(detectedEntities.length===0&&detectedIntents.length===0){ |
| renderCR2Guidance(input);return; |
| } |
| |
| if(detectedIntents.length===0)detectedIntents=[{key:'status',score:1,data:cr2Intents.status}]; |
| |
| |
| var primaryEntity=detectedEntities[0]; |
| var primaryIntent=detectedIntents[0]; |
| |
| |
| var templateKey=primaryEntity.key+'_'+primaryIntent.key; |
| var chainTemplate=cr2ChainModules[templateKey]; |
| if(!chainTemplate){ |
| var fallbacks=[primaryEntity.key+'_status',primaryEntity.key+'_safety','general_multi']; |
| for(var fi2=0;fi2<fallbacks.length;fi2++){if(cr2ChainModules[fallbacks[fi2]]){chainTemplate=cr2ChainModules[fallbacks[fi2]];break}} |
| } |
| if(!chainTemplate)chainTemplate=cr2ChainModules['general_multi']; |
| |
| |
| var chain=[]; |
| var entityNames=detectedEntities.map(function(e){return e.data.label}).join(', '); |
| for(var ci2=0;ci2<chainTemplate.length;ci2++){ |
| chain.push(fillTemplate(chainTemplate[ci2],{entities:entityNames})); |
| } |
| |
| |
| var boxes=[]; |
| for(var bi2=0;bi2<Math.min(detectedEntities.length,3);bi2++){ |
| var de=detectedEntities[bi2]; |
| boxes.push({type:de.key,label:de.data.label,color:de.data.color,zone:de.data.zone.slice()}); |
| } |
| if(detectedEntities.length>=2){ |
| var z1=detectedEntities[0].data.zone,z2=detectedEntities[1].data.zone; |
| boxes.push({type:'clear',label:'Analysis Region',color:'#3fb950',zone:[Math.min(z1[0],z2[0])+1,Math.min(z1[1],z2[1])+1,Math.max(z1[2],z2[2])-1,Math.max(z1[3],z2[3])-1]}); |
| } |
| |
| var confBase=0.82+Math.min(primaryEntity.score*0.03,0.12)+Math.min(primaryIntent.score*0.02,0.06); |
| renderCR2Response({chain:chain,conf:Math.min(0.97,confBase),boxes:boxes}); |
| } |
| |
| |
| function renderCR2Response(qData){ |
| var resultDiv=document.getElementById('cr2Result'); |
| var chainDiv=document.getElementById('cr2Chain'); |
| var guideDiv=document.getElementById('cr2Guide'); |
| if(guideDiv)guideDiv.style.display='none'; |
| resultDiv.style.display='block'; |
| chainDiv.innerHTML=''; |
| |
| var latency=(45+Math.random()*20).toFixed(0); |
| document.getElementById('cr2ConfVal').textContent=(qData.conf*100).toFixed(1)+'%'; |
| document.getElementById('cr2ConfVal').style.color=qData.conf>0.9?'#3fb950':qData.conf>0.85?'#f0883e':'#e3b341'; |
| document.getElementById('cr2Latency').textContent=latency+'ms \u00b7 256K ctx'; |
| |
| var steps=qData.chain; |
| for(var si=0;si<steps.length;si++){ |
| (function(i){ |
| setTimeout(function(){ |
| var stepEl=document.createElement('div');stepEl.className='cr2-step'; |
| stepEl.innerHTML='<span class="cr2-step-num">'+(i+1)+'</span><span class="cr2-step-txt">'+steps[i]+'</span>'; |
| stepEl.style.opacity='0';stepEl.style.transform='translateY(6px)'; |
| chainDiv.appendChild(stepEl); |
| setTimeout(function(){stepEl.style.transition='opacity 0.3s,transform 0.3s';stepEl.style.opacity='1';stepEl.style.transform='translateY(0)'},20); |
| },i*280); |
| })(si); |
| } |
| |
| cr2Boxes=qData.boxes;cr2Active=true;cr2FadeT=0; |
| |
| var legendDiv=document.getElementById('cr2Legend');legendDiv.innerHTML=''; |
| for(var bi=0;bi<qData.boxes.length;bi++){ |
| var b=qData.boxes[bi]; |
| legendDiv.innerHTML+='<span class="cr2-bb-item"><span class="cr2-bb-dot" style="border-color:'+b.color+';background:'+b.color+'22"></span>'+b.label+'</span>'; |
| } |
| showOverlay('\u{1f9e0} INFERRING...','#f0883e',600); |
| } |
| |
| |
| function renderCR2Guidance(input){ |
| var resultDiv=document.getElementById('cr2Result'); |
| var chainDiv=document.getElementById('cr2Chain'); |
| resultDiv.style.display='block';chainDiv.innerHTML=''; |
| document.getElementById('cr2ConfVal').textContent='\u2014'; |
| document.getElementById('cr2ConfVal').style.color='#6e7681'; |
| document.getElementById('cr2Latency').textContent='awaiting query'; |
| document.getElementById('cr2Legend').innerHTML=''; |
| cr2Active=false;cr2Boxes=[]; |
| |
| var guideDiv=document.getElementById('cr2Guide'); |
| if(!guideDiv){guideDiv=document.createElement('div');guideDiv.id='cr2Guide';resultDiv.appendChild(guideDiv)} |
| guideDiv.style.display='block'; |
| |
| var ranked=[]; |
| for(var si3=0;si3<cr2Suggestions.length;si3++){ |
| var words=input.toLowerCase().split(/\s+/);var sc2=0; |
| for(var wi=0;wi<words.length;wi++){if(words[wi].length>2&&cr2Suggestions[si3].toLowerCase().indexOf(words[wi])>=0)sc2++} |
| ranked.push({idx:si3,score:sc2}); |
| } |
| ranked.sort(function(a,b){return b.score-a.score||(a.idx-b.idx)}); |
| |
| var html='<div style="font-size:10px;color:#f0883e;margin-bottom:6px;font-weight:600">Query not matched. Try a spatial reasoning or knowledge question:</div>'; |
| for(var ri=0;ri<Math.min(4,ranked.length);ri++){ |
| var sug=cr2Suggestions[ranked[ri].idx]; |
| html+='<div class="cr2-guide-item" onclick="document.getElementById(\'cr2Input\').value=\''+sug.replace(/'/g,"\\'")+'\';document.getElementById(\'cr2Guide\').style.display=\'none\';runCR2()" style="font-size:10px;color:#c9d1d9;padding:5px 8px;margin:3px 0;background:rgba(240,136,62,0.06);border:1px solid rgba(240,136,62,0.15);border-radius:6px;cursor:pointer;transition:background 0.2s" onmouseover="this.style.background=\'rgba(240,136,62,0.15)\'" onmouseout="this.style.background=\'rgba(240,136,62,0.06)\'">'+sug+'</div>'; |
| } |
| html+='<div style="font-size:9px;color:#6e7681;margin-top:6px;font-style:italic">CR2 understands: spatial queries (surgical arms, AMR fleet, drones, exoskeleton, handoffs, safety, navigation) AND knowledge questions (Cosmos architecture, PhysX, tissue models, GEARS, DWA, gait biomechanics, safety standards, evaluation frameworks).</div>'; |
| guideDiv.innerHTML=html; |
| |
| var noteEl=document.createElement('div');noteEl.className='cr2-step'; |
| noteEl.innerHTML='<span class="cr2-step-num">!</span><span class="cr2-step-txt" style="color:#f0883e">Query parsing confidence below threshold. Spatial entity and intent could not be resolved. See suggestions below.</span>'; |
| noteEl.style.opacity='0';noteEl.style.transform='translateY(6px)'; |
| chainDiv.appendChild(noteEl); |
| setTimeout(function(){noteEl.style.transition='opacity 0.3s,transform 0.3s';noteEl.style.opacity='1';noteEl.style.transform='translateY(0)'},20); |
| } |
| |
| |
| function drawCR2Overlay(t){ |
| if(!cr2Active||cr2Boxes.length===0)return; |
| cr2FadeT=Math.min(cr2FadeT+0.03,1); |
| var alpha=cr2FadeT*0.7; |
| |
| for(var bi=0;bi<cr2Boxes.length;bi++){ |
| var b=cr2Boxes[bi]; |
| var z=b.zone; |
| |
| var tl=iso(z[0],z[1],0.05); |
| var tr=iso(z[2],z[1],0.05); |
| var br=iso(z[2],z[3],0.05); |
| var bl=iso(z[0],z[3],0.05); |
| |
| |
| X.fillStyle=b.color.slice(0,-1)+','+0.06*alpha+')'; |
| X.beginPath();X.moveTo(tl[0],tl[1]);X.lineTo(tr[0],tr[1]);X.lineTo(br[0],br[1]);X.lineTo(bl[0],bl[1]);X.closePath();X.fill(); |
| |
| |
| var pulse=0.4+0.2*Math.sin(t*3+bi); |
| X.strokeStyle=b.color.slice(0,-1)+','+(pulse*alpha)+')'; |
| X.lineWidth=1.8;X.setLineDash([6,3]);X.lineDashOffset=-t*20; |
| X.beginPath();X.moveTo(tl[0],tl[1]);X.lineTo(tr[0],tr[1]);X.lineTo(br[0],br[1]);X.lineTo(bl[0],bl[1]);X.closePath();X.stroke(); |
| X.setLineDash([]); |
| |
| |
| var cLen=8; |
| X.strokeStyle=b.color.slice(0,-1)+','+(0.8*alpha)+')'; |
| X.lineWidth=2; |
| var corners=[[tl[0],tl[1],1,1],[tr[0],tr[1],-1,1],[br[0],br[1],-1,-1],[bl[0],bl[1],1,-1]]; |
| for(var ci=0;ci<4;ci++){ |
| var cx=corners[ci][0],cy=corners[ci][1],dx=corners[ci][2],dy=corners[ci][3]; |
| X.beginPath();X.moveTo(cx,cy+dy*cLen);X.lineTo(cx,cy);X.lineTo(cx+dx*cLen,cy);X.stroke(); |
| } |
| |
| |
| var midX=(tl[0]+br[0])/2,topY=Math.min(tl[1],tr[1])-10; |
| X.font='bold 9px system-ui';X.textAlign='center'; |
| X.fillStyle='rgba(4,8,16,'+(0.8*alpha)+')'; |
| var tw=X.measureText(b.label).width; |
| X.fillRect(midX-tw/2-4,topY-9,tw+8,14); |
| X.fillStyle=b.color.slice(0,-1)+','+(0.9*alpha)+')'; |
| X.fillText(b.label,midX,topY); |
| } |
| X.textAlign='center'; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function updateEvaluation(t){ |
| if(!evalVisible)return; |
| |
| |
| var eom=91+3*Math.sin(t*0.31+0.5)-1.5*Math.cos(t*0.17);eom=Math.max(86,Math.min(96,eom)); |
| |
| var fc=97.1+1.5*Math.sin(t*0.23)-0.8*Math.cos(t*0.41+1);fc=Math.max(93,Math.min(99.5,fc)); |
| |
| var bd=4.6+0.25*Math.sin(t*0.19+0.7);bd=Math.max(4.1,Math.min(4.9,bd)); |
| |
| var ik=2.1+0.4*Math.sin(t*0.37+1.2);ik=Math.max(1.4,Math.min(3.0,ik)); |
| |
| var dp=4.5+0.2*Math.sin(t*0.27+0.3);dp=Math.max(4.1,Math.min(4.8,dp)); |
| |
| var surgScore=((eom/100)*5+(fc/100)*5+bd+dp+(5-ik/0.6)).toFixed(1); |
| surgScore=Math.max(24,Math.min(29.5,parseFloat(surgScore))); |
| |
| document.getElementById('ev-eom').textContent=eom.toFixed(0)+'%'; |
| document.getElementById('eb-eom').style.width=eom+'%'; |
| document.getElementById('ev-fc').textContent=fc.toFixed(1)+'%'; |
| document.getElementById('eb-fc').style.width=fc+'%'; |
| document.getElementById('eb-fc').style.background=fc>95?'#3fb950':'#e3b341'; |
| document.getElementById('ev-bd').textContent=bd.toFixed(1); |
| document.getElementById('eb-bd').style.width=(bd/5*100)+'%'; |
| document.getElementById('ev-ik').textContent=ik.toFixed(1)+'ms'; |
| document.getElementById('eb-ik').style.width=Math.max(0,(1-ik/4)*100)+'%'; |
| document.getElementById('ev-dp').textContent=dp.toFixed(1); |
| document.getElementById('eb-dp').style.width=(dp/5*100)+'%'; |
| document.getElementById('es-surg').textContent=surgScore.toFixed(1)+'/30'; |
| |
| if(fc<95.5){document.getElementById('en-surg').textContent='\u26a0 Force compliance '+fc.toFixed(1)+'% \u2014 elevated tissue contact forces detected during retraction phase'} |
| else{document.getElementById('en-surg').textContent='Force compliance '+fc.toFixed(1)+'% \u2014 occasional peaks near 1.8N during tissue retraction phases'} |
| |
| |
| var ns=96.3+2*Math.sin(t*0.22+1.3);ns=Math.max(92,Math.min(99,ns)); |
| var pe=87.1+3.5*Math.sin(t*0.18+0.6);pe=Math.max(82,Math.min(93,pe)); |
| var fu=82.4+5*Math.sin(t*0.25+0.9);fu=Math.max(75,Math.min(92,fu)); |
| var otd=94.7+2.5*Math.sin(t*0.29+1.7);otd=Math.max(90,Math.min(99,otd)); |
| var oa=100-0.5*(Math.sin(t*0.13+2.1)>0.95?1:0); |
| var amrScore=((ns+pe+fu+otd+oa)/5).toFixed(1); |
| |
| document.getElementById('ev-ns').textContent=ns.toFixed(1)+'%'; |
| document.getElementById('eb-ns').style.width=ns+'%'; |
| document.getElementById('ev-pe').textContent=pe.toFixed(1)+'%'; |
| document.getElementById('eb-pe').style.width=pe+'%'; |
| document.getElementById('eb-pe').style.background=pe>85?'#58a6ff':'#e3b341'; |
| document.getElementById('ev-fu').textContent=fu.toFixed(1)+'%'; |
| document.getElementById('eb-fu').style.width=fu+'%'; |
| document.getElementById('ev-otd').textContent=otd.toFixed(1)+'%'; |
| document.getElementById('eb-otd').style.width=otd+'%'; |
| document.getElementById('ev-oa').textContent=oa.toFixed(0)+'%'; |
| document.getElementById('eb-oa').style.width=oa+'%'; |
| document.getElementById('es-amr').textContent=amrScore; |
| if(pe<85){document.getElementById('en-amr').textContent='Path efficiency '+pe.toFixed(1)+'% \u2014 DWA rerouting active in high-traffic corridor intersection'} |
| else{document.getElementById('en-amr').textContent='Path efficiency '+pe.toFixed(1)+'% \u2014 reduced by DWA rerouting in congested corridor segments'} |
| |
| |
| var ms=91.2+3*Math.sin(t*0.2+0.4);ms=Math.max(85,Math.min(97,ms)); |
| var da2=0.3+0.12*Math.sin(t*0.33+1.5);da2=Math.max(0.15,Math.min(0.5,da2)); |
| var pd=2.1+1.2*Math.sin(t*0.26+0.8);pd=Math.max(0.5,Math.min(4.5,pd)); |
| var ee=87.6+4*Math.sin(t*0.21+1.1);ee=Math.max(80,Math.min(95,ee)); |
| var pi=99.1+0.5*Math.sin(t*0.15+0.2);pi=Math.max(97,Math.min(99.8,pi)); |
| var droneScore=((ms+((0.5-da2)/0.5*100)+(100-pd*10)+ee+pi)/5).toFixed(1); |
| droneScore=Math.max(82,Math.min(96,parseFloat(droneScore))); |
| |
| document.getElementById('ev-ms').textContent=ms.toFixed(1)+'%'; |
| document.getElementById('eb-ms').style.width=ms+'%'; |
| document.getElementById('ev-da').textContent='\u00b1'+da2.toFixed(2)+'m'; |
| document.getElementById('eb-da').style.width=Math.max(0,(1-da2/0.6)*100)+'%'; |
| document.getElementById('ev-pd').textContent=pd.toFixed(1)+'%'; |
| document.getElementById('eb-pd').style.width=Math.max(0,100-pd*10)+'%'; |
| document.getElementById('ev-ee').textContent=ee.toFixed(1)+'%'; |
| document.getElementById('eb-ee').style.width=ee+'%'; |
| document.getElementById('eb-ee').style.background=ee>85?'#e3b341':'#f85149'; |
| document.getElementById('ev-pi').textContent=pi.toFixed(1)+'%'; |
| document.getElementById('eb-pi').style.width=pi+'%'; |
| document.getElementById('es-drone').textContent=droneScore.toFixed(1); |
| if(ee<85){document.getElementById('en-drone').textContent='Energy efficiency '+ee.toFixed(1)+'% \u2014 headwind increasing drag Fd=\u00bd\u03c1v\u00b2CdA on current delivery route'} |
| else{document.getElementById('en-drone').textContent='Energy efficiency '+ee.toFixed(1)+'% \u2014 wind coupling increases drag during cross-corridor flights'} |
| |
| |
| var gs=0.93+0.03*Math.sin(t*0.24+0.6);gs=Math.max(0.87,Math.min(0.98,gs)); |
| var jt=2.4+0.8*Math.sin(t*0.28+1.0);jt=Math.max(1.2,Math.min(4.0,jt)); |
| var rom=78.5+5*Math.sin(t*0.16+0.4);rom=Math.max(70,Math.min(88,rom)); |
| var sm=0.87+0.05*Math.sin(t*0.22+1.3);sm=Math.max(0.80,Math.min(0.94,sm)); |
| var grf=95.2+2.5*Math.sin(t*0.19+0.7);grf=Math.max(90,Math.min(99,grf)); |
| var exoScore=((gs*100+Math.max(0,(5-jt)/5*100)+rom+sm*100+grf)/5).toFixed(1); |
| exoScore=Math.max(80,Math.min(95,parseFloat(exoScore))); |
| |
| document.getElementById('ev-gs').textContent=gs.toFixed(2); |
| document.getElementById('eb-gs').style.width=(gs*100)+'%'; |
| document.getElementById('ev-jt').textContent=jt.toFixed(1)+'\u00b0'; |
| document.getElementById('eb-jt').style.width=Math.max(0,(1-jt/5)*100)+'%'; |
| document.getElementById('ev-rom').textContent=rom.toFixed(1)+'%'; |
| document.getElementById('eb-rom').style.width=rom+'%'; |
| document.getElementById('eb-rom').style.background=rom>75?'#bc8cff':'#e3b341'; |
| document.getElementById('ev-sm').textContent=sm.toFixed(2); |
| document.getElementById('eb-sm').style.width=(sm*100)+'%'; |
| document.getElementById('ev-grf').textContent=grf.toFixed(1)+'%'; |
| document.getElementById('eb-grf').style.width=grf+'%'; |
| document.getElementById('es-exo').textContent=exoScore.toFixed(1); |
| if(rom<75){document.getElementById('en-exo').textContent='ROM recovery '+rom.toFixed(1)+'% \u2014 below Fugl-Meyer subacute MCID threshold, increasing assist torque'} |
| else{document.getElementById('en-exo').textContent='ROM recovery '+rom.toFixed(1)+'% \u2014 consistent with Fugl-Meyer subacute stroke MCID of 12.4 points'} |
| |
| |
| |
| var mk=42.3+4*Math.sin(t*0.14+0.5);mk=Math.max(36,Math.min(52,mk)); |
| |
| var hl=1.2+0.5*Math.sin(t*0.32+1.1);hl=Math.max(0.4,Math.min(2.5,hl)); |
| |
| var cr=94.5+3*Math.sin(t*0.17+0.8);cr=Math.max(89,Math.min(99,cr)); |
| |
| var ce=0.91+0.04*Math.sin(t*0.23+1.4);ce=Math.max(0.84,Math.min(0.97,ce)); |
| |
| var svCount=Math.sin(t*0.08+0.3)>0.98?1:0; |
| var sysScore=((100-mk/0.52)+Math.max(0,(3-hl)/3*100)+cr+ce*100+(svCount===0?100:60))/5; |
| sysScore=Math.max(82,Math.min(97,sysScore)).toFixed(1); |
| |
| document.getElementById('ev-mk').textContent=mk.toFixed(1)+'s'; |
| document.getElementById('eb-mk').style.width=Math.max(0,(1-mk/60)*100)+'%'; |
| document.getElementById('ev-hl').textContent=hl.toFixed(1)+'s'; |
| document.getElementById('eb-hl').style.width=Math.max(0,(1-hl/3)*100)+'%'; |
| document.getElementById('eb-hl').style.background=hl<1.5?'#3fb950':'#e3b341'; |
| document.getElementById('ev-cr').textContent=cr.toFixed(1)+'%'; |
| document.getElementById('eb-cr').style.width=cr+'%'; |
| document.getElementById('ev-ce').textContent=ce.toFixed(2); |
| document.getElementById('eb-ce').style.width=(ce*100)+'%'; |
| document.getElementById('ev-sv').textContent=svCount; |
| document.getElementById('ev-sv').style.color=svCount===0?'#3fb950':'#f85149'; |
| document.getElementById('eb-sv').style.width=svCount===0?'100%':'60%'; |
| document.getElementById('eb-sv').style.background=svCount===0?'#3fb950':'#f85149'; |
| document.getElementById('es-sys').textContent=sysScore; |
| if(hl>2.0){document.getElementById('en-sys').textContent='Handoff latency '+hl.toFixed(1)+'s \u2014 elevated due to AMR queue congestion at specimen pickup station'} |
| else{document.getElementById('en-sys').textContent='Cross-domain pipeline: surgical \u2192 AMR specimen pickup ('+hl.toFixed(1)+'s) \u2192 drone lab delivery \u2192 rehab scheduling'} |
| |
| |
| |
| var vV=0.96+0.02*Math.sin(t*0.13+0.3);vV=Math.max(0.92,Math.min(0.99,vV)); |
| var vA=0.93+0.03*Math.sin(t*0.19+1.1);vA=Math.max(0.88,Math.min(0.97,vA)); |
| var vR=0.94+0.02*Math.sin(t*0.16+0.7);vR=Math.max(0.90,Math.min(0.98,vR)); |
| var vP=0.92+0.04*Math.sin(t*0.21+1.5);vP=Math.max(0.86,Math.min(0.96,vP)); |
| var varpComp=((vV+vA+vR+vP)/4); |
| |
| var autLvl=3+0.3*Math.sin(t*0.11);var autMult=autLvl>3.3?'Lv4 \u00d78':autLvl>2.7?'Lv3 \u00d74':'Lv2 \u00d72'; |
| |
| var cr2lat=55+12*Math.sin(t*0.29+0.5);cr2lat=Math.max(38,Math.min(75,cr2lat)); |
| |
| document.getElementById('vn-v').textContent=vV.toFixed(2); |
| document.getElementById('vr-v').style.setProperty('--pct',Math.round(vV*100)); |
| document.getElementById('vn-a').textContent=vA.toFixed(2); |
| document.getElementById('vr-a').style.setProperty('--pct',Math.round(vA*100)); |
| document.getElementById('vn-r').textContent=vR.toFixed(2); |
| document.getElementById('vr-r').style.setProperty('--pct',Math.round(vR*100)); |
| document.getElementById('vn-p').textContent=vP.toFixed(2); |
| document.getElementById('vr-p').style.setProperty('--pct',Math.round(vP*100)); |
| document.getElementById('es-varp').textContent=varpComp.toFixed(2); |
| document.getElementById('ev-al').textContent=autMult; |
| document.getElementById('eb-al').style.width=(autLvl/5*100)+'%'; |
| document.getElementById('ev-cr2').textContent=Math.round(cr2lat)+'ms'; |
| document.getElementById('eb-cr2').style.width=Math.max(0,(1-cr2lat/100)*100)+'%'; |
| document.getElementById('eb-cr2').style.background=cr2lat<60?'#3fb950':'#e3b341'; |
| document.getElementById('en-varp').textContent='VARP '+varpComp.toFixed(2)+' composite \u2014 12-agent system under AEGIS-Reason + CR2 unified inference ('+Math.round(cr2lat)+'ms)'; |
| |
| |
| |
| var collisions=0; |
| var estopMs=38+8*Math.sin(t*0.08); |
| var forceOK=true; |
| var proxOK=true; |
| var allGates=collisions===0&&estopMs<50&&forceOK&&proxOK; |
| document.getElementById('ev-sgate').textContent=allGates?'ALL PASS':'FAIL'; |
| document.getElementById('ev-sgate').style.color=allGates?'#3fb950':'#f85149'; |
| document.getElementById('ev-sgate').style.borderColor=allGates?'rgba(63,185,80,0.3)':'rgba(248,81,73,0.3)'; |
| document.getElementById('ev-sgate').style.background=allGates?'rgba(63,185,80,0.1)':'rgba(248,81,73,0.1)'; |
| document.getElementById('sv-coll').textContent=collisions; |
| document.getElementById('sg-coll').style.background=collisions===0?'#3fb950':'#f85149'; |
| document.getElementById('sv-estop').textContent=Math.round(estopMs)+'ms'; |
| document.getElementById('sg-estop').style.background=estopMs<50?'#3fb950':'#f85149'; |
| document.getElementById('sv-force').textContent=forceOK?'OK':'FAIL'; |
| document.getElementById('sg-force').style.background=forceOK?'#3fb950':'#f85149'; |
| document.getElementById('sv-prox').textContent=proxOK?'OK':'FAIL'; |
| document.getElementById('sg-prox').style.background=proxOK?'#3fb950':'#f85149'; |
| |
| var physb=0.87+0.03*Math.sin(t*0.18); |
| var cosmo=0.91+0.02*Math.sin(t*0.15+0.5); |
| var cfact=0.84+0.035*Math.sin(t*0.22+1.0); |
| var L2=(physb+cosmo+cfact)/3; |
| document.getElementById('ev-physb').textContent=physb.toFixed(2); |
| document.getElementById('eb-physb').style.width=Math.round(physb*100)+'%'; |
| document.getElementById('eb-physb').style.background=physb>0.85?'#58a6ff':'#e3b341'; |
| document.getElementById('ev-cosmo').textContent=cosmo.toFixed(2); |
| document.getElementById('eb-cosmo').style.width=Math.round(cosmo*100)+'%'; |
| document.getElementById('eb-cosmo').style.background=cosmo>0.88?'#58a6ff':'#e3b341'; |
| document.getElementById('ev-cfact').textContent=cfact.toFixed(2); |
| document.getElementById('eb-cfact').style.width=Math.round(cfact*100)+'%'; |
| document.getElementById('eb-cfact').style.background=cfact>0.85?'#58a6ff':'#e3b341'; |
| |
| var tsr=0.94+0.02*Math.sin(t*0.12+0.3); |
| var pve=0.91+0.025*Math.sin(t*0.14+0.8); |
| var bprec=0.88+0.03*Math.sin(t*0.16+1.2); |
| var L3=(tsr+pve+bprec)/3; |
| document.getElementById('ev-tsr').textContent=tsr.toFixed(2); |
| document.getElementById('eb-tsr').style.width=Math.round(tsr*100)+'%'; |
| document.getElementById('eb-tsr').style.background=tsr>0.90?'#3fb950':'#e3b341'; |
| document.getElementById('ev-pve').textContent=pve.toFixed(2); |
| document.getElementById('eb-pve').style.width=Math.round(pve*100)+'%'; |
| document.getElementById('eb-pve').style.background=pve>0.88?'#3fb950':'#e3b341'; |
| document.getElementById('ev-bprec').textContent=bprec.toFixed(2); |
| document.getElementById('eb-bprec').style.width=Math.round(bprec*100)+'%'; |
| document.getElementById('eb-bprec').style.background=bprec>0.85?'#3fb950':'#e3b341'; |
| |
| var mksp=0.92+0.02*Math.sin(t*0.2+0.5); |
| var coal=0.89+0.03*Math.sin(t*0.17+1.5); |
| var dead=0.96+0.015*Math.sin(t*0.1+0.2); |
| var L4=(mksp+coal+dead)/3; |
| document.getElementById('ev-mksp').textContent=mksp.toFixed(2); |
| document.getElementById('eb-mksp').style.width=Math.round(mksp*100)+'%'; |
| document.getElementById('eb-mksp').style.background=mksp>0.90?'#3fb950':'#e3b341'; |
| document.getElementById('ev-coal').textContent=coal.toFixed(2); |
| document.getElementById('eb-coal').style.width=Math.round(coal*100)+'%'; |
| document.getElementById('eb-coal').style.background=coal>0.88?'#3fb950':'#e3b341'; |
| document.getElementById('ev-dead').textContent=dead.toFixed(2); |
| document.getElementById('eb-dead').style.width=Math.round(dead*100)+'%'; |
| document.getElementById('eb-dead').style.background=dead>0.93?'#3fb950':'#e3b341'; |
| |
| var prm=0.90+0.025*Math.sin(t*0.19+0.7); |
| var sadh=0.97+0.01*Math.sin(t*0.11+1.0); |
| var ece=0.038+0.008*Math.sin(t*0.1); |
| var L5=(prm+sadh+(1-ece*10))/3; |
| document.getElementById('ev-prm').textContent=prm.toFixed(2); |
| document.getElementById('eb-prm').style.width=Math.round(prm*100)+'%'; |
| document.getElementById('eb-prm').style.background=prm>0.88?'#bc8cff':'#e3b341'; |
| document.getElementById('ev-sadh').textContent=sadh.toFixed(2); |
| document.getElementById('eb-sadh').style.width=Math.round(sadh*100)+'%'; |
| document.getElementById('eb-sadh').style.background=sadh>0.95?'#bc8cff':'#e3b341'; |
| document.getElementById('ev-ece').textContent=ece.toFixed(3); |
| document.getElementById('eb-ece').style.width=Math.round((1-ece*10)*100)+'%'; |
| document.getElementById('ev-ece').style.color=ece<0.05?'#3fb950':'#e3b341'; |
| |
| var paiefComp=allGates?(L2*0.25+L3*0.30+L4*0.25+L5*0.20):0; |
| document.getElementById('es-paief').textContent=allGates?paiefComp.toFixed(2):'GATED'; |
| document.getElementById('es-paief').style.color=allGates?'#00c8dc':'#f85149'; |
| document.getElementById('en-paief').textContent='Gate: '+(allGates?'ALL PASS':'FAIL')+' | Physical AI Composite '+paiefComp.toFixed(2)+' \u2014 5-layer gate-then-score across 15 metrics'; |
| |
| |
| |
| var nasssPass=7; |
| var techComplexity=(Math.sin(t*0.15)>-0.3)?'Complex':'Moderate'; |
| document.getElementById('nv-tech').textContent=techComplexity; |
| document.getElementById('nv-tech').style.color=(techComplexity==='Complex')?'#ffa657':'#3fb950'; |
| document.getElementById('ns-tech').style.background=(techComplexity==='Complex')?'#ffa657':'#3fb950'; |
| document.getElementById('ev-nasss').textContent=nasssPass+'/7 DOMAINS'; |
| |
| |
| var surgMin=Math.round(16+4*Math.sin(t*0.08)); |
| var logSav=Math.round(118+18*Math.sin(t*0.12)); |
| var ccPct=(99.2+0.7*Math.sin(t*0.09)).toFixed(1); |
| document.getElementById('ev-tsav').textContent='+'+surgMin+' min/case'; |
| document.getElementById('ev-lsav').textContent='$'+logSav+'K/yr'; |
| document.getElementById('ev-ccsv').textContent=ccPct+'%'; |
| document.getElementById('eb-tsav').style.width=Math.min(100,surgMin*4)+'%'; |
| document.getElementById('eb-lsav').style.width=Math.min(100,logSav*0.55)+'%'; |
| document.getElementById('eb-ccsv').style.width=ccPct+'%'; |
| |
| |
| var govScore=allGates?'READY':'BLOCKED'; |
| document.getElementById('es-clinical').textContent=govScore; |
| document.getElementById('es-clinical').style.color=allGates?'#ffa657':'#f85149'; |
| document.getElementById('en-clinical').textContent='NASSS '+nasssPass+'/7 | $'+logSav+'K/yr | Gov 6/6 | CBF\u2714 REALM\u2714 EDF\u2714 CERT\u2714'+(allGates?' \u2714':' \u2718'); |
| |
| |
| var realmEntropy=(0.14+0.06*Math.sin(t*0.5)).toFixed(2); |
| document.getElementById('nv-realm').textContent='H(\u03c0): '+realmEntropy; |
| document.getElementById('nv-realm').style.color=parseFloat(realmEntropy)<0.25?'#3fb950':'#f85149'; |
| var teamFluency=Math.round(89+5*Math.sin(t*0.3)); |
| document.getElementById('nv-fluency').textContent='Team: '+teamFluency+'%'; |
| evalScores.realmH=parseFloat(realmEntropy);evalScores.teamFluency=teamFluency; |
| |
| |
| evalScores.clinicalReady=allGates;evalScores.nasssDomains=nasssPass;evalScores.tdabcSavings=logSav; |
| |
| |
| evalScores.surg=surgScore/30;evalScores.amr=parseFloat(amrScore)/100;evalScores.drone=parseFloat(droneScore)/100;evalScores.exo=parseFloat(exoScore)/100; |
| evalScores.sys=parseFloat(sysScore)/100;evalScores.fc=fc;evalScores.hl=hl;evalScores.varp=varpComp;evalScores.cr2=cr2lat;evalScores.paief=paiefComp;evalScores.clinicalReady=allGates;evalScores.nasssDomains=7;evalScores.safeGate=allGates; |
| |
| |
| |
| function setLed(id,status){var el=document.getElementById(id);if(el){el.className='rc-led '+status}} |
| |
| setLed('rl-iec77',fc>95?'pass':fc>92?'warn':'fail'); |
| |
| setLed('rl-iec78',grf>93&&jt<3.5?'pass':grf>88?'warn':'fail'); |
| |
| setLed('rl-iso13',oa>=99.5&&svCount===0?'pass':oa>95?'warn':'fail'); |
| |
| var silOk=fc>93&&grf>90&&oa>=99&&svCount===0; |
| setLed('rl-iec61',silOk?'pass':fc>90?'warn':'fail'); |
| |
| setLed('rl-fda',surgScore>25?'pass':surgScore>22?'warn':'fail'); |
| |
| setLed('rl-vda',ns>94&&fu>78?'pass':ns>90?'warn':'fail'); |
| |
| setLed('rl-faa',ms>88&&pd<4?'pass':ms>82?'warn':'fail'); |
| |
| setLed('rl-iec62',ce>0.88?'pass':ce>0.82?'warn':'fail'); |
| |
| var leds=['rl-iec77','rl-iec78','rl-iso13','rl-iec61','rl-fda','rl-vda','rl-faa','rl-iec62']; |
| var passCount=0;for(var li2=0;li2<leds.length;li2++){var el2=document.getElementById(leds[li2]);if(el2&&el2.className.indexOf('pass')>=0)passCount++} |
| var warnCount=0;for(var li3=0;li3<leds.length;li3++){var el3=document.getElementById(leds[li3]);if(el3&&el3.className.indexOf('warn')>=0)warnCount++} |
| document.getElementById('es-reg').textContent=passCount+'/8 PASS'+(warnCount>0?' · '+warnCount+' WARN':''); |
| document.getElementById('es-reg').style.color=passCount===8?'#3fb950':passCount>=6?'#e3b341':'#f85149'; |
| |
| if(passCount===8){document.getElementById('en-reg').textContent='All 8 regulatory standards within compliance thresholds \u2014 system cleared for simulated clinical deployment'} |
| else if(warnCount>0){document.getElementById('en-reg').textContent=warnCount+' standard(s) approaching threshold limits \u2014 monitoring active, no violations detected'} |
| else{document.getElementById('en-reg').textContent=(8-passCount)+' compliance violation(s) detected \u2014 automated safety interlock engaged'} |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| var varpPrev={v:0.96,a:0.93,r:0.94,p:0.92}; |
| |
| function updateVarpHud(t){ |
| |
| var vV=0.96+0.02*Math.sin(t*0.11+0.3);vV=Math.max(0.91,Math.min(0.99,vV)); |
| var vA=0.93+0.03*Math.sin(t*0.14+0.7);vA=Math.max(0.88,Math.min(0.98,vA)); |
| var vR=0.94+0.025*Math.sin(t*0.09+1.1);vR=Math.max(0.89,Math.min(0.98,vR)); |
| var vP=0.92+0.035*Math.sin(t*0.12+0.5);vP=Math.max(0.86,Math.min(0.97,vP)); |
| var comp=(vV+vA+vR+vP)/4; |
| |
| |
| var rV=document.getElementById('vhr-v'); |
| var rA=document.getElementById('vhr-a'); |
| var rR=document.getElementById('vhr-r'); |
| var rP=document.getElementById('vhr-p'); |
| if(rV){rV.style.setProperty('--vp',Math.round(vV*100));document.getElementById('vhv-v').textContent='.'+Math.round(vV*100).toString().slice(-2)} |
| if(rA){rA.style.setProperty('--vp',Math.round(vA*100));document.getElementById('vhv-a').textContent='.'+Math.round(vA*100).toString().slice(-2)} |
| if(rR){rR.style.setProperty('--vp',Math.round(vR*100));document.getElementById('vhv-r').textContent='.'+Math.round(vR*100).toString().slice(-2)} |
| if(rP){rP.style.setProperty('--vp',Math.round(vP*100));document.getElementById('vhv-p').textContent='.'+Math.round(vP*100).toString().slice(-2)} |
| |
| |
| var compEl=document.getElementById('vh-comp'); |
| if(compEl){ |
| compEl.textContent=comp.toFixed(2); |
| compEl.style.color=comp>0.93?'#58a6ff':comp>0.90?'#3fb950':comp>0.87?'#e3b341':'#f85149'; |
| } |
| |
| |
| if(Math.abs(vV-varpPrev.v)>0.02&&rV){rV.classList.remove('pulse');void rV.offsetWidth;rV.classList.add('pulse')} |
| if(Math.abs(vA-varpPrev.a)>0.02&&rA){rA.classList.remove('pulse');void rA.offsetWidth;rA.classList.add('pulse')} |
| if(Math.abs(vR-varpPrev.r)>0.02&&rR){rR.classList.remove('pulse');void rR.offsetWidth;rR.classList.add('pulse')} |
| if(Math.abs(vP-varpPrev.p)>0.02&&rP){rP.classList.remove('pulse');void rP.offsetWidth;rP.classList.add('pulse')} |
| varpPrev={v:vV,a:vA,r:vR,p:vP}; |
| |
| |
| var autoEl=document.getElementById('vh-auto'); |
| if(autoEl){ |
| var autoLvl=comp>0.93?3:comp>0.88?2:1; |
| var autoMult=autoLvl>=3?'4':autoLvl>=2?'2':'1'; |
| autoEl.textContent='LASR Lv'+autoLvl+' \u00d7'+autoMult; |
| autoEl.style.color=autoLvl>=3?'#3fb950':autoLvl>=2?'#e3b341':'#f85149'; |
| autoEl.style.background=autoLvl>=3?'rgba(63,185,80,0.15)':autoLvl>=2?'rgba(227,179,65,0.15)':'rgba(248,81,73,0.15)'; |
| } |
| |
| |
| var regEl=document.getElementById('vh-reg'); |
| if(regEl){ |
| |
| var passCount=8; |
| var regHeader=document.getElementById('ec-reg-hdr'); |
| if(regHeader&®Header.textContent){ |
| var m=regHeader.textContent.match(/(\d+)\/8/); |
| if(m) passCount=parseInt(m[1]); |
| } else { |
| |
| passCount=0; |
| if(vV>0.90) passCount+=2; |
| if(vA>0.90) passCount+=2; |
| if(vR>0.88) passCount+=2; |
| if(vP>0.86) passCount+=2; |
| } |
| regEl.textContent=passCount+'/8 PASS'; |
| regEl.style.color=passCount>=8?'#3fb950':passCount>=6?'#e3b341':'#f85149'; |
| regEl.style.background=passCount>=8?'rgba(63,185,80,0.12)':passCount>=6?'rgba(227,179,65,0.12)':'rgba(248,81,73,0.12)'; |
| } |
| |
| |
| var vrV=document.getElementById('vr-v'); |
| if(vrV){ |
| vrV.style.setProperty('--pct',Math.round(vV*100)); |
| document.getElementById('vr-a').style.setProperty('--pct',Math.round(vA*100)); |
| document.getElementById('vr-r').style.setProperty('--pct',Math.round(vR*100)); |
| document.getElementById('vr-p').style.setProperty('--pct',Math.round(vP*100)); |
| document.getElementById('vn-v').textContent=vV.toFixed(2); |
| document.getElementById('vn-a').textContent=vA.toFixed(2); |
| document.getElementById('vn-r').textContent=vR.toFixed(2); |
| document.getElementById('vn-p').textContent=vP.toFixed(2); |
| var compVarp=document.getElementById('vn-comp'); |
| if(compVarp) compVarp.textContent=comp.toFixed(2); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| var tlVisible=false; |
| |
| function TT(){ |
| tlVisible=!tlVisible; |
| document.getElementById('timelinePanel').classList.toggle('vis',tlVisible); |
| document.getElementById('bTL').classList.toggle('active',tlVisible); |
| if(tlVisible){showOverlay('\u{1f4ca} COORDINATION TIMELINE','#58a6ff',700)} |
| else{showOverlay('TIMELINE OFF','#6e7681',500)} |
| } |
| |
| |
| (function(){ |
| document.addEventListener('click',function(e){ |
| var seg=e.target.closest('.tl-seg'); |
| if(seg&&seg.getAttribute('data-cam')){ |
| var v=seg.getAttribute('data-cam'); |
| SV(v); |
| } |
| }); |
| })(); |
| |
| |
| function updateTimeline(t){ |
| if(!tlVisible) return; |
| |
| var cycleLen=24; |
| var ct=t%cycleLen; |
| var pct=ct/cycleLen*100; |
| |
| |
| var ph=document.getElementById('tl-playhead'); |
| if(ph){ |
| |
| var trackEl=document.getElementById('tl-t-surg'); |
| if(trackEl){ |
| var trackW=trackEl.offsetWidth; |
| ph.style.left=(80+pct/100*trackW)+'px'; |
| } |
| } |
| |
| |
| var timeEl=document.getElementById('tl-time'); |
| if(timeEl){ |
| timeEl.textContent='Cycle '+cycleCount+' \u00b7 '+ct.toFixed(1)+'s / '+cycleLen+'.0s \u00b7 Speed '+speed+'x'; |
| } |
| |
| |
| var segs=document.querySelectorAll('.tl-seg'); |
| for(var si=0;si<segs.length;si++){ |
| var seg=segs[si]; |
| var segLeft=parseFloat(seg.style.left)/100; |
| var segWidth=parseFloat(seg.style.width)/100; |
| var segStart=segLeft*cycleLen; |
| var segEnd=(segLeft+segWidth)*cycleLen; |
| |
| if(ct>=segStart&&ct<segEnd){ |
| seg.classList.add('active'); |
| } else { |
| seg.classList.remove('active'); |
| } |
| } |
| } |
| |
| |
| |
| |
| |
| |
| var presRunning=false; |
| var presStartT=0; |
| var presStageIdx=-1; |
| |
| var presStages=[ |
| {t:0, dur:11, cam:'overview', title:'ENVIRONMENT INITIALIZATION', |
| panels:['narration','timeline']}, |
| {t:11, dur:14, cam:'surgical', title:'SURGICAL PRECISION', |
| panels:['narration','eval','physics','vision','timeline','twin']}, |
| {t:25, dur:14, cam:'amr', title:'FLEET LOGISTICS', |
| panels:['narration','eval','physics','vision','timeline','twin']}, |
| {t:39, dur:13, cam:'drone', title:'AERIAL DELIVERY', |
| panels:['narration','eval','physics','timeline','twin']}, |
| {t:52, dur:13, cam:'exo', title:'GAIT REHABILITATION', |
| panels:['narration','eval','physics','timeline','twin']}, |
| {t:65, dur:14, cam:'overview', title:'INTEGRATED OPERATIONS', |
| panels:['narration','eval','physics','timeline','twin']}, |
| {t:79, dur:13, cam:'overview', title:'CLINICAL READINESS', |
| panels:['eval','timeline']}, |
| {t:92, dur:13, cam:'overview', title:'EVALUATION SUMMARY', |
| panels:['eval','timeline']} |
| ]; |
| var presTotalDur=105; |
| |
| function startPresentation(){ |
| if(presRunning){stopPresentation();return} |
| presRunning=true; |
| presStartT=performance.now()/1000; |
| presStageIdx=-1; |
| if(paused){paused=false;step=0;simTime=0;speed=1;cycleCount=1;requestAnimationFrame(render)} |
| document.getElementById('presBar').classList.add('vis'); |
| document.getElementById('presStage').classList.add('vis'); |
| document.getElementById('bPres').classList.add('active'); |
| if(!narrating){TN()} |
| showOverlay('🎬 PRESENTATION MODE','#e3b341',1200); |
| } |
| |
| function stopPresentation(){ |
| presRunning=false; |
| presStageIdx=-1; |
| document.getElementById('presBar').classList.remove('vis'); |
| document.getElementById('presStage').classList.remove('vis'); |
| document.getElementById('bPres').classList.remove('active'); |
| showOverlay('PRESENTATION ENDED','#6e7681',800); |
| } |
| |
| function dismissSummary(){ |
| document.getElementById('presSummary').classList.remove('vis'); |
| stopPresentation(); |
| } |
| |
| function showSummary(){ |
| var compEl=document.getElementById('vh-comp'); |
| if(compEl) document.getElementById('ps-comp').textContent=compEl.textContent; |
| var regEl=document.getElementById('vh-reg'); |
| if(regEl) document.getElementById('ps-reg').textContent=regEl.textContent.replace(' PASS',''); |
| var autoEl=document.getElementById('vh-auto'); |
| if(autoEl){ |
| var autoText=autoEl.textContent; |
| document.getElementById('ps-auto').textContent=autoText.substring(0,autoText.indexOf(' ')); |
| } |
| document.getElementById('presSummary').classList.add('vis'); |
| |
| var nassEl=document.getElementById('ps-nasss'); |
| if(nassEl) nassEl.textContent=(evalScores.nasssDomains||7)+'/7'; |
| var tdEl=document.getElementById('ps-tdabc'); |
| if(tdEl) tdEl.textContent='$'+(evalScores.tdabcSavings||127)+'K'; |
| var paiefEl=document.getElementById('ps-paief'); |
| if(paiefEl) paiefEl.textContent=evalScores.safeGate?(evalScores.paief||0).toFixed(2):'GATED'; |
| |
| var realmEl=document.getElementById('ps-realm'); |
| if(realmEl) realmEl.textContent=(evalScores.realmH||0.14)<0.25?'AUTO':'OVRST'; |
| var smmEl=document.getElementById('ps-smm'); |
| if(smmEl) smmEl.textContent=(evalScores.teamFluency||91)+'%'; |
| } |
| |
| function updatePresentation(){ |
| if(!presRunning) return; |
| var now=performance.now()/1000; |
| var elapsed=now-presStartT; |
| var pct=Math.min(100,elapsed/presTotalDur*100); |
| document.getElementById('pb-fill').style.width=pct+'%'; |
| var currentStage=-1; |
| for(var si=presStages.length-1;si>=0;si--){ |
| if(elapsed>=presStages[si].t){currentStage=si;break} |
| } |
| if(currentStage>=0&¤tStage!==presStageIdx){ |
| presStageIdx=currentStage; |
| var stage=presStages[currentStage]; |
| document.getElementById('ps-num').textContent=(currentStage+1)+'/'+presStages.length; |
| document.getElementById('ps-title').textContent=stage.title; |
| SV(stage.cam); |
| var needEval=stage.panels.indexOf('eval')>=0; |
| var needPhys=stage.panels.indexOf('physics')>=0; |
| var needTL=stage.panels.indexOf('timeline')>=0; |
| var needDT=stage.panels.indexOf('twin')>=0; |
| if(needEval&&!evalVisible){TE()} |
| if(!needEval&&evalVisible){TE()} |
| if(needPhys&&!physVisible){TPH()} |
| if(!needPhys&&physVisible){TPH()} |
| if(needTL&&!tlVisible){TT()} |
| if(!needTL&&tlVisible){TT()} |
| if(needDT&&!dtVisible){TDT()} |
| if(!needDT&&dtVisible){TDT()} |
| var needCV=stage.panels.indexOf('vision')>=0; |
| if(needCV&&!cvVisible){TCV()} |
| if(!needCV&&cvVisible){TCV()} |
| } |
| if(elapsed>=presTotalDur){ |
| stopPresentation(); |
| showSummary(); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| var dtVisible=false; |
| |
| function TDT(){ |
| dtVisible=!dtVisible; |
| document.getElementById('dtPanel').classList.toggle('vis',dtVisible); |
| document.getElementById('bDT').classList.toggle('active',dtVisible); |
| if(dtVisible){showOverlay('OBSERVATIONS ONLINE','#76b900',700)} |
| else{showOverlay('OBSERVATIONS OFF','#6e7681',500)} |
| } |
| |
| function TCV(){ |
| cvVisible=!cvVisible; |
| document.getElementById('bCV').classList.toggle('active',cvVisible); |
| if(cvVisible){showOverlay('\u{1f441} CLINICAL VISION OVERLAY','#00c8dc',800)} |
| else{showOverlay('VISION OFF','#6e7681',500)} |
| } |
| |
| function updateDigitalTwin(t){ |
| if(!dtVisible) return; |
| |
| |
| var sf=cr2Val('f'), sfp=cr2Val('fp'), sik=cr2Val('ik'); |
| var sg=cr2Val('g'), se=cr2Val('e'); |
| var sfc=evalScores.fc||97; |
| document.getElementById('dt-s-f').textContent=sf+' N'; |
| document.getElementById('dt-s-fp').textContent=sfp+' N'; |
| document.getElementById('dt-s-ik').textContent=sik+' ms'; |
| document.getElementById('dt-s-g').textContent=sg+'/30'; |
| document.getElementById('dt-s-e').textContent=se+'%'; |
| document.getElementById('dt-s-fc').textContent=sfc.toFixed(1)+'%'; |
| document.getElementById('dt-s-fcb').style.width=Math.min(100,sfc)+'%'; |
| document.getElementById('dt-s-fcb').style.background=sfc>95?'#3fb950':sfc>90?'#e3b341':'#f85149'; |
| var surgOk=parseFloat(sfp)<2.0&&sfc>90; |
| var surgSt=document.getElementById('dt-s-st'); |
| surgSt.textContent=surgOk?'NOMINAL':'CAUTION'; |
| surgSt.className='dt-status '+(surgOk?'dt-status-ok':'dt-status-warn'); |
| |
| |
| var av=cr2Val('v'), adest=cr2Val('s'), asep=cr2Val('sep'); |
| var au=cr2Val('u'), acol=cr2Val('ct'); |
| document.getElementById('dt-a-v').textContent=av+' m/s'; |
| document.getElementById('dt-a-dest').textContent=adest; |
| document.getElementById('dt-a-sep').textContent=asep+' m'; |
| document.getElementById('dt-a-n').textContent=Math.min(5,3+Math.floor(Math.abs(Math.sin(t*0.15))*3))+'/5'; |
| document.getElementById('dt-a-col').textContent=acol; |
| document.getElementById('dt-a-col').style.color=parseInt(acol)===0?'#3fb950':'#f85149'; |
| document.getElementById('dt-a-u').textContent=au+'%'; |
| document.getElementById('dt-a-ub').style.width=au+'%'; |
| var amrOk=parseInt(acol)===0&&parseFloat(asep)>1.0; |
| var amrSt=document.getElementById('dt-a-st'); |
| amrSt.textContent=amrOk?'NOMINAL':'CAUTION'; |
| amrSt.className='dt-status '+(amrOk?'dt-status-ok':'dt-status-warn'); |
| |
| |
| var dn=cr2Val('n'), dalt=cr2Val('a1'), dtemp=cr2Val('temp'); |
| var dbat=cr2Val('b1'), dacc=cr2Val('da2'), dms=cr2Val('ms'); |
| document.getElementById('dt-d-n').textContent=dn+'/3'; |
| document.getElementById('dt-d-alt').textContent=dalt+' m'; |
| document.getElementById('dt-d-temp').textContent=dtemp+'\u00b0C'; |
| document.getElementById('dt-d-bat').textContent=dbat+'%'; |
| document.getElementById('dt-d-acc').textContent='\u00b1'+dacc+' m'; |
| document.getElementById('dt-d-ms').textContent=dms+'%'; |
| document.getElementById('dt-d-msb').style.width=dms+'%'; |
| var tempVal=parseFloat(dtemp); |
| document.getElementById('dt-d-temp').style.color=(tempVal>=2&&tempVal<=8)?'#e6edf3':'#f85149'; |
| var droneOk=parseInt(dbat)>20&&tempVal>=2&&tempVal<=8; |
| var droneSt=document.getElementById('dt-d-st'); |
| droneSt.textContent=droneOk?'NOMINAL':'CAUTION'; |
| droneSt.className='dt-status '+(droneOk?'dt-status-ok':'dt-status-warn'); |
| |
| |
| var xph=cr2Val('phase'), xgrf=cr2Val('grf'), xsym=cr2Val('sym'); |
| var xmos=cr2Val('mos'), xfm=cr2Val('fm'); |
| var xhip=cr2Val('hip'), xknee=cr2Val('knee'), xankle=cr2Val('ankle'); |
| document.getElementById('dt-x-ph').textContent=xph; |
| document.getElementById('dt-x-jt').textContent='H:'+xhip+' K:'+xknee+' A:'+xankle; |
| document.getElementById('dt-x-grf').textContent=xgrf+' N'; |
| document.getElementById('dt-x-sym').textContent=xsym; |
| document.getElementById('dt-x-mos').textContent=xmos+' cm'; |
| document.getElementById('dt-x-fm').textContent=xfm+'%'; |
| document.getElementById('dt-x-fmb').style.width=xfm+'%'; |
| var exoOk=parseFloat(xmos)>2.0&&parseFloat(xsym)>0.85; |
| var exoSt=document.getElementById('dt-x-st'); |
| exoSt.textContent=exoOk?'NOMINAL':'CAUTION'; |
| exoSt.className='dt-status '+(exoOk?'dt-status-ok':'dt-status-warn'); |
| |
| |
| var lat1=(1.2+0.5*Math.sin(t*0.35)).toFixed(1); |
| var lat2=(2.1+0.8*Math.sin(t*0.28)).toFixed(1); |
| var lat3=(1.8+0.6*Math.sin(t*0.32)).toFixed(1); |
| var cr2lat=Math.round(55+10*Math.sin(t*0.7)); |
| var physLat=(17.6+2*Math.sin(t*0.45)).toFixed(1); |
| document.getElementById('dt-n1-lat').textContent=lat1+'ms'; |
| document.getElementById('dt-n2-lat').textContent=lat2+'ms'; |
| document.getElementById('dt-n3-lat').textContent=lat3+'ms'; |
| document.getElementById('dt-n4-lat').textContent=cr2lat+'ms'; |
| document.getElementById('dt-n5-lat').textContent=physLat+'ms'; |
| |
| |
| var lats=[parseFloat(lat1),parseFloat(lat2),parseFloat(lat3),cr2lat,parseFloat(physLat)]; |
| var dots=['dt-n1','dt-n2','dt-n3','dt-n4','dt-n5']; |
| for(var li=0;li<5;li++){ |
| document.getElementById(dots[li]).style.background=lats[li]<50?'#3fb950':lats[li]<100?'#e3b341':'#f85149'; |
| } |
| |
| |
| document.getElementById('dt-sys-t').textContent=t.toFixed(1)+'s'; |
| document.getElementById('dt-sys-c').textContent=cycleCount; |
| var varpC=evalScores.varp||0.94; |
| document.getElementById('dt-sys-varp').textContent=varpC.toFixed(2); |
| document.getElementById('dt-sys-varpb').style.width=(varpC*100)+'%'; |
| |
| |
| var safetyEvents=0; |
| if(!surgOk) safetyEvents++; |
| if(!amrOk) safetyEvents++; |
| if(!droneOk) safetyEvents++; |
| if(!exoOk) safetyEvents++; |
| var seEl=document.getElementById('dt-sys-se'); |
| seEl.textContent=safetyEvents; |
| seEl.style.color=safetyEvents===0?'#3fb950':'#f85149'; |
| } |
| |
| function SS(){C.style.filter='brightness(2)';setTimeout(function(){C.style.filter='';},150);var a=document.createElement('a');a.download='arena_'+Date.now()+'.png';a.href=C.toDataURL();a.click()} |
| |
| function TS(){ |
| paused=true;step=0;simTime=0;speed=1; |
| if(evalVisible){evalVisible=false;document.getElementById('evalPanel').classList.remove('vis');document.getElementById('bE').classList.remove('active')} |
| if(tlVisible){tlVisible=false;document.getElementById('timelinePanel').classList.remove('vis');document.getElementById('bTL').classList.remove('active')} |
| if(presRunning){stopPresentation()} |
| if(dtVisible){dtVisible=false;document.getElementById('dtPanel').classList.remove('vis');document.getElementById('bDT').classList.remove('active')} |
| if(dtVisible){dtVisible=false;document.getElementById('dtPanel').classList.remove('vis');document.getElementById('bDT').classList.remove('active')} |
| if(presRunning){stopPresentation()} |
| if(tlVisible){tlVisible=false;document.getElementById('timelinePanel').classList.remove('vis');document.getElementById('bTL').classList.remove('active')} |
| if(physVisible){physVisible=false;document.getElementById('bPH').classList.remove('active')} |
| if(cr2Visible){cr2Visible=false;cr2Active=false;cr2Boxes=[];document.getElementById('cr2Panel').classList.remove('vis');document.getElementById('bCR').classList.remove('active')} |
| if(cvVisible){cvVisible=false;document.getElementById('bCV').classList.remove('active')} |
| |
| document.getElementById('bP').textContent='\u25b6 Play [Space]'; |
| |
| var po=document.getElementById('pauseOv');if(po)po.style.display='none'; |
| var so=document.getElementById('stoppedOv');if(so)so.style.display='flex'; |
| |
| document.getElementById('spd').textContent='Speed: 1\u00d7'; |
| document.getElementById('spd').style.color='#8b949e';document.getElementById('spd').style.fontSize='11px'; |
| |
| if(narrating){narrating=false;document.getElementById('bN').classList.remove('active');document.getElementById('narration').classList.remove('visible')} |
| |
| camView='overview';var c=cams.overview;camX=c.x;camY=c.y;camZ=c.z; |
| document.querySelectorAll('#cam-row button').forEach(function(b){b.classList.remove('active')}); |
| document.getElementById('bOv').classList.add('active'); |
| |
| document.getElementById('tf').style.width='0%';document.getElementById('tm').style.left='0%'; |
| document.getElementById('sc').textContent='Step: 0 / 240 \u00b7 Cycle 1'; |
| cycleCount=1; |
| } |
| |
| function RG(){ |
| |
| paused=false;step=0;simTime=0;speed=1;cycleCount=1; |
| if(evalVisible){evalVisible=false;document.getElementById('evalPanel').classList.remove('vis');document.getElementById('bE').classList.remove('active')} |
| if(physVisible){physVisible=false;document.getElementById('bPH').classList.remove('active')} |
| if(cr2Visible){cr2Visible=false;cr2Active=false;cr2Boxes=[];document.getElementById('cr2Panel').classList.remove('vis');document.getElementById('bCR').classList.remove('active')} |
| if(cvVisible){cvVisible=false;document.getElementById('bCV').classList.remove('active')} |
| document.getElementById('bP').textContent='\u23f8 Pause [Space]'; |
| var po=document.getElementById('pauseOv');if(po)po.style.display='none'; |
| var so=document.getElementById('stoppedOv');if(so)so.style.display='none'; |
| document.getElementById('spd').textContent='Speed: 1\u00d7'; |
| document.getElementById('spd').style.color='#8b949e';document.getElementById('spd').style.fontSize='11px'; |
| |
| if(narrating){narrating=false;document.getElementById('bN').classList.remove('active');document.getElementById('narration').classList.remove('visible')} |
| |
| camView='overview';var c=cams.overview;camX=c.x;camY=c.y;camZ=c.z; |
| document.querySelectorAll('#cam-row button').forEach(function(b){b.classList.remove('active')}); |
| document.getElementById('bOv').classList.add('active'); |
| |
| particles.length=0; |
| for(var i=0;i<70;i++){particles.push({x:Math.random()*FW,y:Math.random()*FD,z:Math.random()*5,vx:(Math.random()-0.5)*0.012,vy:(Math.random()-0.5)*0.012,vz:Math.random()*0.007,size:0.3+Math.random()*1,color:['rgba(88,166,255,','rgba(62,175,80,','rgba(227,179,65,','rgba(188,140,255,'][Math.floor(Math.random()*4)],phase:Math.random()*Math.PI*2})} |
| |
| document.getElementById('tf').style.width='0%';document.getElementById('tm').style.left='0%'; |
| document.getElementById('sc').textContent='Step: 0 / 240 \u00b7 Cycle 1'; |
| |
| C.style.filter='brightness(1.6) hue-rotate(60deg)';setTimeout(function(){C.style.filter='';},200); |
| showOverlay('\u{1f504} ARENA REGENERATED','#3fb950',1200); |
| } |
| |
| |
| var overlayTimeout=null; |
| function showOverlay(text,color,duration){ |
| |
| var ov=document.getElementById('actionOv'); |
| var txt=document.getElementById('actionTxt'); |
| var box=document.getElementById('actionBox'); |
| var bdr=document.getElementById('borderOv'); |
| txt.textContent=text; |
| txt.style.color=color; |
| box.style.borderColor=color; |
| box.style.boxShadow='0 0 60px '+color+'66,0 0 120px '+color+'33'; |
| ov.style.display='flex'; |
| |
| bdr.style.display='block';bdr.style.borderColor=color; |
| bdr.style.boxShadow='inset 0 0 60px '+color+'44,0 0 60px '+color+'33'; |
| bdr.style.opacity='1'; |
| |
| if(overlayTimeout)clearTimeout(overlayTimeout); |
| overlayTimeout=setTimeout(function(){ |
| ov.style.display='none'; |
| bdr.style.opacity='0'; |
| setTimeout(function(){bdr.style.display='none'},300); |
| },duration||1500); |
| } |
| |
| function drawOverlay(dt){} |
| var narWallStart=0; |
| var lastNarPhase=-1; |
| var narTypeIdx=0; |
| var narTypeDone=false; |
| var colors_map={overview:'#58a6ff',surgical:'#3fb950',amr:'#58a6ff',drone:'#e3b341',exo:'#bc8cff'}; |
| document.addEventListener('keydown',function(e){ |
| |
| var tag=e.target.tagName;if(tag==='INPUT'||tag==='TEXTAREA'||tag==='SELECT'||e.target.isContentEditable)return; |
| if(e.key===' '){e.preventDefault();TP()} |
| if(e.key==='n'||e.key==='N'){TN()} |
| if(e.key==='s'||e.key==='S'){SS()} |
| if(e.key==='x'||e.key==='X'){TS()} |
| if(e.key==='r'||e.key==='R'){RG()} |
| if(e.key==='e'||e.key==='E'){TE()} |
| if(e.key==='d'||e.key==='D'){TDT()} |
| if(e.key==='t'||e.key==='T'){TT()} |
| if(e.key==='g'||e.key==='G'){if(document.getElementById('presSummary').classList.contains('vis')){dismissSummary()}else{startPresentation()}} |
| if(e.key==='p'||e.key==='P'){TPH()} |
| if(e.key==='c'||e.key==='C'){TCR()} |
| if(e.key==='v'||e.key==='V'){TCV()} |
| if(e.key==='q'||e.key==='Q'){TR()} |
| if(e.key==='z'||e.key==='Z'){TSC()} |
| if(e.key==='1'){SV('overview')} |
| if(e.key==='2'){SV('surgical')} |
| if(e.key==='3'){SV('amr')} |
| if(e.key==='4'){SV('drone')} |
| if(e.key==='5'){SV('exo')} |
| if(e.key==='='||e.key==='+'){CS(1)} |
| if(e.key==='-'){CS(-1)} |
| }); |
| C.addEventListener('mousedown',function(e){dragging=true;dragX=e.clientX;dragY=e.clientY;C.classList.add('grabbing')}); |
| window.addEventListener('mousemove',function(e){mouseX=e.clientX;mouseY=e.clientY;if(dragging){camX+=(e.clientX-dragX)*0.02/eCamZ;camY-=(e.clientY-dragY)*0.02/eCamZ;dragX=e.clientX;dragY=e.clientY}}); |
| window.addEventListener('mouseup',function(){dragging=false;C.classList.remove('grabbing')}); |
| C.addEventListener('wheel',function(e){e.preventDefault();camZ=Math.max(0.4,Math.min(3,camZ-e.deltaY*0.001))},{passive:false}); |
| var tch={}; |
| C.addEventListener('touchstart',function(e){e.preventDefault();if(e.touches.length===1){dragging=true;dragX=e.touches[0].clientX;dragY=e.touches[0].clientY}if(e.touches.length===2){tch.d=Math.hypot(e.touches[0].clientX-e.touches[1].clientX,e.touches[0].clientY-e.touches[1].clientY)}},{passive:false}); |
| C.addEventListener('touchmove',function(e){e.preventDefault();if(e.touches.length===1&&dragging){camX+=(e.touches[0].clientX-dragX)*0.02/eCamZ;camY-=(e.touches[0].clientY-dragY)*0.02/eCamZ;dragX=e.touches[0].clientX;dragY=e.touches[0].clientY}if(e.touches.length===2){var nd=Math.hypot(e.touches[0].clientX-e.touches[1].clientX,e.touches[0].clientY-e.touches[1].clientY);camZ=Math.max(0.4,Math.min(3,camZ*(nd/tch.d)));tch.d=nd}},{passive:false}); |
| C.addEventListener('touchend',function(){dragging=false}); |
| document.getElementById('tl').addEventListener('click',function(e){var r=e.currentTarget.getBoundingClientRect();step=Math.floor((e.clientX-r.left)/r.width*240)}); |
| |
| |
| |
| |
| |
| |
| |
| function updateHover(){ |
| var best=''; |
| var bestDist=80*eCamZ; |
| var types=['surgical','amr','drone','exo']; |
| for(var i=0;i<types.length;i++){ |
| var t=types[i]; |
| var p=botScreenPos[t]; |
| if(p[0]<-900)continue; |
| var d=Math.hypot(mouseX-p[0],mouseY-p[1]); |
| if(d<bestDist){bestDist=d;best=t} |
| } |
| var el=document.getElementById('ins'); |
| if(best!==''){ |
| if(hoveredBot!==best){ |
| hoveredBot=best; |
| showInspector(best); |
| } |
| |
| var p=botScreenPos[best]; |
| var lft=Math.min(p[0]+25,W-320); |
| var tp=Math.max(10,Math.min(p[1]-100,H-440)); |
| el.style.left=lft+'px'; |
| el.style.top=tp+'px'; |
| el.classList.add('vis'); |
| }else{ |
| hoveredBot=''; |
| el.classList.remove('vis'); |
| } |
| } |
| |
| function showInspector(type){ |
| var tEl=document.getElementById('iT'),bEl=document.getElementById('iB'); |
| var s={ |
| surgical:{t:'\u{1f9be} da Vinci Xi Surgical System',b: |
| '<div class="sp"><span class="sl">Isaac Lab Config</span><span class="sv">ArticulationCfg</span></div>'+ |
| '<div class="sp"><span class="sl">Kinematics</span><span class="sv">4\u00d77-DOF Serial Chain</span></div>'+ |
| '<div class="sp"><span class="sl">Tissue Model</span><span class="sv">Kelvin-Voigt Viscoelastic</span></div>'+ |
| '<div class="sp"><span class="sl">Force Limit</span><span class="sv">< 2 N (auto-halt)</span></div>'+ |
| '<div class="sp"><span class="sl">Tremor Filter</span><span class="sv">8\u201312 Hz Notch</span></div>'+ |
| '<div class="sp"><span class="sl">AEGIS Speedup</span><span class="sv">'+D.surg_speedup.toFixed(1)+'\u00d7 faster</span></div>'+ |
| '<div class="phys"><h5>\u{1f4d0} Governing Physics Laws</h5>'+ |
| '<div class="eq">F = m \u00b7 a (Newton\u2019s 2nd Law)</div>'+ |
| '<div class="eq-note">Instrument tip force \u2264 2N; mass \u00d7 accel at tissue contact</div>'+ |
| '<div class="eq">\u03c3 = E\u03b5 + \u03b7(d\u03b5/dt) (Kelvin-Voigt Model)</div>'+ |
| '<div class="eq-note">Viscoelastic tissue: elastic modulus E + viscous damping \u03b7</div>'+ |
| '<div class="eq">\u03c4 = J\u1d40 \u00b7 F (Jacobian Transpose Control)</div>'+ |
| '<div class="eq-note">Maps Cartesian endpoint forces to joint torques</div>'+ |
| '<div class="eq">q\u0307 = J\u207b\u00b9(q) \u00b7 \u1e8b (Inverse Kinematics)</div>'+ |
| '<div class="eq-note">7-DOF joint velocities from end-effector velocity</div>'+ |
| '<div class="eq">V = \u00bd k(\u0394x)\u00b2 (Elastic Potential Energy)</div>'+ |
| '<div class="eq-note">Tissue deformation energy governs haptic feedback</div>'+ |
| '</div>'}, |
| amr:{t:'\u{1f3e5} Hospital AMR Fleet',b: |
| '<div class="sp"><span class="sl">Isaac Lab Config</span><span class="sv">RigidObjectCfg</span></div>'+ |
| '<div class="sp"><span class="sl">Drive</span><span class="sv">Differential 2WD</span></div>'+ |
| '<div class="sp"><span class="sl">LiDAR</span><span class="sv">360\u00b0 8 m, 16-ray</span></div>'+ |
| '<div class="sp"><span class="sl">Navigation</span><span class="sv">SLAM + A* Grid</span></div>'+ |
| '<div class="sp"><span class="sl">AEGIS Speedup</span><span class="sv">'+D.amr_speedup.toFixed(1)+'\u00d7 faster</span></div>'+ |
| '<div class="phys"><h5>\u{1f4d0} Governing Physics Laws</h5>'+ |
| '<div class="eq">F = m \u00b7 a (Newton\u2019s 2nd Law)</div>'+ |
| '<div class="eq-note">Chassis acceleration from differential motor torque</div>'+ |
| '<div class="eq">\u03c4 = I\u03b1 + b\u03c9 (Rotational Dynamics)</div>'+ |
| '<div class="eq-note">Wheel torque = inertia \u00d7 angular accel + friction</div>'+ |
| '<div class="eq">f = \u03bc \u00b7 N (Coulomb Friction)</div>'+ |
| '<div class="eq-note">Tire-floor friction governs max accel and cornering</div>'+ |
| '<div class="eq">v = \u03c9 \u00d7 r (Rolling Constraint)</div>'+ |
| '<div class="eq-note">Linear velocity from angular velocity \u00d7 wheel radius</div>'+ |
| '<div class="eq">E = \u00bd m v\u00b2 (Kinetic Energy)</div>'+ |
| '<div class="eq-note">Braking distance from kinetic energy dissipation</div>'+ |
| '</div>'}, |
| drone:{t:'\u{1f681} Medical Delivery Drones',b: |
| '<div class="sp"><span class="sl">Isaac Lab Config</span><span class="sv">RigidObjectCfg</span></div>'+ |
| '<div class="sp"><span class="sl">Airframe</span><span class="sv">Quadrotor X-config</span></div>'+ |
| '<div class="sp"><span class="sl">Wind Model</span><span class="sv">Earth-2 Coupling</span></div>'+ |
| '<div class="sp"><span class="sl">Path Planning</span><span class="sv">B\u00e9zier Curves</span></div>'+ |
| '<div class="sp"><span class="sl">Max Payload</span><span class="sv">2.5 kg</span></div>'+ |
| '<div class="phys"><h5>\u{1f4d0} Governing Physics Laws</h5>'+ |
| '<div class="eq">T \u2212 mg = ma (Newton\u2019s 2nd, vertical)</div>'+ |
| '<div class="eq-note">Net thrust minus weight = vertical acceleration</div>'+ |
| '<div class="eq">F_d = \u00bd\u03c1v\u00b2C_dA (Aerodynamic Drag)</div>'+ |
| '<div class="eq-note">Air resistance \u221d velocity\u00b2, drag coeff, cross-section</div>'+ |
| '<div class="eq">L = I\u03c9 (Angular Momentum)</div>'+ |
| '<div class="eq-note">Rotor gyroscopic effects; differential thrust = torque</div>'+ |
| '<div class="eq">\u03a3F = 0, \u03a3\u03c4 = 0 (Hover Equilibrium)</div>'+ |
| '<div class="eq-note">4 rotors balance gravity and cancel net torque</div>'+ |
| '<div class="eq">P = T \u00b7 v (Thrust Power)</div>'+ |
| '<div class="eq-note">Battery drain = thrust \u00d7 velocity \u2192 flight endurance</div>'+ |
| '</div>'}, |
| exo:{t:'\u{1f9bf} Rehab Exoskeleton',b: |
| '<div class="sp"><span class="sl">Isaac Lab Config</span><span class="sv">ArticulationCfg</span></div>'+ |
| '<div class="sp"><span class="sl">Segments</span><span class="sv">7-Link Biped Chain</span></div>'+ |
| '<div class="sp"><span class="sl">Gait Detection</span><span class="sv">Stance/Swing FSM</span></div>'+ |
| '<div class="sp"><span class="sl">Balance</span><span class="sv">CoP Tracking</span></div>'+ |
| '<div class="phys"><h5>\u{1f4d0} Governing Physics Laws</h5>'+ |
| '<div class="eq">\u03c4 = I\u03b1 + mgl\u00b7sin\u03b8 (Inverted Pendulum)</div>'+ |
| '<div class="eq-note">Each leg segment: gravity torque drives fall risk</div>'+ |
| '<div class="eq">GRF = m(g + a) (Ground Reaction Force)</div>'+ |
| '<div class="eq-note">Stance floor force = body weight + inertial load</div>'+ |
| '<div class="eq">CoP = \u03a3(r_i\u00b7F_i) / \u03a3F_i (Center of Pressure)</div>'+ |
| '<div class="eq-note">Balance if CoP stays in foot support polygon</div>'+ |
| '<div class="eq">W = \u222b \u03c4 \u00b7 d\u03b8 (Joint Mechanical Work)</div>'+ |
| '<div class="eq-note">Motor energy from torque \u00d7 angular displacement</div>'+ |
| '<div class="eq">p = m \u00b7 v (Linear Momentum)</div>'+ |
| '<div class="eq-note">Detect abnormal momentum \u2192 corrective torque < 50 ms</div>'+ |
| '</div>'} |
| }; |
| if(s[type]){tEl.innerHTML=s[type].t;bEl.innerHTML=s[type].b} |
| } |
| |
| |
| |
| |
| var narPhases=[ |
| {t:0,dur:4,title:'PHASE 1 \u2014 ENVIRONMENT INITIALIZATION',text:'PhysX 5 TGS solver online. USD scene graph: 80\u00d760m hospital complex with 4 specialized zones and 12 autonomous agents. Isaac Lab ArticulationCfg and RigidObjectCfg initializing all rigid bodies, articulations, and sensor models...', cam:'overview'}, |
| {t:4,dur:4,title:'PHASE 2 \u2014 SURGICAL PROCEDURE',text:'da Vinci Xi surgical system: 4\u00d77-DOF serial-chain manipulators under impedance control. Kelvin-Voigt viscoelastic tissue model (\u03c3 = E\u03b5 + \u03b7 d\u03b5/dt). End-effector force constrained < 2N via Jacobian transpose control. Cosmos Reason 2 provides spatial tissue classification for autonomous suturing...', cam:'surgical'}, |
| {t:8,dur:4,title:'PHASE 3 \u2014 FLEET LOGISTICS',text:'AMR fleet: '+D.n_amr+' differential-drive robots navigating via SLAM + A* grid planning with DWA obstacle avoidance. Trapezoidal velocity profiles (F=ma acceleration \u2192 constant cruise \u2192 F=-ma deceleration). 82% fleet utilization. CR2 provides corridor topology reasoning for multi-agent coordination...', cam:'amr'}, |
| {t:12,dur:4,title:'PHASE 4 \u2014 AERIAL DELIVERY',text:'Medical delivery drones on B\u00e9zier curve trajectories. Full flight physics: thrust T > mg for climb, T \u2248 mg cruise with Earth-2 wind coupling, aerodynamic drag F_d = \u00bd\u03c1v\u00b2C_dA. Downwash visualization (Newton\u2019s 3rd law). CR2 spatiotemporal prediction for delivery scheduling...', cam:'drone'}, |
| {t:16,dur:4,title:'PHASE 5 \u2014 GAIT REHABILITATION',text:'Rehab exoskeleton: 7-link biped with stance/swing gait detection FSM. Inverted pendulum dynamics (\u03c4 = I\u03b1 + mgl\u00b7sin\u03b8) govern balance. Ground reaction force GRF = m(g+a) during stance phase. Center of pressure tracking for predictive fall prevention within 50ms response window...', cam:'exo'}, |
| {t:20,dur:4,title:'PHASE 6 \u2014 INTEGRATED OPERATIONS',text:'All '+(D.n_arms+D.n_amr+D.n_drones+1)+' agents operating under AEGIS-Reason + Cosmos Reason 2 unified inference. Cross-domain coordination pipeline: surgical completion \u2192 AMR specimen transport \u2192 drone lab delivery \u2192 patient rehab scheduling. VARP score 0.94, CR2 latency 55ms, zero safety violations across 240 simulation steps...', cam:'overview'} |
| ]; |
| |
| |
| |
| |
| function drawIsoBox(cx,cy,cz,w,d,h,topC,leftC,rightC,alpha){ |
| var tl=iso(cx-w/2,cy-d/2,cz+h),tr=iso(cx+w/2,cy-d/2,cz+h),br=iso(cx+w/2,cy+d/2,cz+h),bl=iso(cx-w/2,cy+d/2,cz+h); |
| var bbl=iso(cx-w/2,cy+d/2,cz),bbr=iso(cx+w/2,cy+d/2,cz),btr=iso(cx+w/2,cy-d/2,cz); |
| X.globalAlpha=alpha||1; |
| X.beginPath();X.moveTo(tl[0],tl[1]);X.lineTo(tr[0],tr[1]);X.lineTo(br[0],br[1]);X.lineTo(bl[0],bl[1]);X.closePath();X.fillStyle=topC;X.fill();X.strokeStyle='rgba(255,255,255,0.05)';X.lineWidth=0.5;X.stroke(); |
| X.beginPath();X.moveTo(bl[0],bl[1]);X.lineTo(br[0],br[1]);X.lineTo(bbr[0],bbr[1]);X.lineTo(bbl[0],bbl[1]);X.closePath();X.fillStyle=leftC;X.fill(); |
| X.beginPath();X.moveTo(br[0],br[1]);X.lineTo(tr[0],tr[1]);X.lineTo(btr[0],btr[1]);X.lineTo(bbr[0],bbr[1]);X.closePath();X.fillStyle=rightC;X.fill(); |
| X.globalAlpha=1; |
| } |
| |
| |
| |
| |
| function drawFloor(t){ |
| var fl=iso(0,0,0),fr=iso(FW,0,0),fbr=iso(FW,FD,0),fbl=iso(0,FD,0); |
| var fg=X.createLinearGradient(fl[0],fl[1],fbr[0],fbr[1]); |
| fg.addColorStop(0,'#0e1420');fg.addColorStop(0.5,'#111822');fg.addColorStop(1,'#0c1018'); |
| X.beginPath();X.moveTo(fl[0],fl[1]);X.lineTo(fr[0],fr[1]);X.lineTo(fbr[0],fbr[1]);X.lineTo(fbl[0],fbl[1]);X.closePath();X.fillStyle=fg;X.fill(); |
| |
| X.strokeStyle='rgba(88,166,255,0.03)';X.lineWidth=0.5; |
| for(var gx=0;gx<=FW;gx+=2){var a=iso(gx,0,0),b=iso(gx,FD,0);X.beginPath();X.moveTo(a[0],a[1]);X.lineTo(b[0],b[1]);X.stroke()} |
| for(var gy=0;gy<=FD;gy+=2){var a=iso(0,gy,0),b=iso(FW,gy,0);X.beginPath();X.moveTo(a[0],a[1]);X.lineTo(b[0],b[1]);X.stroke()} |
| |
| X.strokeStyle='rgba(150,210,255,0.14)';X.lineWidth=2.5; |
| var pairs=[[10,12,25,12],[10,12,10,20],[25,12,25,20],[10,20,25,20]]; |
| pairs.forEach(function(p){var a=iso(p[0],p[1],0.02),b=iso(p[2],p[3],0.02);X.beginPath();X.moveTo(a[0],a[1]);X.lineTo(b[0],b[1]);X.stroke()}); |
| |
| var sy=(t*0.5)%FD;var sa=iso(0,sy,0),sb=iso(FW,sy,0); |
| X.strokeStyle='rgba(88,166,255,'+(0.04+0.02*Math.sin(t*2))+')';X.lineWidth=1;X.beginPath();X.moveTo(sa[0],sa[1]);X.lineTo(sb[0],sb[1]);X.stroke(); |
| } |
| function drawZones(){ |
| drawZoneFloor(10,2,14,10,'rgba(62,175,80,0.07)','rgba(62,175,80,0.22)','OPERATING ROOM'); |
| drawZoneFloor(25,14,14,14,'rgba(88,166,255,0.05)','rgba(88,166,255,0.18)','AMR CORRIDOR'); |
| drawZoneFloor(11,20,12,10,'rgba(227,179,65,0.05)','rgba(227,179,65,0.18)','DRONE PAD'); |
| drawZoneFloor(1,6,8,12,'rgba(188,140,255,0.05)','rgba(188,140,255,0.18)','REHAB WING'); |
| } |
| function drawZoneFloor(zx,zy,zw,zd,fillC,borderC,label){ |
| var a=iso(zx,zy,0),b=iso(zx+zw,zy,0),c=iso(zx+zw,zy+zd,0),d=iso(zx,zy+zd,0); |
| X.beginPath();X.moveTo(a[0],a[1]);X.lineTo(b[0],b[1]);X.lineTo(c[0],c[1]);X.lineTo(d[0],d[1]);X.closePath(); |
| X.fillStyle=fillC;X.fill();X.strokeStyle=borderC;X.lineWidth=1.2;X.setLineDash([5,4]);X.stroke();X.setLineDash([]); |
| var p=iso(zx+zw/2,zy+zd/2,0);X.font='bold '+Math.max(8,10*eCamZ)+'px system-ui';X.textAlign='center'; |
| X.fillStyle=borderC.replace(/[\d.]+\)/,'0.55)');X.fillText(label,p[0],p[1]); |
| } |
| function drawHospitalDetails(t){ |
| |
| var crosses=[[17,7,'rgba(62,175,80,'],[5,12,'rgba(188,140,255,'],[32,21,'rgba(88,166,255,']]; |
| crosses.forEach(function(cr){ |
| var p=iso(cr[0],cr[1],0.03);var sz=8*eCamZ; |
| var alpha=0.35+0.15*Math.sin(t*2); |
| X.fillStyle=cr[2]+alpha+')'; |
| X.fillRect(p[0]-sz*0.12,p[1]-sz*0.45,sz*0.24,sz*0.9); |
| X.fillRect(p[0]-sz*0.45,p[1]-sz*0.12,sz*0.9,sz*0.24); |
| }); |
| |
| X.font='bold '+Math.max(8,10*eCamZ)+'px system-ui';X.textAlign='center'; |
| var signs=[ |
| [12,3,2.3,'OR-1','rgba(255,255,255,0.35)'], |
| [20,3,2.3,'OR-2','rgba(255,255,255,0.35)'], |
| [3,7,2.3,'REHAB-A','rgba(188,140,255,0.4)'], |
| [7,7,2.3,'REHAB-B','rgba(188,140,255,0.4)'] |
| ]; |
| signs.forEach(function(s){var p=iso(s[0],s[1],s[2]);X.fillStyle=s[4];X.fillText(s[3],p[0],p[1])}); |
| |
| var rxp=iso(28,15,2); |
| X.font='bold '+Math.max(9,12*eCamZ)+'px system-ui'; |
| X.fillStyle='rgba(62,175,80,0.6)';X.fillText('\u2695 Rx PHARMACY',rxp[0],rxp[1]); |
| |
| var exp=iso(37,27,2.2); |
| X.fillStyle='rgba(62,175,80,0.55)';X.font='bold '+Math.max(8,10*eCamZ)+'px system-ui'; |
| X.fillText('EXIT \u2192',exp[0],exp[1]); |
| |
| var icup=iso(33,15,2); |
| X.fillStyle='rgba(255,107,107,0.45)';X.fillText('ICU \u2191',icup[0],icup[1]); |
| |
| var doors=[[16,12],[9,11],[24,8]]; |
| doors.forEach(function(d){ |
| var pb=iso(d[0],d[1],0),pt=iso(d[0],d[1],2); |
| X.strokeStyle='rgba(130,210,255,0.25)';X.lineWidth=2.5; |
| X.beginPath();X.moveTo(pb[0]-6*eCamZ,pb[1]);X.lineTo(pt[0]-6*eCamZ,pt[1]);X.lineTo(pt[0]+6*eCamZ,pt[1]);X.lineTo(pb[0]+6*eCamZ,pb[1]);X.stroke(); |
| |
| var lg=X.createRadialGradient(pb[0],pb[1],0,pb[0],pb[1],20*eCamZ); |
| lg.addColorStop(0,'rgba(130,210,255,0.04)');lg.addColorStop(1,'transparent'); |
| X.fillStyle=lg;X.beginPath();X.arc(pb[0],pb[1],20*eCamZ,0,Math.PI*2);X.fill(); |
| }); |
| } |
| function drawWalls(){ |
| drawWall(0,0,FW,0,3.5,'rgba(20,28,40,0.75)','rgba(15,22,35,0.8)'); |
| drawWall(0,0,0,FD,3.5,'rgba(18,25,38,0.75)','rgba(12,18,30,0.8)'); |
| drawWall(10,12,24,12,2.2,'rgba(22,30,42,0.45)','rgba(16,24,36,0.5)'); |
| drawWall(24,2,24,12,2.2,'rgba(20,28,40,0.45)','rgba(14,22,34,0.5)'); |
| drawWall(9,6,9,18,2.2,'rgba(22,30,42,0.35)','rgba(16,24,36,0.4)'); |
| } |
| function drawWall(x1,y1,x2,y2,h,fC,eC){ |
| var a=iso(x1,y1,0),b=iso(x2,y2,0),at=iso(x1,y1,h),bt=iso(x2,y2,h); |
| X.beginPath();X.moveTo(a[0],a[1]);X.lineTo(b[0],b[1]);X.lineTo(bt[0],bt[1]);X.lineTo(at[0],at[1]);X.closePath(); |
| var g=X.createLinearGradient(a[0],a[1],at[0],at[1]);g.addColorStop(0,eC);g.addColorStop(0.5,fC);g.addColorStop(1,eC); |
| X.fillStyle=g;X.fill();X.strokeStyle='rgba(88,166,255,0.04)';X.lineWidth=0.4;X.stroke(); |
| } |
| function drawEquipment(t){ |
| drawIsoBox(17,7,0,3,1.2,0.8,'#283848','#1e2e3e','#233240',1); |
| drawIsoBox(17,7,0.8,2.8,1.0,0.05,'rgba(62,175,80,0.2)','rgba(50,140,65,0.2)','rgba(55,155,70,0.2)',1); |
| drawIsoBox(14.5,8.5,0,0.7,1.3,0.5,'#384050','#2c3444','#303a4a',1); |
| drawIsoBox(20,5,0,0.9,0.7,1.5,'#2e3845','#242e3a','#283240',1); |
| var asp=iso(20,4.6,1.1);X.fillStyle='rgba(8,12,20,0.8)';X.fillRect(asp[0]-7,asp[1]-5,14,10); |
| X.strokeStyle='rgba(62,175,80,0.5)';X.lineWidth=0.7;X.beginPath();for(var i=0;i<14;i++){var yy=asp[1]+Math.sin(t*3+i*0.5)*2;i===0?X.moveTo(asp[0]-7+i,yy):X.lineTo(asp[0]-7+i,yy)}X.stroke(); |
| var ivp=iso(15.5,5.5,0);X.strokeStyle='rgba(160,180,200,0.3)';X.lineWidth=1;X.beginPath();X.moveTo(ivp[0],ivp[1]);X.lineTo(ivp[0],ivp[1]-35*eCamZ);X.stroke(); |
| X.fillStyle='rgba(200,220,240,0.1)';X.beginPath();X.ellipse(ivp[0],ivp[1]-37*eCamZ,3*eCamZ,5*eCamZ,0,0,Math.PI*2);X.fill(); |
| for(var li=0;li<2;li++){var lx=16+li*2.5;var lbp=iso(lx,7,3.5);X.beginPath();X.ellipse(lbp[0],lbp[1],9*eCamZ,4.5*eCamZ,0,0,Math.PI*2);X.strokeStyle='rgba(255,255,255,0.1)';X.lineWidth=1;X.stroke();var lcg=X.createRadialGradient(lbp[0],lbp[1],2,lbp[0],lbp[1],40*eCamZ);lcg.addColorStop(0,'rgba(255,250,230,0.05)');lcg.addColorStop(1,'transparent');X.fillStyle=lcg;X.beginPath();X.arc(lbp[0],lbp[1],40*eCamZ,0,Math.PI*2);X.fill()} |
| drawIsoBox(20.5,9,0,0.35,0.5,1.0,'#1a2230','#141c28','#182028',1); |
| var vsp=iso(20.5,8.7,0.7);X.fillStyle='rgba(8,12,20,0.8)';X.fillRect(vsp[0]-7,vsp[1]-5,14,10); |
| X.strokeStyle='rgba(62,175,80,0.5)';X.lineWidth=0.6;X.beginPath();for(var i=0;i<14;i++){var yy=vsp[1]-2+Math.sin(t*4+i*0.6)*2;i===0?X.moveTo(vsp[0]-7+i,yy):X.lineTo(vsp[0]-7+i,yy)}X.stroke(); |
| for(var ci=0;ci<3;ci++){var cx=27+ci*4,cy=16;drawIsoBox(cx,cy,0,0.5,0.5,0.6,'#2a3342','#1e2736','#232d3c',1);var clp=iso(cx,cy-0.3,0.5);X.fillStyle=ci===0?'rgba(62,175,80,0.5)':'rgba(227,179,65,0.35)';X.beginPath();X.arc(clp[0],clp[1],2*eCamZ,0,Math.PI*2);X.fill()} |
| drawIsoBox(37,18,0,0.5,2.5,1.6,'#242e3a','#1c2630','#202a36',1); |
| X.setLineDash([5,4]);X.strokeStyle='rgba(88,166,255,0.08)';X.lineWidth=1; |
| var la=iso(26,18,0.01),lb=iso(38,18,0.01);X.beginPath();X.moveTo(la[0],la[1]);X.lineTo(lb[0],lb[1]);X.stroke(); |
| la=iso(26,24,0.01);lb=iso(38,24,0.01);X.beginPath();X.moveTo(la[0],la[1]);X.lineTo(lb[0],lb[1]);X.stroke();X.setLineDash([]); |
| for(var pi=0;pi<3;pi++){var px=13+pi*3.5,py=24;var pdp=iso(px,py,0.01);X.beginPath();X.ellipse(pdp[0],pdp[1],12*eCamZ,6*eCamZ,0,0,Math.PI*2);X.strokeStyle='rgba(227,179,65,0.22)';X.lineWidth=1;X.stroke();X.font='bold '+Math.max(6,8*eCamZ)+'px system-ui';X.textAlign='center';X.fillStyle='rgba(227,179,65,0.18)';X.fillText('H',pdp[0],pdp[1]+2*eCamZ)} |
| for(var bi=0;bi<4;bi++){var blp=iso(12+bi*2.5,20.5,0.01);X.fillStyle='rgba(227,179,65,'+(0.12+0.15*Math.sin(t*3+bi*1.5))+')';X.beginPath();X.arc(blp[0],blp[1],2*eCamZ,0,Math.PI*2);X.fill()} |
| X.strokeStyle='rgba(160,170,185,0.25)';X.lineWidth=1.2; |
| for(var pp=0;pp<3;pp++){var ppx=3+pp*2;var pa=iso(ppx,10,0),pb=iso(ppx,10,0.8);X.beginPath();X.moveTo(pa[0],pa[1]);X.lineTo(pb[0],pb[1]);X.stroke();var pa2=iso(ppx,11.5,0),pb2=iso(ppx,11.5,0.8);X.beginPath();X.moveTo(pa2[0],pa2[1]);X.lineTo(pb2[0],pb2[1]);X.stroke()} |
| var r1=iso(3,10,0.8),r2=iso(7,10,0.8);X.beginPath();X.moveTo(r1[0],r1[1]);X.lineTo(r2[0],r2[1]);X.stroke(); |
| var r3=iso(3,11.5,0.8),r4=iso(7,11.5,0.8);X.beginPath();X.moveTo(r3[0],r3[1]);X.lineTo(r4[0],r4[1]);X.stroke(); |
| drawIsoBox(5,15,0,2,0.9,0.22,'#2a3342','#1e2736','#232d3c',1);drawIsoBox(3,17,0,0.6,0.6,0.9,'#1e2736','#182030','#1c2634',1); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function drawDaVinciXi(t){ |
| var bx=17,by=7; |
| botScreenPos.surgical=iso(bx,by,2.5); |
| var st=D.surgical; |
| var nArms=Math.min(D.n_arms||4,4); |
| |
| |
| drawIsoBox(bx,by,5,1.6,1.6,0.1,'rgba(95,108,130,0.55)','rgba(70,82,105,0.55)','rgba(82,95,118,0.55)',1); |
| |
| var boomP=iso(bx-0.3,by-0.3,5.12); |
| X.fillStyle='rgba(255,255,255,0.12)';X.beginPath();X.ellipse(boomP[0],boomP[1],6*eCamZ,3*eCamZ,0.5,0,Math.PI*2);X.fill(); |
| |
| var colT=iso(bx,by,5),colB=iso(bx,by,2.6); |
| var colGrad=X.createLinearGradient(colT[0],colT[1],colB[0],colB[1]); |
| colGrad.addColorStop(0,'rgba(145,160,185,0.5)');colGrad.addColorStop(0.5,'rgba(100,115,140,0.4)');colGrad.addColorStop(1,'rgba(130,145,170,0.45)'); |
| X.strokeStyle=colGrad;X.lineWidth=6*eCamZ;X.beginPath();X.moveTo(colT[0],colT[1]);X.lineTo(colB[0],colB[1]);X.stroke(); |
| |
| X.strokeStyle='rgba(200,215,235,0.12)';X.lineWidth=1.2*eCamZ; |
| X.beginPath();X.moveTo(colT[0]-2*eCamZ,colT[1]);X.lineTo(colB[0]-2*eCamZ,colB[1]);X.stroke(); |
| |
| drawIsoBox(bx,by,2.4,2.2,2.2,0.12,'rgba(105,118,140,0.55)','rgba(82,95,118,0.55)','rgba(92,106,128,0.55)',1); |
| |
| var bpP=iso(bx-0.5,by-0.3,2.54); |
| X.fillStyle='rgba(255,255,255,0.08)';X.beginPath();X.ellipse(bpP[0],bpP[1],8*eCamZ,4*eCamZ,0.5,0,Math.PI*2);X.fill(); |
| |
| for(var li=0;li<4;li++){ |
| var la=li*Math.PI*2/4;var lxp=iso(bx+Math.cos(la)*0.6,by+Math.sin(la)*0.6,5.1); |
| var ledAlpha=0.5+0.25*Math.sin(t*2+li); |
| |
| var ledG=X.createRadialGradient(lxp[0],lxp[1],0,lxp[0],lxp[1],8*eCamZ); |
| ledG.addColorStop(0,['rgba(255,107,107,','rgba(255,135,135,','rgba(255,82,82,','rgba(255,64,64,'][li]+ledAlpha*0.3+')'); |
| ledG.addColorStop(1,'transparent'); |
| X.fillStyle=ledG;X.beginPath();X.arc(lxp[0],lxp[1],8*eCamZ,0,Math.PI*2);X.fill(); |
| |
| X.fillStyle=['#ff6b6b','#ff8787','#ff5252','#ff4040'][li];X.globalAlpha=ledAlpha; |
| X.beginPath();X.arc(lxp[0],lxp[1],2.2*eCamZ,0,Math.PI*2);X.fill(); |
| |
| X.fillStyle='rgba(255,220,220,'+ledAlpha*0.6+')'; |
| X.beginPath();X.arc(lxp[0],lxp[1],0.8*eCamZ,0,Math.PI*2);X.fill(); |
| X.globalAlpha=1; |
| } |
| |
| var armColors=['#ff6b6b','#ff8787','#ff5252','#ff4040']; |
| var armAngles=[];for(var _aa=0;_aa<nArms;_aa++)armAngles.push(_aa*Math.PI*2/nArms); |
| |
| for(var ai=0;ai<nArms;ai++){ |
| |
| |
| var freq1=0.15+ai*0.03; |
| var freq2=0.11+ai*0.025; |
| var freq3=0.08+ai*0.02; |
| |
| |
| var reachX=Math.sin(t*freq1+ai*1.5)*2.8+Math.cos(t*freq2+ai*2.1)*1.2; |
| var reachY=Math.cos(t*freq1+ai*1.8)*2.5+Math.sin(t*freq3+ai*0.7)*1.0; |
| var reachZ=0.4+Math.sin(t*freq2+ai*0.9)*0.5+0.3*Math.cos(t*freq3+ai*1.3); |
| |
| |
| var sa=armAngles[ai]; |
| var sx=bx+Math.cos(sa)*0.9,sy=by+Math.sin(sa)*0.9,sz=2.4; |
| |
| |
| var ex=bx+reachX; |
| var ey=by+reachY; |
| var ez=reachZ; |
| |
| |
| var L1=1.3,L2=1.1; |
| var dx=ex-sx,dy=ey-sy,dz=ez-sz; |
| var dist=Math.sqrt(dx*dx+dy*dy+dz*dz); |
| dist=Math.min(dist,L1+L2-0.02); |
| dist=Math.max(dist,Math.abs(L1-L2)+0.02); |
| |
| |
| var cosQ2=(dist*dist-L1*L1-L2*L2)/(2*L1*L2); |
| cosQ2=Math.max(-1,Math.min(1,cosQ2)); |
| var q2=Math.acos(cosQ2); |
| var ratio=dist/(L1+L2); |
| |
| |
| var elbowOffset=Math.sin(q2)*0.5; |
| var perpX=-dy/Math.max(dist,0.01)*elbowOffset; |
| var perpY=dx/Math.max(dist,0.01)*elbowOffset; |
| var mx=sx+dx*(L1/(L1+L2))+perpX; |
| var my2=sy+dy*(L1/(L1+L2))+perpY; |
| var mz=(sz+ez)/2+0.3*elbowOffset; |
| |
| |
| var up=iso(sx,sy,sz); |
| var mp=iso(mx,my2,mz); |
| var ep=iso(ex,ey,ez); |
| |
| |
| X.strokeStyle='rgba(185,200,220,0.6)';X.lineWidth=5*eCamZ;X.lineCap='round'; |
| X.beginPath();X.moveTo(up[0],up[1]);X.lineTo(mp[0],mp[1]);X.stroke(); |
| |
| X.strokeStyle='rgba(220,230,245,0.15)';X.lineWidth=1.2*eCamZ; |
| X.beginPath();X.moveTo(up[0]-1.5*eCamZ,up[1]-0.8*eCamZ);X.lineTo(mp[0]-1.5*eCamZ,mp[1]-0.8*eCamZ);X.stroke(); |
| |
| |
| X.fillStyle='rgba(130,145,168,0.7)'; |
| X.beginPath();X.arc(mp[0],mp[1],3.5*eCamZ,0,Math.PI*2);X.fill(); |
| X.fillStyle='rgba(255,255,255,0.12)'; |
| X.beginPath();X.arc(mp[0]-1*eCamZ,mp[1]-1*eCamZ,1.2*eCamZ,0,Math.PI*2);X.fill(); |
| |
| |
| X.strokeStyle='rgba(170,185,208,0.55)';X.lineWidth=4.2*eCamZ;X.lineCap='round'; |
| X.beginPath();X.moveTo(mp[0],mp[1]);X.lineTo(ep[0],ep[1]);X.stroke(); |
| X.strokeStyle='rgba(215,225,240,0.12)';X.lineWidth=1*eCamZ; |
| X.beginPath();X.moveTo(mp[0]-1.3*eCamZ,mp[1]-0.6*eCamZ);X.lineTo(ep[0]-1.3*eCamZ,ep[1]-0.6*eCamZ);X.stroke(); |
| |
| |
| X.strokeStyle='rgba(88,166,255,0.1)';X.lineWidth=0.6;X.setLineDash([2,3]); |
| X.beginPath();X.moveTo(up[0]+2,up[1]-1);X.lineTo(mp[0]+2,mp[1]-1);X.lineTo(ep[0]+2,ep[1]-1);X.stroke();X.setLineDash([]); |
| |
| |
| var jawAngle=0.15+0.12*Math.sin(t*1.5+ai*1.1); |
| var wristAngle=Math.atan2(ep[1]-mp[1],ep[0]-mp[0]); |
| var jl=7*eCamZ; |
| |
| X.strokeStyle=armColors[ai];X.lineWidth=2.5*eCamZ;X.lineCap='round'; |
| var jaw1x=ep[0]+Math.cos(wristAngle+jawAngle)*jl,jaw1y=ep[1]+Math.sin(wristAngle+jawAngle)*jl; |
| var jaw2x=ep[0]+Math.cos(wristAngle-jawAngle)*jl,jaw2y=ep[1]+Math.sin(wristAngle-jawAngle)*jl; |
| X.beginPath();X.moveTo(ep[0],ep[1]);X.lineTo(jaw1x,jaw1y);X.stroke(); |
| X.beginPath();X.moveTo(ep[0],ep[1]);X.lineTo(jaw2x,jaw2y);X.stroke(); |
| |
| X.fillStyle=armColors[ai];X.globalAlpha=0.8; |
| X.beginPath();X.arc(jaw1x,jaw1y,1.5*eCamZ,0,Math.PI*2);X.fill(); |
| X.beginPath();X.arc(jaw2x,jaw2y,1.5*eCamZ,0,Math.PI*2);X.fill(); |
| X.globalAlpha=1; |
| |
| |
| X.fillStyle=armColors[ai]+'aa'; |
| X.beginPath();X.arc(ep[0],ep[1],3*eCamZ,0,Math.PI*2);X.fill(); |
| X.strokeStyle='rgba(255,255,255,0.15)';X.lineWidth=0.8*eCamZ; |
| X.beginPath();X.arc(ep[0],ep[1],3*eCamZ,0,Math.PI*2);X.stroke(); |
| |
| |
| var forceIntensity=0.3+0.4*Math.abs(Math.sin(t*freq1*3+ai*2)); |
| var fGlow=X.createRadialGradient(ep[0],ep[1],0,ep[0],ep[1],14*eCamZ*forceIntensity); |
| fGlow.addColorStop(0,armColors[ai]+'55');fGlow.addColorStop(1,'transparent'); |
| X.fillStyle=fGlow;X.beginPath();X.arc(ep[0],ep[1],14*eCamZ*forceIntensity,0,Math.PI*2);X.fill(); |
| } |
| |
| |
| var lightP=iso(bx,by,2.4); |
| var lightGrad=X.createRadialGradient(lightP[0],lightP[1]-5*eCamZ,0,lightP[0],lightP[1],40*eCamZ); |
| lightGrad.addColorStop(0,'rgba(255,240,220,0.06)');lightGrad.addColorStop(0.5,'rgba(255,235,210,0.02)');lightGrad.addColorStop(1,'transparent'); |
| X.fillStyle=lightGrad;X.beginPath();X.arc(lightP[0],lightP[1],40*eCamZ,0,Math.PI*2);X.fill(); |
| |
| |
| var phaseN=Math.floor((t*0.5)%6)+1; |
| document.getElementById('hS').textContent='Phase '+phaseN+'/6 | '+D.surg_speedup.toFixed(1)+'x'; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function drawAMRFleet(t){ |
| var stations=D.amr_stations||[];var nBots=Math.min(D.n_amr||3,stations.length); |
| |
| |
| stations.forEach(function(s,i){ |
| var sx=s.x,sy=s.y;var sp=iso(sx,sy,0); |
| drawIsoBox(sx-0.2,sy-0.2,0,0.4,0.4,0.06,'rgba(88,166,255,0.1)','rgba(88,166,255,0.07)','rgba(88,166,255,0.08)',1); |
| X.font=Math.max(5,6.5*eCamZ)+'px system-ui';X.textAlign='center'; |
| X.fillStyle='rgba(88,166,255,0.35)';X.fillText(s.name||'S'+(i+1),sp[0],sp[1]+8*eCamZ); |
| }); |
| |
| var bestBotPos=[0,0]; |
| |
| for(var bi=0;bi<nBots;bi++){ |
| |
| var cycleDur=18+bi*3; |
| var totalCycle=t/cycleDur+bi*0.35; |
| var segIndex=Math.floor(totalCycle)%stations.length; |
| var segProgress=totalCycle-Math.floor(totalCycle); |
| |
| var from=stations[segIndex]; |
| var to=stations[(segIndex+1)%stations.length]; |
| if(!from||!to)continue; |
| |
| var x1=from.x, y1=from.y; |
| var x2=to.x, y2=to.y; |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| var sp; |
| var vel; |
| if(segProgress < 0.25){ |
| sp = 2*segProgress*segProgress; |
| vel = 4*segProgress; |
| } else if(segProgress < 0.75){ |
| sp = 0.125 + (segProgress-0.25)*1.5; |
| vel = 1.0; |
| } else { |
| var remaining = 1-segProgress; |
| sp = 1 - 2*remaining*remaining; |
| vel = 4*remaining; |
| } |
| |
| |
| var pathCurve = Math.sin(sp*Math.PI)*1.0; |
| var perpX = -(y2-y1)/Math.max(Math.hypot(x2-x1,y2-y1),0.1); |
| var perpY = (x2-x1)/Math.max(Math.hypot(x2-x1,y2-y1),0.1); |
| |
| var bx = x1+(x2-x1)*sp + perpX*pathCurve; |
| var by2 = y1+(y2-y1)*sp + perpY*pathCurve; |
| |
| if(bi===0) bestBotPos=iso(bx,by2,0.3); |
| |
| |
| drawIsoBox(bx,by2,0,0.8,0.55,0.28,'rgba(52,68,98,0.8)','rgba(38,52,78,0.8)','rgba(45,60,88,0.8)',1); |
| |
| var dl1=iso(bx-0.4,by2-0.27,0.14),dl2=iso(bx+0.4,by2-0.27,0.14); |
| X.strokeStyle='rgba(25,35,55,0.5)';X.lineWidth=1;X.beginPath();X.moveTo(dl1[0],dl1[1]);X.lineTo(dl2[0],dl2[1]);X.stroke(); |
| |
| var dh1=iso(bx,by2-0.27,0.2),dh2=iso(bx,by2-0.27,0.08); |
| X.fillStyle='rgba(88,166,255,0.3)';X.beginPath();X.arc(dh1[0],dh1[1],1.2*eCamZ,0,Math.PI*2);X.fill(); |
| X.beginPath();X.arc(dh2[0],dh2[1],1.2*eCamZ,0,Math.PI*2);X.fill(); |
| |
| var bp1=iso(bx-0.42,by2-0.28,0.02),bp2=iso(bx+0.42,by2-0.28,0.02); |
| X.strokeStyle='rgba(88,166,255,0.25)';X.lineWidth=2.5*eCamZ;X.lineCap='round'; |
| X.beginPath();X.moveTo(bp1[0],bp1[1]);X.lineTo(bp2[0],bp2[1]);X.stroke(); |
| |
| var chSp=iso(bx-0.15,by2-0.2,0.28); |
| X.fillStyle='rgba(255,255,255,0.07)';X.beginPath();X.ellipse(chSp[0],chSp[1],5*eCamZ,3*eCamZ,0.3,0,Math.PI*2);X.fill(); |
| |
| drawIsoBox(bx,by2,0.28,0.6,0.45,0.02,'rgba(60,78,108,0.55)','rgba(48,62,88,0.55)','rgba(54,70,98,0.55)',1); |
| |
| |
| var wheelRot = t*vel*5+bi; |
| var wOff=[[-0.32,-0.24],[0.32,-0.24],[-0.32,0.24],[0.32,0.24]]; |
| wOff.forEach(function(wo){ |
| var wp=iso(bx+wo[0],by2+wo[1],0.04); |
| |
| X.fillStyle='rgba(28,32,42,0.8)';X.beginPath();X.ellipse(wp[0],wp[1],4*eCamZ,2.3*eCamZ,0,0,Math.PI*2);X.fill(); |
| X.strokeStyle='rgba(90,100,118,0.4)';X.lineWidth=0.8;X.stroke(); |
| |
| X.fillStyle='rgba(65,78,100,0.6)';X.beginPath();X.ellipse(wp[0],wp[1],2*eCamZ,1.1*eCamZ,0,0,Math.PI*2);X.fill(); |
| |
| X.fillStyle='rgba(255,255,255,0.1)';X.beginPath();X.ellipse(wp[0]-0.5*eCamZ,wp[1]-0.3*eCamZ,0.8*eCamZ,0.5*eCamZ,0,0,Math.PI*2);X.fill(); |
| |
| X.strokeStyle='rgba(130,142,160,0.4)';X.lineWidth=0.7; |
| X.beginPath();X.moveTo(wp[0]-2.5*eCamZ*Math.cos(wheelRot),wp[1]-1.3*eCamZ*Math.sin(wheelRot)); |
| X.lineTo(wp[0]+2.5*eCamZ*Math.cos(wheelRot),wp[1]+1.3*eCamZ*Math.sin(wheelRot));X.stroke(); |
| }); |
| |
| |
| var lp=iso(bx,by2,0.4); |
| |
| X.fillStyle='rgba(55,68,95,0.7)';X.beginPath();X.ellipse(lp[0],lp[1],5*eCamZ,2.5*eCamZ,0,0,Math.PI*2);X.fill(); |
| |
| var domeG=X.createRadialGradient(lp[0]-1.5*eCamZ,lp[1]-1*eCamZ,0,lp[0],lp[1],5*eCamZ); |
| domeG.addColorStop(0,'rgba(120,160,220,0.2)');domeG.addColorStop(0.6,'rgba(70,100,150,0.1)');domeG.addColorStop(1,'rgba(50,70,110,0.05)'); |
| X.fillStyle=domeG;X.beginPath();X.ellipse(lp[0],lp[1]-1.5*eCamZ,4.5*eCamZ,3*eCamZ,0,0,Math.PI*2);X.fill(); |
| |
| X.fillStyle='rgba(255,255,255,0.15)';X.beginPath();X.ellipse(lp[0]-1.5*eCamZ,lp[1]-2*eCamZ,1.5*eCamZ,1*eCamZ,0.3,0,Math.PI*2);X.fill(); |
| |
| var scanA=t*6+bi*1.5; |
| X.strokeStyle='rgba(88,166,255,0.65)';X.lineWidth=1.8; |
| X.beginPath();X.moveTo(lp[0],lp[1]); |
| var scanEnd=iso(bx+Math.cos(scanA)*2.2,by2+Math.sin(scanA)*2.2,0.4); |
| X.lineTo(scanEnd[0],scanEnd[1]);X.stroke(); |
| |
| X.strokeStyle='rgba(88,166,255,0.12)';X.lineWidth=6; |
| X.beginPath();X.moveTo(lp[0],lp[1]);X.lineTo(scanEnd[0],scanEnd[1]);X.stroke(); |
| |
| for(var ri=0;ri<16;ri++){ |
| var ra=scanA+ri*Math.PI*2/16; |
| var rr=1.8+Math.sin(ra*2+t)*0.5; |
| var rp=iso(bx+Math.cos(ra)*rr*0.18,by2+Math.sin(ra)*rr*0.18,0.4); |
| X.strokeStyle='rgba(88,166,255,'+(0.07+0.05*Math.sin(t*3+ri))+')';X.lineWidth=0.5; |
| X.beginPath();X.moveTo(lp[0],lp[1]);X.lineTo(rp[0],rp[1]);X.stroke(); |
| } |
| |
| |
| var slp=iso(bx+0.4,by2,0.28); |
| var sCol=vel>0.5?[62,175,80]:[227,179,65]; |
| var sAlpha=vel>0.5?0.6:0.5; |
| |
| var slG=X.createRadialGradient(slp[0],slp[1],0,slp[0],slp[1],7*eCamZ); |
| slG.addColorStop(0,'rgba('+sCol.join(',')+','+sAlpha*0.35+')');slG.addColorStop(1,'transparent'); |
| X.fillStyle=slG;X.beginPath();X.arc(slp[0],slp[1],7*eCamZ,0,Math.PI*2);X.fill(); |
| |
| X.fillStyle='rgba('+sCol.join(',')+','+sAlpha+')'; |
| X.beginPath();X.arc(slp[0],slp[1],2.2*eCamZ,0,Math.PI*2);X.fill(); |
| |
| X.fillStyle='rgba(255,255,255,'+sAlpha*0.35+')'; |
| X.beginPath();X.arc(slp[0],slp[1],0.9*eCamZ,0,Math.PI*2);X.fill(); |
| |
| |
| X.strokeStyle='rgba(88,166,255,0.04)';X.lineWidth=1;X.setLineDash([3,3]); |
| var trailP=Math.max(0,sp-0.15); |
| var tx1=x1+(x2-x1)*trailP,ty1=y1+(y2-y1)*trailP; |
| var tp1=iso(tx1,ty1,0.01),tp2=iso(bx,by2,0.01); |
| X.beginPath();X.moveTo(tp1[0],tp1[1]);X.lineTo(tp2[0],tp2[1]);X.stroke();X.setLineDash([]); |
| } |
| |
| botScreenPos.amr=bestBotPos; |
| document.getElementById('hA').textContent=nBots+' bots | '+D.amr_speedup.toFixed(1)+'x throughput'; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function drawDrones(t){ |
| var missions=D.drone_missions||[];var nD=Math.min(D.n_drones||3,missions.length); |
| var bestPos=[0,0]; |
| |
| for(var di=0;di<nD;di++){ |
| var m=missions[di];if(!m)continue; |
| |
| |
| var flightDur=22+di*3.5; |
| var progress=(t/flightDur+di*0.2)%1.0; |
| |
| |
| var sx0=13+m.sx*0.15, sy0=22+m.sy*0.1; |
| var dx0=13+m.dx*0.15, dy0=22+m.dy*0.1; |
| |
| |
| var cpx=(sx0+dx0)/2+Math.sin(di*1.8+0.5)*3; |
| var cpy=(sy0+dy0)/2+Math.cos(di*1.3+0.8)*3; |
| |
| |
| |
| |
| |
| |
| |
| |
| var pathT; |
| var alt; |
| |
| if(progress<0.10){ |
| |
| pathT=0; |
| alt=0.3+progress/0.10*1.5; |
| } else if(progress<0.20){ |
| |
| pathT=(progress-0.10)/0.10*0.05; |
| alt=1.8+(progress-0.10)/0.10*2.7; |
| } else if(progress<0.80){ |
| |
| pathT=0.05+(progress-0.20)/0.60*0.90; |
| alt=4.5+Math.sin(t*1.5+di*0.7)*0.35; |
| } else if(progress<0.90){ |
| |
| pathT=0.95+(progress-0.80)/0.10*0.05; |
| alt=4.5-(progress-0.80)/0.10*3.0; |
| } else { |
| |
| pathT=1.0; |
| alt=1.5-(progress-0.90)/0.10*1.2; |
| } |
| |
| alt=Math.max(0.2,alt); |
| |
| |
| var bt=pathT; |
| var fx=sx0*(1-bt)*(1-bt)+cpx*2*bt*(1-bt)+dx0*bt*bt; |
| var fy=sy0*(1-bt)*(1-bt)+cpy*2*bt*(1-bt)+dy0*bt*bt; |
| |
| var dronePos=iso(fx,fy,alt); |
| if(di===0) bestPos=dronePos; |
| |
| |
| var gp=iso(fx,fy,0); |
| var shadowScale=Math.max(0,1-alt/8); |
| var sR=12*eCamZ*shadowScale; |
| if(sR>1){ |
| X.globalAlpha=0.08*shadowScale;X.fillStyle='#000'; |
| X.beginPath();X.ellipse(gp[0],gp[1],sR,sR*0.5,0,0,Math.PI*2);X.fill(); |
| X.globalAlpha=1; |
| } |
| |
| |
| if(alt<2.5){ |
| var dwIntensity=(2.5-alt)/2.5; |
| X.globalAlpha=0.04*dwIntensity; |
| X.strokeStyle='rgba(227,179,65,0.3)';X.lineWidth=0.5; |
| for(var dw=0;dw<3;dw++){ |
| var dwR=(2.5-alt)*10*eCamZ*(0.4+dw*0.3)+Math.sin(t*6+dw*2)*2; |
| X.beginPath();X.ellipse(gp[0],gp[1],dwR,dwR*0.5,0,0,Math.PI*2);X.stroke(); |
| } |
| X.globalAlpha=1; |
| } |
| |
| |
| var aLen=9*eCamZ; |
| var droneArms=[[1,1],[-1,1],[-1,-1],[1,-1]]; |
| |
| |
| var wSpan=aLen*0.7; |
| X.fillStyle='rgba(58,72,100,0.5)';X.beginPath(); |
| X.moveTo(dronePos[0]-wSpan*COS_I,dronePos[1]+wSpan*0.08*SIN_I); |
| X.lineTo(dronePos[0]-wSpan*0.15*COS_I,dronePos[1]-wSpan*0.25*SIN_I); |
| X.lineTo(dronePos[0]+wSpan*COS_I,dronePos[1]-wSpan*0.08*SIN_I); |
| X.lineTo(dronePos[0]+wSpan*0.15*COS_I,dronePos[1]+wSpan*0.25*SIN_I); |
| X.closePath();X.fill(); |
| |
| X.fillStyle='rgba(255,255,255,0.04)';X.beginPath(); |
| X.ellipse(dronePos[0]-wSpan*0.3,dronePos[1]-wSpan*0.05,wSpan*0.4,wSpan*0.08,0.2,0,Math.PI*2);X.fill(); |
| |
| |
| X.fillStyle='rgba(55,68,92,0.85)';X.beginPath(); |
| droneArms.forEach(function(a,i){ |
| var px=dronePos[0]+a[0]*aLen*0.22*COS_I-a[1]*aLen*0.22*COS_I; |
| var py=dronePos[1]+a[0]*aLen*0.11*SIN_I+a[1]*aLen*0.11*SIN_I; |
| i===0?X.moveTo(px,py):X.lineTo(px,py); |
| }); |
| X.closePath();X.fill(); |
| |
| X.fillStyle='rgba(255,255,255,0.06)';X.beginPath(); |
| X.ellipse(dronePos[0],dronePos[1]-1*eCamZ,aLen*0.15,aLen*0.06,0,0,Math.PI*2);X.fill(); |
| |
| |
| droneArms.forEach(function(a,i){ |
| var px=dronePos[0]+a[0]*aLen*0.55*COS_I-a[1]*aLen*0.55*COS_I; |
| var py=dronePos[1]+a[0]*aLen*0.27*SIN_I+a[1]*aLen*0.27*SIN_I; |
| |
| |
| X.strokeStyle='rgba(88,105,135,0.65)';X.lineWidth=2*eCamZ; |
| X.beginPath();X.moveTo(dronePos[0],dronePos[1]);X.lineTo(px,py);X.stroke(); |
| |
| X.strokeStyle='rgba(120,140,170,0.2)';X.lineWidth=0.6*eCamZ; |
| X.beginPath();X.moveTo(dronePos[0],dronePos[1]-0.5*eCamZ);X.lineTo(px,py-0.5*eCamZ);X.stroke(); |
| |
| |
| X.fillStyle='rgba(48,58,82,0.8)'; |
| X.beginPath();X.arc(px,py,3.2*eCamZ,0,Math.PI*2);X.fill(); |
| X.strokeStyle='rgba(100,118,148,0.4)';X.lineWidth=0.8;X.stroke(); |
| |
| X.fillStyle='rgba(255,255,255,0.1)'; |
| X.beginPath();X.arc(px-0.8*eCamZ,py-0.8*eCamZ,1*eCamZ,0,Math.PI*2);X.fill(); |
| |
| |
| X.globalAlpha=0.14+0.08*Math.sin(t*15+i*2); |
| X.fillStyle='rgba(210,228,248,0.45)'; |
| X.beginPath();X.ellipse(px,py-1.5*eCamZ,6.5*eCamZ,3*eCamZ,0,0,Math.PI*2);X.fill(); |
| |
| X.strokeStyle='rgba(180,200,230,0.15)';X.lineWidth=0.5; |
| X.beginPath();X.ellipse(px,py-1.5*eCamZ,6.5*eCamZ,3*eCamZ,0,0,Math.PI*2);X.stroke(); |
| X.globalAlpha=1; |
| }); |
| |
| |
| var navBlink=Math.sin(t*5+di)>0?1:0.15; |
| |
| var rpx=dronePos[0]-aLen*0.4,rpy=dronePos[1]; |
| var navRG=X.createRadialGradient(rpx,rpy,0,rpx,rpy,6*eCamZ); |
| navRG.addColorStop(0,'rgba(255,50,50,'+0.25*navBlink+')');navRG.addColorStop(1,'transparent'); |
| X.fillStyle=navRG;X.beginPath();X.arc(rpx,rpy,6*eCamZ,0,Math.PI*2);X.fill(); |
| X.fillStyle='rgba(255,50,50,'+0.7*navBlink+')';X.beginPath();X.arc(rpx,rpy,2*eCamZ,0,Math.PI*2);X.fill(); |
| |
| var gpx=dronePos[0]+aLen*0.4,gpy=dronePos[1]; |
| var navGG=X.createRadialGradient(gpx,gpy,0,gpx,gpy,6*eCamZ); |
| navGG.addColorStop(0,'rgba(50,255,50,'+0.25*navBlink+')');navGG.addColorStop(1,'transparent'); |
| X.fillStyle=navGG;X.beginPath();X.arc(gpx,gpy,6*eCamZ,0,Math.PI*2);X.fill(); |
| X.fillStyle='rgba(50,255,50,'+0.7*navBlink+')';X.beginPath();X.arc(gpx,gpy,2*eCamZ,0,Math.PI*2);X.fill(); |
| |
| if(Math.sin(t*8+di*3)>0.8){ |
| var stG=X.createRadialGradient(dronePos[0],dronePos[1]+2*eCamZ,0,dronePos[0],dronePos[1]+2*eCamZ,10*eCamZ); |
| stG.addColorStop(0,'rgba(255,255,255,0.3)');stG.addColorStop(1,'transparent'); |
| X.fillStyle=stG;X.beginPath();X.arc(dronePos[0],dronePos[1]+2*eCamZ,10*eCamZ,0,Math.PI*2);X.fill(); |
| X.fillStyle='rgba(255,255,255,0.7)';X.beginPath();X.arc(dronePos[0],dronePos[1]+2*eCamZ,1.5*eCamZ,0,Math.PI*2);X.fill(); |
| } |
| |
| |
| var pbY=dronePos[1]+2*eCamZ; |
| X.fillStyle='rgba(40,48,68,0.7)';X.beginPath(); |
| X.moveTo(dronePos[0]-2.5*eCamZ,pbY);X.lineTo(dronePos[0]+2.5*eCamZ,pbY); |
| X.lineTo(dronePos[0]+1.8*eCamZ,pbY+2.5*eCamZ);X.lineTo(dronePos[0]-1.8*eCamZ,pbY+2.5*eCamZ); |
| X.closePath();X.fill(); |
| |
| var pbCol=m.on_time?[62,175,80]:[255,107,107]; |
| var pbG=X.createRadialGradient(dronePos[0],pbY+1.2*eCamZ,0,dronePos[0],pbY+1.2*eCamZ,5*eCamZ); |
| pbG.addColorStop(0,'rgba('+pbCol.join(',')+',0.3)');pbG.addColorStop(1,'transparent'); |
| X.fillStyle=pbG;X.beginPath();X.arc(dronePos[0],pbY+1.2*eCamZ,5*eCamZ,0,Math.PI*2);X.fill(); |
| X.fillStyle='rgba('+pbCol.join(',')+',0.5)';X.beginPath();X.arc(dronePos[0],pbY+1.2*eCamZ,1.5*eCamZ,0,Math.PI*2);X.fill(); |
| |
| |
| X.strokeStyle=m.on_time?'rgba(62,175,80,0.07)':'rgba(255,107,107,0.06)'; |
| X.lineWidth=0.7;X.setLineDash([3,4]);X.beginPath(); |
| for(var pt=0;pt<=1;pt+=0.04){ |
| var ptx=sx0*(1-pt)*(1-pt)+cpx*2*pt*(1-pt)+dx0*pt*pt; |
| var pty=sy0*(1-pt)*(1-pt)+cpy*2*pt*(1-pt)+dy0*pt*pt; |
| var pp=iso(ptx,pty,3); |
| pt===0?X.moveTo(pp[0],pp[1]):X.lineTo(pp[0],pp[1]); |
| } |
| X.stroke();X.setLineDash([]); |
| } |
| |
| botScreenPos.drone=bestPos; |
| var onTime=missions.filter(function(m){return m&&m.on_time}).length; |
| document.getElementById('hD').textContent=onTime+'/'+missions.length+' on-time deliveries'; |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function drawExoskeleton(t){ |
| |
| var walkCycle=30; |
| var walkProgress=(t/walkCycle)%2; |
| var walkFrac=walkProgress<1?walkProgress:2-walkProgress; |
| |
| walkFrac=walkFrac*walkFrac*(3-2*walkFrac); |
| |
| var cx=2+walkFrac*6; |
| var cy=12; |
| |
| botScreenPos.exo=iso(cx,cy,1.5); |
| |
| |
| var gaitPeriod=4; |
| var gaitPhase=(t/gaitPeriod)%2; |
| var p=gaitPhase%1; |
| var legSide=gaitPhase<1?0:1; |
| |
| |
| var pelvisH=1.5+Math.sin(p*Math.PI)*0.06; |
| |
| |
| drawIsoBox(cx,cy,pelvisH,0.7,0.25,0.12,'rgba(158,118,218,0.55)','rgba(135,95,198,0.55)','rgba(148,108,210,0.55)',1); |
| |
| var pelSp=iso(cx-0.15,cy-0.08,pelvisH+0.12); |
| X.fillStyle='rgba(255,255,255,0.08)';X.beginPath();X.ellipse(pelSp[0],pelSp[1],4*eCamZ,2*eCamZ,0.3,0,Math.PI*2);X.fill(); |
| |
| var pLine1=iso(cx-0.25,cy,pelvisH+0.06),pLine2=iso(cx+0.25,cy,pelvisH+0.06); |
| X.strokeStyle='rgba(188,140,255,0.25)';X.lineWidth=0.8;X.beginPath();X.moveTo(pLine1[0],pLine1[1]);X.lineTo(pLine2[0],pLine2[1]);X.stroke(); |
| |
| |
| drawIsoBox(cx-0.06,cy+0.15,pelvisH+0.12,0.28,0.18,0.2,'rgba(55,68,90,0.65)','rgba(42,52,72,0.65)','rgba(48,60,80,0.65)',1); |
| var plp=iso(cx-0.06,cy+0.3,pelvisH+0.25); |
| |
| var pwrAlpha=0.45+0.25*Math.sin(t*3); |
| var pwrG=X.createRadialGradient(plp[0],plp[1],0,plp[0],plp[1],7*eCamZ); |
| pwrG.addColorStop(0,'rgba(62,175,80,'+pwrAlpha*0.35+')');pwrG.addColorStop(1,'transparent'); |
| X.fillStyle=pwrG;X.beginPath();X.arc(plp[0],plp[1],7*eCamZ,0,Math.PI*2);X.fill(); |
| X.fillStyle='rgba(62,175,80,'+pwrAlpha+')'; |
| X.beginPath();X.arc(plp[0],plp[1],2.5*eCamZ,0,Math.PI*2);X.fill(); |
| X.fillStyle='rgba(255,255,255,'+pwrAlpha*0.3+')'; |
| X.beginPath();X.arc(plp[0],plp[1],0.8*eCamZ,0,Math.PI*2);X.fill(); |
| |
| |
| for(var leg=0;leg<2;leg++){ |
| var lOff=leg===0?-0.2:0.2; |
| var isSwing=(leg===legSide); |
| |
| |
| |
| |
| |
| var hipAngle, kneeAngle; |
| if(isSwing){ |
| hipAngle = 0.52*Math.sin(p*Math.PI); |
| kneeAngle = -0.87*Math.sin(p*Math.PI)*Math.sin(p*Math.PI); |
| } else { |
| hipAngle = -0.26*Math.sin(p*Math.PI); |
| kneeAngle = -0.1-0.05*Math.sin(p*Math.PI); |
| } |
| |
| var thighLen=0.7, shankLen=0.65; |
| |
| |
| var hx=cx+lOff, hy=cy, hz=pelvisH; |
| |
| |
| var kx=hx+Math.sin(hipAngle)*thighLen*0.4; |
| var ky=hy; |
| var kz=hz-thighLen*Math.cos(hipAngle); |
| |
| |
| var totalAngle=hipAngle+kneeAngle; |
| var ax=kx+Math.sin(totalAngle)*shankLen*0.35; |
| var ay=ky; |
| var az=Math.max(0.02, kz-shankLen*Math.cos(totalAngle)); |
| |
| var hp=iso(hx,hy,hz), kp=iso(kx,ky,kz), ap=iso(ax,ay,az); |
| |
| |
| |
| X.strokeStyle='rgba(165,180,202,0.6)';X.lineWidth=3.2*eCamZ;X.lineCap='round'; |
| X.beginPath();X.moveTo(hp[0]-1.5*eCamZ,hp[1]);X.lineTo(kp[0]-1.5*eCamZ,kp[1]);X.stroke(); |
| |
| X.strokeStyle='rgba(155,170,195,0.55)';X.lineWidth=3.2*eCamZ; |
| X.beginPath();X.moveTo(hp[0]+1.5*eCamZ,hp[1]);X.lineTo(kp[0]+1.5*eCamZ,kp[1]);X.stroke(); |
| |
| X.strokeStyle='rgba(220,232,248,0.12)';X.lineWidth=0.8*eCamZ; |
| X.beginPath();X.moveTo(hp[0]-2.5*eCamZ,hp[1]-0.5*eCamZ);X.lineTo(kp[0]-2.5*eCamZ,kp[1]-0.5*eCamZ);X.stroke(); |
| |
| X.strokeStyle='rgba(210,195,180,0.18)';X.lineWidth=2.5*eCamZ; |
| X.beginPath();X.moveTo(hp[0],hp[1]);X.lineTo(kp[0],kp[1]);X.stroke(); |
| |
| var thMidX=(hp[0]+kp[0])/2,thMidY=(hp[1]+kp[1])/2; |
| X.strokeStyle='rgba(140,105,200,0.4)';X.lineWidth=2*eCamZ; |
| X.beginPath();X.moveTo(thMidX-3*eCamZ,thMidY);X.lineTo(thMidX+3*eCamZ,thMidY);X.stroke(); |
| |
| |
| X.fillStyle='rgba(128,142,168,0.7)'; |
| X.beginPath();X.arc(hp[0],hp[1],4.5*eCamZ,0,Math.PI*2);X.fill(); |
| X.strokeStyle='rgba(160,175,198,0.4)';X.lineWidth=0.8;X.stroke(); |
| |
| X.fillStyle='rgba(255,255,255,0.12)'; |
| X.beginPath();X.arc(hp[0]-1.2*eCamZ,hp[1]-1.2*eCamZ,1.5*eCamZ,0,Math.PI*2);X.fill(); |
| |
| var motorTorque=isSwing?0.35+0.55*Math.abs(Math.sin(p*Math.PI)):0.18; |
| var mGlow=X.createRadialGradient(hp[0],hp[1],0,hp[0],hp[1],12*eCamZ); |
| mGlow.addColorStop(0,'rgba(188,140,255,'+motorTorque*0.45+')');mGlow.addColorStop(0.6,'rgba(188,140,255,'+motorTorque*0.15+')');mGlow.addColorStop(1,'transparent'); |
| X.fillStyle=mGlow;X.beginPath();X.arc(hp[0],hp[1],12*eCamZ,0,Math.PI*2);X.fill(); |
| |
| |
| X.fillStyle='rgba(118,132,158,0.7)'; |
| X.beginPath();X.arc(kp[0],kp[1],3.8*eCamZ,0,Math.PI*2);X.fill(); |
| X.strokeStyle='rgba(150,165,190,0.35)';X.lineWidth=0.7;X.stroke(); |
| |
| X.fillStyle='rgba(255,255,255,0.1)'; |
| X.beginPath();X.arc(kp[0]-0.8*eCamZ,kp[1]-0.8*eCamZ,1.2*eCamZ,0,Math.PI*2);X.fill(); |
| |
| var kTorque=isSwing?0.25+0.4*Math.abs(Math.sin(p*Math.PI)):0.12; |
| var kGlow=X.createRadialGradient(kp[0],kp[1],0,kp[0],kp[1],10*eCamZ); |
| kGlow.addColorStop(0,'rgba(188,140,255,'+kTorque*0.35+')');kGlow.addColorStop(0.6,'rgba(188,140,255,'+kTorque*0.12+')');kGlow.addColorStop(1,'transparent'); |
| X.fillStyle=kGlow;X.beginPath();X.arc(kp[0],kp[1],10*eCamZ,0,Math.PI*2);X.fill(); |
| |
| |
| |
| X.strokeStyle='rgba(155,170,195,0.55)';X.lineWidth=2.8*eCamZ;X.lineCap='round'; |
| X.beginPath();X.moveTo(kp[0]-1.2*eCamZ,kp[1]);X.lineTo(ap[0]-1.2*eCamZ,ap[1]);X.stroke(); |
| |
| X.strokeStyle='rgba(145,160,185,0.5)';X.lineWidth=2.8*eCamZ; |
| X.beginPath();X.moveTo(kp[0]+1.2*eCamZ,kp[1]);X.lineTo(ap[0]+1.2*eCamZ,ap[1]);X.stroke(); |
| |
| X.strokeStyle='rgba(215,228,245,0.1)';X.lineWidth=0.7*eCamZ; |
| X.beginPath();X.moveTo(kp[0]-2*eCamZ,kp[1]-0.4*eCamZ);X.lineTo(ap[0]-2*eCamZ,ap[1]-0.4*eCamZ);X.stroke(); |
| |
| X.strokeStyle='rgba(210,195,180,0.15)';X.lineWidth=2*eCamZ; |
| X.beginPath();X.moveTo(kp[0],kp[1]);X.lineTo(ap[0],ap[1]);X.stroke(); |
| |
| var shMidX=(kp[0]+ap[0])/2,shMidY=(kp[1]+ap[1])/2; |
| X.strokeStyle='rgba(140,105,200,0.35)';X.lineWidth=1.8*eCamZ; |
| X.beginPath();X.moveTo(shMidX-2.5*eCamZ,shMidY);X.lineTo(shMidX+2.5*eCamZ,shMidY);X.stroke(); |
| |
| |
| X.fillStyle='rgba(108,122,145,0.65)'; |
| X.beginPath();X.arc(ap[0],ap[1],3*eCamZ,0,Math.PI*2);X.fill(); |
| X.strokeStyle='rgba(140,155,178,0.3)';X.lineWidth=0.6;X.stroke(); |
| X.fillStyle='rgba(255,255,255,0.08)'; |
| X.beginPath();X.arc(ap[0]-0.6*eCamZ,ap[1]-0.6*eCamZ,1*eCamZ,0,Math.PI*2);X.fill(); |
| |
| |
| var fp=iso(ax+0.15,ay,0); |
| X.fillStyle='rgba(60,72,95,0.55)'; |
| X.beginPath();X.ellipse(fp[0],fp[1],6*eCamZ,3*eCamZ,0,0,Math.PI*2);X.fill(); |
| X.strokeStyle='rgba(90,105,130,0.3)';X.lineWidth=0.6;X.stroke(); |
| |
| X.strokeStyle='rgba(80,95,120,0.2)';X.lineWidth=0.4; |
| for(var ti=0;ti<3;ti++){X.beginPath();X.moveTo(fp[0]-4*eCamZ+ti*2.5*eCamZ,fp[1]-2*eCamZ);X.lineTo(fp[0]-3*eCamZ+ti*2.5*eCamZ,fp[1]+2*eCamZ);X.stroke();} |
| |
| |
| if(!isSwing){ |
| var grfMag=0.35+0.3*Math.sin(p*Math.PI); |
| |
| X.fillStyle='rgba(188,140,255,'+grfMag*0.12+')'; |
| X.beginPath();X.ellipse(fp[0],fp[1],10*eCamZ*grfMag,5*eCamZ*grfMag,0,0,Math.PI*2);X.fill(); |
| |
| X.strokeStyle='rgba(188,140,255,'+grfMag*0.2+')';X.lineWidth=1.5; |
| X.beginPath();X.moveTo(fp[0],fp[1]);X.lineTo(fp[0],fp[1]-15*eCamZ*grfMag);X.stroke(); |
| } |
| } |
| |
| |
| var torsoBot=iso(cx,cy,pelvisH+0.12); |
| var torsoTop=iso(cx,cy,pelvisH+0.55); |
| X.strokeStyle='rgba(150,165,190,0.4)';X.lineWidth=2.5*eCamZ; |
| X.beginPath();X.moveTo(torsoBot[0]-1.5*eCamZ,torsoBot[1]);X.lineTo(torsoTop[0]-1.5*eCamZ,torsoTop[1]);X.stroke(); |
| X.beginPath();X.moveTo(torsoBot[0]+1.5*eCamZ,torsoBot[1]);X.lineTo(torsoTop[0]+1.5*eCamZ,torsoTop[1]);X.stroke(); |
| |
| X.strokeStyle='rgba(210,222,240,0.1)';X.lineWidth=0.6*eCamZ; |
| X.beginPath();X.moveTo(torsoBot[0]-2.2*eCamZ,torsoBot[1]-0.3*eCamZ);X.lineTo(torsoTop[0]-2.2*eCamZ,torsoTop[1]-0.3*eCamZ);X.stroke(); |
| |
| var tMid=iso(cx,cy,pelvisH+0.33); |
| X.strokeStyle='rgba(140,105,200,0.3)';X.lineWidth=1.5*eCamZ; |
| X.beginPath();X.moveTo(tMid[0]-3*eCamZ,tMid[1]);X.lineTo(tMid[0]+3*eCamZ,tMid[1]);X.stroke(); |
| |
| |
| drawIsoBox(cx,cy,pelvisH+0.5,0.55,0.2,0.06,'rgba(142,122,195,0.45)','rgba(118,98,172,0.45)','rgba(130,110,185,0.45)',1); |
| |
| |
| var headP=iso(cx,cy,pelvisH+0.7); |
| X.fillStyle='rgba(200,185,170,0.15)'; |
| X.beginPath();X.arc(headP[0],headP[1],3*eCamZ,0,Math.PI*2);X.fill(); |
| |
| |
| [[cx-0.2,cy,pelvisH],[cx+0.2,cy,pelvisH]].forEach(function(s){ |
| var sp=iso(s[0],s[1],s[2]); |
| var sAlpha=0.3+0.2*Math.sin(t*4); |
| |
| var senG=X.createRadialGradient(sp[0],sp[1],0,sp[0],sp[1],5*eCamZ); |
| senG.addColorStop(0,'rgba(62,175,80,'+sAlpha*0.3+')');senG.addColorStop(1,'transparent'); |
| X.fillStyle=senG;X.beginPath();X.arc(sp[0],sp[1],5*eCamZ,0,Math.PI*2);X.fill(); |
| |
| X.fillStyle='rgba(62,175,80,'+sAlpha+')'; |
| X.beginPath();X.arc(sp[0],sp[1],1.8*eCamZ,0,Math.PI*2);X.fill(); |
| X.fillStyle='rgba(255,255,255,'+sAlpha*0.3+')'; |
| X.beginPath();X.arc(sp[0],sp[1],0.6*eCamZ,0,Math.PI*2);X.fill(); |
| }); |
| |
| document.getElementById('hE').textContent='Falls '+(D.exo_falls_base||20)+'\u2192'+(D.exo_falls_aegis||3)+' | Gait '+(Math.floor(t/gaitPeriod)%10+1); |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function drawCVOverlay(t){ |
| if(!cvVisible)return; |
| var S2=eCamZ; |
| var pa=0.7+0.15*Math.sin(t*1.2); |
| |
| |
| function cvPanel(px,py,title,lines,accentColor,alpha){ |
| var lineH=16,pad=10,titleH=20; |
| var maxW=0; |
| X.font='bold 11px system-ui'; |
| var tw=X.measureText(title).width;if(tw>maxW)maxW=tw; |
| X.font='11px "Courier New",monospace'; |
| for(var i=0;i<lines.length;i++){var lw=X.measureText(lines[i]).width;if(lw>maxW)maxW=lw} |
| var bw=maxW+pad*2+8,bh=titleH+lines.length*lineH+pad; |
| X.fillStyle='rgba(4,8,16,0.88)'; |
| X.beginPath(); |
| if(X.roundRect){X.roundRect(px,py,bw,bh,7)}else{X.rect(px,py,bw,bh)} |
| X.fill(); |
| X.strokeStyle=accentColor.replace(')',','+alpha*0.5+')').replace('rgb','rgba'); |
| X.lineWidth=1.3;X.stroke(); |
| X.fillStyle=accentColor.replace(')',','+alpha*0.4+')').replace('rgb','rgba'); |
| X.fillRect(px+1,py+4,3,bh-8); |
| X.font='bold 12px system-ui';X.textAlign='left'; |
| X.fillStyle=accentColor.replace(')',','+alpha*0.95+')').replace('rgb','rgba'); |
| X.fillText(title,px+pad+5,py+pad+10); |
| X.strokeStyle=accentColor.replace(')',','+alpha*0.2+')').replace('rgb','rgba'); |
| X.lineWidth=0.8;X.beginPath();X.moveTo(px+pad,py+titleH+2);X.lineTo(px+bw-pad,py+titleH+2);X.stroke(); |
| X.font='11px "Courier New",monospace'; |
| for(var i=0;i<lines.length;i++){ |
| X.fillStyle=accentColor.replace(')',','+alpha*0.8+')').replace('rgb','rgba'); |
| X.fillText(lines[i],px+pad+5,py+titleH+10+i*lineH); |
| } |
| X.textAlign='center'; |
| return {x:px,y:py,w:bw,h:bh,cx:px+bw/2,cy:py+bh/2}; |
| } |
| |
| |
| function cvLeader(rx,ry,bx,by,color,alpha){ |
| X.strokeStyle=color;X.globalAlpha=alpha*0.45;X.lineWidth=1.2;X.setLineDash([5,4]); |
| X.beginPath();X.moveTo(rx,ry);X.lineTo(bx,by);X.stroke();X.setLineDash([]); |
| X.fillStyle=color; |
| X.beginPath();X.arc(rx,ry,3*S2,0,Math.PI*2);X.fill(); |
| X.globalAlpha=1; |
| } |
| |
| |
| var isOverview=(camView==='overview'); |
| var showSurg=(camView==='surgical'||isOverview); |
| var showAmr=(camView==='amr'||isOverview); |
| var showDrone=(camView==='drone'||isOverview); |
| var showExo=(camView==='exo'||isOverview); |
| |
| |
| var sp=botScreenPos.surgical; |
| if(showSurg&&sp&&sp[0]>-500){ |
| var triScale=isOverview?1:1.6; |
| var cvsTri=[ |
| [sp[0]-35*S2*triScale, sp[1]+15*S2*triScale], |
| [sp[0]+35*S2*triScale, sp[1]+15*S2*triScale], |
| [sp[0], sp[1]-28*S2*triScale] |
| ]; |
| var cvsAlpha=0.3+0.15*Math.sin(t*2); |
| X.strokeStyle='rgba(0,200,220,'+cvsAlpha+')';X.lineWidth=2*S2;X.setLineDash([8,4]); |
| X.beginPath();X.moveTo(cvsTri[0][0],cvsTri[0][1]);X.lineTo(cvsTri[1][0],cvsTri[1][1]);X.lineTo(cvsTri[2][0],cvsTri[2][1]);X.closePath();X.stroke(); |
| X.setLineDash([]); |
| X.fillStyle='rgba(0,200,220,'+cvsAlpha*0.05+')';X.fill(); |
| |
| |
| [{ox:-15,oy:4,c:'rgba(255,107,107,0.5)'},{ox:18,oy:-3,c:'rgba(255,135,135,0.5)'},{ox:4,oy:16,c:'rgba(255,82,82,0.5)'}].forEach(function(inst){ |
| var ix=sp[0]+inst.ox*S2+Math.sin(t*0.3+inst.ox)*3*S2; |
| var iy=sp[1]+inst.oy*S2+Math.cos(t*0.25+inst.oy)*2*S2; |
| var bs=5*S2*triScale; |
| X.strokeStyle=inst.c;X.lineWidth=1.3; |
| X.beginPath();X.moveTo(ix-bs,iy-bs);X.lineTo(ix-bs,iy-bs+2.5*S2);X.stroke(); |
| X.beginPath();X.moveTo(ix-bs,iy-bs);X.lineTo(ix-bs+2.5*S2,iy-bs);X.stroke(); |
| X.beginPath();X.moveTo(ix+bs,iy+bs);X.lineTo(ix+bs,iy+bs-2.5*S2);X.stroke(); |
| X.beginPath();X.moveTo(ix+bs,iy+bs);X.lineTo(ix+bs-2.5*S2,iy+bs);X.stroke(); |
| }); |
| |
| if(!isOverview){ |
| var cvsConf=(92+5*Math.sin(t*0.6)).toFixed(1); |
| var sfc=(97+2*Math.sin(t*0.4)).toFixed(1); |
| var pb=cvPanel(sp[0]+60*S2,sp[1]-70*S2, |
| '\u{1f441} CRITICAL VIEW OF SAFETY',[ |
| 'CVS Confidence: '+cvsConf+'%', |
| 'Cystic Duct: identified', |
| 'Cystic Artery: identified', |
| 'Hepatocystic \u25b3: clear', |
| '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500', |
| 'Gallbladder: 96% conf', |
| 'Liver Bed: 94% conf', |
| 'Fat Tissue: 89% conf', |
| '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500', |
| 'Grasper L | Hook R | Clip', |
| 'Force Compliance: '+sfc+'%', |
| '\u25b8 DESCRIPTIVE \u2022 CAUSAL \u2022 GOVERNED', |
| 'H(\u03c0)='+(0.12+0.08*Math.sin(t*0.7)).toFixed(2)+' \u2192 AUTONOMOUS', |
| 'CBF \u2714 CERT \u2714 SMM:'+Math.round(91+4*Math.sin(t*0.5))+'%', |
| 'FDA 510(k) \u2714 IEC 80601 \u2714' |
| ],'rgb(0,200,220)',pa); |
| cvLeader(sp[0],sp[1],pb.x,pb.cy,'rgba(0,200,220,0.5)',pa); |
| } |
| } |
| |
| |
| var ap2=botScreenPos.amr; |
| if(showAmr&&ap2&&ap2[0]>-500){ |
| var corrScale=isOverview?1:1.5; |
| var corrW=28*S2*corrScale,corrH=22*S2*corrScale; |
| var cx2=ap2[0],cy2=ap2[1]; |
| var corrAlpha=0.28+0.1*Math.sin(t*1.8); |
| X.strokeStyle='rgba(88,166,255,'+corrAlpha+')';X.lineWidth=1.5*S2;X.setLineDash([5,4]); |
| X.beginPath(); |
| X.moveTo(cx2-corrW,cy2+corrH*0.4);X.lineTo(cx2-corrW*0.5,cy2-corrH); |
| X.lineTo(cx2+corrW*0.5,cy2-corrH);X.lineTo(cx2+corrW,cy2+corrH*0.4); |
| X.closePath();X.stroke();X.setLineDash([]); |
| X.fillStyle='rgba(88,166,255,'+corrAlpha*0.04+')';X.fill(); |
| |
| [{ox:-20,oy:10,r:7},{ox:16,oy:-7,r:6},{ox:-10,oy:-16,r:5},{ox:24,oy:3,r:6}].forEach(function(ob){ |
| var obx=cx2+ob.ox*S2*corrScale+Math.sin(t*0.2+ob.ox)*2*S2; |
| var oby=cy2+ob.oy*S2*corrScale; |
| X.fillStyle='rgba(255,80,80,0.15)';X.beginPath();X.arc(obx,oby,ob.r*S2*0.5,0,Math.PI*2);X.fill(); |
| X.strokeStyle='rgba(255,80,80,'+corrAlpha*0.55+')';X.lineWidth=0.9;X.setLineDash([3,2]); |
| X.beginPath();X.arc(obx,oby,ob.r*S2,0,Math.PI*2);X.stroke();X.setLineDash([]); |
| }); |
| |
| var vAngle=t*0.3;var vLen=15*S2*corrScale; |
| var vx2=ap2[0]+Math.cos(vAngle)*vLen,vy2=ap2[1]+Math.sin(vAngle)*vLen*0.5; |
| X.strokeStyle='rgba(62,175,80,0.5)';X.lineWidth=2.2; |
| X.beginPath();X.moveTo(ap2[0],ap2[1]);X.lineTo(vx2,vy2);X.stroke(); |
| var aAng=Math.atan2(vy2-ap2[1],vx2-ap2[0]); |
| X.fillStyle='rgba(62,175,80,0.5)';X.beginPath(); |
| X.moveTo(vx2,vy2);X.lineTo(vx2-5*S2*Math.cos(aAng-0.4),vy2-5*S2*Math.sin(aAng-0.4)); |
| X.lineTo(vx2-5*S2*Math.cos(aAng+0.4),vy2-5*S2*Math.sin(aAng+0.4));X.closePath();X.fill(); |
| |
| var nWP=6;var wpPrev=null; |
| for(var wi=0;wi<nWP;wi++){ |
| var wpFrac=wi/(nWP-1); |
| var wpx=cx2-corrW*0.55+wpFrac*corrW*1.1; |
| var wpy=cy2+corrH*0.25-Math.sin(wpFrac*Math.PI)*corrH*0.7; |
| X.fillStyle='rgba(88,166,255,'+(0.4+0.2*Math.sin(t*2+wi))+')'; |
| X.beginPath();X.arc(wpx,wpy,2.5*S2,0,Math.PI*2);X.fill(); |
| if(wpPrev){X.strokeStyle='rgba(88,166,255,0.2)';X.lineWidth=1.3;X.beginPath();X.moveTo(wpPrev[0],wpPrev[1]);X.lineTo(wpx,wpy);X.stroke()} |
| wpPrev=[wpx,wpy]; |
| } |
| |
| if(!isOverview){ |
| var amrV=(0.8+0.4*Math.sin(t*0.25)).toFixed(2); |
| var amrAcc=(Math.cos(t*0.25)*0.3).toFixed(2); |
| var sep=(2.1+0.5*Math.sin(t*0.3)).toFixed(1); |
| var pb2=cvPanel(ap2[0]-110*S2,ap2[1]-60*S2, |
| '\u{1f441} DWA NAVIGATION',[ |
| 'Velocity: '+amrV+' m/s', |
| 'Acceleration: '+amrAcc+' m/s\u00b2', |
| 'Min Separation: '+sep+' m', |
| 'Obstacles: 4 tracked', |
| 'Collisions: 0 \u2714', |
| '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500', |
| 'Corridor: CLEAR', |
| 'Waypoints: 6 planned', |
| 'LiDAR: 360\u00b0 active', |
| '\u25b8 DESCRIPTIVE \u2022 CAUSAL \u2022 GOVERNED', |
| 'H(\u03c0)='+(0.15+0.1*Math.sin(t*0.6)).toFixed(2)+' \u2192 AUTONOMOUS', |
| 'CBF \u2714 CERT \u2714 SMM:'+Math.round(88+5*Math.sin(t*0.45))+'%', |
| 'ISO 3691 \u2714 ANSI/RIA \u2714' |
| ],'rgb(88,166,255)',pa); |
| cvLeader(ap2[0],ap2[1],pb2.x+pb2.w,pb2.cy,'rgba(88,166,255,0.5)',pa); |
| } |
| } |
| |
| |
| var dp=botScreenPos.drone; |
| if(showDrone&&dp&&dp[0]>-500){ |
| var lzScale=isOverview?1:1.5; |
| var lzx=dp[0],lzy=dp[1]+45*S2*lzScale; |
| var gpsAlpha=0.25+0.12*Math.sin(t*2.5); |
| X.strokeStyle='rgba(227,179,65,'+gpsAlpha+')';X.lineWidth=1.6*S2;X.setLineDash([6,4]); |
| X.beginPath();X.ellipse(lzx,lzy,25*S2*lzScale,12*S2*lzScale,0,0,Math.PI*2);X.stroke();X.setLineDash([]); |
| X.strokeStyle='rgba(227,179,65,'+gpsAlpha*1.3+')';X.lineWidth=1.3*S2; |
| X.beginPath();X.ellipse(lzx,lzy,12*S2*lzScale,6*S2*lzScale,0,0,Math.PI*2);X.stroke(); |
| X.fillStyle='rgba(227,179,65,'+gpsAlpha*1.6+')'; |
| X.beginPath();X.arc(lzx,lzy,3*S2,0,Math.PI*2);X.fill(); |
| |
| var chR=30*S2*lzScale,chG=14*S2*lzScale; |
| X.strokeStyle='rgba(227,179,65,'+gpsAlpha*0.7+')';X.lineWidth=0.9; |
| X.beginPath();X.moveTo(lzx-chR,lzy);X.lineTo(lzx-chG,lzy);X.stroke(); |
| X.beginPath();X.moveTo(lzx+chG,lzy);X.lineTo(lzx+chR,lzy);X.stroke(); |
| X.beginPath();X.moveTo(lzx,lzy-chR*0.55);X.lineTo(lzx,lzy-chG*0.5);X.stroke(); |
| X.beginPath();X.moveTo(lzx,lzy+chG*0.5);X.lineTo(lzx,lzy+chR*0.55);X.stroke(); |
| |
| X.strokeStyle='rgba(227,179,65,0.18)';X.lineWidth=1;X.setLineDash([5,5]); |
| X.beginPath();X.moveTo(dp[0],dp[1]);X.lineTo(lzx,lzy);X.stroke();X.setLineDash([]); |
| |
| if(!isOverview){ |
| var gpsAcc=(1.2+0.5*Math.sin(t*0.5)).toFixed(1); |
| var altFrac=0.3+0.5*Math.abs(Math.sin(t*0.15)); |
| var altVal=(altFrac*80).toFixed(0); |
| var windStr=(6+3*Math.sin(t*0.12)).toFixed(0); |
| var bat=(78+10*Math.sin(t*0.08)).toFixed(0); |
| var tempV=(4.2+1.5*Math.sin(t*0.1)).toFixed(1); |
| var coldOk=parseFloat(tempV)>=2&&parseFloat(tempV)<=8; |
| var pb3=cvPanel(dp[0]+65*S2,dp[1]-55*S2, |
| '\u{1f441} PRECISION LANDING',[ |
| 'GPS Accuracy: \u00b1'+gpsAcc+' m', |
| 'Altitude: '+altVal+' m AGL', |
| 'Wind: '+windStr+' kn', |
| 'Battery: '+bat+'%', |
| '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500', |
| 'Cargo Temp: '+tempV+'\u00b0C', |
| 'Cold Chain: '+(coldOk?'NOMINAL \u2714':'ALERT \u26a0'), |
| 'Descent: '+(1.2+0.3*Math.sin(t*0.2)).toFixed(1)+' m/s', |
| '\u25b8 DESCRIPTIVE \u2022 CAUSAL \u2022 GOVERNED', |
| 'H(\u03c0)='+(0.18+0.12*Math.sin(t*0.55)).toFixed(2)+' \u2192 AUTONOMOUS', |
| 'CBF \u2714 CERT \u2714 SMM:'+Math.round(86+6*Math.sin(t*0.4))+'%', |
| 'FAA Part 135 \u2714 BVLOS \u2714' |
| ],'rgb(227,179,65)',pa); |
| cvLeader(dp[0],dp[1],pb3.x,pb3.cy,'rgba(227,179,65,0.5)',pa); |
| |
| var altBarX=pb3.x+pb3.w+10,altBarY=pb3.y,altBarH=pb3.h; |
| X.strokeStyle='rgba(227,179,65,0.35)';X.lineWidth=1.2; |
| X.strokeRect(altBarX,altBarY,7*S2,altBarH); |
| X.fillStyle='rgba(227,179,65,0.25)'; |
| X.fillRect(altBarX+0.5,altBarY+altBarH*(1-altFrac),6*S2,altBarH*altFrac); |
| X.font='bold 9px system-ui';X.textAlign='center'; |
| X.fillStyle='rgba(227,179,65,'+pa*0.6+')'; |
| X.fillText('ALT',altBarX+3.5*S2,altBarY-5); |
| X.font='bold 10px "Courier New",monospace';X.textAlign='left'; |
| X.fillStyle='rgba(227,179,65,'+pa*0.7+')'; |
| X.fillText(altVal+'m',altBarX+10*S2,altBarY+altBarH*(1-altFrac)+4); |
| } |
| } |
| |
| |
| var ep=botScreenPos.exo; |
| if(showExo&&ep&&ep[0]>-500){ |
| var gaitPeriod=4; |
| var gaitPhase=(t/gaitPeriod)%2; |
| var gp2=gaitPhase%1; |
| var gLeg=gaitPhase<1?0:1; |
| var walkCycle=30; |
| var walkProgress=(t/walkCycle)%2; |
| var walkFrac=walkProgress<1?walkProgress:2-walkProgress; |
| walkFrac=walkFrac*walkFrac*(3-2*walkFrac); |
| var ecx=2+walkFrac*6,ecy=12; |
| var pelvisH=1.5+Math.sin(gp2*Math.PI)*0.06; |
| |
| var poseJoints=[]; |
| for(var pl=0;pl<2;pl++){ |
| var plOff=pl===0?-0.2:0.2; |
| var plSwing=(pl===gLeg); |
| var plHip,plKnee; |
| if(plSwing){plHip=0.52*Math.sin(gp2*Math.PI);plKnee=-0.87*Math.sin(gp2*Math.PI)*Math.sin(gp2*Math.PI)} |
| else{plHip=-0.26*Math.sin(gp2*Math.PI);plKnee=-0.1-0.05*Math.sin(gp2*Math.PI)} |
| var phx=ecx+plOff,phy=ecy,phz=pelvisH; |
| var pkx=phx+Math.sin(plHip)*0.7*0.4,pky=phy,pkz=phz-0.7*Math.cos(plHip); |
| var pTot=plHip+plKnee; |
| var pax=pkx+Math.sin(pTot)*0.65*0.35,pay=pky,paz=Math.max(0.02,pkz-0.65*Math.cos(pTot)); |
| poseJoints.push(iso(phx,phy,phz)); |
| poseJoints.push(iso(pkx,pky,pkz)); |
| poseJoints.push(iso(pax,pay,paz)); |
| } |
| poseJoints.push(iso(ecx,ecy,pelvisH)); |
| poseJoints.push(iso(ecx,ecy,pelvisH+0.7)); |
| |
| |
| var skelAlpha=isOverview?0.25:0.45; |
| X.strokeStyle='rgba(0,200,220,'+skelAlpha+')';X.lineWidth=2*S2; |
| X.beginPath();X.moveTo(poseJoints[6][0],poseJoints[6][1]);X.lineTo(poseJoints[0][0],poseJoints[0][1]); |
| X.lineTo(poseJoints[1][0],poseJoints[1][1]);X.lineTo(poseJoints[2][0],poseJoints[2][1]);X.stroke(); |
| X.beginPath();X.moveTo(poseJoints[6][0],poseJoints[6][1]);X.lineTo(poseJoints[3][0],poseJoints[3][1]); |
| X.lineTo(poseJoints[4][0],poseJoints[4][1]);X.lineTo(poseJoints[5][0],poseJoints[5][1]);X.stroke(); |
| X.beginPath();X.moveTo(poseJoints[6][0],poseJoints[6][1]);X.lineTo(poseJoints[7][0],poseJoints[7][1]);X.stroke(); |
| |
| |
| var jointConfs=[97,95,92,97,95,92,98,96]; |
| poseJoints.forEach(function(jp,ji){ |
| var jAlpha=isOverview?0.3:0.6;var dotR=isOverview?2.5:3.5; |
| var jG=X.createRadialGradient(jp[0],jp[1],0,jp[0],jp[1],7*S2); |
| jG.addColorStop(0,'rgba(0,200,220,'+jAlpha*0.3+')');jG.addColorStop(1,'transparent'); |
| X.fillStyle=jG;X.beginPath();X.arc(jp[0],jp[1],7*S2,0,Math.PI*2);X.fill(); |
| X.fillStyle='rgba(0,200,220,'+jAlpha*0.85+')'; |
| X.beginPath();X.arc(jp[0],jp[1],dotR*S2,0,Math.PI*2);X.fill(); |
| }); |
| |
| |
| var copX2=ecx+Math.sin(gp2*Math.PI*2)*0.15; |
| var copP=iso(copX2,ecy,0); |
| X.fillStyle='rgba(188,140,255,'+(isOverview?0.3:0.5)+')'; |
| X.beginPath();X.arc(copP[0],copP[1],3.5*S2,0,Math.PI*2);X.fill(); |
| X.strokeStyle='rgba(188,140,255,0.3)';X.lineWidth=0.9;X.setLineDash([3,3]); |
| X.beginPath();X.arc(copP[0],copP[1],10*S2,0,Math.PI*2);X.stroke();X.setLineDash([]); |
| |
| if(!isOverview){ |
| var hipAng=(Math.sin(gp2*Math.PI)*30).toFixed(1); |
| var kneeAng=(Math.sin(gp2*Math.PI)*50).toFixed(1); |
| var sym=(95+3*Math.sin(t*0.4)).toFixed(1); |
| var stride=((walkFrac*6/15)*1.2).toFixed(2); |
| var cadence=(60/gaitPeriod).toFixed(0); |
| var jNames=['L Hip','L Knee','L Ankle','R Hip','R Knee','R Ankle','Pelvis','Head']; |
| var confStrs=[]; |
| for(var ci2=0;ci2<8;ci2++){confStrs.push(jNames[ci2]+': '+(jointConfs[ci2]+2*Math.sin(t*1.5+jointConfs[ci2]*0.1)).toFixed(0)+'%')} |
| var pb4=cvPanel(ep[0]-120*S2,ep[1]-55*S2, |
| '\u{1f441} GAIT ANALYSIS',[ |
| 'Hip Flex: '+hipAng+'\u00b0', |
| 'Knee Flex: '+kneeAng+'\u00b0', |
| 'Cadence: '+cadence+' steps/min', |
| 'Stride: '+stride+' m', |
| 'Symmetry: '+sym+'%', |
| 'CoP Drift: '+(Math.sin(gp2*Math.PI*2)*3.2).toFixed(1)+' cm', |
| '\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500', |
| confStrs[0]+' '+confStrs[3], |
| confStrs[1]+' '+confStrs[4], |
| confStrs[2]+''+confStrs[5], |
| confStrs[6]+' '+confStrs[7], |
| '\u25b8 DESCRIPTIVE \u2022 CAUSAL \u2022 GOVERNED', |
| 'H(\u03c0)='+(0.14+0.09*Math.sin(t*0.65)).toFixed(2)+' \u2192 AUTONOMOUS', |
| 'CBF \u2714 CERT \u2714 SMM:'+Math.round(90+4*Math.sin(t*0.35))+'%', |
| 'IEC 80601-2-78 \u2714' |
| ],'rgb(188,140,255)',pa); |
| cvLeader(ep[0],ep[1],pb4.x+pb4.w,pb4.cy,'rgba(188,140,255,0.5)',pa); |
| } |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function drawExtraCVOverlays(t){ |
| if(!cvVisible)return; |
| var isOverview=(camView==='overview'); |
| X.save(); |
| |
| if(cvICG&&(camView==='surgical'||isOverview)){ |
| var sp=botScreenPos.surgical; |
| if(sp[0]>-500){ |
| |
| var px=sp[0]+20*eCamZ,py=sp[1]-15*eCamZ; |
| var perfR=18*eCamZ; |
| |
| var perfPhase=(t*0.8)%4; |
| var perfAlpha=0.12+0.06*Math.sin(t*1.5); |
| var perfGrad=X.createRadialGradient(px,py,0,px,py,perfR); |
| perfGrad.addColorStop(0,'rgba(0,255,100,'+perfAlpha*2+')'); |
| perfGrad.addColorStop(0.4,'rgba(0,200,60,'+perfAlpha+')'); |
| perfGrad.addColorStop(0.7,'rgba(0,150,40,'+perfAlpha*0.5+')'); |
| perfGrad.addColorStop(1,'rgba(0,100,20,0)'); |
| X.fillStyle=perfGrad;X.beginPath();X.arc(px,py,perfR,0,Math.PI*2);X.fill(); |
| |
| if(camView==='surgical'){ |
| X.font='bold '+(7*eCamZ)+'px monospace';X.textAlign='center'; |
| X.fillStyle='rgba(0,255,100,0.7)'; |
| X.fillText('ICG PERFUSION',px,py+perfR+8*eCamZ); |
| |
| var confW=30*eCamZ,confH=3*eCamZ; |
| var perfConf=0.87+0.08*Math.sin(t*0.7); |
| X.fillStyle='rgba(0,255,100,0.15)';X.fillRect(px-confW/2,py+perfR+12*eCamZ,confW,confH); |
| X.fillStyle='rgba(0,255,100,0.6)';X.fillRect(px-confW/2,py+perfR+12*eCamZ,confW*perfConf,confH); |
| X.font=(5*eCamZ)+'px monospace';X.fillStyle='rgba(0,255,100,0.5)'; |
| X.fillText(Math.round(perfConf*100)+'% viable',px,py+perfR+22*eCamZ); |
| } |
| } |
| } |
| |
| if(cvBleed&&(camView==='surgical')){ |
| var sp=botScreenPos.surgical; |
| if(sp[0]>-500){ |
| var bleedActive=Math.sin(t*0.3)>0.6; |
| if(bleedActive){ |
| var bx=sp[0]-15*eCamZ,by=sp[1]+5*eCamZ; |
| var bleedPulse=0.4+0.3*Math.sin(t*5); |
| X.strokeStyle='rgba(248,81,73,'+bleedPulse+')';X.lineWidth=2; |
| X.beginPath();X.arc(bx,by,6*eCamZ,0,Math.PI*2);X.stroke(); |
| X.beginPath();X.arc(bx,by,10*eCamZ,0,Math.PI*2);X.stroke(); |
| X.font='bold '+(7*eCamZ)+'px monospace';X.textAlign='center'; |
| X.fillStyle='rgba(248,81,73,'+bleedPulse+')'; |
| X.fillText('\u26a0 BLEED DETECT',bx,by-14*eCamZ); |
| X.font=(5*eCamZ)+'px monospace';X.fillStyle='rgba(248,81,73,0.6)'; |
| X.fillText('BlooDet AI: Region+Source',bx,by+14*eCamZ); |
| } |
| } |
| } |
| |
| if(cvMedVerify&&(camView==='amr'||isOverview)){ |
| var ap=botScreenPos.amr; |
| if(ap[0]>-500){ |
| var scanLine=(t*40)%20-10; |
| var mx=ap[0]+8*eCamZ,my=ap[1]-2*eCamZ; |
| |
| X.strokeStyle='rgba(63,185,80,0.6)';X.lineWidth=1; |
| for(var i=0;i<5;i++){ |
| var bw=1+Math.random()*3; |
| X.fillStyle='rgba(63,185,80,'+(0.3+0.2*Math.sin(t*3+i))+')'; |
| X.fillRect(mx-8*eCamZ+i*4*eCamZ,my-6*eCamZ,bw*eCamZ,12*eCamZ); |
| } |
| |
| X.strokeStyle='rgba(63,185,80,'+(0.5+0.4*Math.sin(t*6))+')';X.lineWidth=1.5; |
| X.beginPath();X.moveTo(mx-10*eCamZ,my+scanLine*eCamZ*0.3);X.lineTo(mx+10*eCamZ,my+scanLine*eCamZ*0.3);X.stroke(); |
| if(camView==='amr'){ |
| X.font=(6*eCamZ)+'px monospace';X.textAlign='center';X.fillStyle='rgba(63,185,80,0.7)'; |
| X.fillText('\u2705 NDC VERIFIED',mx,my+12*eCamZ); |
| X.font=(5*eCamZ)+'px monospace';X.fillStyle='rgba(63,185,80,0.5)'; |
| X.fillText('Pyxis-linked \u2022 Chain-of-custody OK',mx,my+18*eCamZ); |
| } |
| } |
| } |
| |
| if(cvFallRisk&&(camView==='exo'||isOverview)){ |
| var ep=botScreenPos.exo; |
| if(ep[0]>-500){ |
| var gx=ep[0]+25*eCamZ,gy=ep[1]-10*eCamZ; |
| var risk=0.15+0.12*Math.sin(t*0.5); |
| var riskC=risk>0.4?'#f85149':risk>0.25?'#e3b341':'#3fb950'; |
| |
| var gR=12*eCamZ; |
| X.strokeStyle='rgba(139,148,158,0.2)';X.lineWidth=3*eCamZ; |
| X.beginPath();X.arc(gx,gy,gR,-Math.PI,-0);X.stroke(); |
| X.strokeStyle=riskC;X.lineWidth=3*eCamZ; |
| var riskAngle=-Math.PI+risk*Math.PI; |
| X.beginPath();X.arc(gx,gy,gR,-Math.PI,riskAngle);X.stroke(); |
| |
| var nx=gx+gR*0.7*Math.cos(riskAngle),ny=gy+gR*0.7*Math.sin(riskAngle); |
| X.strokeStyle=riskC;X.lineWidth=1.5;X.beginPath();X.moveTo(gx,gy);X.lineTo(nx,ny);X.stroke(); |
| |
| X.font='bold '+(7*eCamZ)+'px monospace';X.textAlign='center';X.fillStyle=riskC; |
| X.fillText(Math.round(risk*100)+'%',gx,gy+4*eCamZ); |
| X.font=(5*eCamZ)+'px monospace';X.fillStyle='rgba(230,237,243,0.5)'; |
| X.fillText('FALL RISK',gx,gy+12*eCamZ); |
| if(camView==='exo'){ |
| X.fillText('CoP drift: '+(2.1+1.5*Math.sin(t*0.4)).toFixed(1)+'cm',gx,gy+18*eCamZ); |
| } |
| } |
| } |
| |
| if(isOverview){ |
| var heatZones=[{x:12,y:14,int:0.7},{x:20,y:10,int:0.5},{x:8,y:8,int:0.3},{x:28,y:6,int:0.4},{x:16,y:20,int:0.6}]; |
| heatZones.forEach(function(hz){ |
| var hp=iso(hz.x,hz.y,0); |
| var hAlpha=hz.int*0.08*(1+0.3*Math.sin(t*0.5+hz.x)); |
| if(scenario.active&&scenario.phase>=2){hAlpha*=2;} |
| var hGrad=X.createRadialGradient(hp[0],hp[1],0,hp[0],hp[1],20*eCamZ); |
| hGrad.addColorStop(0,'rgba(248,81,73,'+hAlpha*2+')'); |
| hGrad.addColorStop(0.5,'rgba(227,179,65,'+hAlpha+')'); |
| hGrad.addColorStop(1,'rgba(227,179,65,0)'); |
| X.fillStyle=hGrad;X.beginPath();X.arc(hp[0],hp[1],20*eCamZ,0,Math.PI*2);X.fill(); |
| }); |
| } |
| |
| if(camView==='surgical'){ |
| var sp=botScreenPos.surgical; |
| if(sp[0]>-500){ |
| var tlX=sp[0]-60*eCamZ,tlY=sp[1]+40*eCamZ; |
| var tlW=120*eCamZ,tlH=6*eCamZ; |
| var surgPhases=['Prep','Access','Dissect','CVS','Resect','Hemo','Close']; |
| var phColors=['#8b949e','#58a6ff','#e3b341','#3fb950','#f0883e','#f85149','#bc8cff']; |
| var segW=tlW/surgPhases.length; |
| var curPhIdx=Math.floor((t*0.15)%surgPhases.length); |
| var curPhProg=(t*0.15)%1; |
| X.fillStyle='rgba(13,17,23,0.8)'; |
| X.beginPath();X.roundRect(tlX-4,tlY-10,tlW+8,tlH+20,4);X.fill(); |
| X.strokeStyle='rgba(0,200,220,0.2)';X.lineWidth=0.5; |
| X.beginPath();X.roundRect(tlX-4,tlY-10,tlW+8,tlH+20,4);X.stroke(); |
| surgPhases.forEach(function(ph,pi){ |
| var sx=tlX+pi*segW; |
| var isCurrent=(pi===curPhIdx),isPast=(pi<curPhIdx); |
| X.fillStyle=isPast?phColors[pi]:isCurrent?phColors[pi]:'rgba(139,148,158,0.15)'; |
| X.globalAlpha=isPast?0.6:isCurrent?0.9:0.3; |
| X.fillRect(sx+0.5,tlY,segW-1,tlH); |
| if(isCurrent){X.fillStyle='rgba(255,255,255,0.15)';X.fillRect(sx+0.5,tlY,segW*curPhProg,tlH);} |
| X.globalAlpha=1; |
| X.font=(4.5*eCamZ)+'px monospace';X.textAlign='center'; |
| X.fillStyle=isCurrent?'#e6edf3':isPast?'rgba(230,237,243,0.5)':'rgba(139,148,158,0.4)'; |
| X.fillText(ph,sx+segW/2,tlY+tlH+8*eCamZ); |
| }); |
| var phX=tlX+curPhIdx*segW+curPhProg*segW; |
| X.fillStyle='#e6edf3';X.beginPath();X.moveTo(phX,tlY-3);X.lineTo(phX-3,tlY-7);X.lineTo(phX+3,tlY-7);X.closePath();X.fill(); |
| X.font='bold '+(5*eCamZ)+'px monospace';X.textAlign='left';X.fillStyle='rgba(0,200,220,0.6)'; |
| X.fillText('SURGICAL PHASE',tlX,tlY-14*eCamZ); |
| } |
| } |
| |
| if(camView==='surgical'){ |
| var sp=botScreenPos.surgical; |
| if(sp[0]>-500){ |
| var dpX=sp[0]-30*eCamZ,dpY=sp[1]-20*eCamZ,dpR=14*eCamZ; |
| var depthAlpha=0.08; |
| ['rgba(68,1,84,'+depthAlpha+')','rgba(59,82,139,'+depthAlpha+')','rgba(33,145,140,'+depthAlpha+')','rgba(94,201,98,'+depthAlpha+')','rgba(253,231,37,'+depthAlpha+')'].forEach(function(dc,di){ |
| X.fillStyle=dc;X.beginPath();X.arc(dpX,dpY,dpR*(1-di*0.18),0,Math.PI*2);X.fill(); |
| }); |
| X.font=(5*eCamZ)+'px monospace';X.textAlign='center';X.fillStyle='rgba(253,231,37,0.4)'; |
| X.fillText('DEPTH EST.',dpX,dpY+dpR+6*eCamZ); |
| } |
| } |
| X.restore(); |
| } |
| function drawPhysicsOverlay(t){ |
| if(!physVisible)return; |
| var S2=eCamZ; |
| |
| |
| function eqBox(cx,cy,lines,color,alpha){ |
| var boxW=0,lineH=13,pad=8; |
| X.font='bold 10px "Courier New",monospace'; |
| for(var i=0;i<lines.length;i++){var w=X.measureText(lines[i]).width;if(w>boxW)boxW=w} |
| var boxH=lines.length*lineH+pad*2;boxW+=pad*2+4; |
| var bx=cx-boxW/2,by=cy-boxH/2; |
| X.fillStyle='rgba(4,8,16,'+(0.88*alpha)+')'; |
| X.beginPath(); |
| if(X.roundRect){X.roundRect(bx,by,boxW,boxH,6)}else{X.rect(bx,by,boxW,boxH)} |
| X.fill(); |
| X.strokeStyle=color.replace(')',','+0.5*alpha+')').replace('rgb','rgba'); |
| X.lineWidth=1.2;X.stroke(); |
| X.fillStyle=color.replace(')',','+0.4*alpha+')').replace('rgb','rgba'); |
| X.fillRect(bx,by+4,2.5,boxH-8); |
| X.textAlign='left'; |
| for(var i=0;i<lines.length;i++){ |
| var ly=by+pad+i*lineH+10; |
| if(i===0){X.font='bold 10px system-ui';X.fillStyle=color.replace(')',','+0.9*alpha+')').replace('rgb','rgba')} |
| else{X.font='10px "Courier New",monospace';X.fillStyle='rgba(188,140,255,'+0.8*alpha+')'} |
| X.fillText(lines[i],bx+pad+4,ly); |
| } |
| X.textAlign='center'; |
| } |
| |
| var pa=0.75+0.15*Math.sin(t*1.5); |
| |
| |
| var sp=botScreenPos.surgical; |
| if(sp&&sp[0]>-500){ |
| var ox=sp[0]+35*S2,oy=sp[1]-30*S2; |
| var forceN=(1.2+0.6*Math.sin(t*0.7)).toFixed(2); |
| var jacDet=(0.85+0.1*Math.sin(t*0.4)).toFixed(3); |
| var tissueE=(12.5+2*Math.sin(t*0.3)).toFixed(1); |
| var tissueEta=(0.45+0.1*Math.sin(t*0.5)).toFixed(2); |
| eqBox(ox,oy,[ |
| 'JACOBIAN TRANSPOSE CONTROL', |
| '\u03c4 = J\u1d40(q)\u00b7F F='+forceN+'N', |
| '|J|='+jacDet+' F<2N \u2714', |
| '\u03c3 = E\u03b5+\u03b7(d\u03b5/dt)', |
| 'E='+tissueE+'kPa \u03b7='+tissueEta+'Pa\u00b7s' |
| ],'rgb(255,107,107)',pa); |
| X.strokeStyle='rgba(255,107,107,'+(0.2*pa)+')';X.lineWidth=0.8;X.setLineDash([3,3]); |
| X.beginPath();X.moveTo(ox-40,oy+20);X.lineTo(sp[0],sp[1]);X.stroke();X.setLineDash([]); |
| } |
| |
| |
| var ap=botScreenPos.amr; |
| if(ap&&ap[0]>-500){ |
| var ox2=ap[0]-40*S2,oy2=ap[1]-35*S2; |
| var amrVel=(0.8+0.4*Math.sin(t*0.25)).toFixed(2); |
| var amrAcc=(Math.cos(t*0.25)*0.3).toFixed(2); |
| var amrF=(45*parseFloat(amrAcc)).toFixed(1); |
| eqBox(ox2,oy2,[ |
| 'TRAPEZOIDAL VELOCITY PROFILE', |
| 'F = ma = 45.0\u00d7'+amrAcc+'='+amrF+'N', |
| 'v = '+amrVel+' m/s a='+amrAcc+' m/s\u00b2', |
| 'DWA: v\u2208[0,v_max], \u03c9\u2208[-1,1]', |
| 'SLAM drift < 0.02m/cycle' |
| ],'rgb(88,166,255)',pa); |
| X.strokeStyle='rgba(88,166,255,'+(0.2*pa)+')';X.lineWidth=0.8;X.setLineDash([3,3]); |
| X.beginPath();X.moveTo(ox2+50,oy2+20);X.lineTo(ap[0],ap[1]);X.stroke();X.setLineDash([]); |
| } |
| |
| |
| var dp2=botScreenPos.drone; |
| if(dp2&&dp2[0]>-500){ |
| var ox3=dp2[0]+35*S2,oy3=dp2[1]+25*S2; |
| var droneAlt=(3.0+1.5*Math.sin(t*0.2)).toFixed(1); |
| var thrust=(9.81*2.2+0.5*Math.sin(t*0.35)).toFixed(1); |
| var dragF=(0.5*1.225*Math.pow(1.5+Math.sin(t*0.3),2)*0.02*0.04).toFixed(3); |
| var mg=(2.2*9.81).toFixed(1); |
| eqBox(ox3,oy3,[ |
| 'FLIGHT DYNAMICS', |
| 'T-mg = ma T='+thrust+'N mg='+mg+'N', |
| 'F_d = \u00bd\u03c1v\u00b2C_dA = '+dragF+'N', |
| 'alt = '+droneAlt+'m \u03c1=1.225kg/m\u00b3', |
| 'B\u00e9zier: P=(1-t)\u00b2P\u2080+2t(1-t)P\u2081+t\u00b2P\u2082' |
| ],'rgb(227,179,65)',pa); |
| X.strokeStyle='rgba(227,179,65,'+(0.2*pa)+')';X.lineWidth=0.8;X.setLineDash([3,3]); |
| X.beginPath();X.moveTo(ox3-40,oy3-15);X.lineTo(dp2[0],dp2[1]);X.stroke();X.setLineDash([]); |
| } |
| |
| |
| var ep=botScreenPos.exo; |
| if(ep&&ep[0]>-500){ |
| var ox4=ep[0]-40*S2,oy4=ep[1]+25*S2; |
| var hipAngle=(25+10*Math.sin(t*0.8)).toFixed(1); |
| var kneeAngle=(35+15*Math.sin(t*0.8+0.5)).toFixed(1); |
| var grfVal=(75+10*Math.sin(t*0.6)).toFixed(0); |
| var tauVal=(12+4*Math.sin(t*0.7)).toFixed(1); |
| eqBox(ox4,oy4,[ |
| 'INVERTED PENDULUM + GAIT', |
| '\u03c4 = I\u03b1+mgl\u00b7sin\u03b8 = '+tauVal+'N\u00b7m', |
| 'GRF = m(g+a) = '+grfVal+'N', |
| '\u03b8_hip='+hipAngle+'\u00b0 \u03b8_knee='+kneeAngle+'\u00b0', |
| 'Gait sym=0.93 stance/swing FSM' |
| ],'rgb(188,140,255)',pa); |
| X.strokeStyle='rgba(188,140,255,'+(0.2*pa)+')';X.lineWidth=0.8;X.setLineDash([3,3]); |
| X.beginPath();X.moveTo(ox4+50,oy4-15);X.lineTo(ep[0],ep[1]);X.stroke();X.setLineDash([]); |
| } |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| function drawEvalOverlays(t){ |
| if(!evalVisible)return; |
| var S2=eCamZ; |
| |
| |
| var bots=[ |
| {key:'surgical',score:evalScores.surg,color:'#ff6b6b',label:'SURG'}, |
| {key:'amr',score:evalScores.amr,color:'#58a6ff',label:'AMR'}, |
| {key:'drone',score:evalScores.drone,color:'#e3b341',label:'DRONE'}, |
| {key:'exo',score:evalScores.exo,color:'#bc8cff',label:'EXO'} |
| ]; |
| |
| for(var bi=0;bi<bots.length;bi++){ |
| var b=bots[bi]; |
| var sp=botScreenPos[b.key]; |
| if(!sp||sp[0]<-500)continue; |
| var sc=b.score; |
| |
| var hc=sc>0.9?'rgba(63,185,80,':'rgba(227,179,65,'; |
| if(sc<0.8)hc='rgba(248,81,73,'; |
| var pulse=0.3+0.15*Math.sin(t*3+bi*1.5); |
| var radius=18+6*S2; |
| |
| |
| X.beginPath();X.arc(sp[0],sp[1],radius,0,Math.PI*2); |
| X.strokeStyle=hc+(pulse+0.1)+')';X.lineWidth=2.5;X.stroke(); |
| |
| |
| X.beginPath();X.arc(sp[0],sp[1],radius,-Math.PI/2,-Math.PI/2+sc*Math.PI*2); |
| X.strokeStyle=hc+'0.7)';X.lineWidth=3.5;X.stroke(); |
| |
| |
| var glow=X.createRadialGradient(sp[0],sp[1],radius*0.5,sp[0],sp[1],radius*1.3); |
| glow.addColorStop(0,'transparent'); |
| glow.addColorStop(0.7,hc+(pulse*0.08)+')'); |
| glow.addColorStop(1,'transparent'); |
| X.fillStyle=glow;X.beginPath();X.arc(sp[0],sp[1],radius*1.3,0,Math.PI*2);X.fill(); |
| |
| |
| X.font='bold '+(8+S2)+'px system-ui';X.textAlign='center'; |
| X.fillStyle=hc+'0.9)'; |
| X.fillText(Math.round(sc*100)+'%',sp[0],sp[1]-radius-4); |
| |
| |
| X.font=(7+S2*0.5)+'px system-ui'; |
| X.fillStyle='rgba(230,237,243,0.35)'; |
| X.fillText(b.label,sp[0],sp[1]+radius+10); |
| |
| |
| var cbfR=radius+8; |
| X.strokeStyle='rgba(0,200,220,'+(0.15+0.08*Math.sin(t*2.5+bi))+')'; |
| X.lineWidth=1;X.setLineDash([4,3]); |
| X.beginPath();X.arc(sp[0],sp[1],cbfR,0,Math.PI*2);X.stroke();X.setLineDash([]); |
| |
| |
| var realmE=(0.12+0.04*bi+0.06*Math.sin(t*0.6+bi*0.8)); |
| var realmOk=realmE<0.25; |
| X.font='bold '+(5.5+S2*0.3)+'px system-ui'; |
| X.fillStyle=realmOk?'rgba(63,185,80,0.45)':'rgba(248,81,73,0.45)'; |
| X.fillText(realmOk?'\\u25CF AUTO':'\\u25CB OVRST',sp[0],sp[1]+radius+19); |
| } |
| |
| |
| |
| var pipePhase=(t*0.15)%4; |
| var links=[ |
| {from:'surgical',to:'amr',phase:0,color:'rgba(126,231,135,',label:'SPECIMEN'}, |
| {from:'amr',to:'drone',phase:1,color:'rgba(88,166,255,',label:'TRANSPORT'}, |
| {from:'drone',to:'amr',phase:2,color:'rgba(227,179,65,',label:'DELIVERY'}, |
| {from:'amr',to:'exo',phase:3,color:'rgba(188,140,255,',label:'SCHEDULE'} |
| ]; |
| |
| for(var li=0;li<links.length;li++){ |
| var lk=links[li]; |
| var dist=Math.abs(pipePhase-lk.phase); |
| if(dist>1)continue; |
| var alpha=Math.max(0,1-dist)*0.6; |
| var fromP=botScreenPos[lk.from],toP=botScreenPos[lk.to]; |
| if(!fromP||!toP||fromP[0]<-500||toP[0]<-500)continue; |
| |
| |
| X.strokeStyle=lk.color+alpha+')';X.lineWidth=1.5+alpha; |
| X.setLineDash([6,4]);X.lineDashOffset=-t*30; |
| X.beginPath();X.moveTo(fromP[0],fromP[1]); |
| |
| var mx=(fromP[0]+toP[0])/2,my=(fromP[1]+toP[1])/2-20*S2; |
| X.quadraticCurveTo(mx,my,toP[0],toP[1]);X.stroke(); |
| X.setLineDash([]);X.lineDashOffset=0; |
| |
| |
| var angle=Math.atan2(toP[1]-my,toP[0]-mx); |
| X.fillStyle=lk.color+alpha+')'; |
| X.beginPath(); |
| X.moveTo(toP[0],toP[1]); |
| X.lineTo(toP[0]-8*Math.cos(angle-0.4),toP[1]-8*Math.sin(angle-0.4)); |
| X.lineTo(toP[0]-8*Math.cos(angle+0.4),toP[1]-8*Math.sin(angle+0.4)); |
| X.closePath();X.fill(); |
| |
| |
| if(alpha>0.3){ |
| X.font='bold '+(7+S2*0.5)+'px system-ui';X.textAlign='center'; |
| X.fillStyle=lk.color+(alpha*0.8)+')'; |
| X.fillText(lk.label,mx,my-6); |
| } |
| } |
| |
| |
| var surgP=botScreenPos.surgical; |
| if(surgP&&surgP[0]>-500){ |
| var fcNorm=evalScores.fc/100; |
| |
| var heatAlpha=0.08+(1-fcNorm)*0.3; |
| var heatR=fcNorm>0.95?'rgba(63,185,80,':'rgba(248,81,73,'; |
| if(fcNorm>0.93&&fcNorm<=0.95)heatR='rgba(227,179,65,'; |
| var forceRadius=30+10*S2; |
| var fg=X.createRadialGradient(surgP[0],surgP[1],forceRadius*0.3,surgP[0],surgP[1],forceRadius); |
| fg.addColorStop(0,heatR+heatAlpha+')'); |
| fg.addColorStop(0.6,heatR+(heatAlpha*0.4)+')'); |
| fg.addColorStop(1,'transparent'); |
| X.fillStyle=fg;X.beginPath();X.arc(surgP[0],surgP[1],forceRadius,0,Math.PI*2);X.fill(); |
| |
| |
| var forceN=(2.0*(1-fcNorm/100)*100).toFixed(1); |
| X.font='bold '+(7+S2)+'px system-ui';X.textAlign='center'; |
| X.fillStyle=heatR+'0.6)'; |
| X.fillText('<2N',surgP[0]+forceRadius+8,surgP[1]); |
| } |
| |
| |
| if(evalScores.hl>1.8){ |
| |
| var pulseA=0.06+0.04*Math.sin(t*5); |
| var zp1=iso(24,12,0),zp2=iso(24,20,0); |
| X.strokeStyle='rgba(248,81,73,'+pulseA+')';X.lineWidth=3; |
| X.beginPath();X.moveTo(zp1[0],zp1[1]);X.lineTo(zp2[0],zp2[1]);X.stroke(); |
| } |
| |
| |
| |
| if(camView==='overview'){ |
| var crX=C.width-195,crY=C.height-155; |
| var crW=180,crH=140; |
| var crReady=evalScores.clinicalReady; |
| var crColor=crReady?'rgba(255,166,87,':'rgba(248,81,73,'; |
| var crPulse=0.85+0.1*Math.sin(t*2); |
| |
| X.fillStyle='rgba(4,8,16,0.88)'; |
| X.beginPath();if(X.roundRect){X.roundRect(crX,crY,crW,crH,8)}else{X.rect(crX,crY,crW,crH)}X.fill(); |
| X.strokeStyle=crColor+crPulse*0.5+')';X.lineWidth=1.3;X.stroke(); |
| |
| X.fillStyle=crColor+crPulse*0.4+')';X.fillRect(crX+1,crY+5,3,crH-10); |
| |
| X.font='bold 10px system-ui';X.textAlign='left'; |
| X.fillStyle=crColor+crPulse*0.95+')'; |
| X.fillText('CLINICAL READINESS',crX+10,crY+15); |
| |
| X.font='bold 9px system-ui';X.textAlign='right'; |
| X.fillStyle=crReady?'rgba(63,185,80,0.9)':'rgba(248,81,73,0.9)'; |
| X.fillText(crReady?'\\u2714 READY':'\\u2718 BLOCKED',crX+crW-8,crY+15); |
| |
| X.strokeStyle=crColor+'0.2)';X.lineWidth=0.8;X.beginPath();X.moveTo(crX+8,crY+21);X.lineTo(crX+crW-8,crY+21);X.stroke(); |
| |
| X.font='10px "Courier New",monospace';X.textAlign='left'; |
| X.fillStyle=crColor+crPulse*0.75+')'; |
| var nassVal=evalScores.nasssDomains||7; |
| X.fillText('Sociotechnical: '+nassVal+'/7',crX+10,crY+35); |
| |
| for(var nd=0;nd<7;nd++){ |
| X.fillStyle=nd<nassVal?'rgba(63,185,80,0.8)':'rgba(110,118,129,0.4)'; |
| X.beginPath();X.arc(crX+130+nd*7,crY+32,2.5,0,Math.PI*2);X.fill(); |
| } |
| |
| var tdSav=evalScores.tdabcSavings||127; |
| X.fillStyle=crColor+crPulse*0.75+')'; |
| X.fillText('Value Impact: $'+tdSav+'K/yr',crX+10,crY+50); |
| |
| X.fillStyle='rgba(63,185,80,0.15)';X.fillRect(crX+130,crY+44,40,6); |
| X.fillStyle='rgba(63,185,80,0.6)';X.fillRect(crX+130,crY+44,Math.min(40,tdSav*0.3),6); |
| |
| X.fillStyle='rgba(88,166,255,'+crPulse*0.75+')'; |
| X.fillText('AI Output: Descriptive',crX+10,crY+65); |
| |
| X.fillStyle=crColor+crPulse*0.75+')'; |
| X.fillText('Governance:',crX+10,crY+80); |
| |
| var govLabels=['MC','EQ','PCCP','GMLP','CG','RT']; |
| for(var gi=0;gi<6;gi++){ |
| var gx=crX+85+gi*16; |
| X.fillStyle='rgba(63,185,80,0.15)';X.beginPath();if(X.roundRect){X.roundRect(gx,crY+72,14,11,2)}else{X.rect(gx,crY+72,14,11)}X.fill(); |
| X.font='bold 5.5px system-ui';X.textAlign='center'; |
| X.fillStyle='rgba(63,185,80,0.85)';X.fillText(govLabels[gi],gx+7,crY+80.5); |
| } |
| |
| X.strokeStyle='rgba(0,200,220,0.15)';X.lineWidth=0.6;X.beginPath();X.moveTo(crX+8,crY+88);X.lineTo(crX+crW-8,crY+88);X.stroke(); |
| |
| X.font='10px "Courier New",monospace';X.textAlign='left'; |
| X.fillStyle='rgba(0,200,220,'+crPulse*0.75+')'; |
| X.fillText('CBF Safety: \\u2714 Invariant',crX+10,crY+101); |
| |
| var realmH=(0.14+0.06*Math.sin(t*0.5)).toFixed(2); |
| var realmMode=parseFloat(realmH)<0.25?'AUTONOMOUS':'OVERSIGHT'; |
| X.fillStyle='rgba(126,231,135,'+crPulse*0.75+')'; |
| X.fillText('H(\\u03c0): '+realmH+' \\u2192 '+realmMode,crX+10,crY+115); |
| |
| var teamFl=Math.round(89+5*Math.sin(t*0.3)); |
| X.fillStyle='rgba(188,140,255,'+crPulse*0.75+')'; |
| X.fillText('Team Fluency: '+teamFl+'%',crX+10,crY+129); |
| |
| X.fillStyle='rgba(227,179,65,'+crPulse*0.7+')'; |
| X.font='9px "Courier New",monospace'; |
| X.fillText('EDF \\u2714 CERT \\u2714 PAIEF:'+(evalScores.safeGate?(evalScores.paief||0).toFixed(2):'GATED'),crX+10,crY+140); |
| } |
| } |
| var particles=[];for(var i=0;i<70;i++){particles.push({x:Math.random()*FW,y:Math.random()*FD,z:Math.random()*5,vx:(Math.random()-0.5)*0.012,vy:(Math.random()-0.5)*0.012,vz:Math.random()*0.007,size:0.3+Math.random()*1,color:['rgba(88,166,255,','rgba(62,175,80,','rgba(227,179,65,','rgba(188,140,255,'][Math.floor(Math.random()*4)],phase:Math.random()*Math.PI*2})} |
| function drawScenarioHUD(t){ |
| if(!scenario.active)return; |
| var ph=scenario.phases[scenario.phase]; |
| X.save(); |
| |
| var bx=W/2,by=90; |
| var n2=scenario.news2; |
| var n2c=n2>=7?'#f85149':n2>=5?'#e3b341':n2>=3?'#f0883e':'#3fb950'; |
| var n2bg=n2>=7?'rgba(248,81,73,0.15)':n2>=5?'rgba(227,179,65,0.15)':'rgba(63,185,80,0.08)'; |
| |
| var pillW=280,pillH=52; |
| X.fillStyle=n2bg; |
| X.beginPath();X.roundRect(bx-pillW/2,by-pillH/2,pillW,pillH,8);X.fill(); |
| X.strokeStyle=n2c;X.lineWidth=1.5;X.beginPath();X.roundRect(bx-pillW/2,by-pillH/2,pillW,pillH,8);X.stroke(); |
| |
| X.font='bold 13px monospace';X.textAlign='center';X.fillStyle=n2c; |
| X.fillText(ph.name,bx,by-10); |
| |
| X.font='bold 11px monospace';X.fillStyle='#e6edf3'; |
| X.fillText('NEWS2: '+n2+'/20',bx-80,by+12); |
| |
| var progW=100,progH=4; |
| X.fillStyle='rgba(255,255,255,0.1)';X.fillRect(bx-progW/2+30,by+8,progW,progH); |
| var frac=Math.min(scenario.timer/ph.dur,1); |
| X.fillStyle=n2c;X.fillRect(bx-progW/2+30,by+8,progW*frac,progH); |
| |
| X.font='9px monospace';X.fillStyle='#8b949e'; |
| X.fillText('Phase '+(scenario.phase+1)+'/'+scenario.phases.length,bx+100,by+12); |
| |
| if(scenario.phase>=2&&scenario.phase<=4){ |
| var flash=Math.sin(t*6)>0.3?0.08:0; |
| X.fillStyle='rgba(248,81,73,'+flash+')';X.fillRect(0,0,W,H); |
| } |
| |
| X.font='9px monospace';X.textAlign='center';X.fillStyle='rgba(230,237,243,0.6)'; |
| var desc=ph.desc;if(desc.length>80)desc=desc.substring(0,77)+'...'; |
| X.fillText(desc,bx,by+28); |
| |
| if(scenario.phase>=3&&scenario.phase<=5){ |
| var emergPos=iso(12,14,0); |
| var robotSrc=[ |
| {pos:botScreenPos.amr,color:'#58a6ff',label:'TUG'}, |
| {pos:botScreenPos.drone,color:'#e3b341',label:'Zipline'}, |
| {pos:botScreenPos.exo,color:'#bc8cff',label:'EksoNR'} |
| ]; |
| robotSrc.forEach(function(rs,ri){ |
| if(rs.pos[0]<-500)return; |
| var dashOff=(t*60+ri*40)%20; |
| X.setLineDash([6,4]);X.lineDashOffset=-dashOff; |
| X.strokeStyle=rs.color;X.lineWidth=1.5;X.globalAlpha=0.5+0.2*Math.sin(t*2+ri); |
| X.beginPath();X.moveTo(rs.pos[0],rs.pos[1]); |
| var cpx=(rs.pos[0]+emergPos[0])/2+(ri-1)*40; |
| var cpy=(rs.pos[1]+emergPos[1])/2-30; |
| X.quadraticCurveTo(cpx,cpy,emergPos[0],emergPos[1]); |
| X.stroke();X.setLineDash([]);X.globalAlpha=1; |
| var dotProg=(t*0.5+ri*0.3)%1; |
| var dx=rs.pos[0]+(emergPos[0]-rs.pos[0])*dotProg; |
| var dy=rs.pos[1]+(emergPos[1]-rs.pos[1])*dotProg; |
| X.fillStyle=rs.color;X.beginPath();X.arc(dx,dy,3,0,Math.PI*2);X.fill(); |
| }); |
| |
| var emPulse=8+4*Math.sin(t*4); |
| X.strokeStyle='rgba(248,81,73,'+(0.3+0.2*Math.sin(t*3))+')';X.lineWidth=2; |
| X.beginPath();X.arc(emergPos[0],emergPos[1],emPulse,0,Math.PI*2);X.stroke(); |
| X.beginPath();X.arc(emergPos[0],emergPos[1],emPulse*1.5,0,Math.PI*2);X.stroke(); |
| } |
| |
| if(scenario.phase>=2){ |
| var vsX=W/2+160,vsY=78,vsW=110,vsH=28; |
| X.fillStyle='rgba(3,6,13,0.85)'; |
| X.beginPath();X.roundRect(vsX,vsY,vsW,vsH,4);X.fill(); |
| X.strokeStyle='rgba(248,81,73,0.3)';X.lineWidth=1; |
| X.beginPath();X.roundRect(vsX,vsY,vsW,vsH,4);X.stroke(); |
| var hr=scenario.phase<=3?38+Math.floor(Math.random()*5):72+Math.floor(Math.random()*8); |
| var hrC=hr<50?'#f85149':'#3fb950'; |
| X.font='bold 8px monospace';X.textAlign='left';X.fillStyle=hrC; |
| X.fillText('\u2764 '+hr,vsX+4,vsY+10); |
| |
| X.strokeStyle=hrC;X.lineWidth=1;X.beginPath(); |
| for(var ei=0;ei<30;ei++){ |
| var ex=vsX+35+ei*2.3; |
| var ePhase=((t*3+ei*0.3)%2); |
| var ey=vsY+7; |
| if(ePhase>0.8&&ePhase<0.85)ey-=6; |
| else if(ePhase>0.85&&ePhase<0.95)ey+=3; |
| else ey+=Math.sin(ei*0.5)*0.5; |
| if(ei===0)X.moveTo(ex,ey);else X.lineTo(ex,ey); |
| }X.stroke(); |
| var spo2=scenario.phase<=3?82+Math.floor(Math.random()*4):96+Math.floor(Math.random()*3); |
| var bp=scenario.phase<=3?'60/35':'120/78'; |
| X.font='7px monospace';X.fillStyle=spo2<90?'#f85149':'#58a6ff'; |
| X.fillText('SpO\u2082 '+spo2+'%',vsX+4,vsY+21); |
| X.fillStyle=scenario.phase<=3?'#e3b341':'#3fb950'; |
| X.fillText('BP '+bp,vsX+55,vsY+21); |
| |
| if(scenario.phase>=3&&scenario.phase<=5){ |
| X.font='bold 6px monospace';X.fillStyle='#f85149';X.textAlign='center'; |
| X.fillText('ACLS',vsX+vsW/2,vsY+vsH+8); |
| var aclsPhases=['CPR','EPI','DEFIB','RHYTHM']; |
| var aclsIdx=Math.floor(t*0.5)%4; |
| X.font='5px monospace';X.fillStyle='#e3b341'; |
| X.fillText(aclsPhases[aclsIdx],vsX+vsW/2,vsY+vsH+15); |
| } |
| } |
| X.restore(); |
| } |
| function drawHandoffs(t){ |
| if(activeHandoff===null){ |
| |
| var hzPos=iso(23,12,0); |
| X.save();X.globalAlpha=0.3+0.15*Math.sin(t*2); |
| X.strokeStyle='#f0883e';X.lineWidth=1;X.setLineDash([3,3]); |
| X.beginPath();X.arc(hzPos[0],hzPos[1],12*eCamZ,0,Math.PI*2);X.stroke(); |
| X.setLineDash([]); |
| X.font=(7*eCamZ)+'px monospace';X.fillStyle='#f0883e';X.textAlign='center'; |
| X.fillText('HANDOFF ZONE',hzPos[0],hzPos[1]+18*eCamZ); |
| X.restore(); |
| return; |
| } |
| var h=handoffs[activeHandoff]; |
| var prog=h.phase/h.phases.length+h.timer/(h.durations[h.phase]*h.phases.length); |
| var phaseName=h.phases[h.phase]||''; |
| var phaseProgress=h.timer/h.durations[h.phase]; |
| |
| var fx=h.fromPos[0],fy=h.fromPos[1],tx=h.toPos[0],ty=h.toPos[1]; |
| var mx=fx+(tx-fx)*prog,my=fy+(ty-fy)*prog; |
| var fp=iso(fx,fy,0),tp=iso(tx,ty,0),mp=iso(mx,my,0); |
| X.save(); |
| |
| X.strokeStyle='#f0883e';X.lineWidth=1.5;X.globalAlpha=0.6; |
| X.setLineDash([4,4]);X.beginPath();X.moveTo(fp[0],fp[1]);X.lineTo(tp[0],tp[1]);X.stroke();X.setLineDash([]); |
| |
| X.globalAlpha=0.9; |
| var cargoZ=0; |
| if(h.type==='aerial'){cargoZ=8-prog*6;} |
| var cp=iso(mx,my,cargoZ); |
| |
| var pulse=0.7+0.3*Math.sin(t*6); |
| var glow=X.createRadialGradient(cp[0],cp[1],0,cp[0],cp[1],10*eCamZ); |
| glow.addColorStop(0,'rgba(240,136,62,'+pulse+')');glow.addColorStop(1,'rgba(240,136,62,0)'); |
| X.fillStyle=glow;X.beginPath();X.arc(cp[0],cp[1],10*eCamZ,0,Math.PI*2);X.fill(); |
| X.fillStyle='#f0883e';X.beginPath();X.arc(cp[0],cp[1],3*eCamZ,0,Math.PI*2);X.fill(); |
| |
| if(h.type==='aerial'&&(phaseName==='lower_droid'||phaseName==='transfer'||phaseName==='retract')){ |
| var droneHover=iso(mx,my,8); |
| X.strokeStyle='rgba(240,136,62,0.5)';X.lineWidth=1; |
| X.beginPath();X.moveTo(droneHover[0],droneHover[1]);X.lineTo(cp[0],cp[1]);X.stroke(); |
| } |
| |
| X.font='bold '+(8*eCamZ)+'px monospace';X.textAlign='center';X.fillStyle='#f0883e'; |
| X.fillText(phaseName.toUpperCase().replace('_',' '),cp[0],cp[1]-16*eCamZ); |
| |
| var barW=40*eCamZ,barH=3*eCamZ; |
| X.fillStyle='rgba(240,136,62,0.2)';X.fillRect(cp[0]-barW/2,cp[1]-12*eCamZ,barW,barH); |
| X.fillStyle='#f0883e';X.fillRect(cp[0]-barW/2,cp[1]-12*eCamZ,barW*phaseProgress,barH); |
| |
| if(phaseName==='authenticate'){ |
| var scanY=cp[1]+8*eCamZ+phaseProgress*14*eCamZ; |
| X.strokeStyle='rgba(63,185,80,'+(0.5+0.3*Math.sin(t*8))+')';X.lineWidth=1.5; |
| X.beginPath();X.moveTo(cp[0]-8*eCamZ,scanY);X.lineTo(cp[0]+8*eCamZ,scanY);X.stroke(); |
| X.font=(6*eCamZ)+'px monospace';X.fillStyle='#3fb950'; |
| X.fillText('BIOMETRIC SCAN',cp[0],cp[1]+28*eCamZ); |
| } |
| |
| if(h.type==='instrument'&&(phaseName==='retract'||phaseName==='swap'||phaseName==='insert')){ |
| var armOff=8*Math.sin(t*4)*eCamZ; |
| X.strokeStyle='rgba(63,185,80,0.7)';X.lineWidth=2; |
| X.beginPath();X.moveTo(cp[0]-armOff,cp[1]-5*eCamZ);X.lineTo(cp[0]+armOff,cp[1]+5*eCamZ);X.stroke(); |
| if(phaseName==='swap'){ |
| X.font=(6*eCamZ)+'px monospace';X.fillStyle='#e3b341'; |
| X.fillText('\u{1f504} ENDOWRIST SWAP',cp[0],cp[1]+22*eCamZ); |
| } |
| } |
| |
| var fromLed=h.phase<3?'#e3b341':'#3fb950'; |
| var toLed=h.phase>=3?'#3fb950':'#8b949e'; |
| X.fillStyle=fromLed;X.beginPath();X.arc(fp[0],fp[1]-4*eCamZ,3*eCamZ,0,Math.PI*2);X.fill(); |
| X.fillStyle=toLed;X.beginPath();X.arc(tp[0],tp[1]-4*eCamZ,3*eCamZ,0,Math.PI*2);X.fill(); |
| |
| X.font=(6*eCamZ)+'px monospace';X.fillStyle='rgba(240,136,62,0.7)'; |
| X.fillText(h.cargoLabel,cp[0],cp[1]+8*eCamZ); |
| |
| if(h.type==='delivery'&&phaseName==='authenticate'){ |
| var drawY=tp[1]+4*eCamZ; |
| for(var dw=0;dw<7;dw++){ |
| var dwX=tp[0]+(-12+dw*4)*eCamZ; |
| var litFrac=phaseProgress*7;var dwLit=dw<litFrac; |
| X.fillStyle=dwLit?'rgba(63,185,80,'+(0.6+0.3*Math.sin(t*4+dw))+')':'rgba(139,148,158,0.2)'; |
| X.fillRect(dwX,drawY,3*eCamZ,4*eCamZ); |
| if(dwLit){var dGlow=X.createRadialGradient(dwX+1.5*eCamZ,drawY+2*eCamZ,0,dwX+1.5*eCamZ,drawY+2*eCamZ,4*eCamZ); |
| dGlow.addColorStop(0,'rgba(63,185,80,0.3)');dGlow.addColorStop(1,'rgba(63,185,80,0)'); |
| X.fillStyle=dGlow;X.beginPath();X.arc(dwX+1.5*eCamZ,drawY+2*eCamZ,4*eCamZ,0,Math.PI*2);X.fill();} |
| } |
| X.font=(5*eCamZ)+'px monospace';X.fillStyle='rgba(63,185,80,0.6)';X.textAlign='center'; |
| X.fillText('DRAWER '+Math.min(7,Math.ceil(phaseProgress*7))+'/7 UNLOCKED',tp[0],drawY+10*eCamZ); |
| } |
| |
| if(h.type==='aerial'&&(phaseName==='hover'||phaseName==='lower_droid')){ |
| var droidP=iso(mx,my,cargoZ); |
| [[-4,-4],[4,-4],[-4,4],[4,4]].forEach(function(off){ |
| var jx=droidP[0]+off[0]*eCamZ,jy=droidP[1]+off[1]*eCamZ; |
| var flH=(3+2*Math.random())*eCamZ; |
| var flGrad=X.createLinearGradient(jx,jy,jx,jy+flH); |
| flGrad.addColorStop(0,'rgba(240,136,62,0.7)');flGrad.addColorStop(0.4,'rgba(248,81,73,0.4)');flGrad.addColorStop(1,'rgba(248,81,73,0)'); |
| X.fillStyle=flGrad;X.beginPath();X.moveTo(jx-1.5*eCamZ,jy);X.lineTo(jx+1.5*eCamZ,jy);X.lineTo(jx+(Math.random()-0.5)*eCamZ,jy+flH);X.closePath();X.fill(); |
| }); |
| X.font=(5*eCamZ)+'px monospace';X.textAlign='center';X.fillStyle='rgba(227,179,65,0.7)'; |
| X.fillText('ALT: '+cargoZ.toFixed(1)+'m',droidP[0],droidP[1]-8*eCamZ); |
| } |
| |
| if(h.type==='instrument'&&phaseName==='detect'){ |
| var useCount=7,maxUse=10; |
| var ucX=cp[0]+18*eCamZ,ucY=cp[1]-4*eCamZ; |
| var pillW=20*eCamZ,pillH=4*eCamZ; |
| X.fillStyle='rgba(139,148,158,0.15)'; |
| X.beginPath();X.roundRect(ucX-pillW/2,ucY-pillH/2,pillW,pillH,2*eCamZ);X.fill(); |
| X.fillStyle=useCount>7?'#f85149':'#3fb950'; |
| X.beginPath();X.roundRect(ucX-pillW/2,ucY-pillH/2,pillW*(useCount/maxUse),pillH,2*eCamZ);X.fill(); |
| X.font='bold '+(5*eCamZ)+'px monospace';X.textAlign='center';X.fillStyle='#e6edf3'; |
| X.fillText('USE '+useCount+'/'+maxUse,ucX,ucY+10*eCamZ); |
| X.font=(4*eCamZ)+'px monospace';X.fillStyle='rgba(63,185,80,0.5)'; |
| X.fillText('EndoWrist ID Confirmed',ucX,ucY+16*eCamZ); |
| } |
| |
| if(h.phase>=h.phases.length-1&&phaseProgress>0.7){ |
| var ckAlpha=Math.min(1,(phaseProgress-0.7)/0.3); |
| X.strokeStyle='rgba(63,185,80,'+ckAlpha+')';X.lineWidth=2.5*eCamZ; |
| X.beginPath();X.moveTo(tp[0]-5*eCamZ,tp[1]);X.lineTo(tp[0]-1*eCamZ,tp[1]+4*eCamZ);X.lineTo(tp[0]+6*eCamZ,tp[1]-5*eCamZ);X.stroke(); |
| } |
| X.restore(); |
| } |
| function drawParticles(t){particles.forEach(function(p){p.x+=p.vx;p.y+=p.vy;p.z+=p.vz;if(p.x<0||p.x>FW)p.vx*=-1;if(p.y<0||p.y>FD)p.vy*=-1;if(p.z<0||p.z>5){p.z=Math.random()*5;p.vz=Math.random()*0.007}var alpha=0.04+0.025*Math.sin(t*1.5+p.phase);var pp=iso(p.x,p.y,p.z);X.fillStyle=p.color+alpha+')';X.beginPath();X.arc(pp[0],pp[1],p.size*eCamZ,0,Math.PI*2);X.fill()})} |
| function updateRobotRef(){ |
| |
| var viewMap={surgical:'rr-surgical',amr:'rr-amr',drone:'rr-drone',exo:'rr-exo'}; |
| var cards=document.querySelectorAll('.rr-card'); |
| cards.forEach(function(c){c.classList.remove('active')}); |
| |
| if(camView==='overview'){cards.forEach(function(c){c.classList.add('active')})} |
| else if(viewMap[camView]){var el=document.getElementById(viewMap[camView]);if(el)el.classList.add('active')} |
| } |
| function drawMiniMap(){updateRobotRef()} |
| function updateMetrics(t){var varp=(0.94+0.03*Math.sin(t*0.5)).toFixed(2),cr2=Math.round(55+10*Math.sin(t*0.7)),force=Math.random()>0.05?'OK':'WARN',fleet=Math.round(82+10*Math.sin(t*0.4)),gait=(0.91+0.04*Math.sin(t*0.6)).toFixed(2); |
| document.getElementById('mV').textContent=varp;document.getElementById('mL').textContent=cr2+'ms';document.getElementById('mF').textContent=force;document.getElementById('mF').style.color=force==='OK'?'#3fb950':'#f85149';document.getElementById('mU').textContent=fleet+'%';document.getElementById('mG').textContent=gait; |
| document.getElementById('bV').style.width=(varp*100)+'%';document.getElementById('bL').style.width=Math.max(0,100-cr2)+'%';document.getElementById('bF').style.width=force==='OK'?'95%':'40%';document.getElementById('bF').style.background=force==='OK'?'#3fb950':'#f85149';document.getElementById('bU').style.width=fleet+'%';document.getElementById('bG').style.width=(gait*100)+'%'} |
| function updateNarration(){if(!narrating)return; |
| |
| var elapsed=(performance.now()-narWallStart)/1000; |
| var totalDur=24; |
| var cycleTime=((elapsed%totalDur)+totalDur)%totalDur; |
| var phase=null;var phaseIdx=-1; |
| for(var i=0;i<narPhases.length;i++){ |
| if(cycleTime>=narPhases[i].t&&cycleTime<narPhases[i].t+narPhases[i].dur){phase=narPhases[i];phaseIdx=i;break} |
| } |
| if(phase){ |
| var phaseElapsed=cycleTime-phase.t; |
| |
| var charsPerSec=150; |
| var totalChars=phase.text.length; |
| var typedChars=Math.min(totalChars,Math.floor(phaseElapsed*charsPerSec)); |
| var cursor=(typedChars<totalChars)?(Math.floor(elapsed*6)%2===0?'\u2588':'\u2589'):''; |
| var displayText=phase.text.substring(0,typedChars)+cursor; |
| |
| var done=(typedChars>=totalChars); |
| var pctText=done?'\u2705 COMPLETE':'GENERATING... '+Math.floor(typedChars/totalChars*100)+'%'; |
| document.getElementById('nT').textContent='\u{1f3ac} '+phase.title+' ['+pctText+']'; |
| document.getElementById('nX').textContent=displayText; |
| |
| if(phase.cam&&phaseIdx!==lastNarPhase){ |
| lastNarPhase=phaseIdx; |
| narTypeIdx=0;narTypeDone=false; |
| camView=phase.cam;var c=cams[phase.cam];camX=c.x;camY=c.y;camZ=c.z; |
| document.querySelectorAll('#cam-row button').forEach(function(b){b.classList.remove('active')}); |
| var bm={overview:'bOv',surgical:'bSu',amr:'bAm',drone:'bDr',exo:'bEx'}; |
| if(bm[phase.cam])document.getElementById(bm[phase.cam]).classList.add('active'); |
| showOverlay('\u26a1 PHASE '+(phaseIdx+1)+'/6 \u2014 '+phase.title.split('\u2014')[1].trim(),colors_map[phase.cam]||'#58a6ff',700); |
| } |
| |
| var nb=document.getElementById('narration'); |
| var rate=done?3:8; |
| var pulse=done?0.5:0.35+0.25*Math.sin(elapsed*rate); |
| nb.style.borderColor='rgba(227,179,65,'+pulse+')'; |
| nb.style.boxShadow='0 0 '+(done?15:12+10*Math.sin(elapsed*rate))+'px rgba(227,179,65,'+(pulse*0.5)+')'; |
| } |
| } |
| |
| var lastT=0;var renderStarted=false; |
| function render(timestamp){ |
| try{ |
| |
| if(!renderStarted){lastT=timestamp;renderStarted=true} |
| var dt=Math.min((timestamp-lastT)/1000,0.1);lastT=timestamp; |
| |
| if(!paused){ |
| var stepInc=dt*60*speed; |
| step+=stepInc; |
| if(step>=240){step=step%240;cycleCount++; |
| |
| if(cycleCount<=100){showOverlay('\u{1f501} CYCLE '+cycleCount+' STARTED','#3fb950',600)} |
| if(cycleCount%3===1&&activeHandoff===null)triggerHandoff(0); |
| if(cycleCount%3===2&&activeHandoff===null)triggerHandoff(1); |
| if(cycleCount%3===0&&activeHandoff===null)triggerHandoff(2); |
| } |
| simTime+=dt*speed; |
| } |
| var t=simTime; |
| fpsC++;if(timestamp-fpsT>1000){fps=fpsC;fpsC=0;fpsT=timestamp;document.getElementById('mP').textContent=fps} |
| eCamX+=(camX*S-eCamX)*0.12;eCamY+=(camY*S-eCamY)*0.12;eCamZ+=(camZ-eCamZ)*0.12; |
| if(autoRotate&&!rotDragging)rotAngle+=dt*0.15; |
| eRotAngle+=(rotAngle-eRotAngle)*0.12; |
| eElevAngle+=(elevAngle-eElevAngle)*0.08; |
| X.fillStyle='#03060d';X.fillRect(0,0,W,H); |
| var bg=X.createRadialGradient(W/2,H/2,0,W/2,H/2,Math.max(W,H)*0.7);bg.addColorStop(0,'#0a0f1a');bg.addColorStop(1,'#03060d');X.fillStyle=bg;X.fillRect(0,0,W,H); |
| drawFloor(t);drawZones();drawWalls();drawEquipment(t);drawHospitalDetails(t); |
| drawExoskeleton(t);drawAMRFleet(t);drawDaVinciXi(t);drawDrones(t);drawCVOverlay(t);drawExtraCVOverlays(t);drawCR2Overlay(t);drawPhysicsOverlay(t);drawEvalOverlays(t);drawScenarioHUD(t);drawHandoffs(t);drawParticles(t); |
| drawOverlay(dt); |
| var prog=step/240*100;document.getElementById('tf').style.width=prog+'%';document.getElementById('tm').style.left=prog+'%';document.getElementById('sc').textContent='Step: '+Math.floor(step)+' / 240 \u00b7 Cycle '+cycleCount; |
| updateHandoffs(dt);updateScenario(dt); |
| if(Math.floor(t*2)%2===0){updateMetrics(t);updateEvaluation(t);updateVarpHud(t);updateTimeline(t);updatePresentation();updateDigitalTwin(t)}updateNarration();if(fpsC%30===0)drawMiniMap(); |
| updateHover(); |
| }catch(err){console.error('Render error:',err)} |
| requestAnimationFrame(render)} |
| requestAnimationFrame(render); |
| |
| setTimeout(function(){if(!presRunning){startPresentation()}},1200); |
| |
| </script> |
| </body> |
| </html> |