@kubohiroya/turbowarp-realtime-motion-capture 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE +373 -0
  2. package/README.ja.md +89 -0
  3. package/README.md +113 -0
  4. package/THIRD_PARTY_NOTICES.md +31 -0
  5. package/config/feature-flags.ts +28 -0
  6. package/config/qr-config.ts +19 -0
  7. package/dist/extension-manifest.json +664 -0
  8. package/dist/turbowarp-realtime-motion-capture.js +82631 -0
  9. package/docs/architecture.ja.md +256 -0
  10. package/docs/architecture.md +294 -0
  11. package/docs/index.html +83 -0
  12. package/docs/turbowarp-extension-api.ja.md +157 -0
  13. package/docs/turbowarp-extension-api.md +1033 -0
  14. package/package.json +105 -0
  15. package/schemas/camera-calibration-v1.json +209 -0
  16. package/schemas/extension-manifest.schema.json +49 -0
  17. package/schemas/performance-dsl-v1.json +72 -0
  18. package/schemas/pose-frame-2d-v1.json +626 -0
  19. package/schemas/pose-frame-2d-v2.json +723 -0
  20. package/schemas/pose-frame-3d-v1.json +714 -0
  21. package/schemas/session-policy-v1.json +138 -0
  22. package/src/avatar/aframe-port.ts +39 -0
  23. package/src/avatar/controller.ts +541 -0
  24. package/src/avatar/kalidokit-adapter.ts +193 -0
  25. package/src/avatar/types.ts +119 -0
  26. package/src/block-definitions.json +810 -0
  27. package/src/calibration/controller.ts +564 -0
  28. package/src/calibration/opencv-backend.ts +347 -0
  29. package/src/calibration/types.ts +53 -0
  30. package/src/config.ts +13 -0
  31. package/src/extension-manifest.ts +182 -0
  32. package/src/extension.ts +913 -0
  33. package/src/frame-sync/controller.ts +416 -0
  34. package/src/frame-sync/detector.ts +278 -0
  35. package/src/frame-sync/pattern-display.ts +161 -0
  36. package/src/frame-sync/pattern.ts +88 -0
  37. package/src/frame-sync/time-source.ts +36 -0
  38. package/src/frame-sync/types.ts +39 -0
  39. package/src/frame-sync/video-frame-pump.ts +116 -0
  40. package/src/fusion/controller.ts +554 -0
  41. package/src/fusion/fuse.ts +385 -0
  42. package/src/fusion/geometry.ts +474 -0
  43. package/src/fusion/glow-stick.ts +173 -0
  44. package/src/fusion/identity.ts +112 -0
  45. package/src/fusion/jitter-buffer.ts +439 -0
  46. package/src/fusion/types.ts +103 -0
  47. package/src/globals.d.ts +57 -0
  48. package/src/index.ts +8 -0
  49. package/src/markers/canvas-sampler.ts +59 -0
  50. package/src/markers/color.ts +53 -0
  51. package/src/markers/sampler.ts +185 -0
  52. package/src/markers/types.ts +49 -0
  53. package/src/pose/controller.ts +388 -0
  54. package/src/pose/pose-frame.ts +128 -0
  55. package/src/pose/tfjs-movenet.ts +34 -0
  56. package/src/pose/types.ts +116 -0
  57. package/src/protocol/codec.ts +248 -0
  58. package/src/protocol/schemas.ts +283 -0
  59. package/src/qr-courier.ts +289 -0
  60. package/src/qr-svg.ts +39 -0
  61. package/src/sprite-skin.ts +112 -0
  62. package/src/webrtc-capability.ts +38 -0
