dualsense-ts 6.12.0 → 6.13.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.
- package/CHANGELOG.md +10 -0
- package/README.md +52 -5
- package/dist/dualsense.d.ts +19 -0
- package/dist/dualsense.d.ts.map +1 -1
- package/dist/dualsense.js +32 -0
- package/dist/dualsense.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/motion/index.d.ts +8 -0
- package/dist/motion/index.d.ts.map +1 -0
- package/dist/motion/index.js +24 -0
- package/dist/motion/index.js.map +1 -0
- package/dist/motion/madgwick.d.ts +41 -0
- package/dist/motion/madgwick.d.ts.map +1 -0
- package/dist/motion/madgwick.js +95 -0
- package/dist/motion/madgwick.js.map +1 -0
- package/dist/motion/orientation.d.ts +62 -0
- package/dist/motion/orientation.d.ts.map +1 -0
- package/dist/motion/orientation.js +106 -0
- package/dist/motion/orientation.js.map +1 -0
- package/dist/motion/quaternion.d.ts +30 -0
- package/dist/motion/quaternion.d.ts.map +1 -0
- package/dist/motion/quaternion.js +44 -0
- package/dist/motion/quaternion.js.map +1 -0
- package/dist/motion/shake.d.ts +132 -0
- package/dist/motion/shake.d.ts.map +1 -0
- package/dist/motion/shake.js +254 -0
- package/dist/motion/shake.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,16 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `dualsense-ts` are documented here. This project uses [Semantic Versioning](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## [6.13.0] - 2026-04-13
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- **Orientation tracking**: `controller.orientation` provides fused 3D orientation (pitch, yaw, roll, quaternion) via a zero-dependency Madgwick AHRS filter, plus accelerometer-only `tiltPitch`/`tiltRoll` for drift-free gravity-reference applications. Filter gain (`beta`) is tunable at runtime
|
|
10
|
+
- **Shake detection**: `controller.shake` detects shake intensity, frequency, and active state using per-axis Goertzel frequency analysis on first-difference signals. Reports both `frequency` (reversal rate) and `fundamental` (oscillation frequency), with a live `spectrum` of frequency bin powers. Configurable `threshold`, `windowSize`, `sustain`, `freqStep`, `freqMin`, and `freqMax` — all tunable at runtime
|
|
11
|
+
- Axis remapping from DualSense Y-up to Madgwick Z-up convention for correct symmetric tilt behavior
|
|
12
|
+
- Zero-gradient guard in the Madgwick filter to prevent NaN when gravity is already aligned
|
|
13
|
+
- New `motion/` module: `Orientation`, `ShakeDetector`, `MadgwickFilter`, quaternion math — all zero-dependency
|
|
14
|
+
|
|
5
15
|
## [6.12.0] - 2026-04-14
|
|
6
16
|
|
|
7
17
|
### Added
|
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
`dualsense-ts` is the natural interface for your DualSense controller. Simple to use, fully-typed, fully-featured, and supports wired and wireless connections in both node.js and the browser.
|
|
4
4
|
|
|
5
|
-
Check out the **[interactive docs](https://nsfm.github.io/dualsense-ts/)**! Connect a controller and try every feature with live demos,
|
|
5
|
+
Check out the **[interactive docs](https://nsfm.github.io/dualsense-ts/)**! Connect a controller (or a few!) and try every feature with live demos. Or, explore the [playground](https://nsfm.github.io/dualsense-ts/playground) to check all of your controller functionality in one place.
|
|
6
6
|
|
|
7
7
|
## Features
|
|
8
8
|
|
|
@@ -13,7 +13,7 @@ Check out the **[interactive docs](https://nsfm.github.io/dualsense-ts/)**! Conn
|
|
|
13
13
|
- **Lighting control** covering [RGB light bars](https://nsfm.github.io/dualsense-ts/outputs/lightbar), [player LEDs](https://nsfm.github.io/dualsense-ts/outputs/player-leds), and [mute button](https://nsfm.github.io/dualsense-ts/outputs/mute-led)
|
|
14
14
|
- **Full haptics control** over independent [left/right rumble](https://nsfm.github.io/dualsense-ts/outputs/rumble) plus complete [trigger haptics](https://nsfm.github.io/dualsense-ts/outputs/trigger-effects)
|
|
15
15
|
- **[Touchpad support](https://nsfm.github.io/dualsense-ts/inputs/touchpad)** with full multi-touch handling
|
|
16
|
-
- **[Motion tracking](https://nsfm.github.io/dualsense-ts/inputs/motion)** via factory-calibrated gyroscope and accelerometer
|
|
16
|
+
- **[Motion tracking](https://nsfm.github.io/dualsense-ts/inputs/motion)** via factory-calibrated gyroscope and accelerometer, with built-in [orientation tracking](https://nsfm.github.io/dualsense-ts/api/orientation) and [shake detection](https://nsfm.github.io/dualsense-ts/api/shake-detector)
|
|
17
17
|
- **[Battery status](https://nsfm.github.io/dualsense-ts/inputs/battery)** including level and charging state
|
|
18
18
|
- **[Audio controls](https://nsfm.github.io/dualsense-ts/outputs/audio)** for speaker, headphone, and microphone volume, routing, and muting
|
|
19
19
|
- **Peripheral status** for connected headphones and microphone
|
|
@@ -180,7 +180,7 @@ Each touch point also exposes a `tracker` ([Increment](src/elements/increment.ts
|
|
|
180
180
|
|
|
181
181
|
#### [Motion Control](https://nsfm.github.io/dualsense-ts/inputs/motion)
|
|
182
182
|
|
|
183
|
-
|
|
183
|
+
Raw values from the controller's 6-axis IMU are provided:
|
|
184
184
|
|
|
185
185
|
```typescript
|
|
186
186
|
controller.gyroscope.on("change", ({ x, y, z }) => {
|
|
@@ -196,10 +196,57 @@ controller.accelerometer.z.on("change", ({ magnitude }) => {
|
|
|
196
196
|
});
|
|
197
197
|
```
|
|
198
198
|
|
|
199
|
-
You'll need to perform additional processing to get the most use out of the raw readings — for example, by buffering accelerometer inputs and using a rolling Fourier transform to detect shaking.
|
|
200
|
-
|
|
201
199
|
Gyroscope and accelerometer readings are automatically calibrated using each controller's factory calibration data, which removes gyro bias drift and accelerometer zero-point offset. Calibration is applied transparently — you can inspect the resolved factors via `controller.calibration`. See [Factory Calibration](https://nsfm.github.io/dualsense-ts/inputs/motion) in the docs for details on bias removal, zero-point correction, and per-axis sensitivity normalization.
|
|
202
200
|
|
|
201
|
+
#### [Orientation Tracking](https://nsfm.github.io/dualsense-ts/api/orientation)
|
|
202
|
+
|
|
203
|
+
Built-in sensor fusion provides a stable 3D orientation from the raw IMU data, powered by a zero-dependency [Madgwick AHRS](https://nsfm.github.io/dualsense-ts/api/orientation) filter:
|
|
204
|
+
|
|
205
|
+
```typescript
|
|
206
|
+
// Fused Euler angles (radians), updated every IMU sample
|
|
207
|
+
const { pitch, yaw, roll } = controller.orientation;
|
|
208
|
+
|
|
209
|
+
// Quaternion for 3D rendering
|
|
210
|
+
const [w, x, y, z] = controller.orientation.quaternion;
|
|
211
|
+
|
|
212
|
+
// Accelerometer-only tilt — no drift, no yaw
|
|
213
|
+
const steer = controller.orientation.tiltRoll;
|
|
214
|
+
|
|
215
|
+
// Tune the filter: lower beta = smoother, higher = less drift
|
|
216
|
+
controller.orientation.beta = 0.02;
|
|
217
|
+
|
|
218
|
+
// Reset to identity (e.g. on button press)
|
|
219
|
+
controller.orientation.reset();
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
#### [Shake Detection](https://nsfm.github.io/dualsense-ts/api/shake-detector)
|
|
223
|
+
|
|
224
|
+
The built-in shake detector uses [Goertzel frequency analysis](https://nsfm.github.io/dualsense-ts/api/shake-detector) to detect shake intensity, frequency, and direction-reversal rate:
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
// Simple shake detection
|
|
228
|
+
if (controller.shake.active) {
|
|
229
|
+
triggerEffect();
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Proportional response
|
|
233
|
+
controller.left.rumble = controller.shake.intensity;
|
|
234
|
+
|
|
235
|
+
// Frequency-based mechanics
|
|
236
|
+
if (controller.shake.frequency > 4) {
|
|
237
|
+
baby.soothe(controller.shake.intensity);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Tune sensitivity and analysis window at runtime
|
|
241
|
+
controller.shake.threshold = 0.05;
|
|
242
|
+
controller.shake.windowSize = 128;
|
|
243
|
+
|
|
244
|
+
// Access raw spectrum for custom visualization
|
|
245
|
+
for (const bin of controller.shake.spectrum) {
|
|
246
|
+
drawBar(bin.freq, bin.power);
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
203
250
|
#### [Battery](https://nsfm.github.io/dualsense-ts/inputs/battery)
|
|
204
251
|
|
|
205
252
|
The controller provides its current battery level and charging status:
|
package/dist/dualsense.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { Momentary, Dpad, DpadParams, Mute, Unisense, UnisenseParams, Touchpad,
|
|
|
2
2
|
import { Input, InputParams } from "./input";
|
|
3
3
|
import { DualsenseHID, FirmwareInfo, FactoryInfo, DualsenseColor, ResolvedCalibration } from "./hid";
|
|
4
4
|
import { Intensity } from "./math";
|
|
5
|
+
import { Orientation, type OrientationParams, ShakeDetector, type ShakeDetectorParams } from "./motion";
|
|
5
6
|
/** Settings for your Dualsense controller and each of its inputs */
|
|
6
7
|
export interface DualsenseParams extends InputParams {
|
|
7
8
|
/** Sets the source for HID events. Default: decide automatically */
|
|
@@ -36,6 +37,10 @@ export interface DualsenseParams extends InputParams {
|
|
|
36
37
|
accelerometer?: AccelerometerParams;
|
|
37
38
|
/** Settings for the battery */
|
|
38
39
|
battery?: BatteryParams;
|
|
40
|
+
/** Settings for the orientation tracker (Madgwick AHRS) */
|
|
41
|
+
orientation?: OrientationParams;
|
|
42
|
+
/** Settings for the shake detector */
|
|
43
|
+
shake?: ShakeDetectorParams;
|
|
39
44
|
}
|
|
40
45
|
/** Represents a Dualsense controller */
|
|
41
46
|
export declare class Dualsense extends Input<Dualsense> {
|
|
@@ -82,10 +87,24 @@ export declare class Dualsense extends Input<Dualsense> {
|
|
|
82
87
|
readonly audio: Audio;
|
|
83
88
|
/** Per-subsystem power save controls (disable touch, motion, haptics, audio) */
|
|
84
89
|
readonly powerSave: PowerSaveControl;
|
|
90
|
+
/**
|
|
91
|
+
* Fused orientation from Madgwick AHRS sensor fusion.
|
|
92
|
+
* Provides pitch, yaw, roll (radians), quaternion, and
|
|
93
|
+
* accelerometer-only tilt. Updated automatically each HID report.
|
|
94
|
+
*/
|
|
95
|
+
readonly orientation: Orientation;
|
|
96
|
+
/**
|
|
97
|
+
* Shake detector with frequency analysis.
|
|
98
|
+
* Provides intensity (0–1), dominant frequency (Hz), and an
|
|
99
|
+
* active flag. Updated automatically each HID report.
|
|
100
|
+
*/
|
|
101
|
+
readonly shake: ShakeDetector;
|
|
85
102
|
/** Monotonic sensor timestamp in microseconds from the controller's clock.
|
|
86
103
|
* Updated with each input report — useful for correlating motion sensor
|
|
87
104
|
* readings with other inputs across frames. Wraps at 2^32 (~71.6 minutes). */
|
|
88
105
|
sensorTimestamp: number;
|
|
106
|
+
/** Previous sensor timestamp for computing dt (microseconds). */
|
|
107
|
+
private prevSensorTimestamp;
|
|
89
108
|
/** Active interval timers, cleared on dispose */
|
|
90
109
|
private readonly timers;
|
|
91
110
|
/**
|
package/dist/dualsense.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dualsense.d.ts","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,IAAI,EACJ,UAAU,EACV,IAAI,EACJ,QAAQ,EACR,cAAc,EACd,QAAQ,EACR,SAAS,EACT,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,OAAO,EACP,aAAa,EACb,QAAQ,EACR,UAAU,EACV,KAAK,EACL,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,KAAK,EAAY,WAAW,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAEL,YAAY,EAMZ,YAAY,EACZ,WAAW,EACX,cAAc,EAGd,mBAAmB,EACpB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"dualsense.d.ts","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
|
package/dist/dualsense.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.Dualsense = void 0;
|
|
|
4
4
|
const elements_1 = require("./elements");
|
|
5
5
|
const input_1 = require("./input");
|
|
6
6
|
const hid_1 = require("./hid");
|
|
7
|
+
const motion_1 = require("./motion");
|
|
7
8
|
/** Represents a Dualsense controller */
|
|
8
9
|
class Dualsense extends input_1.Input {
|
|
9
10
|
/**
|
|
@@ -62,6 +63,8 @@ class Dualsense extends input_1.Input {
|
|
|
62
63
|
* Updated with each input report — useful for correlating motion sensor
|
|
63
64
|
* readings with other inputs across frames. Wraps at 2^32 (~71.6 minutes). */
|
|
64
65
|
this.sensorTimestamp = 0;
|
|
66
|
+
/** Previous sensor timestamp for computing dt (microseconds). */
|
|
67
|
+
this.prevSensorTimestamp = 0;
|
|
65
68
|
/** Active interval timers, cleared on dispose */
|
|
66
69
|
this.timers = [];
|
|
67
70
|
/**
|
|
@@ -156,6 +159,8 @@ class Dualsense extends input_1.Input {
|
|
|
156
159
|
name: "Battery",
|
|
157
160
|
...(params.battery ?? {}),
|
|
158
161
|
});
|
|
162
|
+
this.orientation = new motion_1.Orientation(params.orientation);
|
|
163
|
+
this.shake = new motion_1.ShakeDetector(params.shake);
|
|
159
164
|
this.connection[input_1.InputSet](false);
|
|
160
165
|
// If a HID instance was supplied externally (e.g. by DualsenseManager),
|
|
161
166
|
// the owner is responsible for driving discovery + reconnection.
|
|
@@ -197,6 +202,11 @@ class Dualsense extends input_1.Input {
|
|
|
197
202
|
if (audioMemo.userChanged)
|
|
198
203
|
audioMemo.key = "";
|
|
199
204
|
}
|
|
205
|
+
// Reset motion helpers on both connect and disconnect so
|
|
206
|
+
// orientation doesn't carry stale state across sessions.
|
|
207
|
+
this.orientation.reset();
|
|
208
|
+
this.shake.reset();
|
|
209
|
+
this.prevSensorTimestamp = 0;
|
|
200
210
|
});
|
|
201
211
|
// Seed the initial state in case the provider was already attached.
|
|
202
212
|
this.connection[input_1.InputSet](this.hid.provider.connected);
|
|
@@ -375,6 +385,28 @@ class Dualsense extends input_1.Input {
|
|
|
375
385
|
this.accelerometer.x[input_1.InputSet](state[hid_1.InputId.AccelX]);
|
|
376
386
|
this.accelerometer.y[input_1.InputSet](state[hid_1.InputId.AccelY]);
|
|
377
387
|
this.accelerometer.z[input_1.InputSet](state[hid_1.InputId.AccelZ]);
|
|
388
|
+
// Compute dt from the controller's hardware clock (microseconds).
|
|
389
|
+
// The timestamp wraps at 2^32 (~71.6 minutes).
|
|
390
|
+
const ts = state[hid_1.InputId.SensorTimestamp];
|
|
391
|
+
if (this.prevSensorTimestamp !== 0 && ts !== 0) {
|
|
392
|
+
const dtMicro = ts >= this.prevSensorTimestamp
|
|
393
|
+
? ts - this.prevSensorTimestamp
|
|
394
|
+
: 0xFFFFFFFF - this.prevSensorTimestamp + ts + 1;
|
|
395
|
+
const dt = dtMicro / 1000000;
|
|
396
|
+
// Sanity check: skip if dt is unreasonable (>0.5s means we
|
|
397
|
+
// probably missed reports or just reconnected).
|
|
398
|
+
if (dt > 0 && dt < 0.5) {
|
|
399
|
+
const gx = state[hid_1.InputId.GyroX];
|
|
400
|
+
const gy = state[hid_1.InputId.GyroY];
|
|
401
|
+
const gz = state[hid_1.InputId.GyroZ];
|
|
402
|
+
const ax = state[hid_1.InputId.AccelX];
|
|
403
|
+
const ay = state[hid_1.InputId.AccelY];
|
|
404
|
+
const az = state[hid_1.InputId.AccelZ];
|
|
405
|
+
this.orientation.update(gx, gy, gz, ax, ay, az, dt);
|
|
406
|
+
this.shake.update(ax, ay, az, dt);
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
this.prevSensorTimestamp = ts;
|
|
378
410
|
const level = state[hid_1.InputId.BatteryLevel];
|
|
379
411
|
if (level > this.pendingBattery.peakLevel) {
|
|
380
412
|
this.pendingBattery.peakLevel = level;
|
package/dist/dualsense.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dualsense.js","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dualsense.js","sourceRoot":"","sources":["../src/dualsense.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,MAAM,CAAC;AACrB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,QAAQ,CAAC;AACvB,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -26,4 +26,5 @@ __exportStar(require("./manager"), exports);
|
|
|
26
26
|
__exportStar(require("./math"), exports);
|
|
27
27
|
__exportStar(require("./elements/index"), exports);
|
|
28
28
|
__exportStar(require("./hid/index"), exports);
|
|
29
|
+
__exportStar(require("./motion/index"), exports);
|
|
29
30
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,gDAA8B;AAC9B,8CAA4B;AAC5B,uCAAqB;AACrB,0CAAwB;AACxB,4CAA0B;AAC1B,yCAAuB;AACvB,mDAAiC;AACjC,8CAA4B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,gDAA8B;AAC9B,8CAA4B;AAC5B,uCAAqB;AACrB,0CAAwB;AACxB,4CAA0B;AAC1B,yCAAuB;AACvB,mDAAiC;AACjC,8CAA4B;AAC5B,iDAA+B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/motion/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @file Automatically generated by barrelsby.
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
__exportStar(require("./madgwick"), exports);
|
|
21
|
+
__exportStar(require("./orientation"), exports);
|
|
22
|
+
__exportStar(require("./quaternion"), exports);
|
|
23
|
+
__exportStar(require("./shake"), exports);
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/motion/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,6CAA2B;AAC3B,gDAA8B;AAC9B,+CAA6B;AAC7B,0CAAwB"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Madgwick AHRS (Attitude and Heading Reference System) filter.
|
|
3
|
+
*
|
|
4
|
+
* Fuses 3-axis gyroscope and 3-axis accelerometer data into a stable
|
|
5
|
+
* orientation quaternion using gradient-descent-based correction.
|
|
6
|
+
*
|
|
7
|
+
* Reference: Sebastian Madgwick, "An efficient orientation filter for
|
|
8
|
+
* inertial and inertial/magnetic sensor arrays" (2010).
|
|
9
|
+
*
|
|
10
|
+
* Zero dependencies. The algorithm is ~40 lines of arithmetic.
|
|
11
|
+
*/
|
|
12
|
+
import { type Quaternion } from "./quaternion";
|
|
13
|
+
export declare class MadgwickFilter {
|
|
14
|
+
/** Current orientation estimate. */
|
|
15
|
+
q: Quaternion;
|
|
16
|
+
/**
|
|
17
|
+
* Filter gain. Higher values trust the accelerometer more — less
|
|
18
|
+
* drift but more high-frequency noise. Lower values give smoother
|
|
19
|
+
* tracking but allow more gyro drift.
|
|
20
|
+
*
|
|
21
|
+
* Typical range: 0.01 (very smooth) to 0.5 (aggressive correction).
|
|
22
|
+
* Default 0.1 is a good general-purpose starting point.
|
|
23
|
+
*/
|
|
24
|
+
beta: number;
|
|
25
|
+
constructor(beta?: number);
|
|
26
|
+
/** Reset to identity orientation. */
|
|
27
|
+
reset(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Incorporate one IMU sample.
|
|
30
|
+
*
|
|
31
|
+
* @param gx Gyroscope X (pitch) in **rad/s**
|
|
32
|
+
* @param gy Gyroscope Y (yaw) in **rad/s**
|
|
33
|
+
* @param gz Gyroscope Z (roll) in **rad/s**
|
|
34
|
+
* @param ax Accelerometer X (any consistent unit — normalized internally)
|
|
35
|
+
* @param ay Accelerometer Y
|
|
36
|
+
* @param az Accelerometer Z
|
|
37
|
+
* @param dt Time delta in **seconds** since last sample
|
|
38
|
+
*/
|
|
39
|
+
update(gx: number, gy: number, gz: number, ax: number, ay: number, az: number, dt: number): void;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=madgwick.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"madgwick.d.ts","sourceRoot":"","sources":["../../src/motion/madgwick.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,KAAK,UAAU,EAAY,MAAM,cAAc,CAAC;AAEzD,qBAAa,cAAc;IACzB,oCAAoC;IACpC,CAAC,EAAE,UAAU,CAAiB;IAE9B;;;;;;;OAOG;IACH,IAAI,EAAE,MAAM,CAAC;gBAED,IAAI,SAAM;IAItB,qCAAqC;IACrC,KAAK,IAAI,IAAI;IAIb;;;;;;;;;;OAUG;IACH,MAAM,CACJ,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,IAAI;CAkER"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Madgwick AHRS (Attitude and Heading Reference System) filter.
|
|
4
|
+
*
|
|
5
|
+
* Fuses 3-axis gyroscope and 3-axis accelerometer data into a stable
|
|
6
|
+
* orientation quaternion using gradient-descent-based correction.
|
|
7
|
+
*
|
|
8
|
+
* Reference: Sebastian Madgwick, "An efficient orientation filter for
|
|
9
|
+
* inertial and inertial/magnetic sensor arrays" (2010).
|
|
10
|
+
*
|
|
11
|
+
* Zero dependencies. The algorithm is ~40 lines of arithmetic.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.MadgwickFilter = void 0;
|
|
15
|
+
const quaternion_1 = require("./quaternion");
|
|
16
|
+
class MadgwickFilter {
|
|
17
|
+
constructor(beta = 0.1) {
|
|
18
|
+
/** Current orientation estimate. */
|
|
19
|
+
this.q = [...quaternion_1.IDENTITY];
|
|
20
|
+
this.beta = beta;
|
|
21
|
+
}
|
|
22
|
+
/** Reset to identity orientation. */
|
|
23
|
+
reset() {
|
|
24
|
+
this.q = [...quaternion_1.IDENTITY];
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Incorporate one IMU sample.
|
|
28
|
+
*
|
|
29
|
+
* @param gx Gyroscope X (pitch) in **rad/s**
|
|
30
|
+
* @param gy Gyroscope Y (yaw) in **rad/s**
|
|
31
|
+
* @param gz Gyroscope Z (roll) in **rad/s**
|
|
32
|
+
* @param ax Accelerometer X (any consistent unit — normalized internally)
|
|
33
|
+
* @param ay Accelerometer Y
|
|
34
|
+
* @param az Accelerometer Z
|
|
35
|
+
* @param dt Time delta in **seconds** since last sample
|
|
36
|
+
*/
|
|
37
|
+
update(gx, gy, gz, ax, ay, az, dt) {
|
|
38
|
+
let [q0, q1, q2, q3] = this.q;
|
|
39
|
+
// ---- Normalize accelerometer ----
|
|
40
|
+
let norm = Math.sqrt(ax * ax + ay * ay + az * az);
|
|
41
|
+
if (norm === 0)
|
|
42
|
+
return; // free-fall or no data — gyro only would diverge
|
|
43
|
+
norm = 1 / norm;
|
|
44
|
+
ax *= norm;
|
|
45
|
+
ay *= norm;
|
|
46
|
+
az *= norm;
|
|
47
|
+
// ---- Precomputed terms ----
|
|
48
|
+
const _2q0 = 2 * q0;
|
|
49
|
+
const _2q1 = 2 * q1;
|
|
50
|
+
const _2q2 = 2 * q2;
|
|
51
|
+
const _2q3 = 2 * q3;
|
|
52
|
+
const _4q0 = 4 * q0;
|
|
53
|
+
const _4q1 = 4 * q1;
|
|
54
|
+
const _4q2 = 4 * q2;
|
|
55
|
+
const _8q1 = 8 * q1;
|
|
56
|
+
const _8q2 = 8 * q2;
|
|
57
|
+
const q0q0 = q0 * q0;
|
|
58
|
+
const q1q1 = q1 * q1;
|
|
59
|
+
const q2q2 = q2 * q2;
|
|
60
|
+
const q3q3 = q3 * q3;
|
|
61
|
+
// ---- Gradient descent corrective step ----
|
|
62
|
+
// Objective: align estimated gravity direction with measured gravity.
|
|
63
|
+
let s0 = _4q0 * q2q2 + _2q2 * ax + _4q0 * q1q1 - _2q1 * ay;
|
|
64
|
+
let s1 = _4q1 * q3q3 - _2q3 * ax + 4 * q0q0 * q1 - _2q0 * ay - _4q1 +
|
|
65
|
+
_8q1 * q1q1 + _8q1 * q2q2 + _4q1 * az;
|
|
66
|
+
let s2 = 4 * q0q0 * q2 + _2q0 * ax + _4q2 * q3q3 - _2q3 * ay - _4q2 +
|
|
67
|
+
_8q2 * q1q1 + _8q2 * q2q2 + _4q2 * az;
|
|
68
|
+
let s3 = 4 * q1q1 * q3 - _2q1 * ax + 4 * q2q2 * q3 - _2q2 * ay;
|
|
69
|
+
const sNorm = s0 * s0 + s1 * s1 + s2 * s2 + s3 * s3;
|
|
70
|
+
if (sNorm > 0) {
|
|
71
|
+
norm = 1 / Math.sqrt(sNorm);
|
|
72
|
+
s0 *= norm;
|
|
73
|
+
s1 *= norm;
|
|
74
|
+
s2 *= norm;
|
|
75
|
+
s3 *= norm;
|
|
76
|
+
}
|
|
77
|
+
// When sNorm ≈ 0, the accel already matches the estimated gravity
|
|
78
|
+
// direction — no correction needed, just integrate gyro.
|
|
79
|
+
// ---- Quaternion rate from gyroscope ----
|
|
80
|
+
const qDot0 = 0.5 * (-q1 * gx - q2 * gy - q3 * gz);
|
|
81
|
+
const qDot1 = 0.5 * (q0 * gx + q2 * gz - q3 * gy);
|
|
82
|
+
const qDot2 = 0.5 * (q0 * gy - q1 * gz + q3 * gx);
|
|
83
|
+
const qDot3 = 0.5 * (q0 * gz + q1 * gy - q2 * gx);
|
|
84
|
+
// ---- Fuse: gyro integration minus gradient correction ----
|
|
85
|
+
q0 += (qDot0 - (sNorm > 0 ? this.beta * s0 : 0)) * dt;
|
|
86
|
+
q1 += (qDot1 - (sNorm > 0 ? this.beta * s1 : 0)) * dt;
|
|
87
|
+
q2 += (qDot2 - (sNorm > 0 ? this.beta * s2 : 0)) * dt;
|
|
88
|
+
q3 += (qDot3 - (sNorm > 0 ? this.beta * s3 : 0)) * dt;
|
|
89
|
+
// ---- Re-normalize ----
|
|
90
|
+
norm = 1 / Math.sqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3);
|
|
91
|
+
this.q = [q0 * norm, q1 * norm, q2 * norm, q3 * norm];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.MadgwickFilter = MadgwickFilter;
|
|
95
|
+
//# sourceMappingURL=madgwick.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"madgwick.js","sourceRoot":"","sources":["../../src/motion/madgwick.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-level orientation tracker for the DualSense controller.
|
|
3
|
+
*
|
|
4
|
+
* Wraps the Madgwick AHRS filter and provides:
|
|
5
|
+
* - Fused orientation as Euler angles and quaternion
|
|
6
|
+
* - Accelerometer-only tilt (no drift, no yaw — useful for
|
|
7
|
+
* gravity-reference applications like steering)
|
|
8
|
+
* - Automatic unit conversion from the library's [-1, 1] calibrated
|
|
9
|
+
* values to the rad/s and g units the filter expects
|
|
10
|
+
*
|
|
11
|
+
* DualSense IMU hardware constants:
|
|
12
|
+
* Gyroscope: ±2000 deg/s full scale → 1.0 = 2000 deg/s
|
|
13
|
+
* Accelerometer: ±4 g full scale → 0.25 ≈ 1 g
|
|
14
|
+
*/
|
|
15
|
+
import { type Quaternion } from "./quaternion";
|
|
16
|
+
export interface OrientationParams {
|
|
17
|
+
/**
|
|
18
|
+
* Madgwick filter gain. Higher = more accelerometer trust (less drift,
|
|
19
|
+
* more noise). Lower = smoother but driftier.
|
|
20
|
+
*
|
|
21
|
+
* - 0.01–0.04: very smooth, noticeable drift over minutes
|
|
22
|
+
* - 0.05–0.15: general purpose (default 0.1)
|
|
23
|
+
* - 0.2–0.5: aggressive correction, jittery under vibration
|
|
24
|
+
*/
|
|
25
|
+
beta?: number;
|
|
26
|
+
}
|
|
27
|
+
export declare class Orientation {
|
|
28
|
+
/** Fused orientation as Euler angles (radians, updated each sample). */
|
|
29
|
+
pitch: number;
|
|
30
|
+
yaw: number;
|
|
31
|
+
roll: number;
|
|
32
|
+
/** Fused orientation as a unit quaternion [w, x, y, z]. */
|
|
33
|
+
quaternion: Quaternion;
|
|
34
|
+
/**
|
|
35
|
+
* Tilt derived from the accelerometer gravity vector alone.
|
|
36
|
+
* No drift, but also no yaw — only pitch and roll.
|
|
37
|
+
* Noisy during motion; best used when the controller is relatively still.
|
|
38
|
+
*/
|
|
39
|
+
tiltPitch: number;
|
|
40
|
+
tiltRoll: number;
|
|
41
|
+
/** Madgwick filter gain. Can be adjusted at runtime. */
|
|
42
|
+
get beta(): number;
|
|
43
|
+
set beta(v: number);
|
|
44
|
+
private readonly filter;
|
|
45
|
+
constructor(params?: OrientationParams);
|
|
46
|
+
/** Reset to identity orientation (call when zeroing the view). */
|
|
47
|
+
reset(): void;
|
|
48
|
+
/**
|
|
49
|
+
* Incorporate one IMU sample. Called automatically by the Dualsense
|
|
50
|
+
* class on each HID report — you don't normally call this yourself.
|
|
51
|
+
*
|
|
52
|
+
* @param gx Calibrated gyro X (pitch), [-1, 1]
|
|
53
|
+
* @param gy Calibrated gyro Y (yaw), [-1, 1]
|
|
54
|
+
* @param gz Calibrated gyro Z (roll), [-1, 1]
|
|
55
|
+
* @param ax Calibrated accel X, [-1, 1]
|
|
56
|
+
* @param ay Calibrated accel Y, [-1, 1]
|
|
57
|
+
* @param az Calibrated accel Z, [-1, 1]
|
|
58
|
+
* @param dt Time delta in seconds
|
|
59
|
+
*/
|
|
60
|
+
update(gx: number, gy: number, gz: number, ax: number, ay: number, az: number, dt: number): void;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=orientation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orientation.d.ts","sourceRoot":"","sources":["../../src/motion/orientation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAE,KAAK,UAAU,EAAuC,MAAM,cAAc,CAAC;AAQpF,MAAM,WAAW,iBAAiB;IAChC;;;;;;;OAOG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,WAAW;IAGtB,wEAAwE;IACxE,KAAK,SAAK;IACV,GAAG,SAAK;IACR,IAAI,SAAK;IAET,2DAA2D;IAC3D,UAAU,EAAE,UAAU,CAAiB;IAEvC;;;;OAIG;IACH,SAAS,SAAK;IACd,QAAQ,SAAK;IAIb,wDAAwD;IACxD,IAAI,IAAI,IAAI,MAAM,CAEjB;IACD,IAAI,IAAI,CAAC,CAAC,EAAE,MAAM,EAEjB;IAGD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAE5B,MAAM,CAAC,EAAE,iBAAiB;IAItC,kEAAkE;IAClE,KAAK,IAAI,IAAI;IAUb;;;;;;;;;;;OAWG;IACH,MAAM,CACJ,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,GACT,IAAI;CAmCR"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* High-level orientation tracker for the DualSense controller.
|
|
4
|
+
*
|
|
5
|
+
* Wraps the Madgwick AHRS filter and provides:
|
|
6
|
+
* - Fused orientation as Euler angles and quaternion
|
|
7
|
+
* - Accelerometer-only tilt (no drift, no yaw — useful for
|
|
8
|
+
* gravity-reference applications like steering)
|
|
9
|
+
* - Automatic unit conversion from the library's [-1, 1] calibrated
|
|
10
|
+
* values to the rad/s and g units the filter expects
|
|
11
|
+
*
|
|
12
|
+
* DualSense IMU hardware constants:
|
|
13
|
+
* Gyroscope: ±2000 deg/s full scale → 1.0 = 2000 deg/s
|
|
14
|
+
* Accelerometer: ±4 g full scale → 0.25 ≈ 1 g
|
|
15
|
+
*/
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.Orientation = void 0;
|
|
18
|
+
const madgwick_1 = require("./madgwick");
|
|
19
|
+
const quaternion_1 = require("./quaternion");
|
|
20
|
+
/**
|
|
21
|
+
* Convert our [-1, 1] calibrated gyro value to rad/s.
|
|
22
|
+
* Full scale is ±2000 deg/s = ±34.9066 rad/s.
|
|
23
|
+
*/
|
|
24
|
+
const GYRO_SCALE = 2000 * (Math.PI / 180); // ≈ 34.9066
|
|
25
|
+
class Orientation {
|
|
26
|
+
// ---- Configuration ----
|
|
27
|
+
/** Madgwick filter gain. Can be adjusted at runtime. */
|
|
28
|
+
get beta() {
|
|
29
|
+
return this.filter.beta;
|
|
30
|
+
}
|
|
31
|
+
set beta(v) {
|
|
32
|
+
this.filter.beta = v;
|
|
33
|
+
}
|
|
34
|
+
constructor(params) {
|
|
35
|
+
// ---- Public state (read these in your game loop) ----
|
|
36
|
+
/** Fused orientation as Euler angles (radians, updated each sample). */
|
|
37
|
+
this.pitch = 0;
|
|
38
|
+
this.yaw = 0;
|
|
39
|
+
this.roll = 0;
|
|
40
|
+
/** Fused orientation as a unit quaternion [w, x, y, z]. */
|
|
41
|
+
this.quaternion = [...quaternion_1.IDENTITY];
|
|
42
|
+
/**
|
|
43
|
+
* Tilt derived from the accelerometer gravity vector alone.
|
|
44
|
+
* No drift, but also no yaw — only pitch and roll.
|
|
45
|
+
* Noisy during motion; best used when the controller is relatively still.
|
|
46
|
+
*/
|
|
47
|
+
this.tiltPitch = 0;
|
|
48
|
+
this.tiltRoll = 0;
|
|
49
|
+
this.filter = new madgwick_1.MadgwickFilter(params?.beta ?? 0.1);
|
|
50
|
+
}
|
|
51
|
+
/** Reset to identity orientation (call when zeroing the view). */
|
|
52
|
+
reset() {
|
|
53
|
+
this.filter.reset();
|
|
54
|
+
this.pitch = 0;
|
|
55
|
+
this.yaw = 0;
|
|
56
|
+
this.roll = 0;
|
|
57
|
+
this.quaternion = [...quaternion_1.IDENTITY];
|
|
58
|
+
this.tiltPitch = 0;
|
|
59
|
+
this.tiltRoll = 0;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Incorporate one IMU sample. Called automatically by the Dualsense
|
|
63
|
+
* class on each HID report — you don't normally call this yourself.
|
|
64
|
+
*
|
|
65
|
+
* @param gx Calibrated gyro X (pitch), [-1, 1]
|
|
66
|
+
* @param gy Calibrated gyro Y (yaw), [-1, 1]
|
|
67
|
+
* @param gz Calibrated gyro Z (roll), [-1, 1]
|
|
68
|
+
* @param ax Calibrated accel X, [-1, 1]
|
|
69
|
+
* @param ay Calibrated accel Y, [-1, 1]
|
|
70
|
+
* @param az Calibrated accel Z, [-1, 1]
|
|
71
|
+
* @param dt Time delta in seconds
|
|
72
|
+
*/
|
|
73
|
+
update(gx, gy, gz, ax, ay, az, dt) {
|
|
74
|
+
// Remap DualSense axes to Madgwick's Z-up convention.
|
|
75
|
+
// DualSense: X = right, Y = up (gravity), Z = forward
|
|
76
|
+
// Madgwick: X = right, Y = forward, Z = up (gravity)
|
|
77
|
+
// Mapping: filter(X, Y, Z) = DS(X, -Z, Y)
|
|
78
|
+
this.filter.update(gx * GYRO_SCALE, // filter X = DS X (pitch axis)
|
|
79
|
+
-gz * GYRO_SCALE, // filter Y = -DS Z (negated forward)
|
|
80
|
+
gy * GYRO_SCALE, // filter Z = DS Y (gravity axis → up)
|
|
81
|
+
ax, // accel X unchanged
|
|
82
|
+
-az, // accel Y = -DS Z
|
|
83
|
+
ay, // accel Z = DS Y (gravity)
|
|
84
|
+
dt);
|
|
85
|
+
// Extract Euler angles and remap back to DualSense frame
|
|
86
|
+
this.quaternion = this.filter.q;
|
|
87
|
+
const euler = (0, quaternion_1.toEuler)(this.quaternion);
|
|
88
|
+
this.pitch = euler.pitch; // filter X rotation → DS pitch (forward/back)
|
|
89
|
+
this.yaw = euler.roll; // filter Z rotation → DS yaw (left/right turn)
|
|
90
|
+
this.roll = -euler.yaw; // filter Y rotation → DS roll (side tilt, negated)
|
|
91
|
+
// Accelerometer-only tilt (gravity reference)
|
|
92
|
+
// DualSense axes: X = lateral, Y = vertical (up at rest), Z = forward
|
|
93
|
+
// Pitch = forward/back tilt (around X): gravity shifts from Y toward Z
|
|
94
|
+
// Roll = side-to-side tilt (around Z): gravity shifts from Y toward X
|
|
95
|
+
const aNorm = Math.sqrt(ax * ax + ay * ay + az * az);
|
|
96
|
+
if (aNorm > 0) {
|
|
97
|
+
const nax = ax / aNorm;
|
|
98
|
+
const nay = ay / aNorm;
|
|
99
|
+
const naz = az / aNorm;
|
|
100
|
+
this.tiltPitch = Math.atan2(-naz, nay);
|
|
101
|
+
this.tiltRoll = Math.atan2(nax, Math.sqrt(nay * nay + naz * naz));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.Orientation = Orientation;
|
|
106
|
+
//# sourceMappingURL=orientation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orientation.js","sourceRoot":"","sources":["../../src/motion/orientation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal quaternion math for AHRS sensor fusion.
|
|
3
|
+
*
|
|
4
|
+
* Quaternions are represented as [w, x, y, z] tuples where w is the
|
|
5
|
+
* scalar part. All functions are pure — no mutations, no allocations
|
|
6
|
+
* beyond the returned tuple.
|
|
7
|
+
*/
|
|
8
|
+
/** A unit quaternion [w, x, y, z] representing a 3D orientation. */
|
|
9
|
+
export type Quaternion = [number, number, number, number];
|
|
10
|
+
/** Euler angles in radians, extracted from a quaternion. */
|
|
11
|
+
export interface EulerAngles {
|
|
12
|
+
/** Rotation around X axis (radians, -PI to PI) */
|
|
13
|
+
pitch: number;
|
|
14
|
+
/** Rotation around Y axis (radians, -PI to PI) */
|
|
15
|
+
yaw: number;
|
|
16
|
+
/** Rotation around Z axis (radians, -PI to PI) */
|
|
17
|
+
roll: number;
|
|
18
|
+
}
|
|
19
|
+
/** Identity quaternion — no rotation. */
|
|
20
|
+
export declare const IDENTITY: Quaternion;
|
|
21
|
+
/** Normalize a quaternion to unit length. */
|
|
22
|
+
export declare function normalize(q: Quaternion): Quaternion;
|
|
23
|
+
/**
|
|
24
|
+
* Extract Euler angles (Tait-Bryan ZYX intrinsic) from a unit quaternion.
|
|
25
|
+
*
|
|
26
|
+
* Convention: pitch = X-axis, yaw = Y-axis, roll = Z-axis.
|
|
27
|
+
* All angles in radians, range (-PI, PI].
|
|
28
|
+
*/
|
|
29
|
+
export declare function toEuler(q: Quaternion): EulerAngles;
|
|
30
|
+
//# sourceMappingURL=quaternion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quaternion.d.ts","sourceRoot":"","sources":["../../src/motion/quaternion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,oEAAoE;AACpE,MAAM,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE1D,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;CACd;AAED,yCAAyC;AACzC,eAAO,MAAM,QAAQ,EAAE,UAAyB,CAAC;AAEjD,6CAA6C;AAC7C,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAInD;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,UAAU,GAAG,WAAW,CAqBlD"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Minimal quaternion math for AHRS sensor fusion.
|
|
4
|
+
*
|
|
5
|
+
* Quaternions are represented as [w, x, y, z] tuples where w is the
|
|
6
|
+
* scalar part. All functions are pure — no mutations, no allocations
|
|
7
|
+
* beyond the returned tuple.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.IDENTITY = void 0;
|
|
11
|
+
exports.normalize = normalize;
|
|
12
|
+
exports.toEuler = toEuler;
|
|
13
|
+
/** Identity quaternion — no rotation. */
|
|
14
|
+
exports.IDENTITY = [1, 0, 0, 0];
|
|
15
|
+
/** Normalize a quaternion to unit length. */
|
|
16
|
+
function normalize(q) {
|
|
17
|
+
const [w, x, y, z] = q;
|
|
18
|
+
const invNorm = 1 / Math.sqrt(w * w + x * x + y * y + z * z);
|
|
19
|
+
return [w * invNorm, x * invNorm, y * invNorm, z * invNorm];
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Extract Euler angles (Tait-Bryan ZYX intrinsic) from a unit quaternion.
|
|
23
|
+
*
|
|
24
|
+
* Convention: pitch = X-axis, yaw = Y-axis, roll = Z-axis.
|
|
25
|
+
* All angles in radians, range (-PI, PI].
|
|
26
|
+
*/
|
|
27
|
+
function toEuler(q) {
|
|
28
|
+
const [w, x, y, z] = q;
|
|
29
|
+
// Roll (Z-axis)
|
|
30
|
+
const sinr = 2 * (w * z + x * y);
|
|
31
|
+
const cosr = 1 - 2 * (y * y + z * z);
|
|
32
|
+
const roll = Math.atan2(sinr, cosr);
|
|
33
|
+
// Pitch (X-axis)
|
|
34
|
+
const sinp = 2 * (w * x - y * z);
|
|
35
|
+
const pitch = Math.abs(sinp) >= 1
|
|
36
|
+
? Math.sign(sinp) * (Math.PI / 2) // gimbal lock
|
|
37
|
+
: Math.asin(sinp);
|
|
38
|
+
// Yaw (Y-axis)
|
|
39
|
+
const siny = 2 * (w * y + z * x);
|
|
40
|
+
const cosy = 1 - 2 * (x * x + y * y);
|
|
41
|
+
const yaw = Math.atan2(siny, cosy);
|
|
42
|
+
return { pitch, yaw, roll };
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=quaternion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quaternion.js","sourceRoot":"","sources":["../../src/motion/quaternion.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAmBH,8BAIC;AAQD,0BAqBC;AArCD,yCAAyC;AAC5B,QAAA,QAAQ,GAAe,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEjD,6CAA6C;AAC7C,SAAgB,SAAS,CAAC,CAAa;IACrC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IACvB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;AAC9D,CAAC;AAED;;;;;GAKG;AACH,SAAgB,OAAO,CAAC,CAAa;IACnC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;IAEvB,gBAAgB;IAChB,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEpC,iBAAiB;IACjB,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,KAAK,GACT,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QACjB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,cAAc;QAChD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEtB,eAAe;IACf,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAEnC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shake detector with frequency-band energy analysis.
|
|
3
|
+
*
|
|
4
|
+
* Maintains circular buffers of per-axis acceleration samples. Shake
|
|
5
|
+
* intensity is computed via RMS of the acceleration magnitude deviation
|
|
6
|
+
* from its mean (high-pass to remove gravity). The dominant shake
|
|
7
|
+
* frequency is identified using the Goertzel algorithm — a single-bin
|
|
8
|
+
* DFT that's far cheaper than a full FFT — applied to the first-
|
|
9
|
+
* difference of individual axis signals:
|
|
10
|
+
*
|
|
11
|
+
* - Per-axis preserves the fundamental frequency (magnitude would
|
|
12
|
+
* full-wave-rectify the signal, doubling the apparent frequency).
|
|
13
|
+
* - First-difference acts as a high-pass filter, removing DC (gravity)
|
|
14
|
+
* and low-frequency drift from arm movement. Its gain is proportional
|
|
15
|
+
* to frequency, so the Goertzel output naturally favors oscillatory
|
|
16
|
+
* shake signals over slow drift — no ad-hoc weighting needed.
|
|
17
|
+
*
|
|
18
|
+
* A 1/freq compensation is applied so the net effective weighting is
|
|
19
|
+
* proportional to freq (diff-filter gain² ∝ freq², divided by freq),
|
|
20
|
+
* giving moderate preference to actual shake frequencies without
|
|
21
|
+
* completely suppressing sub-1 Hz rocking.
|
|
22
|
+
*
|
|
23
|
+
* `.frequency` reports the **reversal rate** (2× fundamental) — how many
|
|
24
|
+
* direction changes per second. This matches the intuitive "how fast am
|
|
25
|
+
* I shaking it?" mental model. `.fundamental` reports the true oscillation
|
|
26
|
+
* frequency (one full back-and-forth cycle).
|
|
27
|
+
*
|
|
28
|
+
* The active flag uses a sustain counter to require several consecutive
|
|
29
|
+
* frames above threshold before triggering, preventing transient jolts
|
|
30
|
+
* from registering as shakes.
|
|
31
|
+
*/
|
|
32
|
+
/** A single frequency bin with its associated power level. */
|
|
33
|
+
export interface FrequencyBin {
|
|
34
|
+
/** Frequency in Hz. */
|
|
35
|
+
freq: number;
|
|
36
|
+
/** Weighted power (arbitrary units, relative within the array). */
|
|
37
|
+
power: number;
|
|
38
|
+
}
|
|
39
|
+
/** Configuration for the shake detector. */
|
|
40
|
+
export interface ShakeDetectorParams {
|
|
41
|
+
/** Intensity (0–1) above which `.active` becomes true. Default 0.15. */
|
|
42
|
+
threshold?: number;
|
|
43
|
+
/** Number of samples in the analysis window. Default 256 (~1s at 250 Hz, ~3s at 84 Hz in browser). */
|
|
44
|
+
windowSize?: number;
|
|
45
|
+
/**
|
|
46
|
+
* Number of consecutive above-threshold frames required before `.active`
|
|
47
|
+
* becomes true. Also the number of below-threshold frames required to
|
|
48
|
+
* deactivate. Default 15 (~60 ms at 250 Hz).
|
|
49
|
+
*/
|
|
50
|
+
sustain?: number;
|
|
51
|
+
/** Frequency bin resolution in Hz. Default 0.25. Smaller = finer but more bins to compute. */
|
|
52
|
+
freqStep?: number;
|
|
53
|
+
/** Minimum detectable frequency in Hz. Default 0.25. */
|
|
54
|
+
freqMin?: number;
|
|
55
|
+
/** Maximum detectable frequency in Hz. Default 15. */
|
|
56
|
+
freqMax?: number;
|
|
57
|
+
}
|
|
58
|
+
export declare class ShakeDetector {
|
|
59
|
+
/** Whether the controller is currently being shaken (sustained). */
|
|
60
|
+
active: boolean;
|
|
61
|
+
/** Shake intensity from 0 (still) to 1 (violent shake). */
|
|
62
|
+
intensity: number;
|
|
63
|
+
/**
|
|
64
|
+
* Dominant shake frequency in Hz as a **reversal rate** — how many
|
|
65
|
+
* direction changes per second (2× the fundamental oscillation
|
|
66
|
+
* frequency). 0 when not shaking.
|
|
67
|
+
*/
|
|
68
|
+
frequency: number;
|
|
69
|
+
/**
|
|
70
|
+
* Fundamental oscillation frequency in Hz — one complete back-and-forth
|
|
71
|
+
* cycle. Equal to `frequency / 2`. 0 when not shaking.
|
|
72
|
+
*/
|
|
73
|
+
fundamental: number;
|
|
74
|
+
/** Intensity threshold for `active`. */
|
|
75
|
+
threshold: number;
|
|
76
|
+
/** Estimated sample rate in Hz (derived from dt). Useful for diagnostics. */
|
|
77
|
+
get inputRate(): number;
|
|
78
|
+
/** Number of samples in the analysis window. Can be changed at runtime (resets state). */
|
|
79
|
+
get windowSize(): number;
|
|
80
|
+
set windowSize(n: number);
|
|
81
|
+
/**
|
|
82
|
+
* Current frequency spectrum — weighted power at each probed bin.
|
|
83
|
+
* Updated every frame when intensity is above half the threshold.
|
|
84
|
+
* Useful for visualization/diagnostics.
|
|
85
|
+
*/
|
|
86
|
+
get spectrum(): readonly FrequencyBin[];
|
|
87
|
+
private bufX;
|
|
88
|
+
private bufY;
|
|
89
|
+
private bufZ;
|
|
90
|
+
private head;
|
|
91
|
+
private filled;
|
|
92
|
+
private _sampleRate;
|
|
93
|
+
/** Sustain counter for debounce — counts up when above threshold, down when below. */
|
|
94
|
+
private sustainCounter;
|
|
95
|
+
private readonly sustainRequired;
|
|
96
|
+
/** EMA-smoothed frequency for stable readout. */
|
|
97
|
+
private smoothedFreq;
|
|
98
|
+
/** Frequency bins to probe, built from constructor params. */
|
|
99
|
+
private readonly freqBins;
|
|
100
|
+
/** Bin step size, used for snapping the EMA output. */
|
|
101
|
+
private readonly freqStep;
|
|
102
|
+
/** Latest computed bin powers. */
|
|
103
|
+
private _bins;
|
|
104
|
+
/**
|
|
105
|
+
* Scale factor: maps RMS of our [-1, 1] calibrated accel deviation
|
|
106
|
+
* to a 0–1 intensity. A vigorous shake produces magnitude-RMS of
|
|
107
|
+
* ~0.3–0.5 in our units; this maps that to ~0.6–1.0 intensity.
|
|
108
|
+
*/
|
|
109
|
+
private static readonly INTENSITY_SCALE;
|
|
110
|
+
constructor(params?: ShakeDetectorParams);
|
|
111
|
+
/** Reset all state (call on disconnect). */
|
|
112
|
+
reset(): void;
|
|
113
|
+
/**
|
|
114
|
+
* Feed one accelerometer sample.
|
|
115
|
+
*
|
|
116
|
+
* @param ax Calibrated accel X ([-1, 1])
|
|
117
|
+
* @param ay Calibrated accel Y ([-1, 1])
|
|
118
|
+
* @param az Calibrated accel Z ([-1, 1])
|
|
119
|
+
* @param dt Time delta in seconds since last sample
|
|
120
|
+
*/
|
|
121
|
+
update(ax: number, ay: number, az: number, dt: number): void;
|
|
122
|
+
/**
|
|
123
|
+
* Goertzel algorithm: compute power at a single target frequency.
|
|
124
|
+
*
|
|
125
|
+
* Operates on the first-difference of the filled portion of a circular
|
|
126
|
+
* buffer. The first-difference (x[n] - x[n-1]) acts as a high-pass
|
|
127
|
+
* filter that removes DC (gravity) and low-frequency arm drift, with
|
|
128
|
+
* gain proportional to frequency.
|
|
129
|
+
*/
|
|
130
|
+
private goertzel;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=shake.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shake.d.ts","sourceRoot":"","sources":["../../src/motion/shake.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AAEH,8DAA8D;AAC9D,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,4CAA4C;AAC5C,MAAM,WAAW,mBAAmB;IAClC,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sGAAsG;IACtG,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8FAA8F;IAC9F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wDAAwD;IACxD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,aAAa;IACxB,oEAAoE;IACpE,MAAM,UAAS;IAEf,2DAA2D;IAC3D,SAAS,SAAK;IAEd;;;;OAIG;IACH,SAAS,SAAK;IAEd;;;OAGG;IACH,WAAW,SAAK;IAEhB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;IAElB,6EAA6E;IAC7E,IAAI,SAAS,IAAI,MAAM,CAEtB;IAED,0FAA0F;IAC1F,IAAI,UAAU,IAAI,MAAM,CAEvB;IACD,IAAI,UAAU,CAAC,CAAC,EAAE,MAAM,EAcvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,SAAS,YAAY,EAAE,CAEtC;IAGD,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,IAAI,CAAe;IAC3B,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;IACnB,OAAO,CAAC,WAAW,CAAO;IAE1B,sFAAsF;IACtF,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAEzC,iDAAiD;IACjD,OAAO,CAAC,YAAY,CAAK;IAEzB,8DAA8D;IAC9D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAEpC,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAElC,kCAAkC;IAClC,OAAO,CAAC,KAAK,CAAsB;IAEnC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAK;gBAEhC,MAAM,CAAC,EAAE,mBAAmB;IAiBxC,4CAA4C;IAC5C,KAAK,IAAI,IAAI;IAgBb;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IA4F5D;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ;CAwBjB"}
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Shake detector with frequency-band energy analysis.
|
|
4
|
+
*
|
|
5
|
+
* Maintains circular buffers of per-axis acceleration samples. Shake
|
|
6
|
+
* intensity is computed via RMS of the acceleration magnitude deviation
|
|
7
|
+
* from its mean (high-pass to remove gravity). The dominant shake
|
|
8
|
+
* frequency is identified using the Goertzel algorithm — a single-bin
|
|
9
|
+
* DFT that's far cheaper than a full FFT — applied to the first-
|
|
10
|
+
* difference of individual axis signals:
|
|
11
|
+
*
|
|
12
|
+
* - Per-axis preserves the fundamental frequency (magnitude would
|
|
13
|
+
* full-wave-rectify the signal, doubling the apparent frequency).
|
|
14
|
+
* - First-difference acts as a high-pass filter, removing DC (gravity)
|
|
15
|
+
* and low-frequency drift from arm movement. Its gain is proportional
|
|
16
|
+
* to frequency, so the Goertzel output naturally favors oscillatory
|
|
17
|
+
* shake signals over slow drift — no ad-hoc weighting needed.
|
|
18
|
+
*
|
|
19
|
+
* A 1/freq compensation is applied so the net effective weighting is
|
|
20
|
+
* proportional to freq (diff-filter gain² ∝ freq², divided by freq),
|
|
21
|
+
* giving moderate preference to actual shake frequencies without
|
|
22
|
+
* completely suppressing sub-1 Hz rocking.
|
|
23
|
+
*
|
|
24
|
+
* `.frequency` reports the **reversal rate** (2× fundamental) — how many
|
|
25
|
+
* direction changes per second. This matches the intuitive "how fast am
|
|
26
|
+
* I shaking it?" mental model. `.fundamental` reports the true oscillation
|
|
27
|
+
* frequency (one full back-and-forth cycle).
|
|
28
|
+
*
|
|
29
|
+
* The active flag uses a sustain counter to require several consecutive
|
|
30
|
+
* frames above threshold before triggering, preventing transient jolts
|
|
31
|
+
* from registering as shakes.
|
|
32
|
+
*/
|
|
33
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
34
|
+
exports.ShakeDetector = void 0;
|
|
35
|
+
class ShakeDetector {
|
|
36
|
+
/** Estimated sample rate in Hz (derived from dt). Useful for diagnostics. */
|
|
37
|
+
get inputRate() {
|
|
38
|
+
return this._sampleRate;
|
|
39
|
+
}
|
|
40
|
+
/** Number of samples in the analysis window. Can be changed at runtime (resets state). */
|
|
41
|
+
get windowSize() {
|
|
42
|
+
return this.bufX.length;
|
|
43
|
+
}
|
|
44
|
+
set windowSize(n) {
|
|
45
|
+
if (n === this.bufX.length)
|
|
46
|
+
return;
|
|
47
|
+
this.bufX = new Float64Array(n);
|
|
48
|
+
this.bufY = new Float64Array(n);
|
|
49
|
+
this.bufZ = new Float64Array(n);
|
|
50
|
+
this.head = 0;
|
|
51
|
+
this.filled = 0;
|
|
52
|
+
this.smoothedFreq = 0;
|
|
53
|
+
this.sustainCounter = 0;
|
|
54
|
+
this.active = false;
|
|
55
|
+
this.intensity = 0;
|
|
56
|
+
this.frequency = 0;
|
|
57
|
+
this.fundamental = 0;
|
|
58
|
+
this._bins = [];
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Current frequency spectrum — weighted power at each probed bin.
|
|
62
|
+
* Updated every frame when intensity is above half the threshold.
|
|
63
|
+
* Useful for visualization/diagnostics.
|
|
64
|
+
*/
|
|
65
|
+
get spectrum() {
|
|
66
|
+
return this._bins;
|
|
67
|
+
}
|
|
68
|
+
constructor(params) {
|
|
69
|
+
/** Whether the controller is currently being shaken (sustained). */
|
|
70
|
+
this.active = false;
|
|
71
|
+
/** Shake intensity from 0 (still) to 1 (violent shake). */
|
|
72
|
+
this.intensity = 0;
|
|
73
|
+
/**
|
|
74
|
+
* Dominant shake frequency in Hz as a **reversal rate** — how many
|
|
75
|
+
* direction changes per second (2× the fundamental oscillation
|
|
76
|
+
* frequency). 0 when not shaking.
|
|
77
|
+
*/
|
|
78
|
+
this.frequency = 0;
|
|
79
|
+
/**
|
|
80
|
+
* Fundamental oscillation frequency in Hz — one complete back-and-forth
|
|
81
|
+
* cycle. Equal to `frequency / 2`. 0 when not shaking.
|
|
82
|
+
*/
|
|
83
|
+
this.fundamental = 0;
|
|
84
|
+
this.head = 0;
|
|
85
|
+
this.filled = 0;
|
|
86
|
+
this._sampleRate = 250; // estimated, updated from dt
|
|
87
|
+
/** Sustain counter for debounce — counts up when above threshold, down when below. */
|
|
88
|
+
this.sustainCounter = 0;
|
|
89
|
+
/** EMA-smoothed frequency for stable readout. */
|
|
90
|
+
this.smoothedFreq = 0;
|
|
91
|
+
/** Latest computed bin powers. */
|
|
92
|
+
this._bins = [];
|
|
93
|
+
this.threshold = params?.threshold ?? 0.15;
|
|
94
|
+
this.sustainRequired = params?.sustain ?? 15;
|
|
95
|
+
const windowSize = params?.windowSize ?? 256;
|
|
96
|
+
this.bufX = new Float64Array(windowSize);
|
|
97
|
+
this.bufY = new Float64Array(windowSize);
|
|
98
|
+
this.bufZ = new Float64Array(windowSize);
|
|
99
|
+
this.freqStep = params?.freqStep ?? 0.25;
|
|
100
|
+
const freqMin = params?.freqMin ?? 0.25;
|
|
101
|
+
const freqMax = params?.freqMax ?? 15;
|
|
102
|
+
this.freqBins = [];
|
|
103
|
+
for (let f = freqMin; f <= freqMax + 1e-9; f += this.freqStep) {
|
|
104
|
+
this.freqBins.push(Math.round(f * 1000) / 1000); // avoid float drift
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
/** Reset all state (call on disconnect). */
|
|
108
|
+
reset() {
|
|
109
|
+
this.bufX.fill(0);
|
|
110
|
+
this.bufY.fill(0);
|
|
111
|
+
this.bufZ.fill(0);
|
|
112
|
+
this.head = 0;
|
|
113
|
+
this.filled = 0;
|
|
114
|
+
this.intensity = 0;
|
|
115
|
+
this.frequency = 0;
|
|
116
|
+
this.fundamental = 0;
|
|
117
|
+
this.active = false;
|
|
118
|
+
this._sampleRate = 250;
|
|
119
|
+
this.sustainCounter = 0;
|
|
120
|
+
this.smoothedFreq = 0;
|
|
121
|
+
this._bins = [];
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Feed one accelerometer sample.
|
|
125
|
+
*
|
|
126
|
+
* @param ax Calibrated accel X ([-1, 1])
|
|
127
|
+
* @param ay Calibrated accel Y ([-1, 1])
|
|
128
|
+
* @param az Calibrated accel Z ([-1, 1])
|
|
129
|
+
* @param dt Time delta in seconds since last sample
|
|
130
|
+
*/
|
|
131
|
+
update(ax, ay, az, dt) {
|
|
132
|
+
// Update sample rate estimate (exponential moving average)
|
|
133
|
+
if (dt > 0 && dt < 0.1) {
|
|
134
|
+
const instantRate = 1 / dt;
|
|
135
|
+
this._sampleRate += 0.1 * (instantRate - this._sampleRate);
|
|
136
|
+
}
|
|
137
|
+
// Store per-axis acceleration in circular buffers
|
|
138
|
+
const len = this.bufX.length;
|
|
139
|
+
this.bufX[this.head] = ax;
|
|
140
|
+
this.bufY[this.head] = ay;
|
|
141
|
+
this.bufZ[this.head] = az;
|
|
142
|
+
this.head = (this.head + 1) % len;
|
|
143
|
+
if (this.filled < len)
|
|
144
|
+
this.filled++;
|
|
145
|
+
// Need at least half a window to produce meaningful results
|
|
146
|
+
if (this.filled < len / 2)
|
|
147
|
+
return;
|
|
148
|
+
// ---- Intensity: RMS of magnitude deviation from mean ----
|
|
149
|
+
const n = this.filled;
|
|
150
|
+
const start = n < len ? 0 : this.head;
|
|
151
|
+
// Compute acceleration magnitudes and their mean
|
|
152
|
+
let magSum = 0;
|
|
153
|
+
for (let i = 0; i < n; i++) {
|
|
154
|
+
const idx = (start + i) % len;
|
|
155
|
+
const x = this.bufX[idx], y = this.bufY[idx], z = this.bufZ[idx];
|
|
156
|
+
magSum += Math.sqrt(x * x + y * y + z * z);
|
|
157
|
+
}
|
|
158
|
+
const magMean = magSum / n;
|
|
159
|
+
let sumSq = 0;
|
|
160
|
+
for (let i = 0; i < n; i++) {
|
|
161
|
+
const idx = (start + i) % len;
|
|
162
|
+
const x = this.bufX[idx], y = this.bufY[idx], z = this.bufZ[idx];
|
|
163
|
+
const d = Math.sqrt(x * x + y * y + z * z) - magMean;
|
|
164
|
+
sumSq += d * d;
|
|
165
|
+
}
|
|
166
|
+
const rms = Math.sqrt(sumSq / n);
|
|
167
|
+
this.intensity = Math.min(1, rms * ShakeDetector.INTENSITY_SCALE);
|
|
168
|
+
// ---- Frequency: per-axis Goertzel on first-difference signal ----
|
|
169
|
+
if (this.intensity > this.threshold * 0.5) {
|
|
170
|
+
let peakPower = 0;
|
|
171
|
+
let peakFreq = 0;
|
|
172
|
+
this._bins = new Array(this.freqBins.length);
|
|
173
|
+
for (let b = 0; b < this.freqBins.length; b++) {
|
|
174
|
+
const freq = this.freqBins[b];
|
|
175
|
+
const px = this.goertzel(freq, this.bufX);
|
|
176
|
+
const py = this.goertzel(freq, this.bufY);
|
|
177
|
+
const pz = this.goertzel(freq, this.bufZ);
|
|
178
|
+
// The first-difference filter has gain ∝ freq², so raw Goertzel
|
|
179
|
+
// power is ∝ freq² × signal_power. Divide by freq to get net
|
|
180
|
+
// weighting ∝ freq — moderate preference for shake frequencies
|
|
181
|
+
// without killing sub-1 Hz rocking.
|
|
182
|
+
const power = Math.max(px, py, pz) / freq;
|
|
183
|
+
this._bins[b] = { freq, power };
|
|
184
|
+
if (power > peakPower) {
|
|
185
|
+
peakPower = power;
|
|
186
|
+
peakFreq = freq;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// EMA-smooth the frequency reading for stability.
|
|
190
|
+
// α = 0.2 gives ~5-frame smoothing at 250 Hz.
|
|
191
|
+
const alpha = 0.2;
|
|
192
|
+
if (this.smoothedFreq === 0) {
|
|
193
|
+
this.smoothedFreq = peakFreq;
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
this.smoothedFreq += alpha * (peakFreq - this.smoothedFreq);
|
|
197
|
+
}
|
|
198
|
+
// Snap to nearest bin step for clean readout
|
|
199
|
+
const snapped = Math.round(this.smoothedFreq / this.freqStep) * this.freqStep;
|
|
200
|
+
this.fundamental = snapped;
|
|
201
|
+
this.frequency = snapped * 2; // reversal rate
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.smoothedFreq = 0;
|
|
205
|
+
this.frequency = 0;
|
|
206
|
+
this.fundamental = 0;
|
|
207
|
+
this._bins = [];
|
|
208
|
+
}
|
|
209
|
+
// ---- Sustain: require consecutive frames to activate/deactivate ----
|
|
210
|
+
if (this.intensity > this.threshold) {
|
|
211
|
+
this.sustainCounter = Math.min(this.sustainCounter + 1, this.sustainRequired * 2);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
this.sustainCounter = Math.max(this.sustainCounter - 1, 0);
|
|
215
|
+
}
|
|
216
|
+
this.active = this.sustainCounter >= this.sustainRequired;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Goertzel algorithm: compute power at a single target frequency.
|
|
220
|
+
*
|
|
221
|
+
* Operates on the first-difference of the filled portion of a circular
|
|
222
|
+
* buffer. The first-difference (x[n] - x[n-1]) acts as a high-pass
|
|
223
|
+
* filter that removes DC (gravity) and low-frequency arm drift, with
|
|
224
|
+
* gain proportional to frequency.
|
|
225
|
+
*/
|
|
226
|
+
goertzel(targetFreq, buf) {
|
|
227
|
+
const N = this.filled;
|
|
228
|
+
const k = (targetFreq * N) / this._sampleRate;
|
|
229
|
+
const w = (2 * Math.PI * k) / N;
|
|
230
|
+
const coeff = 2 * Math.cos(w);
|
|
231
|
+
let s1 = 0;
|
|
232
|
+
let s2 = 0;
|
|
233
|
+
const start = this.filled < buf.length ? 0 : this.head;
|
|
234
|
+
let prevSample = buf[start % buf.length];
|
|
235
|
+
for (let i = 0; i < N; i++) {
|
|
236
|
+
const idx = (start + i) % buf.length;
|
|
237
|
+
const raw = buf[idx];
|
|
238
|
+
const x = raw - prevSample; // first-difference high-pass
|
|
239
|
+
prevSample = raw;
|
|
240
|
+
const s0 = x + coeff * s1 - s2;
|
|
241
|
+
s2 = s1;
|
|
242
|
+
s1 = s0;
|
|
243
|
+
}
|
|
244
|
+
return s1 * s1 + s2 * s2 - coeff * s1 * s2;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
exports.ShakeDetector = ShakeDetector;
|
|
248
|
+
/**
|
|
249
|
+
* Scale factor: maps RMS of our [-1, 1] calibrated accel deviation
|
|
250
|
+
* to a 0–1 intensity. A vigorous shake produces magnitude-RMS of
|
|
251
|
+
* ~0.3–0.5 in our units; this maps that to ~0.6–1.0 intensity.
|
|
252
|
+
*/
|
|
253
|
+
ShakeDetector.INTENSITY_SCALE = 2;
|
|
254
|
+
//# sourceMappingURL=shake.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shake.js","sourceRoot":"","sources":["../../src/motion/shake.ts"],"names":[],"mappings":"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"}
|