Spaces:
Running
Running
Commit ·
54a51e6
0
Parent(s):
Sample Viewer (history squashed; viewer content is served from gated datasets)
Browse filesCo-authored-by: claude opus 5.5 <claude opus 5.5@users.noreply.huggingface.co>
- .gitattributes +245 -0
- README.md +14 -0
- covers/egoSample.jpg +3 -0
- covers/motionSample.jpg +0 -0
- covers/teleopSample.jpg +3 -0
- egoSample/ego-legacy/demo02/viewer.html +6 -0
- egoSample/ego-legacy/demo05/viewer.html +6 -0
- egoSample/ego-legacy/demo07/viewer.html +6 -0
- egoSample/ego-legacy/demo08/viewer.html +6 -0
- egoSample/ego-legacy/demo09/viewer.html +6 -0
- egoSample/ego-legacy/demo10/viewer.html +6 -0
- egoSample/faberu.html +6 -0
- egoSample/index.html +6 -0
- egoSample/jizhi.html +6 -0
- egoSample/mego.html +6 -0
- egoSample/stereogs.html +6 -0
- gate.html +129 -0
- index.html +45 -0
- motionSample/index.html +6 -0
- sceneSample/b2/viewer.html +237 -0
- sceneSample/cover.jpg +0 -0
- sceneSample/index.html +167 -0
- sceneSample/ss.js +61 -0
- style.css +28 -0
- sw.js +97 -0
- teleop.html +6 -0
- teleopSample/clip.html +6 -0
- teleopSample/drink_ep0.html +6 -0
- teleopSample/drink_ep1.html +6 -0
- teleopSample/ep0/viewer.html +6 -0
- teleopSample/ep1/viewer.html +6 -0
- teleopSample/ep2/viewer.html +6 -0
- teleopSample/ep3/viewer.html +6 -0
- teleopSample/ep4/viewer.html +6 -0
- teleopSample/ep5/viewer.html +6 -0
- teleopSample/faberU/t2_water_bottle_into_steel_tray/20260707052527/viewer.html +6 -0
- teleopSample/faberU/t2_water_bottle_into_steel_tray/20260707052609/viewer.html +6 -0
- teleopSample/faberU/t3_juice_bottle_onto_plate/20260724050737/viewer.html +6 -0
- teleopSample/faberU/t3_juice_bottle_onto_plate/20260724050827/viewer.html +6 -0
- teleopSample/faberU/t4_juice_bottle_into_black_tray/20260728075709/viewer.html +6 -0
- teleopSample/faberU/t4_juice_bottle_into_black_tray/20260728080339/viewer.html +6 -0
- teleopSample/faberU/t6_pick_up_green_tea_bottle/20260730045050/viewer.html +6 -0
- teleopSample/faberU/t6_pick_up_green_tea_bottle/20260730045152/viewer.html +6 -0
- teleopSample/index.html +6 -0
- teleopSample/mem_ep0.html +6 -0
- teleopSample/mem_ep1.html +6 -0
- teleopSample/sort_ep0.html +6 -0
- teleopSample/sort_ep1.html +6 -0
- teleopSample/wipe_ep0.html +6 -0
- teleopSample/wipe_ep1.html +6 -0
.gitattributes
ADDED
|
@@ -0,0 +1,245 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
| 2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
| 3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
| 4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
| 5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
| 6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
| 7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
| 8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
| 9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
| 10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
| 11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
| 12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
| 13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
| 14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
| 15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
| 16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
| 17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
| 18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
| 19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
| 20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
| 21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
| 22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
| 23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
| 24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
| 25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
| 26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
| 27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
| 28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
| 29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
| 30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
| 31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
| 32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
| 33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
| 34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
| 35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
| 36 |
+
ep0/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 37 |
+
ep0/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 38 |
+
ep0/video/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 39 |
+
ep0/video/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 40 |
+
ep0/video/head_front_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 41 |
+
ep0/video/head_front_depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 42 |
+
ep1/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 43 |
+
ep1/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 44 |
+
ep1/video/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 45 |
+
ep1/video/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 46 |
+
ep1/video/head_front_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 47 |
+
ep1/video/head_front_depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 48 |
+
ep2/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 49 |
+
ep2/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 50 |
+
ep2/video/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 51 |
+
ep2/video/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 52 |
+
ep2/video/head_front_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 53 |
+
ep2/video/head_front_depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 54 |
+
ep3/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 55 |
+
ep3/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 56 |
+
ep3/video/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 57 |
+
ep3/video/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 58 |
+
ep3/video/head_front_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 59 |
+
ep3/video/head_front_depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 60 |
+
ep4/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 61 |
+
ep4/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 62 |
+
ep4/video/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 63 |
+
ep4/video/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 64 |
+
ep4/video/head_front_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 65 |
+
ep4/video/head_front_depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 66 |
+
ep5/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 67 |
+
ep5/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 68 |
+
ep5/video/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 69 |
+
ep5/video/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 70 |
+
ep5/video/head_front_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 71 |
+
ep5/video/head_front_depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 72 |
+
ego_annotation_demo/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 73 |
+
ego_annotation_demo/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 74 |
+
ego_annotation_demo/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 75 |
+
ego_annotation_demo/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 76 |
+
egoSample/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 77 |
+
egoSample/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 78 |
+
egoSample/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 79 |
+
egoSample/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 80 |
+
egoSample/demo02/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 81 |
+
egoSample/demo02/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 82 |
+
egoSample/demo02/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 83 |
+
egoSample/demo02/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 84 |
+
egoSample/demo05/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 85 |
+
egoSample/demo05/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 86 |
+
egoSample/demo05/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 87 |
+
egoSample/demo05/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 88 |
+
egoSample/demo07/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 89 |
+
egoSample/demo07/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 90 |
+
egoSample/demo07/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 91 |
+
egoSample/demo07/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 92 |
+
egoSample/demo08/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 93 |
+
egoSample/demo08/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 94 |
+
egoSample/demo08/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 95 |
+
egoSample/demo08/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 96 |
+
egoSample/demo09/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 97 |
+
egoSample/demo09/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 98 |
+
egoSample/demo09/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 99 |
+
egoSample/demo09/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 100 |
+
egoSample/demo10/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 101 |
+
egoSample/demo10/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 102 |
+
egoSample/demo10/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 103 |
+
egoSample/demo10/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 104 |
+
egoSample/cover.jpg filter=lfs diff=lfs merge=lfs -text
|
| 105 |
+
ep0/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 106 |
+
ep1/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 107 |
+
ep2/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 108 |
+
ep3/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 109 |
+
ep4/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 110 |
+
ep5/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 111 |
+
*.pack filter=lfs diff=lfs merge=lfs -text
|
| 112 |
+
egoSample/ego-legacy/demo02/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 113 |
+
egoSample/ego-legacy/demo02/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 114 |
+
egoSample/ego-legacy/demo02/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 115 |
+
egoSample/ego-legacy/demo02/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 116 |
+
egoSample/ego-legacy/demo05/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 117 |
+
egoSample/ego-legacy/demo05/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 118 |
+
egoSample/ego-legacy/demo05/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 119 |
+
egoSample/ego-legacy/demo05/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 120 |
+
egoSample/ego-legacy/demo07/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 121 |
+
egoSample/ego-legacy/demo07/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 122 |
+
egoSample/ego-legacy/demo07/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 123 |
+
egoSample/ego-legacy/demo07/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 124 |
+
egoSample/ego-legacy/demo08/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 125 |
+
egoSample/ego-legacy/demo08/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 126 |
+
egoSample/ego-legacy/demo08/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 127 |
+
egoSample/ego-legacy/demo08/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 128 |
+
egoSample/ego-legacy/demo09/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 129 |
+
egoSample/ego-legacy/demo09/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 130 |
+
egoSample/ego-legacy/demo09/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 131 |
+
egoSample/ego-legacy/demo09/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 132 |
+
egoSample/ego-legacy/demo10/thumb.jpg filter=lfs diff=lfs merge=lfs -text
|
| 133 |
+
egoSample/ego-legacy/demo10/video/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 134 |
+
egoSample/ego-legacy/demo10/video/left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 135 |
+
egoSample/ego-legacy/demo10/video/right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 136 |
+
egoSample/media/task_15365_ep000/head_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 137 |
+
egoSample/media/task_15365_ep000/head_fisheye_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 138 |
+
egoSample/media/task_15365_ep000/head_fisheye_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 139 |
+
egoSample/media/task_15365_ep000/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 140 |
+
egoSample/media/task_15365_ep000/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 141 |
+
egoSample/media/task_15634_ep003/head_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 142 |
+
egoSample/media/task_15634_ep003/head_fisheye_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 143 |
+
egoSample/media/task_15634_ep003/head_fisheye_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 144 |
+
egoSample/media/task_15634_ep003/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 145 |
+
egoSample/media/task_15634_ep003/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 146 |
+
egoSample/media/task_15638_ep001/head_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 147 |
+
egoSample/media/task_15638_ep001/head_fisheye_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 148 |
+
egoSample/media/task_15638_ep001/head_fisheye_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 149 |
+
egoSample/media/task_15638_ep001/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 150 |
+
egoSample/media/task_15638_ep001/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 151 |
+
egoSample/media/task_15648_ep002/head_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 152 |
+
egoSample/media/task_15648_ep002/head_fisheye_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 153 |
+
egoSample/media/task_15648_ep002/head_fisheye_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 154 |
+
egoSample/media/task_15648_ep002/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 155 |
+
egoSample/media/task_15648_ep002/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 156 |
+
egoSample/media/task_15659_ep004/head_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 157 |
+
egoSample/media/task_15659_ep004/head_fisheye_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 158 |
+
egoSample/media/task_15659_ep004/head_fisheye_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 159 |
+
egoSample/media/task_15659_ep004/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 160 |
+
egoSample/media/task_15659_ep004/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 161 |
+
teleopSample/media/drink_ep0/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 162 |
+
teleopSample/media/drink_ep0/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 163 |
+
teleopSample/media/drink_ep0/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 164 |
+
teleopSample/media/drink_ep0/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 165 |
+
teleopSample/media/drink_ep0/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 166 |
+
teleopSample/media/drink_ep0/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 167 |
+
teleopSample/media/drink_ep1/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 168 |
+
teleopSample/media/drink_ep1/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 169 |
+
teleopSample/media/drink_ep1/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 170 |
+
teleopSample/media/drink_ep1/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 171 |
+
teleopSample/media/drink_ep1/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 172 |
+
teleopSample/media/drink_ep1/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 173 |
+
teleopSample/media/mem_ep0/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 174 |
+
teleopSample/media/mem_ep0/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 175 |
+
teleopSample/media/mem_ep0/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 176 |
+
teleopSample/media/mem_ep0/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 177 |
+
teleopSample/media/mem_ep0/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 178 |
+
teleopSample/media/mem_ep0/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 179 |
+
teleopSample/media/mem_ep1/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 180 |
+
teleopSample/media/mem_ep1/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 181 |
+
teleopSample/media/mem_ep1/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 182 |
+
teleopSample/media/mem_ep1/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 183 |
+
teleopSample/media/mem_ep1/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 184 |
+
teleopSample/media/mem_ep1/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 185 |
+
teleopSample/media/sort_ep0/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 186 |
+
teleopSample/media/sort_ep0/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 187 |
+
teleopSample/media/sort_ep0/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 188 |
+
teleopSample/media/sort_ep0/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 189 |
+
teleopSample/media/sort_ep0/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 190 |
+
teleopSample/media/sort_ep0/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 191 |
+
teleopSample/media/sort_ep1/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 192 |
+
teleopSample/media/sort_ep1/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 193 |
+
teleopSample/media/sort_ep1/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 194 |
+
teleopSample/media/sort_ep1/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 195 |
+
teleopSample/media/sort_ep1/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 196 |
+
teleopSample/media/sort_ep1/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 197 |
+
teleopSample/media/wipe_ep0/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 198 |
+
teleopSample/media/wipe_ep0/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 199 |
+
teleopSample/media/wipe_ep0/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 200 |
+
teleopSample/media/wipe_ep0/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 201 |
+
teleopSample/media/wipe_ep0/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 202 |
+
teleopSample/media/wipe_ep0/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 203 |
+
teleopSample/media/wipe_ep1/depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 204 |
+
teleopSample/media/wipe_ep1/hand_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 205 |
+
teleopSample/media/wipe_ep1/hand_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 206 |
+
teleopSample/media/wipe_ep1/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 207 |
+
teleopSample/media/wipe_ep1/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 208 |
+
teleopSample/media/wipe_ep1/top_head.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 209 |
+
teleopSample/cover.jpg filter=lfs diff=lfs merge=lfs -text
|
| 210 |
+
teleopSample/ep0/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 211 |
+
teleopSample/ep0/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 212 |
+
teleopSample/ep1/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 213 |
+
teleopSample/ep1/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 214 |
+
teleopSample/ep2/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 215 |
+
teleopSample/ep2/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 216 |
+
teleopSample/ep3/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 217 |
+
teleopSample/ep3/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 218 |
+
teleopSample/ep4/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 219 |
+
teleopSample/ep4/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 220 |
+
teleopSample/ep5/video/chest_left_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 221 |
+
teleopSample/ep5/video/chest_right_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 222 |
+
teleopSample/faberU/**/*.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 223 |
+
egoSample/media/craft_20260629_sticker_ep000/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 224 |
+
egoSample/media/craft_20260629_sticker_ep000/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 225 |
+
egoSample/epdata/restock_20260916_ep000.js filter=lfs diff=lfs merge=lfs -text
|
| 226 |
+
egoSample/media/restock_20260916_ep000/head_color.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 227 |
+
egoSample/media/restock_20260916_ep000/head_depth.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 228 |
+
egoSample/media/restock_20260916_ep000/head_left_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 229 |
+
egoSample/media/restock_20260916_ep000/head_right_fisheye.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 230 |
+
egoSample/media/restock_20260916_ep000/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 231 |
+
egoSample/media/restock_20260916_ep000/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 232 |
+
egoSample/epdata/restock_20260916_ep000.core filter=lfs diff=lfs merge=lfs -text
|
| 233 |
+
egoSample/epdata/restock_20260916_ep000.map filter=lfs diff=lfs merge=lfs -text
|
| 234 |
+
egoSample/epdata/restock_20260916_ep000.scans filter=lfs diff=lfs merge=lfs -text
|
| 235 |
+
egoSample/epdata/restock_20260916_ep000.dgrid filter=lfs diff=lfs merge=lfs -text
|
| 236 |
+
egoSample/media/garment_sewing_ep000/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 237 |
+
egoSample/media/garment_sewing_ep000/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 238 |
+
egoSample/media/electronic_assembly_ep000/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 239 |
+
egoSample/media/electronic_assembly_ep000/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 240 |
+
egoSample/media/hand_sewing_ep000/head_stereo_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 241 |
+
egoSample/media/hand_sewing_ep000/head_stereo_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 242 |
+
egoSample/media/hand_sewing_ep000/head_fisheye_left.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 243 |
+
egoSample/media/hand_sewing_ep000/head_fisheye_right.mp4 filter=lfs diff=lfs merge=lfs -text
|
| 244 |
+
covers/teleopSample.jpg filter=lfs diff=lfs merge=lfs -text
|
| 245 |
+
covers/egoSample.jpg filter=lfs diff=lfs merge=lfs -text
|
README.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: TeleopSample Viewer
|
| 3 |
+
emoji: 😻
|
| 4 |
+
colorFrom: yellow
|
| 5 |
+
colorTo: yellow
|
| 6 |
+
sdk: static
|
| 7 |
+
pinned: false
|
| 8 |
+
hf_oauth: true
|
| 9 |
+
hf_oauth_scopes:
|
| 10 |
+
- gated-repos
|
| 11 |
+
hf_oauth_expiration_minutes: 10080
|
| 12 |
+
---
|
| 13 |
+
|
| 14 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
covers/egoSample.jpg
ADDED
|
Git LFS Details
|
covers/motionSample.jpg
ADDED
|
covers/teleopSample.jpg
ADDED
|
Git LFS Details
|
egoSample/ego-legacy/demo02/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
egoSample/ego-legacy/demo05/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
egoSample/ego-legacy/demo07/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
egoSample/ego-legacy/demo08/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
egoSample/ego-legacy/demo09/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
egoSample/ego-legacy/demo10/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
egoSample/faberu.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
egoSample/index.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
egoSample/jizhi.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
egoSample/mego.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
egoSample/stereogs.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
gate.html
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
+
<title>Sample Viewer Access</title>
|
| 7 |
+
<style>
|
| 8 |
+
:root{color-scheme:dark}*{box-sizing:border-box}
|
| 9 |
+
body{margin:0;background:#0b0d12;color:#e6e8ee;font:15px/1.55 -apple-system,"PingFang SC","Helvetica Neue",Arial,sans-serif}
|
| 10 |
+
a{color:#7fb2ff}
|
| 11 |
+
.wrap{max-width:760px;margin:0 auto;padding:28px 16px 64px}
|
| 12 |
+
.back{font-size:13px;color:#9aa1ad;text-decoration:none}
|
| 13 |
+
h1{font-size:23px;margin:10px 0 6px}
|
| 14 |
+
.sub{color:#9aa1ad;font-size:14px;margin:0 0 18px}
|
| 15 |
+
.gate{background:#12151c;border:1px solid #232733;border-radius:12px;padding:22px}
|
| 16 |
+
.gate p{margin:0 0 12px}
|
| 17 |
+
.btn{display:inline-block;background:#1b2740;color:#7fb2ff;border:1px solid #2c3d63;border-radius:8px;padding:9px 16px;font:inherit;cursor:pointer;text-decoration:none;margin:4px 8px 4px 0}
|
| 18 |
+
.btn:hover{border-color:#7fb2ff}
|
| 19 |
+
.who{font-size:13px;color:#9aa1ad}.who button{background:none;border:0;color:#7fb2ff;cursor:pointer;font:inherit;padding:0}
|
| 20 |
+
code{font:13px ui-monospace,Menlo,monospace;background:#1b2030;padding:1px 5px;border-radius:4px}
|
| 21 |
+
</style>
|
| 22 |
+
</head>
|
| 23 |
+
<body>
|
| 24 |
+
<div class="wrap">
|
| 25 |
+
<a class="back" href="index.html">← All data sample viewers</a>
|
| 26 |
+
<h1 id="title">Data sample viewer</h1>
|
| 27 |
+
<p class="sub">These previews are available to approved Hugging Face accounts.</p>
|
| 28 |
+
<div class="gate" id="gate"><p>Checking access…</p></div>
|
| 29 |
+
</div>
|
| 30 |
+
<script type="module">
|
| 31 |
+
import { oauthLoginUrl, oauthHandleRedirectIfPresent } from "https://cdn.jsdelivr.net/npm/@huggingface/hub@2.11.2/+esm";
|
| 32 |
+
|
| 33 |
+
const SECTIONS = {
|
| 34 |
+
egoSample: { repo: 'faradayfuture/egoSample', name: 'Ego Sample' },
|
| 35 |
+
teleopSample: { repo: 'faradayfuture/teleopSample', name: 'Teleop Sample' },
|
| 36 |
+
motionSample: { repo: 'faradayfuture/motionSample', name: 'Motion Sample' },
|
| 37 |
+
};
|
| 38 |
+
const KEYS = ['sv_oauth', 'sceneSample_oauth'];
|
| 39 |
+
const SELF = location.origin + location.pathname;
|
| 40 |
+
const inFrame = window.top !== window.self;
|
| 41 |
+
const gate = document.getElementById('gate');
|
| 42 |
+
const qs = new URLSearchParams(location.search);
|
| 43 |
+
|
| 44 |
+
let to = qs.get('to');
|
| 45 |
+
if (to) { if (location.hash && !to.includes('#')) to += location.hash; try { localStorage.setItem('sv_next', to); } catch (e) {} }
|
| 46 |
+
else { try { to = localStorage.getItem('sv_next'); } catch (e) {} }
|
| 47 |
+
if (!to || !/^\/(egoSample|teleopSample|motionSample)(\/|$)/.test(to.split('#')[0])) to = '/egoSample/index.html';
|
| 48 |
+
const sec = to.split('/')[1];
|
| 49 |
+
const S = SECTIONS[sec];
|
| 50 |
+
const DATASET = 'https://huggingface.co/datasets/' + S.repo;
|
| 51 |
+
document.getElementById('title').textContent = S.name + ' viewer';
|
| 52 |
+
document.title = S.name + ' · access';
|
| 53 |
+
|
| 54 |
+
const show = html => { gate.innerHTML = html; };
|
| 55 |
+
function session() {
|
| 56 |
+
for (const k of KEYS) {
|
| 57 |
+
try { const s = JSON.parse(localStorage.getItem(k) || 'null');
|
| 58 |
+
if (s && s.accessToken && (!s.accessTokenExpiresAt || new Date(s.accessTokenExpiresAt) > new Date())) return s; } catch (e) {}
|
| 59 |
+
}
|
| 60 |
+
return null;
|
| 61 |
+
}
|
| 62 |
+
function save(s) { for (const k of KEYS) { try { localStorage.setItem(k, JSON.stringify(s)); } catch (e) {} } }
|
| 63 |
+
function clear() { for (const k of KEYS) { try { localStorage.removeItem(k); } catch (e) {} } }
|
| 64 |
+
|
| 65 |
+
async function worker() {
|
| 66 |
+
if (!('serviceWorker' in navigator)) throw new Error('This browser does not support service workers.');
|
| 67 |
+
const reg = await navigator.serviceWorker.register('/sw.js', { scope: '/' });
|
| 68 |
+
await navigator.serviceWorker.ready;
|
| 69 |
+
if (!navigator.serviceWorker.controller)
|
| 70 |
+
await new Promise(r => { navigator.serviceWorker.addEventListener('controllerchange', r, { once: true }); setTimeout(r, 3000); });
|
| 71 |
+
return reg;
|
| 72 |
+
}
|
| 73 |
+
async function sendToken(reg, tokenValue) {
|
| 74 |
+
const sw = reg.active || navigator.serviceWorker.controller;
|
| 75 |
+
await new Promise(r => {
|
| 76 |
+
const on = ev => { if (ev.data && ev.data.type === 'token-ok') { navigator.serviceWorker.removeEventListener('message', on); r(); } };
|
| 77 |
+
navigator.serviceWorker.addEventListener('message', on);
|
| 78 |
+
sw.postMessage({ type: 'token', token: tokenValue });
|
| 79 |
+
setTimeout(r, 2000);
|
| 80 |
+
});
|
| 81 |
+
}
|
| 82 |
+
|
| 83 |
+
function who(s) {
|
| 84 |
+
const n = (s.userInfo && (s.userInfo.preferred_username || s.userInfo.name)) || 'signed in';
|
| 85 |
+
return `<p class="who">Signed in as <b>${n}</b> · <button id="signout">Sign out</button></p>`;
|
| 86 |
+
}
|
| 87 |
+
function wireSignOut(reg) {
|
| 88 |
+
const b = document.getElementById('signout');
|
| 89 |
+
if (b) b.onclick = async () => { clear(); if (reg) await sendToken(reg, null); location.href = SELF + '?to=' + encodeURIComponent(to); };
|
| 90 |
+
}
|
| 91 |
+
async function signIn() {
|
| 92 |
+
const vars = (window.huggingface && window.huggingface.variables) || {};
|
| 93 |
+
location.href = (await oauthLoginUrl({ scopes: 'openid profile gated-repos', redirectUrl: SELF, clientId: vars.OAUTH_CLIENT_ID })) + '&prompt=consent';
|
| 94 |
+
}
|
| 95 |
+
function askLogin() {
|
| 96 |
+
if (inFrame) {
|
| 97 |
+
show(`<p>Sign-in opens in a new tab.</p><a class="btn" href="${SELF}?to=${encodeURIComponent(to)}" target="_blank" rel="noopener">Open in a new tab to sign in ↗</a>`);
|
| 98 |
+
return;
|
| 99 |
+
}
|
| 100 |
+
show(`<p>Sign in with Hugging Face. If your account has not been approved yet, request access on the dataset page first.</p>
|
| 101 |
+
<button class="btn" id="signin">Sign in with Hugging Face</button>
|
| 102 |
+
<a class="btn" href="${DATASET}" target="_blank" rel="noopener">Request access ↗</a>`);
|
| 103 |
+
document.getElementById('signin').onclick = signIn;
|
| 104 |
+
}
|
| 105 |
+
|
| 106 |
+
async function main() {
|
| 107 |
+
let s = session();
|
| 108 |
+
if (!s) {
|
| 109 |
+
try { const r = await oauthHandleRedirectIfPresent(); if (r) { save(r); s = r; history.replaceState(null, '', SELF); } } catch (e) { console.warn(e); }
|
| 110 |
+
}
|
| 111 |
+
if (!s) return askLogin();
|
| 112 |
+
|
| 113 |
+
let reg;
|
| 114 |
+
try { reg = await worker(); await sendToken(reg, s.accessToken); }
|
| 115 |
+
catch (e) { show(`<p>${e.message}</p><p>Please open this page in a current version of Chrome, Edge, Safari or Firefox.</p>`); return; }
|
| 116 |
+
|
| 117 |
+
const r = await fetch(`https://huggingface.co/datasets/${S.repo}/resolve/main/viewer/${sec}/index.html`, { headers: { Authorization: 'Bearer ' + s.accessToken }, cache: 'no-store' }).catch(() => null);
|
| 118 |
+
if (r && r.ok) { try { localStorage.removeItem('sv_next'); } catch (e) {} location.replace(to); return; }
|
| 119 |
+
if (r && r.status === 401) { clear(); await sendToken(reg, null); return askLogin(); }
|
| 120 |
+
show(who(s) + `<p>Your account does not have access to the ${S.name} yet. Request access on the dataset page; once it is approved, reload this page.</p>
|
| 121 |
+
<a class="btn" href="${DATASET}" target="_blank" rel="noopener">Request access ↗</a>
|
| 122 |
+
<button class="btn" id="retry">Reload</button>`);
|
| 123 |
+
wireSignOut(reg);
|
| 124 |
+
document.getElementById('retry').onclick = () => location.reload();
|
| 125 |
+
}
|
| 126 |
+
main();
|
| 127 |
+
</script>
|
| 128 |
+
</body>
|
| 129 |
+
</html>
|
index.html
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html><html lang="en"><head><script>window.huggingface={variables:{"SPACE_CREATOR_USER_ID":"693d2ab492589ea93c96c4e5"}};</script><meta charset="utf-8">
|
| 2 |
+
<title>Faraday Future — Data Sample Viewers</title><style>
|
| 3 |
+
:root{color-scheme:dark}*{box-sizing:border-box}
|
| 4 |
+
body{margin:0;background:#0b0d12;color:#e6e8ee;font-family:-apple-system,"PingFang SC","Helvetica Neue",Arial,sans-serif}
|
| 5 |
+
header{padding:26px 28px 6px}h1{margin:0 0 5px;font-size:23px}.sub{color:#9aa1ad;font-size:13px}
|
| 6 |
+
.grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px;padding:18px 28px 44px;max-width:1800px}
|
| 7 |
+
.card{background:#12151c;border:1px solid #232733;border-radius:12px;overflow:hidden;text-decoration:none;color:inherit;transition:border-color .15s,transform .15s}
|
| 8 |
+
.card:hover{border-color:#3a4a6a;transform:translateY(-2px)}
|
| 9 |
+
.card img{width:100%;aspect-ratio:16/10;object-fit:cover;background:#000;display:block}
|
| 10 |
+
.card .m{padding:14px 16px 16px}
|
| 11 |
+
.card .t{font-size:17px;margin:0 0 6px;font-weight:600}
|
| 12 |
+
.card .r{font-size:12.5px;color:#9aa1ad;line-height:1.5}
|
| 13 |
+
.card .tag{display:inline-block;background:#1b2740;color:#7fb2ff;border-radius:5px;padding:2px 8px;font-size:11px;font-family:ui-monospace,monospace;margin-top:9px}
|
| 14 |
+
@media(max-width:1400px){.grid{grid-template-columns:repeat(2,1fr);max-width:1100px}}
|
| 15 |
+
@media(max-width:760px){.grid{grid-template-columns:1fr}}
|
| 16 |
+
</style></head><body>
|
| 17 |
+
<header><h1>Faraday Future · EAI Data Sample Viewers</h1>
|
| 18 |
+
<div class="sub">Interactive previews of embodied-AI data samples. Pick a dataset to explore.</div></header>
|
| 19 |
+
<div class="grid">
|
| 20 |
+
<a class="card" href="teleopSample/index.html">
|
| 21 |
+
<img src="covers/teleopSample.jpg" alt="Teleop Sample">
|
| 22 |
+
<div class="m"><div class="t">Teleop Sample</div>
|
| 23 |
+
<div class="r">Dual-arm real-robot teleoperation · 22 episodes.<br>Faber U gripper (8 scenes) + Futurist dexterous hand. Multi-camera video + depth, joint / end-effector / gripper / tactile charts, instruction segments.</div>
|
| 24 |
+
<span class="tag">LeRobot · Faber U + Futurist · 22 episodes</span></div>
|
| 25 |
+
</a>
|
| 26 |
+
<a class="card" href="egoSample/index.html">
|
| 27 |
+
<img src="covers/egoSample.jpg" alt="Ego Sample">
|
| 28 |
+
<div class="m"><div class="t">Ego Sample</div>
|
| 29 |
+
<div class="r">Head-mounted first-person capture from 3 rigs (PICO stereo, MEgo 5-cam, Stereo GS) · 12 tasks.<br>Synced multi-view video, head IMU / pose, 3D hand-pose where the rig provides it, temporal skill spans.</div>
|
| 30 |
+
<span class="tag">ego-rgb · 12 tasks · 3 rigs</span></div>
|
| 31 |
+
</a>
|
| 32 |
+
<a class="card" href="sceneSample/index.html">
|
| 33 |
+
<img src="sceneSample/cover.jpg" alt="Scene Sample">
|
| 34 |
+
<div class="m"><div class="t">Scene Sample</div>
|
| 35 |
+
<div class="r">Video paired with 3D scenes and the code that reproduces them · 4 samples.<br>Native 3D (simulation, procedural Blender) and real-world video with reconstructed scenes and motion.</div>
|
| 36 |
+
<span class="tag">3D · code ↔ video · access by approval</span></div>
|
| 37 |
+
</a>
|
| 38 |
+
<a class="card" href="motionSample/index.html">
|
| 39 |
+
<img src="covers/motionSample.jpg" alt="Motion Sample">
|
| 40 |
+
<div class="m"><div class="t">Motion Sample</div>
|
| 41 |
+
<div class="r">FF Master 31-DoF whole-body motion references · 2 clips.<br>URDF forward-kinematics playback, per-joint coordinate frames, joint-angle charts, PHC-format download.</div>
|
| 42 |
+
<span class="tag">PHC pickle · Master · 2 clips</span></div>
|
| 43 |
+
</a>
|
| 44 |
+
</div>
|
| 45 |
+
</body></html>
|
motionSample/index.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
sceneSample/b2/viewer.html
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
+
<title>Robot Ego Reconstruction</title>
|
| 7 |
+
<style>
|
| 8 |
+
:root{--bg:#111110;--panel:rgba(24,24,22,.86);--ink:#ecebe6;--muted:#9a988f;--line:#3a3935;--accent:#7d9cf0;--left:#5aa9ff;--right:#ff9f43}
|
| 9 |
+
*{box-sizing:border-box}
|
| 10 |
+
html,body{margin:0;height:100%;background:var(--bg);color:var(--ink);font:13px/1.45 -apple-system,"Helvetica Neue",sans-serif;overflow:hidden}
|
| 11 |
+
#view{position:fixed;inset:0}
|
| 12 |
+
.panel{position:fixed;background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:10px 12px;backdrop-filter:blur(6px)}
|
| 13 |
+
#info{top:12px;left:12px;max-width:360px}
|
| 14 |
+
#info h1{font-size:15px;margin:0 0 4px}
|
| 15 |
+
#info .stat{color:var(--muted)}
|
| 16 |
+
#info .badges{display:flex;flex-wrap:wrap;gap:4px;margin:6px 0}
|
| 17 |
+
#info .badges span{background:#2a2a27;border-radius:5px;padding:1px 6px;font-size:11.5px}
|
| 18 |
+
#layers{margin-top:6px;display:flex;gap:6px;flex-wrap:wrap}
|
| 19 |
+
button{background:#2a2a27;color:var(--ink);border:1px solid var(--line);border-radius:6px;padding:4px 9px;font:inherit;cursor:pointer}
|
| 20 |
+
button.on{border-color:var(--accent);color:var(--accent)}
|
| 21 |
+
#pip{top:12px;right:12px;width:min(36vw,420px);padding:6px}
|
| 22 |
+
#pip video{width:100%;display:block;border-radius:6px;background:#000}
|
| 23 |
+
#pip .cap{color:var(--muted);font-size:11.5px;margin-top:3px}
|
| 24 |
+
#bar{left:12px;right:12px;bottom:12px;display:grid;grid-template-columns:auto 1fr auto;gap:10px;align-items:center}
|
| 25 |
+
#bar input[type=range]{width:100%}
|
| 26 |
+
#chart{grid-column:1 / -1;width:100%;height:56px;display:block}
|
| 27 |
+
#time{font-variant-numeric:tabular-nums;color:var(--muted);min-width:110px;text-align:right}
|
| 28 |
+
.legend{display:flex;gap:12px;color:var(--muted);font-size:11.5px;margin-top:4px}
|
| 29 |
+
.legend i{display:inline-block;width:10px;height:3px;vertical-align:middle;margin-right:4px}
|
| 30 |
+
#msg{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);color:var(--muted)}
|
| 31 |
+
@media (max-width:720px){#pip{width:46vw}#info{max-width:50vw;font-size:12px}}
|
| 32 |
+
</style>
|
| 33 |
+
<script src="../ss.js"></script><script>addEventListener("DOMContentLoaded",()=>SS.hydrate())</script>
|
| 34 |
+
<script type="importmap">
|
| 35 |
+
{"imports":{"three":"https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.module.js",
|
| 36 |
+
"three/addons/":"https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/"}}
|
| 37 |
+
</script>
|
| 38 |
+
</head>
|
| 39 |
+
<body>
|
| 40 |
+
<div id="view"></div>
|
| 41 |
+
<div id="msg">Loading point cloud…</div>
|
| 42 |
+
<div class="panel" id="info">
|
| 43 |
+
<h1>Robot egocentric · shelf restocking → 3D scene + action</h1>
|
| 44 |
+
<div class="stat" id="stats"></div>
|
| 45 |
+
<div class="badges"><span>metric depth</span><span>full calibration</span><span>loop-closure de-drift</span><span>moving arm removed</span><span>1920px stereo colour</span></div>
|
| 46 |
+
<div>Scene points</div>
|
| 47 |
+
<div id="layers">
|
| 48 |
+
<button data-layer="rgb" class="on">RGB</button>
|
| 49 |
+
<button data-layer="lidar">LiDAR height</button>
|
| 50 |
+
<button data-layer="none">Hide</button>
|
| 51 |
+
</div>
|
| 52 |
+
<div style="margin-top:8px">View</div>
|
| 53 |
+
<div id="views" style="display:flex;gap:6px;margin-top:4px;flex-wrap:wrap">
|
| 54 |
+
<button data-view="orbit">Overview</button>
|
| 55 |
+
<button data-view="top">Top</button>
|
| 56 |
+
<button data-view="follow">Follow robot</button>
|
| 57 |
+
</div>
|
| 58 |
+
<div class="legend"><span><i style="background:var(--left)"></i>Left end-effector</span><span><i style="background:var(--right)"></i>Right end-effector</span><span><i style="background:#9be29b"></i>Base</span></div>
|
| 59 |
+
</div>
|
| 60 |
+
<div class="panel" id="pip">
|
| 61 |
+
<video id="vid" data-ss-src="b2/data/head_stereo_left.mp4" muted playsinline preload="auto"></video>
|
| 62 |
+
<div class="cap">Head stereo-left camera (faces blurred), synced with the 3D timeline</div>
|
| 63 |
+
</div>
|
| 64 |
+
<div class="panel" id="bar">
|
| 65 |
+
<button id="play">▶ Play</button>
|
| 66 |
+
<input id="slider" type="range" min="0" max="2411" value="0" step="1">
|
| 67 |
+
<span id="time">0.0 s</span>
|
| 68 |
+
<canvas id="chart"></canvas>
|
| 69 |
+
</div>
|
| 70 |
+
<script type="module">
|
| 71 |
+
import * as THREE from 'three';
|
| 72 |
+
import { OrbitControls } from 'three/addons/controls/OrbitControls.js';
|
| 73 |
+
import { PLYLoader } from 'three/addons/loaders/PLYLoader.js';
|
| 74 |
+
|
| 75 |
+
const V = '?v=1';
|
| 76 |
+
const view = document.getElementById('view');
|
| 77 |
+
const renderer = new THREE.WebGLRenderer({ antialias: true });
|
| 78 |
+
renderer.setPixelRatio(Math.min(devicePixelRatio, 2));
|
| 79 |
+
renderer.setSize(innerWidth, innerHeight);
|
| 80 |
+
view.appendChild(renderer.domElement);
|
| 81 |
+
const scene = new THREE.Scene();
|
| 82 |
+
scene.background = new THREE.Color(0x111110);
|
| 83 |
+
const camera = new THREE.PerspectiveCamera(55, innerWidth / innerHeight, 0.02, 200);
|
| 84 |
+
camera.up.set(0, 0, 1);
|
| 85 |
+
const controls = new OrbitControls(camera, renderer.domElement);
|
| 86 |
+
controls.enableDamping = true;
|
| 87 |
+
scene.add(new THREE.GridHelper(12, 24, 0x333331, 0x222220).rotateX(Math.PI / 2));
|
| 88 |
+
|
| 89 |
+
const [action, stats] = await Promise.all([
|
| 90 |
+
fetch('data/action.json' + V).then(r => r.json()),
|
| 91 |
+
fetch('data/recon_stats.json' + V).then(r => r.json())
|
| 92 |
+
]);
|
| 93 |
+
const F = action.frames, N = F.length, FPS = action.fps;
|
| 94 |
+
document.getElementById('stats').innerHTML =
|
| 95 |
+
`${stats.duration_s}s · ${N} frames @${FPS}Hz �� scene ${(stats.scene_points / 1e6).toFixed(2)}M points<br>` +
|
| 96 |
+
`base path ${stats.base_path_m}m · right EE path ${stats.right_ee_path_m}m · drift residual ${stats.residual_before_cm}→${stats.residual_after_cm}cm`;
|
| 97 |
+
|
| 98 |
+
// point clouds
|
| 99 |
+
const loader = new PLYLoader();
|
| 100 |
+
function brighten(geo, k) {
|
| 101 |
+
const c = geo.getAttribute('color');
|
| 102 |
+
if (!c) return;
|
| 103 |
+
for (let i = 0; i < c.array.length; i++) c.array[i] = Math.min(1, c.array[i] * k);
|
| 104 |
+
c.needsUpdate = true;
|
| 105 |
+
}
|
| 106 |
+
const clouds = {};
|
| 107 |
+
function loadCloud(name, file, size, k) {
|
| 108 |
+
return new Promise((res, rej) => loader.load(file + V, geo => {
|
| 109 |
+
brighten(geo, k);
|
| 110 |
+
const pts = new THREE.Points(geo, new THREE.PointsMaterial({ size, vertexColors: true, sizeAttenuation: true }));
|
| 111 |
+
clouds[name] = pts; scene.add(pts); res(pts);
|
| 112 |
+
}, undefined, rej));
|
| 113 |
+
}
|
| 114 |
+
await loadCloud('rgb', 'data/scene_rgb.ply', 0.012, 1.7).catch(e => { document.getElementById('msg').textContent = 'Failed to load point cloud (serve this folder over http, see README): ' + e; });
|
| 115 |
+
document.getElementById('msg').remove();
|
| 116 |
+
loadCloud('lidar', 'data/scene.ply', 0.02, 1.0).then(p => { p.visible = false; });
|
| 117 |
+
|
| 118 |
+
// trajectories
|
| 119 |
+
function line(key, color) {
|
| 120 |
+
const pos = new Float32Array(N * 3);
|
| 121 |
+
F.forEach((f, i) => pos.set(f[key], i * 3));
|
| 122 |
+
const g = new THREE.BufferGeometry(); g.setAttribute('position', new THREE.BufferAttribute(pos, 3));
|
| 123 |
+
g.setDrawRange(0, 1);
|
| 124 |
+
const l = new THREE.Line(g, new THREE.LineBasicMaterial({ color, transparent: true, opacity: 0.9 }));
|
| 125 |
+
scene.add(l); return l;
|
| 126 |
+
}
|
| 127 |
+
const baseZ = 0.02;
|
| 128 |
+
const basePos = F.map(f => [f.base[0], f.base[1], baseZ]);
|
| 129 |
+
const lineL = line('ee_l', 0x5aa9ff), lineR = line('ee_r', 0xff9f43);
|
| 130 |
+
const baseGeo = new THREE.BufferGeometry();
|
| 131 |
+
baseGeo.setAttribute('position', new THREE.BufferAttribute(new Float32Array(basePos.flat()), 3));
|
| 132 |
+
const lineB = new THREE.Line(baseGeo, new THREE.LineBasicMaterial({ color: 0x9be29b })); scene.add(lineB);
|
| 133 |
+
|
| 134 |
+
// gripper markers: two jaws whose gap follows the gripper opening
|
| 135 |
+
function gripper(color) {
|
| 136 |
+
const g = new THREE.Group();
|
| 137 |
+
const m = new THREE.MeshBasicMaterial({ color });
|
| 138 |
+
const palm = new THREE.Mesh(new THREE.BoxGeometry(0.05, 0.02, 0.02), m);
|
| 139 |
+
const j1 = new THREE.Mesh(new THREE.BoxGeometry(0.012, 0.012, 0.06), m);
|
| 140 |
+
const j2 = j1.clone();
|
| 141 |
+
g.add(palm, j1, j2); g.userData = { j1, j2 }; scene.add(g); return g;
|
| 142 |
+
}
|
| 143 |
+
const gL = gripper(0x5aa9ff), gR = gripper(0xff9f43);
|
| 144 |
+
const robot = new THREE.Group();
|
| 145 |
+
const body = new THREE.Mesh(new THREE.BoxGeometry(0.55, 0.45, 0.04), new THREE.MeshBasicMaterial({ color: 0x9be29b, wireframe: true }));
|
| 146 |
+
body.position.z = 0.03;
|
| 147 |
+
const nose = new THREE.Mesh(new THREE.ConeGeometry(0.06, 0.16, 12), new THREE.MeshBasicMaterial({ color: 0x9be29b }));
|
| 148 |
+
nose.rotation.z = -Math.PI / 2; nose.position.set(0.34, 0, 0.03);
|
| 149 |
+
robot.add(body, nose); scene.add(robot);
|
| 150 |
+
|
| 151 |
+
const q = new THREE.Quaternion();
|
| 152 |
+
function setFrame(i) {
|
| 153 |
+
const f = F[i];
|
| 154 |
+
for (const [g, p, qq, open] of [[gL, f.ee_l, f.q_l, f.grip_l], [gR, f.ee_r, f.q_r, f.grip_r]]) {
|
| 155 |
+
g.position.set(...p);
|
| 156 |
+
q.set(qq[0], qq[1], qq[2], qq[3]); g.quaternion.copy(q);
|
| 157 |
+
const gap = 0.012 + 0.04 * open;
|
| 158 |
+
g.userData.j1.position.set(-gap, 0, 0.03); g.userData.j2.position.set(gap, 0, 0.03);
|
| 159 |
+
}
|
| 160 |
+
robot.position.set(f.base[0], f.base[1], 0); robot.rotation.z = f.base[2];
|
| 161 |
+
lineL.geometry.setDrawRange(0, i + 1); lineR.geometry.setDrawRange(0, i + 1);
|
| 162 |
+
baseGeo.setDrawRange(0, i + 1);
|
| 163 |
+
slider.value = i;
|
| 164 |
+
timeEl.textContent = `${f.t.toFixed(1)} s · #${i}`;
|
| 165 |
+
drawChart(i);
|
| 166 |
+
if (mode === 'follow') follow(f);
|
| 167 |
+
}
|
| 168 |
+
|
| 169 |
+
// gripper chart
|
| 170 |
+
const chart = document.getElementById('chart'), ctx = chart.getContext('2d');
|
| 171 |
+
function drawChart(i) {
|
| 172 |
+
const w = chart.width = chart.clientWidth * devicePixelRatio, h = chart.height = chart.clientHeight * devicePixelRatio;
|
| 173 |
+
ctx.clearRect(0, 0, w, h);
|
| 174 |
+
ctx.fillStyle = '#9a988f'; ctx.font = `${10 * devicePixelRatio}px sans-serif`;
|
| 175 |
+
ctx.fillText('Gripper opening (up = open)', 4, 11 * devicePixelRatio);
|
| 176 |
+
for (const [key, col] of [['grip_l', '#5aa9ff'], ['grip_r', '#ff9f43']]) {
|
| 177 |
+
ctx.strokeStyle = col; ctx.lineWidth = 1.5 * devicePixelRatio; ctx.beginPath();
|
| 178 |
+
F.forEach((f, k) => { const x = k / (N - 1) * w, y = h - 3 - f[key] * (h - 16); k ? ctx.lineTo(x, y) : ctx.moveTo(x, y); });
|
| 179 |
+
ctx.stroke();
|
| 180 |
+
}
|
| 181 |
+
ctx.strokeStyle = '#ecebe6'; ctx.lineWidth = 1 * devicePixelRatio;
|
| 182 |
+
const x = i / (N - 1) * w; ctx.beginPath(); ctx.moveTo(x, 0); ctx.lineTo(x, h); ctx.stroke();
|
| 183 |
+
}
|
| 184 |
+
chart.addEventListener('click', e => seek(Math.round(e.offsetX / chart.clientWidth * (N - 1))));
|
| 185 |
+
|
| 186 |
+
// timeline + video sync (video is the clock while playing)
|
| 187 |
+
const slider = document.getElementById('slider'), timeEl = document.getElementById('time');
|
| 188 |
+
const vid = document.getElementById('vid'), playBtn = document.getElementById('play');
|
| 189 |
+
let frame = 0, playing = false;
|
| 190 |
+
function seek(i) { frame = Math.max(0, Math.min(N - 1, i)); vid.currentTime = (frame + 0.5) / FPS; setFrame(frame); }
|
| 191 |
+
slider.addEventListener('input', () => seek(+slider.value));
|
| 192 |
+
playBtn.onclick = () => {
|
| 193 |
+
playing = !playing;
|
| 194 |
+
playBtn.textContent = playing ? '❚❚ Pause' : '▶ Play';
|
| 195 |
+
if (playing) { if (frame >= N - 1) seek(0); vid.play().catch(() => {}); } else vid.pause();
|
| 196 |
+
};
|
| 197 |
+
vid.addEventListener('ended', () => { playing = false; playBtn.textContent = '▶ Play'; });
|
| 198 |
+
|
| 199 |
+
// cameras
|
| 200 |
+
let mode = 'orbit';
|
| 201 |
+
function setView(m) {
|
| 202 |
+
mode = m;
|
| 203 |
+
document.querySelectorAll('#views button').forEach(b => b.classList.toggle('on', b.dataset.view === m));
|
| 204 |
+
const c = new THREE.Vector3(0.6, 0.2, 0.8);
|
| 205 |
+
if (m === 'orbit') { camera.position.set(-2.6, -3.4, 3.0); controls.target.copy(c); }
|
| 206 |
+
if (m === 'top') { camera.position.set(0.6, 0.15, 7.5); controls.target.set(0.6, 0.2, 0); }
|
| 207 |
+
if (m === 'follow') follow(F[frame], true);
|
| 208 |
+
}
|
| 209 |
+
function follow(f, jump) {
|
| 210 |
+
const [x, y, yaw] = f.base;
|
| 211 |
+
const target = new THREE.Vector3(x + Math.cos(yaw) * 0.9, y + Math.sin(yaw) * 0.9, 0.85);
|
| 212 |
+
const eye = new THREE.Vector3(x - Math.cos(yaw) * 1.6, y - Math.sin(yaw) * 1.6, 1.9);
|
| 213 |
+
if (jump) { camera.position.copy(eye); controls.target.copy(target); return; }
|
| 214 |
+
camera.position.lerp(eye, 0.08); controls.target.lerp(target, 0.08);
|
| 215 |
+
}
|
| 216 |
+
document.querySelectorAll('#views button').forEach(b => b.onclick = () => setView(b.dataset.view));
|
| 217 |
+
document.querySelectorAll('#layers button').forEach(b => b.onclick = () => {
|
| 218 |
+
document.querySelectorAll('#layers button').forEach(x => x.classList.toggle('on', x === b));
|
| 219 |
+
for (const [k, p] of Object.entries(clouds)) p.visible = (k === b.dataset.layer);
|
| 220 |
+
});
|
| 221 |
+
|
| 222 |
+
setView('orbit'); setFrame(0);
|
| 223 |
+
addEventListener('resize', () => {
|
| 224 |
+
camera.aspect = innerWidth / innerHeight; camera.updateProjectionMatrix();
|
| 225 |
+
renderer.setSize(innerWidth, innerHeight); drawChart(frame);
|
| 226 |
+
});
|
| 227 |
+
renderer.setAnimationLoop(() => {
|
| 228 |
+
if (playing) {
|
| 229 |
+
const i = Math.min(N - 1, Math.floor(vid.currentTime * FPS));
|
| 230 |
+
if (i !== frame) { frame = i; setFrame(i); }
|
| 231 |
+
}
|
| 232 |
+
controls.update();
|
| 233 |
+
renderer.render(scene, camera);
|
| 234 |
+
});
|
| 235 |
+
</script>
|
| 236 |
+
</body>
|
| 237 |
+
</html>
|
sceneSample/cover.jpg
ADDED
|
sceneSample/index.html
ADDED
|
@@ -0,0 +1,167 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
| 6 |
+
<title>Scene Sample</title>
|
| 7 |
+
<script type="module" src="https://unpkg.com/@google/model-viewer@3.5.0/dist/model-viewer.min.js"></script>
|
| 8 |
+
<script src="ss.js"></script>
|
| 9 |
+
<style>
|
| 10 |
+
:root{color-scheme:dark;--bg:#0b0d12;--surface:#12151c;--ink:#e6e8ee;--muted:#9aa1ad;--line:#232733;--accent:#7fb2ff;--good:#4cc282;--warn:#e0a84a;--chip:#1b2030}
|
| 11 |
+
*{box-sizing:border-box}
|
| 12 |
+
body{margin:0;background:var(--bg);color:var(--ink);font:15px/1.55 -apple-system,"PingFang SC","Helvetica Neue",Arial,sans-serif}
|
| 13 |
+
a{color:var(--accent)}
|
| 14 |
+
.wrap{max-width:1280px;margin:0 auto;padding:22px 16px 64px}
|
| 15 |
+
.back{font-size:13px;color:var(--muted);text-decoration:none}
|
| 16 |
+
h1{font-size:24px;margin:10px 0 4px}h2{font-size:19px;margin:0}
|
| 17 |
+
.sub{color:var(--muted);margin:0 0 18px;max-width:900px;font-size:14px}
|
| 18 |
+
.gate{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:22px;max-width:720px}
|
| 19 |
+
.gate p{margin:0 0 12px}
|
| 20 |
+
.gate .btn{display:inline-block;background:#1b2740;color:var(--accent);border:1px solid #2c3d63;border-radius:8px;padding:9px 16px;font:inherit;cursor:pointer;text-decoration:none;margin:4px 8px 4px 0}
|
| 21 |
+
.gate .btn:hover{border-color:var(--accent)}
|
| 22 |
+
.who{font-size:13px;color:var(--muted);margin:0 0 16px}.who button{background:none;border:0;color:var(--accent);cursor:pointer;font:inherit;padding:0}
|
| 23 |
+
nav{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 20px}
|
| 24 |
+
nav a{padding:6px 12px;border:1px solid var(--line);border-radius:999px;color:var(--ink);text-decoration:none;background:var(--surface);font-size:13.5px}
|
| 25 |
+
nav a:hover{border-color:var(--accent)}
|
| 26 |
+
.tablewrap{overflow-x:auto;background:var(--surface);border:1px solid var(--line);border-radius:12px;margin-bottom:30px}
|
| 27 |
+
table{border-collapse:collapse;width:100%;min-width:980px;font-size:13.5px}
|
| 28 |
+
th,td{padding:9px 12px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}
|
| 29 |
+
th{background:var(--chip);font-weight:600}td:first-child{font-weight:600;white-space:nowrap}tr:last-child td{border-bottom:0}
|
| 30 |
+
.y{color:var(--good)}.p{color:var(--warn)}
|
| 31 |
+
.card{background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:20px;margin:0 0 26px}
|
| 32 |
+
.head{display:flex;flex-wrap:wrap;align-items:baseline;gap:10px;margin-bottom:6px}
|
| 33 |
+
.tag{font-size:11.5px;padding:2px 8px;border-radius:5px;font-family:ui-monospace,monospace}
|
| 34 |
+
.tag.a{background:#1b2740;color:var(--accent)}.tag.b{background:#16301f;color:var(--good)}
|
| 35 |
+
.desc{color:var(--muted);margin:0 0 14px}
|
| 36 |
+
.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(420px,1fr));gap:14px}
|
| 37 |
+
.grid.wide{grid-template-columns:1fr}
|
| 38 |
+
@media (max-width:520px){.grid{grid-template-columns:1fr}}
|
| 39 |
+
.mt{margin-top:14px}figure{margin:0}
|
| 40 |
+
figcaption{font-size:12.5px;color:var(--muted);margin-top:4px}
|
| 41 |
+
video,img{width:100%;border-radius:8px;background:#000;display:block;min-height:60px}
|
| 42 |
+
model-viewer{width:100%;height:420px;border-radius:8px;background:var(--chip)}
|
| 43 |
+
iframe.embed{width:100%;height:620px;border:0;border-radius:8px;background:#111}
|
| 44 |
+
.load3d,.loadframe{width:100%;height:420px;border-radius:8px;border:1px dashed #33405a;background:var(--chip) center/cover;color:var(--ink);font:inherit;font-size:15px;cursor:pointer;text-shadow:0 1px 4px #000;padding:12px}
|
| 45 |
+
.loadframe[data-h="480"]{height:220px}
|
| 46 |
+
details{margin-top:14px}summary{cursor:pointer;color:var(--accent)}
|
| 47 |
+
pre.code{max-height:520px;overflow:auto;background:#0e1118;border:1px solid var(--line);border-radius:8px;padding:12px;font:12px/1.45 ui-monospace,Menlo,monospace;white-space:pre}
|
| 48 |
+
.cols{display:grid;grid-template-columns:1fr 1fr;gap:18px;margin-top:14px}
|
| 49 |
+
@media (max-width:760px){.cols{grid-template-columns:1fr}}
|
| 50 |
+
.cols h3{font-size:14px;margin:0 0 4px}.cols ul{margin:0;padding-left:18px;color:var(--muted);font-size:14px}
|
| 51 |
+
.dl{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin-top:16px;padding-top:12px;border-top:1px solid var(--line);font-size:13.5px}
|
| 52 |
+
.dl .dlk{font-size:11.5px;text-transform:uppercase;letter-spacing:.06em;color:var(--muted)}
|
| 53 |
+
.dl a{color:#7fe0a0;text-decoration:none}.dl a:hover{text-decoration:underline}
|
| 54 |
+
.cpy{background:#1b2740;color:var(--accent);border:1px solid #2c3d63;border-radius:6px;padding:4px 10px;font:12.5px inherit;cursor:pointer}
|
| 55 |
+
code{font:12.5px ui-monospace,Menlo,monospace;background:var(--chip);padding:1px 5px;border-radius:4px}
|
| 56 |
+
</style>
|
| 57 |
+
</head>
|
| 58 |
+
<body>
|
| 59 |
+
<div class="wrap">
|
| 60 |
+
<a class="back" href="../index.html">← All data sample viewers</a>
|
| 61 |
+
<h1>Scene Sample · video ↔ 3D scene + code</h1>
|
| 62 |
+
<p class="sub">Paired 3D samples in two families. <b>A</b>: native 3D, where code and assets render the video exactly. <b>B</b>: real-world video paired with a reconstructed 3D scene and motion. Access is by approval.</p>
|
| 63 |
+
<div id="gate" class="gate"><p>Checking access…</p></div>
|
| 64 |
+
<div id="app" hidden></div>
|
| 65 |
+
</div>
|
| 66 |
+
|
| 67 |
+
<script type="module">
|
| 68 |
+
import { oauthLoginUrl, oauthHandleRedirectIfPresent } from "https://cdn.jsdelivr.net/npm/@huggingface/hub@2.11.2/+esm";
|
| 69 |
+
|
| 70 |
+
const gate = document.getElementById('gate'), app = document.getElementById('app');
|
| 71 |
+
const DATASET = 'https://huggingface.co/datasets/' + SS.REPO;
|
| 72 |
+
const SELF = location.origin + location.pathname;
|
| 73 |
+
const inFrame = window.top !== window.self;
|
| 74 |
+
|
| 75 |
+
function show(html) { gate.innerHTML = html; gate.hidden = false; }
|
| 76 |
+
|
| 77 |
+
async function signIn() {
|
| 78 |
+
const vars = (window.huggingface && window.huggingface.variables) || {};
|
| 79 |
+
location.href = (await oauthLoginUrl({ scopes: 'openid profile gated-repos', redirectUrl: SELF, clientId: vars.OAUTH_CLIENT_ID })) + '&prompt=consent';
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
function askLogin() {
|
| 83 |
+
if (inFrame) {
|
| 84 |
+
show(`<p>This preview is available to approved Hugging Face accounts.</p>
|
| 85 |
+
<a class="btn" href="${SELF}" target="_blank" rel="noopener">Open in a new tab to sign in ↗</a>`);
|
| 86 |
+
return;
|
| 87 |
+
}
|
| 88 |
+
show(`<p>This preview is available to approved Hugging Face accounts. Sign in with Hugging Face; if you have not been approved yet, request access on the dataset page first.</p>
|
| 89 |
+
<button class="btn" id="signin">Sign in with Hugging Face</button>
|
| 90 |
+
<a class="btn" href="${DATASET}" target="_blank" rel="noopener">Request access ↗</a>`);
|
| 91 |
+
document.getElementById('signin').onclick = signIn;
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
function signOutLink(s) {
|
| 95 |
+
const name = (s.userInfo && (s.userInfo.preferred_username || s.userInfo.name)) || 'signed in';
|
| 96 |
+
return `<p class="who">Signed in as <b>${name}</b> · <button id="signout">Sign out</button></p>`;
|
| 97 |
+
}
|
| 98 |
+
function wireSignOut() {
|
| 99 |
+
const b = document.getElementById('signout');
|
| 100 |
+
if (b) b.onclick = () => { SS.clear(); location.href = SELF; };
|
| 101 |
+
}
|
| 102 |
+
|
| 103 |
+
async function main() {
|
| 104 |
+
let s = SS.session();
|
| 105 |
+
if (!s) {
|
| 106 |
+
try {
|
| 107 |
+
const r = await oauthHandleRedirectIfPresent();
|
| 108 |
+
if (r) { SS.save(r); s = r; history.replaceState(null, '', SELF); }
|
| 109 |
+
} catch (e) { console.warn(e); }
|
| 110 |
+
}
|
| 111 |
+
if (!s) return askLogin();
|
| 112 |
+
|
| 113 |
+
let html;
|
| 114 |
+
try { html = await (await SS.get('content.html')).text(); }
|
| 115 |
+
catch (e) {
|
| 116 |
+
if (e.status === 401) { SS.clear(); return askLogin(); }
|
| 117 |
+
show(signOutLink(s) + `<p>Your account does not have access yet. Request access on the dataset page; once it is approved, reload this page.</p>
|
| 118 |
+
<a class="btn" href="${DATASET}" target="_blank" rel="noopener">Request access ↗</a>`);
|
| 119 |
+
return wireSignOut();
|
| 120 |
+
}
|
| 121 |
+
|
| 122 |
+
gate.hidden = true;
|
| 123 |
+
app.innerHTML = signOutLink(s) + `<nav>
|
| 124 |
+
<a href="#a1">A1 · Simulated robot, generated world</a><a href="#a2">A2 · Procedural scene from code</a>
|
| 125 |
+
<a href="#b1">B1 · Kitchen digital twin</a><a href="#b2">B2 · Robot egocentric</a><a href="#download">Download</a></nav>` + html;
|
| 126 |
+
app.hidden = false;
|
| 127 |
+
wireSignOut();
|
| 128 |
+
SS.hydrate(app);
|
| 129 |
+
|
| 130 |
+
app.querySelectorAll('.load3d').forEach(btn => btn.addEventListener('click', async () => {
|
| 131 |
+
btn.textContent = 'Loading…';
|
| 132 |
+
const mv = document.createElement('model-viewer');
|
| 133 |
+
mv.setAttribute('camera-controls', ''); mv.setAttribute('touch-action', 'pan-y');
|
| 134 |
+
mv.setAttribute('exposure', btn.dataset.exposure || '1.1');
|
| 135 |
+
if (btn.dataset.orbit) mv.setAttribute('camera-orbit', btn.dataset.orbit);
|
| 136 |
+
if (btn.dataset.orient) mv.setAttribute('orientation', btn.dataset.orient);
|
| 137 |
+
if (btn.dataset.target) { mv.setAttribute('camera-target', btn.dataset.target); mv.setAttribute('min-camera-orbit', 'auto auto 0.5m'); }
|
| 138 |
+
if (btn.dataset.maxr) mv.setAttribute('max-camera-orbit', 'auto auto ' + btn.dataset.maxr);
|
| 139 |
+
if (btn.dataset.fov) mv.setAttribute('field-of-view', btn.dataset.fov);
|
| 140 |
+
if (btn.dataset.env) mv.setAttribute('environment-image', btn.dataset.env);
|
| 141 |
+
try { mv.setAttribute('src', await SS.blobURL(btn.dataset.ssGlb)); btn.replaceWith(mv); }
|
| 142 |
+
catch (e) { btn.textContent = 'Could not load: ' + e.message; }
|
| 143 |
+
}));
|
| 144 |
+
app.querySelectorAll('.loadframe').forEach(btn => btn.addEventListener('click', () => {
|
| 145 |
+
const f = document.createElement('iframe');
|
| 146 |
+
f.className = 'embed'; f.src = btn.dataset.frame;
|
| 147 |
+
if (btn.dataset.h) f.style.height = btn.dataset.h + 'px';
|
| 148 |
+
btn.replaceWith(f);
|
| 149 |
+
}));
|
| 150 |
+
const det = document.getElementById('a2code');
|
| 151 |
+
if (det) det.addEventListener('toggle', async () => {
|
| 152 |
+
const pre = det.querySelector('pre');
|
| 153 |
+
if (!det.open || pre.dataset.done) return;
|
| 154 |
+
try { pre.textContent = await (await SS.get('a2/bedroom_scene.py')).text(); pre.dataset.done = 1; }
|
| 155 |
+
catch (e) { pre.textContent = 'Could not load: ' + e.message; }
|
| 156 |
+
});
|
| 157 |
+
app.querySelectorAll('.cpy').forEach(b => b.addEventListener('click', () => {
|
| 158 |
+
const label = b.textContent;
|
| 159 |
+
navigator.clipboard.writeText(b.dataset.cmd).then(() => { b.textContent = '✓ copied'; setTimeout(() => b.textContent = label, 1500); },
|
| 160 |
+
() => { prompt('Copy this command:', b.dataset.cmd); });
|
| 161 |
+
}));
|
| 162 |
+
if (location.hash) document.querySelector(location.hash)?.scrollIntoView();
|
| 163 |
+
}
|
| 164 |
+
main();
|
| 165 |
+
</script>
|
| 166 |
+
</body>
|
| 167 |
+
</html>
|
sceneSample/ss.js
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// Shared loader for sceneSample: media lives in a gated dataset and is fetched
|
| 2 |
+
// with the viewer's own HF OAuth token (scope: gated-repos). Nothing here is secret.
|
| 3 |
+
(function () {
|
| 4 |
+
const REPO = 'faradayfuture/sceneSample';
|
| 5 |
+
const BASE = 'https://huggingface.co/datasets/' + REPO + '/resolve/main/';
|
| 6 |
+
const KEY = 'sceneSample_oauth';
|
| 7 |
+
const cache = new Map();
|
| 8 |
+
|
| 9 |
+
const KEYS = [KEY, 'sv_oauth']; // shared with the Sample Viewer sign-in page (gate.html)
|
| 10 |
+
function session() {
|
| 11 |
+
for (const k of KEYS) {
|
| 12 |
+
try {
|
| 13 |
+
const s = JSON.parse(localStorage.getItem(k) || 'null');
|
| 14 |
+
if (s && s.accessToken && (!s.accessTokenExpiresAt || new Date(s.accessTokenExpiresAt) > new Date())) return s;
|
| 15 |
+
} catch (e) {}
|
| 16 |
+
}
|
| 17 |
+
return null;
|
| 18 |
+
}
|
| 19 |
+
function save(s) { for (const k of KEYS) { try { localStorage.setItem(k, JSON.stringify(s)); } catch (e) {} } }
|
| 20 |
+
function clear() { for (const k of KEYS) { try { localStorage.removeItem(k); } catch (e) {} } }
|
| 21 |
+
|
| 22 |
+
const nativeFetch = window.fetch.bind(window);
|
| 23 |
+
|
| 24 |
+
async function get(path) {
|
| 25 |
+
const s = session();
|
| 26 |
+
const r = await nativeFetch(BASE + path, { headers: s ? { Authorization: 'Bearer ' + s.accessToken } : {} });
|
| 27 |
+
if (!r.ok) { const e = new Error(path + ' → HTTP ' + r.status); e.status = r.status; throw e; }
|
| 28 |
+
return r;
|
| 29 |
+
}
|
| 30 |
+
function blobURL(path) {
|
| 31 |
+
if (!cache.has(path)) cache.set(path, get(path).then(r => r.blob()).then(b => URL.createObjectURL(b)));
|
| 32 |
+
return cache.get(path);
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
// Map a URL on this Space under /sceneSample/ to a dataset path, else null.
|
| 36 |
+
function datasetPath(u) {
|
| 37 |
+
let url;
|
| 38 |
+
try { url = new URL(typeof u === 'string' ? u : u.url, location.href); } catch (e) { return null; }
|
| 39 |
+
if (url.origin !== location.origin) return null;
|
| 40 |
+
const m = url.pathname.match(/\/sceneSample\/((?:b2|b3)\/data\/.+)$/);
|
| 41 |
+
return m ? decodeURIComponent(m[1]) : null;
|
| 42 |
+
}
|
| 43 |
+
// Viewers keep their original relative fetches; redirect data files to the dataset.
|
| 44 |
+
window.fetch = function (u, opts) {
|
| 45 |
+
const p = datasetPath(u);
|
| 46 |
+
return p ? get(p) : nativeFetch(u, opts);
|
| 47 |
+
};
|
| 48 |
+
|
| 49 |
+
async function hydrate(root) {
|
| 50 |
+
const els = [...(root || document).querySelectorAll('[data-ss-src],[data-ss-poster],[data-ss-bg]')];
|
| 51 |
+
await Promise.all(els.map(async el => {
|
| 52 |
+
try {
|
| 53 |
+
if (el.dataset.ssPoster) el.poster = await blobURL(el.dataset.ssPoster);
|
| 54 |
+
if (el.dataset.ssBg) el.style.backgroundImage = 'url(' + await blobURL(el.dataset.ssBg) + ')';
|
| 55 |
+
if (el.dataset.ssSrc) el.src = await blobURL(el.dataset.ssSrc);
|
| 56 |
+
} catch (e) { console.warn(e); }
|
| 57 |
+
}));
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
window.SS = { REPO, session, save, clear, get, blobURL, hydrate };
|
| 61 |
+
})();
|
style.css
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
body {
|
| 2 |
+
padding: 2rem;
|
| 3 |
+
font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
|
| 4 |
+
}
|
| 5 |
+
|
| 6 |
+
h1 {
|
| 7 |
+
font-size: 16px;
|
| 8 |
+
margin-top: 0;
|
| 9 |
+
}
|
| 10 |
+
|
| 11 |
+
p {
|
| 12 |
+
color: rgb(107, 114, 128);
|
| 13 |
+
font-size: 15px;
|
| 14 |
+
margin-bottom: 10px;
|
| 15 |
+
margin-top: 5px;
|
| 16 |
+
}
|
| 17 |
+
|
| 18 |
+
.card {
|
| 19 |
+
max-width: 620px;
|
| 20 |
+
margin: 0 auto;
|
| 21 |
+
padding: 16px;
|
| 22 |
+
border: 1px solid lightgray;
|
| 23 |
+
border-radius: 16px;
|
| 24 |
+
}
|
| 25 |
+
|
| 26 |
+
.card p:last-child {
|
| 27 |
+
margin-bottom: 0;
|
| 28 |
+
}
|
sw.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// SampleViewer access proxy. Viewer pages for these sections live in gated HF datasets
|
| 2 |
+
// (under viewer/<section>/); this worker serves them on the Space origin using the
|
| 3 |
+
// visitor's own HF OAuth token (scope gated-repos). Nothing here is secret.
|
| 4 |
+
const SECTIONS = {
|
| 5 |
+
egoSample: 'faradayfuture/egoSample',
|
| 6 |
+
teleopSample: 'faradayfuture/teleopSample',
|
| 7 |
+
motionSample: 'faradayfuture/motionSample',
|
| 8 |
+
};
|
| 9 |
+
const VERSION = 'sv-1';
|
| 10 |
+
const TYPES = {
|
| 11 |
+
html: 'text/html; charset=utf-8', htm: 'text/html; charset=utf-8', js: 'text/javascript; charset=utf-8',
|
| 12 |
+
mjs: 'text/javascript; charset=utf-8', css: 'text/css; charset=utf-8', json: 'application/json',
|
| 13 |
+
mp4: 'video/mp4', webm: 'video/webm', jpg: 'image/jpeg', jpeg: 'image/jpeg', png: 'image/png',
|
| 14 |
+
webp: 'image/webp', gif: 'image/gif', svg: 'image/svg+xml', glb: 'model/gltf-binary', bin: 'application/octet-stream',
|
| 15 |
+
txt: 'text/plain; charset=utf-8', csv: 'text/csv; charset=utf-8', wasm: 'application/wasm',
|
| 16 |
+
};
|
| 17 |
+
|
| 18 |
+
self.addEventListener('install', () => self.skipWaiting());
|
| 19 |
+
self.addEventListener('activate', e => e.waitUntil(self.clients.claim()));
|
| 20 |
+
|
| 21 |
+
let TOKEN = null;
|
| 22 |
+
async function token() {
|
| 23 |
+
if (TOKEN) return TOKEN;
|
| 24 |
+
try { const r = await (await caches.open('sv-auth')).match('/__sv_token'); TOKEN = r ? await r.text() : null; } catch (e) {}
|
| 25 |
+
return TOKEN;
|
| 26 |
+
}
|
| 27 |
+
self.addEventListener('message', e => {
|
| 28 |
+
const d = e.data || {};
|
| 29 |
+
if (d.type !== 'token') return;
|
| 30 |
+
TOKEN = d.token || null;
|
| 31 |
+
cache.clear();
|
| 32 |
+
e.waitUntil(caches.open('sv-auth').then(c => TOKEN ? c.put('/__sv_token', new Response(TOKEN)) : c.delete('/__sv_token'))
|
| 33 |
+
.then(() => e.source && e.source.postMessage({ type: 'token-ok' })));
|
| 34 |
+
});
|
| 35 |
+
|
| 36 |
+
// small in-memory LRU of whole files (so video Range requests are served locally)
|
| 37 |
+
const cache = new Map(); let cacheBytes = 0; const CACHE_MAX = 300e6;
|
| 38 |
+
function remember(key, buf) {
|
| 39 |
+
if (buf.byteLength > 80e6) return;
|
| 40 |
+
cache.set(key, buf); cacheBytes += buf.byteLength;
|
| 41 |
+
for (const [k, v] of cache) { if (cacheBytes <= CACHE_MAX) break; cache.delete(k); cacheBytes -= v.byteLength; }
|
| 42 |
+
}
|
| 43 |
+
const inflight = new Map();
|
| 44 |
+
|
| 45 |
+
self.addEventListener('fetch', e => {
|
| 46 |
+
const u = new URL(e.request.url);
|
| 47 |
+
if (u.origin !== self.location.origin || e.request.method !== 'GET') return;
|
| 48 |
+
const m = u.pathname.match(/^\/(egoSample|teleopSample|motionSample)(\/.*)?$/);
|
| 49 |
+
if (!m) return;
|
| 50 |
+
let path = decodeURIComponent((m[2] || '/').slice(1));
|
| 51 |
+
if (path === '' || path.endsWith('/')) path += 'index.html';
|
| 52 |
+
e.respondWith(serve(e.request, m[1], path, u));
|
| 53 |
+
});
|
| 54 |
+
|
| 55 |
+
function toGate(u, why) {
|
| 56 |
+
return Response.redirect(new URL('/gate.html?to=' + encodeURIComponent(u.pathname + u.search) + (why ? '&why=' + why : ''), u).href, 302);
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
async function getFile(sec, path, tok) {
|
| 60 |
+
const key = sec + '/' + path;
|
| 61 |
+
if (cache.has(key)) { const b = cache.get(key); cache.delete(key); cache.set(key, b); return { status: 200, buf: b }; }
|
| 62 |
+
if (inflight.has(key)) return inflight.get(key);
|
| 63 |
+
const p = (async () => {
|
| 64 |
+
const url = 'https://huggingface.co/datasets/' + SECTIONS[sec] + '/resolve/main/viewer/' + sec + '/' + path.split('/').map(encodeURIComponent).join('/');
|
| 65 |
+
const r = await fetch(url, { headers: { Authorization: 'Bearer ' + tok }, cache: 'no-store' });
|
| 66 |
+
if (!r.ok) return { status: r.status };
|
| 67 |
+
const buf = await r.arrayBuffer(); remember(key, buf);
|
| 68 |
+
return { status: 200, buf };
|
| 69 |
+
})().finally(() => inflight.delete(key));
|
| 70 |
+
inflight.set(key, p);
|
| 71 |
+
return p;
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
async function serve(req, sec, path, u) {
|
| 75 |
+
const nav = req.mode === 'navigate';
|
| 76 |
+
const tok = await token();
|
| 77 |
+
if (!tok) return nav ? toGate(u, 'login') : new Response('', { status: 401 });
|
| 78 |
+
let f;
|
| 79 |
+
try { f = await getFile(sec, path, tok); } catch (err) { return new Response('Network error', { status: 502 }); }
|
| 80 |
+
if (f.status === 401) return nav ? toGate(u, 'login') : new Response('', { status: 401 });
|
| 81 |
+
if (f.status === 403) return nav ? toGate(u, 'denied') : new Response('', { status: 403 });
|
| 82 |
+
if (f.status !== 200) return new Response('Not found', { status: f.status === 404 ? 404 : 502 });
|
| 83 |
+
const ext = (path.split('.').pop() || '').toLowerCase();
|
| 84 |
+
const type = TYPES[ext] || 'application/octet-stream';
|
| 85 |
+
const total = f.buf.byteLength;
|
| 86 |
+
const base = { 'Content-Type': type, 'Accept-Ranges': 'bytes', 'Cache-Control': 'private, no-store', 'X-Sample-Viewer': VERSION };
|
| 87 |
+
const range = req.headers.get('range');
|
| 88 |
+
const mm = range && /bytes=(\d*)-(\d*)/.exec(range);
|
| 89 |
+
if (mm && (mm[1] !== '' || mm[2] !== '')) {
|
| 90 |
+
let start, end;
|
| 91 |
+
if (mm[1] === '') { start = Math.max(0, total - Number(mm[2])); end = total - 1; }
|
| 92 |
+
else { start = Number(mm[1]); end = mm[2] === '' ? total - 1 : Math.min(Number(mm[2]), total - 1); }
|
| 93 |
+
if (start >= total || start > end) return new Response('', { status: 416, headers: { 'Content-Range': 'bytes */' + total } });
|
| 94 |
+
return new Response(f.buf.slice(start, end + 1), { status: 206, headers: { ...base, 'Content-Range': `bytes ${start}-${end}/${total}`, 'Content-Length': String(end - start + 1) } });
|
| 95 |
+
}
|
| 96 |
+
return new Response(f.buf, { status: 200, headers: { ...base, 'Content-Length': String(total) } });
|
| 97 |
+
}
|
teleop.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html><meta charset="utf-8">
|
| 2 |
+
<!-- teleop 页已移到 teleopSample/ 子目录; 这个桩只为兼容旧链接, 可安全删除。 -->
|
| 3 |
+
<meta http-equiv="refresh" content="0; url=teleopSample/index.html">
|
| 4 |
+
<title>Moved</title>
|
| 5 |
+
<p style="font:14px -apple-system,sans-serif;padding:2rem">
|
| 6 |
+
Moved to <a href="teleopSample/index.html">teleopSample/index.html</a>.</p>
|
teleopSample/clip.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/drink_ep0.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/drink_ep1.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/ep0/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/ep1/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/ep2/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/ep3/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/ep4/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/ep5/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/faberU/t2_water_bottle_into_steel_tray/20260707052527/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/faberU/t2_water_bottle_into_steel_tray/20260707052609/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/faberU/t3_juice_bottle_onto_plate/20260724050737/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/faberU/t3_juice_bottle_onto_plate/20260724050827/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/faberU/t4_juice_bottle_into_black_tray/20260728075709/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/faberU/t4_juice_bottle_into_black_tray/20260728080339/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/faberU/t6_pick_up_green_tea_bottle/20260730045050/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/faberU/t6_pick_up_green_tea_bottle/20260730045152/viewer.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/index.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/mem_ep0.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/mem_ep1.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/sort_ep0.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/sort_ep1.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/wipe_ep0.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|
teleopSample/wipe_ep1.html
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!doctype html>
|
| 2 |
+
<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
|
| 3 |
+
<title>Faraday Future · Data Sample Viewers</title>
|
| 4 |
+
<script>location.replace('/gate.html?to='+encodeURIComponent(location.pathname+location.search+location.hash));</script>
|
| 5 |
+
<style>body{margin:0;background:#0b0d12;color:#9aa1ad;font:14px -apple-system,Arial,sans-serif;padding:28px}a{color:#7fb2ff}</style>
|
| 6 |
+
</head><body>Redirecting to sign-in… <a href="/gate.html">continue</a></body></html>
|