@pollen-robotics/reachy-mini-sdk 1.13.0-dev.0.main.24f74f0 → 1.13.0-dev.0.main.55a68f6
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.
- package/APP_CREATION_GUIDE.md +6 -1
- package/dist/animation/safe-return.d.ts +6 -4
- package/dist/animation/safe-return.d.ts.map +1 -1
- package/dist/animation/safe-return.js +12 -4
- package/dist/animation/safe-return.js.map +1 -1
- package/dist/lib/app-dx.test.d.ts +2 -0
- package/dist/lib/app-dx.test.d.ts.map +1 -0
- package/dist/lib/app-dx.test.js +100 -0
- package/dist/lib/app-dx.test.js.map +1 -0
- package/dist/lib/math.d.ts +3 -2
- package/dist/lib/math.d.ts.map +1 -1
- package/dist/lib/math.js +6 -2
- package/dist/lib/math.js.map +1 -1
- package/dist/lib/reachy-mini.d.ts +24 -0
- package/dist/lib/reachy-mini.d.ts.map +1 -1
- package/dist/lib/reachy-mini.js +53 -0
- package/dist/lib/reachy-mini.js.map +1 -1
- package/dist/lib/types.d.ts +16 -3
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/version.d.ts +1 -1
- package/dist/lib/version.js +1 -1
- package/dist/reachy-mini-sdk.d.ts +1 -1
- package/dist/reachy-mini-sdk.d.ts.map +1 -1
- package/dist/reachy-mini-sdk.js.map +1 -1
- package/host/dist/chunks/{centralRest-K3a9U_Sk.js → centralRest-Bf6BR9KA.js} +345 -310
- package/host/dist/chunks/{index-B79tSfbK.js → index-B5svCSPt.js} +1 -1
- package/host/dist/chunks/{mountHost-CMP4uYnZ.js → mountHost-B2Eh6aMK.js} +1 -1
- package/host/dist/entry/auto.js +2 -2
- package/host/dist/entry/embed.js +2 -2
- package/host/dist/index.js +3 -3
- package/package.json +1 -1
package/APP_CREATION_GUIDE.md
CHANGED
|
@@ -118,6 +118,7 @@ Pick the reference closest to your needs and clone its repo from Hugging Face:
|
|
|
118
118
|
| [`pollen-robotics/emotions`](https://huggingface.co/spaces/pollen-robotics/emotions) | React 19 + MUI 7 + Vite | UI-rich app with rich components / theming |
|
|
119
119
|
| [`pollen-robotics/telepresence`](https://huggingface.co/spaces/pollen-robotics/telepresence) | React 19 + MUI 7 + Vite | App with camera / media streams |
|
|
120
120
|
| [`pollen-robotics/sdk-js-demo-app`](https://huggingface.co/spaces/pollen-robotics/sdk-js-demo-app) | Vanilla TS + Vite | Tour of every SDK primitive |
|
|
121
|
+
| [`pollen-robotics/reachy-mini-js-template`](https://huggingface.co/spaces/pollen-robotics/reachy-mini-js-template) | **Bare HTML, no build** | Smallest correct template; see §11.5 |
|
|
121
122
|
|
|
122
123
|
```bash
|
|
123
124
|
# Example: start from the vanilla TS template
|
|
@@ -337,7 +338,7 @@ mountHost({
|
|
|
337
338
|
|
|
338
339
|
**Required**: `appName`. Everything else has sensible defaults.
|
|
339
340
|
|
|
340
|
-
**Return**: `{
|
|
341
|
+
**Return**: `{ unmount(): void }` - call it to tear the shell down. You
|
|
341
342
|
usually never need this; the page lifecycle handles it.
|
|
342
343
|
|
|
343
344
|
---
|
|
@@ -900,6 +901,10 @@ one-off prototype, you can deploy a single `index.html` that imports
|
|
|
900
901
|
the SDK from a CDN. No `package.json`, no `app_build_command`, no
|
|
901
902
|
build step. HF serves the repo root as-is.
|
|
902
903
|
|
|
904
|
+
Start from [`pollen-robotics/reachy-mini-js-template`](https://huggingface.co/spaces/pollen-robotics/reachy-mini-js-template): duplicate the
|
|
905
|
+
Space and edit its `index.html` — it already follows every rule in this
|
|
906
|
+
guide and shows the common recipes in a few lines each.
|
|
907
|
+
|
|
903
908
|
**Trade-off summary**
|
|
904
909
|
|
|
905
910
|
| | Bundled (default, §11.1-§11.4) | Bare HTML + CDN |
|
|
@@ -29,12 +29,14 @@ export interface SafelyReturnOptions {
|
|
|
29
29
|
* Smooth, distance-scaled return to a target pose. Routes through the
|
|
30
30
|
* existing SDK primitives:
|
|
31
31
|
*
|
|
32
|
-
* 1. `reachy.
|
|
32
|
+
* 1. `reachy.stopHeadTracking()` — at weight 1 daemon-side face
|
|
33
|
+
* tracking overrides every app head target, this goto included.
|
|
34
|
+
* 2. `reachy.setMotorMode("enabled")` — safe by construction since
|
|
33
35
|
* daemon PR #1138 (the daemon pins all targets to the present
|
|
34
36
|
* pose before flipping torque on).
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
37
|
+
* 3. Read `reachy.robotState` for the current pose snapshot.
|
|
38
|
+
* 4. Compute `scaledDuration(current, target, preset)`.
|
|
39
|
+
* 5. Call `reachy.gotoTarget({ ...target, duration })`.
|
|
38
40
|
*
|
|
39
41
|
* Returns **synchronously after dispatching** the goto — does NOT
|
|
40
42
|
* await completion. Callers who want to await the move should
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-return.d.ts","sourceRoot":"","sources":["../../animation/safe-return.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAGH,KAAK,oBAAoB,EAC5B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAChC,mDAAmD;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,oBAAoB,CAAC;CACjC;AAED
|
|
1
|
+
{"version":3,"file":"safe-return.d.ts","sourceRoot":"","sources":["../../animation/safe-return.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAGH,KAAK,oBAAoB,EAC5B,MAAM,cAAc,CAAC;AACtB,OAAO,EAAkB,KAAK,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,wCAAwC;AACxC,MAAM,WAAW,mBAAmB;IAChC,mDAAmD;IACnD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,oBAAoB,CAAC;CACjC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,kBAAkB,CAC9B,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,mBAAwB,GAClC,oBAAoB,CAqCtB;AAED,4CAA4C;AAC5C,MAAM,WAAW,6BAA8B,SAAQ,mBAAmB;IACtE;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAClC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,GAAE,6BAAkC,GAC5C,IAAI,CAoBN"}
|
|
@@ -20,12 +20,14 @@ import { scaledDuration } from "./distance.js";
|
|
|
20
20
|
* Smooth, distance-scaled return to a target pose. Routes through the
|
|
21
21
|
* existing SDK primitives:
|
|
22
22
|
*
|
|
23
|
-
* 1. `reachy.
|
|
23
|
+
* 1. `reachy.stopHeadTracking()` — at weight 1 daemon-side face
|
|
24
|
+
* tracking overrides every app head target, this goto included.
|
|
25
|
+
* 2. `reachy.setMotorMode("enabled")` — safe by construction since
|
|
24
26
|
* daemon PR #1138 (the daemon pins all targets to the present
|
|
25
27
|
* pose before flipping torque on).
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
28
|
+
* 3. Read `reachy.robotState` for the current pose snapshot.
|
|
29
|
+
* 4. Compute `scaledDuration(current, target, preset)`.
|
|
30
|
+
* 5. Call `reachy.gotoTarget({ ...target, duration })`.
|
|
29
31
|
*
|
|
30
32
|
* Returns **synchronously after dispatching** the goto — does NOT
|
|
31
33
|
* await completion. Callers who want to await the move should
|
|
@@ -52,6 +54,12 @@ import { scaledDuration } from "./distance.js";
|
|
|
52
54
|
export function safelyReturnToPose(reachy, options = {}) {
|
|
53
55
|
const target = options.target ?? INIT_POSE;
|
|
54
56
|
const preset = options.preset ?? DEFAULT_SCALED_DURATION_PRESET;
|
|
57
|
+
try {
|
|
58
|
+
reachy.stopHeadTracking();
|
|
59
|
+
}
|
|
60
|
+
catch {
|
|
61
|
+
// Data channel closed; nothing is tracking then.
|
|
62
|
+
}
|
|
55
63
|
try {
|
|
56
64
|
reachy.setMotorMode("enabled");
|
|
57
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-return.js","sourceRoot":"","sources":["../../animation/safe-return.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EACH,8BAA8B,EAC9B,SAAS,GAEZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAA6B,MAAM,eAAe,CAAC;AAW1E
|
|
1
|
+
{"version":3,"file":"safe-return.js","sourceRoot":"","sources":["../../animation/safe-return.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EACH,8BAA8B,EAC9B,SAAS,GAEZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,cAAc,EAA6B,MAAM,eAAe,CAAC;AAW1E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,UAAU,kBAAkB,CAC9B,MAA0B,EAC1B,UAA+B,EAAE;IAEjC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC;IAC3C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,8BAA8B,CAAC;IAEhE,IAAI,CAAC;QACD,MAAM,CAAC,gBAAgB,EAAE,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACL,iDAAiD;IACrD,CAAC;IAED,IAAI,CAAC;QACD,MAAM,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACL,8DAA8D;QAC9D,oDAAoD;IACxD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,UAAyB,CAAC;IACjD,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAErD,MAAM,IAAI,GAAoD;QAC1D,QAAQ,EAAE,IAAI,CAAC,QAAQ;KAC1B,CAAC;IACF,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;IAC/D,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,CAAC,QAAQ,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IAEnE,IAAI,CAAC;QACD,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACL,6DAA6D;QAC7D,4DAA4D;IAChE,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC;AAaD;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,sBAAsB,CAClC,MAA0B,EAC1B,UAAyC,EAAE;IAE3C,MAAM,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,IAAI,CAAC;IAC5D,mEAAmE;IACnE,sEAAsE;IACtE,sEAAsE;IACtE,sEAAsE;IACtE,0EAA0E;IAC1E,2DAA2D;IAC3D,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,MAAM,IAAI,GAAG,GAAS,EAAE;QACpB,IAAI,YAAY;YAAE,OAAO;QACzB,YAAY,GAAG,IAAI,CAAC;QACpB,IAAI,iBAAiB,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO;QAC9D,kBAAkB,CAAC,MAAM,EAAE;YACvB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,MAAM,EAAE,OAAO,CAAC,MAAM;SACzB,CAAC,CAAC;IACP,CAAC,CAAC;IACF,MAAM,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-dx.test.d.ts","sourceRoot":"","sources":["../../lib/app-dx.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Small DX contracts that fresh app authors (human or agent) kept tripping on:
|
|
3
|
+
* - `matrixToRpy` must accept the flat `number[16]` head that `state` carries;
|
|
4
|
+
* - app audio reaches the robot speaker through a public method, not `_pc`;
|
|
5
|
+
* - `safelyReturnToPose` stops head tracking first, since tracking at
|
|
6
|
+
* weight 1 overrides the return-to-rest goto.
|
|
7
|
+
*/
|
|
8
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
9
|
+
import { safelyReturnToPose } from '../animation/safe-return.js';
|
|
10
|
+
import { matrixToRpy, rpyToMatrix } from './math.js';
|
|
11
|
+
import { ReachyMini } from './reachy-mini.js';
|
|
12
|
+
describe('matrixToRpy', () => {
|
|
13
|
+
it('gives the same angles for the nested and the flat form', () => {
|
|
14
|
+
const nested = rpyToMatrix(5, -10, 20);
|
|
15
|
+
const fromNested = matrixToRpy(nested);
|
|
16
|
+
const fromFlat = matrixToRpy(nested.flat());
|
|
17
|
+
expect(fromFlat.roll).toBeCloseTo(fromNested.roll);
|
|
18
|
+
expect(fromFlat.pitch).toBeCloseTo(fromNested.pitch);
|
|
19
|
+
expect(fromFlat.yaw).toBeCloseTo(fromNested.yaw);
|
|
20
|
+
expect(fromNested.yaw).toBeCloseTo(20);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
function fakeTrack(kind, id = kind) {
|
|
24
|
+
return { kind, id };
|
|
25
|
+
}
|
|
26
|
+
function withAudioSender(r) {
|
|
27
|
+
const replaceTrack = vi.fn(async () => { });
|
|
28
|
+
const internals = r;
|
|
29
|
+
const placeholder = fakeTrack('audio', 'placeholder');
|
|
30
|
+
internals._micStream = { getAudioTracks: () => [placeholder] };
|
|
31
|
+
internals._micSupported = true;
|
|
32
|
+
internals._pc = {
|
|
33
|
+
getTransceivers: () => [
|
|
34
|
+
{ receiver: { track: { kind: 'video' } }, sender: { replaceTrack: vi.fn() } },
|
|
35
|
+
{ receiver: { track: { kind: 'audio' } }, sender: { replaceTrack } },
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
return { replaceTrack, placeholder };
|
|
39
|
+
}
|
|
40
|
+
describe('setOutgoingAudioTrack', () => {
|
|
41
|
+
it('puts the app track on the audio sender', async () => {
|
|
42
|
+
const r = new ReachyMini();
|
|
43
|
+
const { replaceTrack } = withAudioSender(r);
|
|
44
|
+
const tts = fakeTrack('audio', 'tts');
|
|
45
|
+
await expect(r.setOutgoingAudioTrack(tts)).resolves.toBe(true);
|
|
46
|
+
expect(replaceTrack).toHaveBeenCalledWith(tts);
|
|
47
|
+
});
|
|
48
|
+
it('null goes back to the silent placeholder', async () => {
|
|
49
|
+
const r = new ReachyMini();
|
|
50
|
+
const { replaceTrack, placeholder } = withAudioSender(r);
|
|
51
|
+
await r.setOutgoingAudioTrack(null);
|
|
52
|
+
expect(replaceTrack).toHaveBeenLastCalledWith(placeholder);
|
|
53
|
+
});
|
|
54
|
+
it('resolves false before a session exists, without throwing', async () => {
|
|
55
|
+
const r = new ReachyMini();
|
|
56
|
+
await expect(r.setOutgoingAudioTrack(fakeTrack('audio'))).resolves.toBe(false);
|
|
57
|
+
});
|
|
58
|
+
it('resolves false when the robot did not offer two-way audio', async () => {
|
|
59
|
+
const r = new ReachyMini();
|
|
60
|
+
const { replaceTrack } = withAudioSender(r);
|
|
61
|
+
r._micSupported = false;
|
|
62
|
+
await expect(r.setOutgoingAudioTrack(fakeTrack('audio'))).resolves.toBe(false);
|
|
63
|
+
expect(replaceTrack).not.toHaveBeenCalled();
|
|
64
|
+
});
|
|
65
|
+
it('is forgotten by an explicit stopSession', async () => {
|
|
66
|
+
const r = new ReachyMini();
|
|
67
|
+
await r.setOutgoingAudioTrack(fakeTrack('audio'));
|
|
68
|
+
await r.stopSession();
|
|
69
|
+
expect(r._outgoingAudioTrack).toBeNull();
|
|
70
|
+
});
|
|
71
|
+
it('rejects non-audio tracks', async () => {
|
|
72
|
+
const r = new ReachyMini();
|
|
73
|
+
await expect(r.setOutgoingAudioTrack(fakeTrack('video'))).rejects.toThrow(TypeError);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe('safelyReturnToPose', () => {
|
|
77
|
+
it('stops head tracking before re-enabling torque and sending the goto', () => {
|
|
78
|
+
const calls = [];
|
|
79
|
+
const reachy = {
|
|
80
|
+
robotState: {},
|
|
81
|
+
stopHeadTracking: () => { calls.push('stopHeadTracking'); return true; },
|
|
82
|
+
setMotorMode: () => { calls.push('setMotorMode'); return true; },
|
|
83
|
+
gotoTarget: () => { calls.push('gotoTarget'); return true; },
|
|
84
|
+
};
|
|
85
|
+
safelyReturnToPose(reachy);
|
|
86
|
+
expect(calls).toEqual(['stopHeadTracking', 'setMotorMode', 'gotoTarget']);
|
|
87
|
+
});
|
|
88
|
+
it('still returns to pose when the tracking command throws', () => {
|
|
89
|
+
const goto = vi.fn(() => true);
|
|
90
|
+
const reachy = {
|
|
91
|
+
robotState: {},
|
|
92
|
+
stopHeadTracking: () => { throw new Error('channel closed'); },
|
|
93
|
+
setMotorMode: () => true,
|
|
94
|
+
gotoTarget: goto,
|
|
95
|
+
};
|
|
96
|
+
safelyReturnToPose(reachy);
|
|
97
|
+
expect(goto).toHaveBeenCalledOnce();
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
//# sourceMappingURL=app-dx.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-dx.test.js","sourceRoot":"","sources":["../../lib/app-dx.test.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/math.d.ts
CHANGED
|
@@ -13,9 +13,10 @@ export declare function radToDeg(rad: number): number;
|
|
|
13
13
|
*/
|
|
14
14
|
export declare function rpyToMatrix(rollDeg: number, pitchDeg: number, yawDeg: number): number[][];
|
|
15
15
|
/**
|
|
16
|
-
* Rotation matrix (3×3 or 4×4
|
|
16
|
+
* Rotation matrix (3×3 or 4×4 nested, or the flat row-major `number[16]`
|
|
17
|
+
* of `state.head`) → { roll, pitch, yaw } in degrees.
|
|
17
18
|
*/
|
|
18
|
-
export declare function matrixToRpy(
|
|
19
|
+
export declare function matrixToRpy(matrix: number[][] | number[]): {
|
|
19
20
|
roll: number;
|
|
20
21
|
pitch: number;
|
|
21
22
|
yaw: number;
|
package/dist/lib/math.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../lib/math.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACvB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACf,MAAM,EAAE,EAAE,CAWZ;AAED
|
|
1
|
+
{"version":3,"file":"math.d.ts","sourceRoot":"","sources":["../../lib/math.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE5C;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACvB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,GACf,MAAM,EAAE,EAAE,CAWZ;AAED;;;GAGG;AACH,wBAAgB,WAAW,CACvB,MAAM,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,GAC9B;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAS9C"}
|
package/dist/lib/math.js
CHANGED
|
@@ -28,9 +28,13 @@ export function rpyToMatrix(rollDeg, pitchDeg, yawDeg) {
|
|
|
28
28
|
];
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
31
|
-
* Rotation matrix (3×3 or 4×4
|
|
31
|
+
* Rotation matrix (3×3 or 4×4 nested, or the flat row-major `number[16]`
|
|
32
|
+
* of `state.head`) → { roll, pitch, yaw } in degrees.
|
|
32
33
|
*/
|
|
33
|
-
export function matrixToRpy(
|
|
34
|
+
export function matrixToRpy(matrix) {
|
|
35
|
+
const m = Array.isArray(matrix[0])
|
|
36
|
+
? matrix
|
|
37
|
+
: [0, 1, 2, 3].map((r) => matrix.slice(r * 4, r * 4 + 4));
|
|
34
38
|
return {
|
|
35
39
|
roll: radToDeg(Math.atan2(m[2][1], m[2][2])),
|
|
36
40
|
pitch: radToDeg(Math.asin(-m[2][0])),
|
package/dist/lib/math.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../lib/math.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAChC,OAAO,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW;IAChC,OAAO,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACvB,OAAe,EACf,QAAgB,EAChB,MAAc;IAEd,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1E,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO;QACH,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KACf,CAAC;AACN,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../../lib/math.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,UAAU,QAAQ,CAAC,GAAW;IAChC,OAAO,GAAG,GAAG,IAAI,CAAC,EAAE,GAAG,GAAG,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAW;IAChC,OAAO,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;AAC/B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACvB,OAAe,EACf,QAAgB,EAChB,MAAc;IAEd,MAAM,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1E,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACzC,OAAO;QACH,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1B,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KACf,CAAC;AACN,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CACvB,MAA6B;IAE7B,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9B,CAAC,CAAE,MAAqB;QACxB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,MAAmB,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO;QACH,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,CAAC;QAChD,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,CAAC;QACtC,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAE,CAAC,CAAC;KAClD,CAAC;AACN,CAAC"}
|
|
@@ -29,6 +29,8 @@ export declare class ReachyMini extends EventTarget implements ReachyMiniInstanc
|
|
|
29
29
|
private _selectedRobotId;
|
|
30
30
|
private _pendingRemoteIce;
|
|
31
31
|
_micStream: MediaStream | null;
|
|
32
|
+
private _robotAudioTrack;
|
|
33
|
+
private _outgoingAudioTrack;
|
|
32
34
|
private _micMuted;
|
|
33
35
|
private _audioMuted;
|
|
34
36
|
private _micSupported;
|
|
@@ -64,6 +66,12 @@ export declare class ReachyMini extends EventTarget implements ReachyMiniInstanc
|
|
|
64
66
|
* use — never capture it across ticks.
|
|
65
67
|
*/
|
|
66
68
|
get peerConnection(): RTCPeerConnection | null;
|
|
69
|
+
/**
|
|
70
|
+
* The robot's microphone as a live audio track, or `null` until the
|
|
71
|
+
* session's audio arrives (see the `audioTrack` event). Feed it to Web
|
|
72
|
+
* Audio, `MediaRecorder` or `SpeechRecognition.start(track)`.
|
|
73
|
+
*/
|
|
74
|
+
get robotAudioTrack(): MediaStreamTrack | null;
|
|
67
75
|
/**
|
|
68
76
|
* Build version of this SDK (npm package `version`), injected from
|
|
69
77
|
* package.json at build time. This is the JS SDK's OWN version and is
|
|
@@ -351,6 +359,22 @@ export declare class ReachyMini extends EventTarget implements ReachyMiniInstanc
|
|
|
351
359
|
unsubscribePose(): boolean;
|
|
352
360
|
setAudioMuted(muted: boolean): void;
|
|
353
361
|
setMicMuted(muted: boolean): void;
|
|
362
|
+
/**
|
|
363
|
+
* Stream an audio track to the robot's speaker in real time (TTS output,
|
|
364
|
+
* a WebAudio graph, the user's own mic for teleop…). Pass `null` to go
|
|
365
|
+
* back to silence. The track survives auto-reconnects; the app keeps
|
|
366
|
+
* ownership of it (the SDK never stops it).
|
|
367
|
+
*
|
|
368
|
+
* Resolves `true` once the track is on the wire, `false` when there is
|
|
369
|
+
* no live session yet (it is then applied as soon as one starts) or when
|
|
370
|
+
* the robot didn't offer two-way audio. Cleared by `stopSession()` /
|
|
371
|
+
* `disconnect()`. `setMicMuted()` only mutes the SDK's placeholder, not
|
|
372
|
+
* this track — stop or disable the track itself to go quiet.
|
|
373
|
+
* For clips that must stay in sync with motion, prefer
|
|
374
|
+
* `playMove(motion, { audioBlob })` or `uploadAudio` + `playUploadedAudio`.
|
|
375
|
+
*/
|
|
376
|
+
setOutgoingAudioTrack(track: MediaStreamTrack | null): Promise<boolean>;
|
|
377
|
+
private _applyOutgoingAudioTrack;
|
|
354
378
|
attachVideo(videoElement: HTMLVideoElement): () => void;
|
|
355
379
|
playMove(motion: MoveData, { audioBlob, audioLeadMs, description, encoding, playFrequency, initialGotoDuration, startTimeoutMs, onProgress, onStarted, }?: PlayMoveOptions): Promise<PlayMoveResult>;
|
|
356
380
|
cancelMove(uploadId?: string | null): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reachy-mini.d.ts","sourceRoot":"","sources":["../../lib/reachy-mini.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"reachy-mini.d.ts","sourceRoot":"","sources":["../../lib/reachy-mini.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/reachy-mini.js
CHANGED
|
@@ -81,6 +81,8 @@ export class ReachyMini extends EventTarget {
|
|
|
81
81
|
_pendingRemoteIce = [];
|
|
82
82
|
// ─── Audio ───────────────────────────────────────────────────────────
|
|
83
83
|
_micStream = null;
|
|
84
|
+
_robotAudioTrack = null;
|
|
85
|
+
_outgoingAudioTrack = null;
|
|
84
86
|
_micMuted = true;
|
|
85
87
|
_audioMuted = true;
|
|
86
88
|
_micSupported = false;
|
|
@@ -171,6 +173,12 @@ export class ReachyMini extends EventTarget {
|
|
|
171
173
|
* use — never capture it across ticks.
|
|
172
174
|
*/
|
|
173
175
|
get peerConnection() { return this._pc; }
|
|
176
|
+
/**
|
|
177
|
+
* The robot's microphone as a live audio track, or `null` until the
|
|
178
|
+
* session's audio arrives (see the `audioTrack` event). Feed it to Web
|
|
179
|
+
* Audio, `MediaRecorder` or `SpeechRecognition.start(track)`.
|
|
180
|
+
*/
|
|
181
|
+
get robotAudioTrack() { return this._robotAudioTrack; }
|
|
174
182
|
/**
|
|
175
183
|
* Build version of this SDK (npm package `version`), injected from
|
|
176
184
|
* package.json at build time. This is the JS SDK's OWN version and is
|
|
@@ -554,6 +562,10 @@ export class ReachyMini extends EventTarget {
|
|
|
554
562
|
catch { /* ignore */ }
|
|
555
563
|
this._emit('videoTrack', { track: e.track, stream: e.streams[0] });
|
|
556
564
|
}
|
|
565
|
+
else if (e.track.kind === 'audio') {
|
|
566
|
+
this._robotAudioTrack = e.track;
|
|
567
|
+
this._emit('audioTrack', { track: e.track, stream: e.streams[0] });
|
|
568
|
+
}
|
|
557
569
|
};
|
|
558
570
|
this._pc.onicecandidate = async (e) => {
|
|
559
571
|
if (e.candidate && this._sessionId) {
|
|
@@ -683,6 +695,7 @@ export class ReachyMini extends EventTarget {
|
|
|
683
695
|
this._micStream.getTracks().forEach((t) => t.stop());
|
|
684
696
|
this._micStream = null;
|
|
685
697
|
}
|
|
698
|
+
this._robotAudioTrack = null;
|
|
686
699
|
this._micMuted = true;
|
|
687
700
|
this._micSupported = false;
|
|
688
701
|
if (this._pc) {
|
|
@@ -721,6 +734,7 @@ export class ReachyMini extends EventTarget {
|
|
|
721
734
|
this._supervisor.cancelRedial();
|
|
722
735
|
this._logSubscribers.clear();
|
|
723
736
|
this._updateProgressSubscribers.clear();
|
|
737
|
+
this._outgoingAudioTrack = null;
|
|
724
738
|
const sessionId = this._closeTransport(new Error('Session stopped'));
|
|
725
739
|
if (sessionId) {
|
|
726
740
|
await this._sendToServer({ type: 'endSession', sessionId });
|
|
@@ -739,6 +753,7 @@ export class ReachyMini extends EventTarget {
|
|
|
739
753
|
}
|
|
740
754
|
this._logSubscribers.clear();
|
|
741
755
|
this._updateProgressSubscribers.clear();
|
|
756
|
+
this._outgoingAudioTrack = null;
|
|
742
757
|
const sessionId = this._closeTransport(new Error('Disconnected'));
|
|
743
758
|
if (sessionId && this._token) {
|
|
744
759
|
void this._sendToServer({ type: 'endSession', sessionId });
|
|
@@ -1271,6 +1286,36 @@ export class ReachyMini extends EventTarget {
|
|
|
1271
1286
|
this._micStream.getAudioTracks().forEach((t) => { t.enabled = !muted; });
|
|
1272
1287
|
}
|
|
1273
1288
|
}
|
|
1289
|
+
/**
|
|
1290
|
+
* Stream an audio track to the robot's speaker in real time (TTS output,
|
|
1291
|
+
* a WebAudio graph, the user's own mic for teleop…). Pass `null` to go
|
|
1292
|
+
* back to silence. The track survives auto-reconnects; the app keeps
|
|
1293
|
+
* ownership of it (the SDK never stops it).
|
|
1294
|
+
*
|
|
1295
|
+
* Resolves `true` once the track is on the wire, `false` when there is
|
|
1296
|
+
* no live session yet (it is then applied as soon as one starts) or when
|
|
1297
|
+
* the robot didn't offer two-way audio. Cleared by `stopSession()` /
|
|
1298
|
+
* `disconnect()`. `setMicMuted()` only mutes the SDK's placeholder, not
|
|
1299
|
+
* this track — stop or disable the track itself to go quiet.
|
|
1300
|
+
* For clips that must stay in sync with motion, prefer
|
|
1301
|
+
* `playMove(motion, { audioBlob })` or `uploadAudio` + `playUploadedAudio`.
|
|
1302
|
+
*/
|
|
1303
|
+
async setOutgoingAudioTrack(track) {
|
|
1304
|
+
if (track && track.kind !== 'audio') {
|
|
1305
|
+
throw new TypeError(`setOutgoingAudioTrack: expected an audio track, got "${track.kind}"`);
|
|
1306
|
+
}
|
|
1307
|
+
this._outgoingAudioTrack = track;
|
|
1308
|
+
return this._applyOutgoingAudioTrack();
|
|
1309
|
+
}
|
|
1310
|
+
async _applyOutgoingAudioTrack() {
|
|
1311
|
+
const sender = this._pc?.getTransceivers()
|
|
1312
|
+
.find((t) => t.receiver.track.kind === 'audio')?.sender;
|
|
1313
|
+
if (!sender || !this._micSupported)
|
|
1314
|
+
return false;
|
|
1315
|
+
const fallback = this._micStream?.getAudioTracks()[0] ?? null;
|
|
1316
|
+
await sender.replaceTrack(this._outgoingAudioTrack ?? fallback);
|
|
1317
|
+
return true;
|
|
1318
|
+
}
|
|
1274
1319
|
// ─── Video helper ────────────────────────────────────────────────────
|
|
1275
1320
|
attachVideo(videoElement) {
|
|
1276
1321
|
this._videoElement = videoElement;
|
|
@@ -1674,6 +1719,7 @@ export class ReachyMini extends EventTarget {
|
|
|
1674
1719
|
this._micStream.getTracks().forEach((t) => t.stop());
|
|
1675
1720
|
this._micStream = null;
|
|
1676
1721
|
}
|
|
1722
|
+
this._robotAudioTrack = null;
|
|
1677
1723
|
this._iceConnected = false;
|
|
1678
1724
|
this._dcOpen = false;
|
|
1679
1725
|
this._micMuted = true;
|
|
@@ -1710,6 +1756,13 @@ export class ReachyMini extends EventTarget {
|
|
|
1710
1756
|
await this._pc.setRemoteDescription(new RTCSessionDescription(sdp));
|
|
1711
1757
|
const answer = await this._pc.createAnswer();
|
|
1712
1758
|
await this._pc.setLocalDescription(answer);
|
|
1759
|
+
// Re-dials build a fresh peer connection: carry the app's
|
|
1760
|
+
// outgoing audio over instead of reverting to the placeholder.
|
|
1761
|
+
if (this._outgoingAudioTrack) {
|
|
1762
|
+
// Best-effort: a failed swap must not keep the answer from going out.
|
|
1763
|
+
await this._applyOutgoingAudioTrack()
|
|
1764
|
+
.catch((e) => log.warn('re-applying outgoing audio failed:', e));
|
|
1765
|
+
}
|
|
1713
1766
|
await this._sendToServer({
|
|
1714
1767
|
type: 'peer',
|
|
1715
1768
|
sessionId: this._sessionId,
|