@@ -0,0 +1,157 @@
1
+ # TurboWarp機能拡張API
2
+
3
+ [利用ガイド](../README.ja.md) | [English](turbowarp-extension-api.md) | [アーキテクチャ](architecture.ja.md)
4
+
5
+ これは`@kubohiroya/turbowarp-realtime-motion-capture` 0.2.0の公開APIリファレンスです。正式な公開面は、
6
+ サンドボックスなしで動作するTurboWarp機能拡張のID、opcode、引数、reporter、JSON契約、runtime
7
+ capabilityです。`src/`以下のTypeScript classは実装詳細であり、npm packageのexportではありません。
8
+
9
+ ## APIの識別情報と読み込み
10
+
11
+ | 項目 | 契約 |
12
+ | ------------ | ---------------------------------------------------- |
13
+ | Extension ID | `kubohiroyarealtimemotioncapture` |
14
+ | Bundle | `dist/turbowarp-realtime-motion-capture.js` |
15
+ | 機械可読API | `dist/extension-manifest.json`(`formatVersion: 1`) |
16
+ | 実行mode | サンドボックスなしのみ |
17
+ | 機能選択 | 起動時固定、すべて既定OFF |
18
+
19
+ 必要なprovider拡張を先に読み込み、bundleを読み込む前に使う機能を1回の代入で設定します。
20
+
21
+ ```js
22
+ globalThis.__TWMP_FEATURE_FLAGS__ = {
23
+ qrCourierPairing: true,
24
+ webgpuMoveNetMultiPose: true,
25
+ protocolV1Codec: true,
26
+ cameraCalibrationV1: true,
27
+ avatarRetargetV1: true,
28
+ frameSyncPatternV1: true,
29
+ poseFusion3D: true,
30
+ glowStickMarkers: true,
31
+ };
32
+ globalThis.__TWMP_QR_CONFIG__ = { errorCorrectionLevel: "M" };
33
+ ```
34
+
35
+ 有効な機能のblockだけがpaletteに現れます。拡張読み込み後にglobal objectを変更しても反映されません。
36
+ flag変更後はprojectと拡張を再読み込みしてください。
37
+
38
+ ## Runtime依存関係
39
+
40
+ | 機能 | 必要なprovider | Runtime境界 |
41
+ | ------------------------ | ----------------------------- | -------------------------------------- |
42
+ | `qrCourierPairing` | TurboWarp-WebRTC 0.3.0 | `kubohiroyaWebRtcCapability` version 2 |
43
+ | `webgpuMoveNetMultiPose` | TurboWarp-Camera-Source 0.5.0 | `acquireCamera({owner, cameraId})` |
44
+ | `protocolV1Codec` | なし | local validationのみ |
45
+ | `cameraCalibrationV1` | TurboWarp-Camera-Source 0.5.0 | 共有named camera lease |
46
+ | `avatarRetargetV1` | TurboWarp-A-Frame 0.3.0 | scene capability version 1 |
47
+ | `frameSyncPatternV1` | Camera Source 0.5.0とWebRTC 0.3.0 | camera frameと同期時刻 |
48
+ | `poseFusion3D` | なし | blockから渡すPoseFrame2D/calibration JSON |
49
+ | `glowStickMarkers` | pose/fusion機能 | camera pixel、Performance DSL palette、identity fusion |
50
+
51
+ この拡張は`getUserMedia()`を呼びません。姿勢推定とcalibrationはCamera Sourceが所有するcameraを
52
+ leaseします。MoveNetはTensorFlow.jsの`webgpu` backend限定で、CPU/WASM/WebGL fallbackは
53
+ ありません。初回model loadにはnetwork接続が必要な場合があります。
54
+
55
+ ## 呼び出し規約
56
+
57
+ - commandは失敗時に例外となります。結果を読む前にcommand blockの完了を待ちます。
58
+ - 値やerrorがない文字列reporterは`""`、count reporterは`0`を返します。
59
+ - JSON引数にはJavaScript objectではなくJSON文字列を渡します。
60
+ - pose、calibration、avatarのIDは1〜64文字の英数字、`.`、`_`、`-`です。
61
+ - offer QRの`PEER`は前後の空白を除いて1〜128文字です。この拡張では、それ以外の文字種制限を
62
+ 加えません。
63
+ - 同時に行ったpose inference、calibration sampling/solveは、実行中の1処理を共有します。
64
+ - project停止、再読み込み、runtime破棄時にskin、detector、camera lease、一時sample、生成avatarと
65
+ retargetのmemory stateを解放します。
66
+
67
+ ## Stateと診断
68
+
69
+ | 領域 | state | error code/診断 |
70
+ | ----------- | --------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
71
+ | Offer QR | `disabled`, `idle`, `generating-offer`, `rendering`, `displayed`, `error` | `offer QR error` |
72
+ | Pose | `disabled`, `idle`, `initializing-webgpu`, `loading-model`, `acquiring-camera`, `ready`, `inferencing`, `stopping`, `error` | `webgpu-unavailable`, `model-load-failed`, `camera-unavailable`, `camera-ended`, `inference-failed`, `invalid-output` |
73
+ | Protocol | 最新schema/version、または`disabled`/`0` | JSON Pointer pathとmessage |
74
+ | Calibration | `disabled`, `idle`, `acquiring-camera`, `sampling`, `ready`, `solving`, `solved`, `cancelling`, `error` | `invalid-board`, `camera-unavailable`, `camera-ended`, `resolution-mismatch`, `board-not-found`, `sample-low-quality`, `sample-too-similar`, `sample-limit`, `sample-insufficient`, `sample-failed`, `solve-failed`, `reprojection-too-high`, `invalid-calibration`, `credential-forbidden` |
75
+ | Avatar | `disabled`, `idle`, `configured`, `bound`, `ready`, `partial`, `error` | `avatar retarget error`内のperson別message |
76
+ | Frame sync | `idle`, `acquiring-camera`, `calibrating`, `ready`, `error` | `panel-not-found`, `low-contrast`, `decode-unstable`とcamera/runtime診断 |
77
+ | Pose fusion | `idle`, `buffering`, `fusing`, `ready`, `error` | `pose fusion error code`と`pose fusion error` |
78
+
79
+ 不採用のcalibration sampleはerror codeを設定しますが、有効なsessionは次のsampleを受け付けます。
80
+ `cancel camera calibration`は最後の検証済みprofileを保持し、`cleanup camera calibration`は
81
+ そのprofileも削除します。
82
+
83
+ ## JSON契約
84
+
85
+ protocol codecが受け付ける組み合わせは次の5つだけです。
86
+
87
+ | `schema` | `version` | 主な制約 |
88
+ | ------------------------- | --------: | ---------------------------------------------------------------- |
89
+ | `twrmc/session-policy` | 1 | camera 1〜16台、performer最大6人 |
90
+ | `twrmc/camera-calibration` | 1 | 3x3 intrinsic、distortion最大14係数、4x4 world変換 |
91
+ | `twrmc/pose-frame-2d` | 1 | person最大6人、順序固定COCO-17、pixel座標 |
92
+ | `twrmc/pose-frame-2d` | 2 | version 1のfieldとsample済みcolor marker |
93
+ | `twrmc/pose-frame-3d` | 1 | person最大6人、重複なしcamera ID 2〜16個、順序固定COCO-17、meter |
94
+ | `twrmc/performance-dsl` | 1 | performer 1〜6人とサイリウム色 |
95
+
96
+ unknown field/schema/versionは拒否します。WebRTC pairing secretに関係するkey(offer、answer、
97
+ SDP、ICE、DTLS、credentialの各形式)も入れ子の深さに関係なく拒否します。timestampは非負の
98
+ safe integerのmicrosecondsで、不透明値のまま運びます。時刻同期は外部serviceの責務です。
99
+
100
+ 17 keypointは次の順序に固定されています。
101
+
102
+ ```text
103
+ nose, left_eye, right_eye, left_ear, right_ear,
104
+ left_shoulder, right_shoulder, left_elbow, right_elbow,
105
+ left_wrist, right_wrist, left_hip, right_hip,
106
+ left_knee, right_knee, left_ankle, right_ankle
107
+ ```
108
+
109
+ ## Avatar rig JSON
110
+
111
+ `register avatar asset`にはA-Frame template JSON文字列と、別のrig mappingを渡します。各boneの
112
+ selectorには`{avatar}`が必要で、bindしたinstance IDへ置換後、ちょうど1 nodeに一致する必要があります。
113
+
114
+ ```json
115
+ {
116
+ "rootScale": 1,
117
+ "rootOffset": [0, 0, 0],
118
+ "recognitionStartEvent": "twmp-recognition-start",
119
+ "recognitionEndEvent": "twmp-recognition-end",
120
+ "bones": [
121
+ {
122
+ "selector": "#{avatar}-left-arm",
123
+ "rig": "LeftUpperArm",
124
+ "offsetDegrees": [0, 0, 0]
125
+ }
126
+ ]
127
+ }
128
+ ```
129
+
130
+ `rig`は`RightUpperArm`, `RightLowerArm`, `LeftUpperArm`, `LeftLowerArm`, `RightHand`,
131
+ `LeftHand`, `RightUpperLeg`, `RightLowerLeg`, `LeftUpperLeg`, `LeftLowerLeg`, `Spine`, `Hips`
132
+ のいずれかです。`rootScale`は正数、confidenceは0〜1、boneは1〜32個です。recognition eventの
133
+ dataは`personId`、`avatarInstanceId`と、PoseFrame3Dに値がある場合の`timestampUs`を持つJSONです。
134
+
135
+ ## Blockリファレンス
136
+
137
+ 全blockの表示文、opcode、型、引数ID、既定値は[英語版の自動生成リファレンス](turbowarp-extension-api.md#block-reference)を参照してください。
138
+ `dist/extension-manifest.json`は同じopcodeと引数を機械可読形式で提供します。
139
+
140
+ 機能別のcommandの流れは次のとおりです。
141
+
142
+ | 機能 | 開始 | 主処理 | 終了/cleanup |
143
+ | ----------- | -------------------------------------------- | --------------------------------------------------------------- | --------------------------------------------------------- |
144
+ | QR | `prepareOfferQr`または`createAndShowOfferQr` | `showOfferQrPart`, `showNextOfferQrPart` | `endOfferQrDisplay` |
145
+ | Pose | `startWebGpuMoveNetMultiPose` | `inferNextPoseFrame` | `stopWebGpuMoveNetMultiPose` |
146
+ | Protocol | — | `protocolJsonValid`, `decodeProtocolJson`, `encodeProtocolJson` | — |
147
+ | Calibration | `startCameraCalibration` | `addCameraCalibrationSample`, `solveCameraCalibration` | `cancelCameraCalibration`または`cleanupCameraCalibration` |
148
+ | Avatar | `registerAvatarAsset`, `bindAvatarPerson` | `applyPoseFrame3DToAvatars` | `unbindAvatarPerson`または`resetAvatarRetarget` |
149
+ | Frame sync | `showFrameSyncPattern`, `startFrameSyncDecoder` | `takeFrameSyncObservation` | `hideFrameSyncPattern`, `stopFrameSyncDecoder` |
150
+ | Pose fusion | `startPoseFusion`, `loadFusionCameraCalibration` | `bufferPoseFrame2D`, `fuseBufferedPoseFrame3D` | `stopPoseFusion`または`cleanupPoseFusion` |
151
+ | Markers | `enableGlowStickMarkers`, `loadGlowStickPalette` | pose frame生成とfusion時に自動処理 | `disableGlowStickMarkers` |
152
+
153
+ ## 互換性方針
154
+
155
+ block追加は後方互換です。extension ID、opcode、argument IDの変更は保存済み`.sb3` projectを壊す
156
+ 可能性があり、migrationが必要です。manifestの`formatVersion`変更はmanifest形式の非互換revisionを
157
+ 表します。consumerはunknown versionを拒否し、private runtime fieldを連携APIにしないでください。