@ziztechnology/dial-library 0.0.11 → 0.0.13
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/README.md +16 -4
- package/dist/index.d.mts +67 -2
- package/dist/index.mjs +453 -231
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -225,9 +225,11 @@ controller.destroy();
|
|
|
225
225
|
|
|
226
226
|
控制器默认每 200ms 读取一次,并保证上一次读取结束后才开始下一次。所有确认都使用传感器时间而不是轮询次数;相同 `sampledAtMs` 的重复数据不会推进窗口。
|
|
227
227
|
|
|
228
|
-
静止和匀速使用 accelerometer 的 1 秒三轴 MAD 稳健波动窗口,至少需要 5 个唯一样本。运动量不高于 `0.12 m/s²` 且陀螺仪足够稳定,连续
|
|
228
|
+
静止和匀速使用 accelerometer 的 1 秒三轴 MAD 稳健波动窗口,至少需要 5 个唯一样本。运动量不高于 `0.12 m/s²` 且陀螺仪足够稳定,连续 3 秒才进入 `STOPPED`;运动量达到 `0.18 m/s²` 或陀螺仪出现持续运动,连续 0.6 秒进入 `STEADY_DRIVING`。中间区间保持原基础状态。
|
|
229
229
|
|
|
230
|
-
普通加速和刹车要求 0.8 秒内至少 4/5 的样本方向一致;急加速和急刹要求峰值、0.6
|
|
230
|
+
普通加速和刹车要求 0.8 秒内至少 4/5 的样本方向一致;急加速和急刹要求峰值、0.6 秒持续均值及方向一致性同时成立,并拒绝垂直能量占主导或短时间反号的颠簸。车辆刚出现方向稳定的物理偏航后,强转向路径要求 0.4 秒内至少 3 个唯一样本,窗口均值达到 `0.08 rad/s`;在默认轮询频率下通常会在 0.4–0.6 秒内触发。转向也可以由累计转角触发,并锁存到回正结束。算法不会预测车辆尚未产生转动时的驾驶意图。最终优先级为:急加减速、已锁存转向、普通加减速、基础状态。
|
|
231
|
+
|
|
232
|
+
缓慢转向还要求偏航旋转占陀螺仪能量的主要部分,或存在足够的横向加速度;垂直颠簸占主导且缺少偏航佐证时不会创建转向事件。重力样本短时缺失时,控制器会在 `maxSampleAgeMs` 内复用最后一个滤波后的车辆坐标系;缓存到期后按传感器不可用处理。单独调用 `classifyDrivingSnapshot()` 不会使用控制器缓存。
|
|
231
233
|
|
|
232
234
|
### 读取当前状态
|
|
233
235
|
|
|
@@ -252,19 +254,29 @@ console.log(snapshot.tuningVersion);
|
|
|
252
254
|
```ts
|
|
253
255
|
const controller = createDrivingStatusController({
|
|
254
256
|
tuning: {
|
|
255
|
-
turnYawThreshold: 0.
|
|
257
|
+
turnYawThreshold: 0.08,
|
|
258
|
+
turnConfirmationMs: 400,
|
|
259
|
+
turnMinimumSamples: 3,
|
|
256
260
|
motionWindowMs: 1_200,
|
|
257
261
|
motionMinimumSamples: 6,
|
|
258
262
|
drivingMotionThreshold: 0.2,
|
|
259
263
|
stoppedMotionThreshold: 0.11,
|
|
260
|
-
stoppedConfirmationMs:
|
|
264
|
+
stoppedConfirmationMs: 3_000,
|
|
261
265
|
longitudinalThreshold: 0.75,
|
|
266
|
+
turnYawDominanceThreshold: 0.65,
|
|
267
|
+
turnLateralEvidenceThreshold: 0.3,
|
|
262
268
|
},
|
|
263
269
|
});
|
|
264
270
|
```
|
|
265
271
|
|
|
266
272
|
`drivingMotionThreshold` 必须大于 `stoppedMotionThreshold`,进入阈值也必须大于相应退出阈值。样本数必须是正整数,方向一致率必须大于 `0.5` 且不大于 `1`,其余窗口和阈值必须是正有限数值。
|
|
267
273
|
|
|
274
|
+
### 识别诊断
|
|
275
|
+
|
|
276
|
+
`onDiagnostic` 的 `sample_available` 事件包含 `frameSource`(`live` 或 `cached`)和 `frameAgeMs`。`detector_evidence` 会报告基础状态 MAD、普通/急加减速的均值、峰值、方向一致率和 RMS,以及转向的累计角度、偏航主导率和横向/垂直 RMS。
|
|
277
|
+
|
|
278
|
+
检测器状态变化时还会发送 `detector_transition`,其 `phase` 为 `candidate_entered`、`candidate_rejected`、`candidate_confirmed` 或 `candidate_exited`。该事件携带当时的完整 `statistics`,可直接用于真车回放调参;同一状态不会逐轮询重复发送。
|
|
279
|
+
|
|
268
280
|
惯性传感器无法严格区分“完全静止”和“没有任何振动的理想匀速直线运动”。默认算法使用稳健振动统计、陀螺仪扰动和 5 秒确认近似判断,修改阈值后应使用完整路测过程回放验证。
|
|
269
281
|
|
|
270
282
|
### 驱动行车表情
|
package/dist/index.d.mts
CHANGED
|
@@ -102,6 +102,10 @@ interface DrivingStatusTuning {
|
|
|
102
102
|
turnConfirmationMs: number;
|
|
103
103
|
turnIntegratedAngleThreshold: number;
|
|
104
104
|
turnSignCoherence: number;
|
|
105
|
+
turnYawDominanceThreshold: number;
|
|
106
|
+
turnLateralEvidenceThreshold: number;
|
|
107
|
+
turnVerticalNoiseFloor: number;
|
|
108
|
+
turnVerticalBumpRatio: number;
|
|
105
109
|
turnExitYawThreshold: number;
|
|
106
110
|
turnExitConfirmationMs: number;
|
|
107
111
|
turnClosureWindowMs: number;
|
|
@@ -115,6 +119,7 @@ interface DrivingVehicleFrame {
|
|
|
115
119
|
}
|
|
116
120
|
interface DrivingMetricsCorrection {
|
|
117
121
|
filteredGravity?: Vector3Value;
|
|
122
|
+
filteredGravitySampledAtMs?: number;
|
|
118
123
|
linearAccelerationBias?: Vector3Value;
|
|
119
124
|
gyroscopeBias?: Vector3Value;
|
|
120
125
|
}
|
|
@@ -247,10 +252,54 @@ interface DrivingStatusEvent {
|
|
|
247
252
|
reason: DrivingStatusChangeReason;
|
|
248
253
|
atMs: number;
|
|
249
254
|
}
|
|
255
|
+
type DrivingFrameSource = 'live' | 'cached';
|
|
256
|
+
type DrivingDetectorName = 'base' | 'rapid_longitudinal' | 'longitudinal' | 'turn';
|
|
257
|
+
type DrivingDetectorTransitionPhase = 'candidate_entered' | 'candidate_rejected' | 'candidate_confirmed' | 'candidate_exited';
|
|
258
|
+
type DrivingDetectorRejectionReason = 'vertical_bump' | 'longitudinal_reversal' | null;
|
|
259
|
+
interface DrivingBaseDetectorStatistics {
|
|
260
|
+
sampleCount: number;
|
|
261
|
+
durationMs: number;
|
|
262
|
+
motionMad: number | null;
|
|
263
|
+
gyroMagnitude: number;
|
|
264
|
+
rawGyroMagnitude: number;
|
|
265
|
+
}
|
|
266
|
+
interface DrivingLongitudinalWindowStatistics {
|
|
267
|
+
sampleCount: number;
|
|
268
|
+
durationMs: number;
|
|
269
|
+
mean: number;
|
|
270
|
+
peak: number;
|
|
271
|
+
coherence: number;
|
|
272
|
+
}
|
|
273
|
+
interface DrivingRapidLongitudinalStatistics extends DrivingLongitudinalWindowStatistics {
|
|
274
|
+
longitudinalRms: number;
|
|
275
|
+
verticalRms: number;
|
|
276
|
+
hasReversal: boolean;
|
|
277
|
+
}
|
|
278
|
+
interface DrivingTurnDetectorStatistics {
|
|
279
|
+
sampleCount: number;
|
|
280
|
+
durationMs: number;
|
|
281
|
+
strongMean: number;
|
|
282
|
+
strongCoherence: number;
|
|
283
|
+
signedAngle: number;
|
|
284
|
+
gentleCoherence: number;
|
|
285
|
+
yawRms: number;
|
|
286
|
+
rawGyroRms: number;
|
|
287
|
+
yawDominance: number;
|
|
288
|
+
lateralRms: number;
|
|
289
|
+
verticalRms: number;
|
|
290
|
+
}
|
|
291
|
+
interface DrivingDetectorStatistics {
|
|
292
|
+
base: DrivingBaseDetectorStatistics;
|
|
293
|
+
longitudinal: DrivingLongitudinalWindowStatistics | null;
|
|
294
|
+
rapidLongitudinal: DrivingRapidLongitudinalStatistics | null;
|
|
295
|
+
turn: DrivingTurnDetectorStatistics | null;
|
|
296
|
+
}
|
|
250
297
|
type DrivingStatusDiagnosticEvent = {
|
|
251
298
|
type: 'sample_available';
|
|
252
299
|
atMs: number;
|
|
253
300
|
capturedAtMs: number;
|
|
301
|
+
frameSource: DrivingFrameSource;
|
|
302
|
+
frameAgeMs: number;
|
|
254
303
|
tuningVersion: string;
|
|
255
304
|
} | {
|
|
256
305
|
type: 'sample_unavailable';
|
|
@@ -266,7 +315,19 @@ type DrivingStatusDiagnosticEvent = {
|
|
|
266
315
|
rapidCandidate: 'RAPID_ACCELERATION' | 'SUDDEN_BRAKING' | null;
|
|
267
316
|
longitudinalCandidate: 'ACCELERATION' | 'BRAKING' | null;
|
|
268
317
|
turnCandidate: 'LEFT_TURN' | 'RIGHT_TURN' | null;
|
|
269
|
-
rejectionReason:
|
|
318
|
+
rejectionReason: DrivingDetectorRejectionReason;
|
|
319
|
+
frameSource: DrivingFrameSource;
|
|
320
|
+
frameAgeMs: number;
|
|
321
|
+
statistics: DrivingDetectorStatistics;
|
|
322
|
+
tuningVersion: string;
|
|
323
|
+
} | {
|
|
324
|
+
type: 'detector_transition';
|
|
325
|
+
atMs: number;
|
|
326
|
+
detector: DrivingDetectorName;
|
|
327
|
+
phase: DrivingDetectorTransitionPhase;
|
|
328
|
+
status: CarRunningStatus | null;
|
|
329
|
+
rejectionReason: DrivingDetectorRejectionReason;
|
|
330
|
+
statistics: DrivingDetectorStatistics;
|
|
270
331
|
tuningVersion: string;
|
|
271
332
|
} | {
|
|
272
333
|
type: 'candidate_changed';
|
|
@@ -352,6 +413,10 @@ interface DrivingExpressionPlayerSnapshot {
|
|
|
352
413
|
}
|
|
353
414
|
interface DrivingExpressionPlayerOptions {
|
|
354
415
|
config: DrivingExpressionsConfigInput;
|
|
416
|
+
/**
|
|
417
|
+
* Emoji and image entries are renderable fallbacks. Other structured kinds
|
|
418
|
+
* remain accepted for source compatibility but are reported as invalid_config.
|
|
419
|
+
*/
|
|
355
420
|
fallbacks?: Partial<Readonly<Record<CarRunningStatus, StructuredDrivingExpressionMedia>>>;
|
|
356
421
|
loadTimeoutMs?: number;
|
|
357
422
|
retryBackoffMs?: number;
|
|
@@ -373,4 +438,4 @@ interface DrivingExpressionPlayer {
|
|
|
373
438
|
}
|
|
374
439
|
declare const createDrivingExpressionPlayer: (container: HTMLElement, options: DrivingExpressionPlayerOptions) => DrivingExpressionPlayer;
|
|
375
440
|
//#endregion
|
|
376
|
-
export { AvailableSensorMetric, BATTERY_HEALTH_LABELS, BatteryCapacityValue, BatteryHealth, BatteryPlugged, BatteryStateValue, BatteryStatus, CAR_RUNNING_LABELS, CAR_RUNNING_STATUSES, CAR_RUNNING_STATUS_PRIORITY, CarRunningStatus, CompleteDrivingExpressionsConfig, DEFAULT_DRIVING_STATUS_TUNING, DrivingControllerSnapshot, DrivingExpressionMedia, DrivingExpressionPlayer, DrivingExpressionPlayerDiagnosticEvent, DrivingExpressionPlayerErrorCategory, DrivingExpressionPlayerOptions, DrivingExpressionPlayerSnapshot, DrivingExpressionResolutionError, DrivingExpressionsConfig, DrivingExpressionsConfigError, DrivingExpressionsConfigErrorCode, DrivingExpressionsConfigInput, DrivingMetricsCorrection, DrivingSensorProvider, DrivingSnapshotAnalysis, DrivingSnapshotCandidate, DrivingSnapshotMetrics, DrivingSnapshotRejectionReason, DrivingStatusChangeReason, DrivingStatusClock, DrivingStatusController, DrivingStatusControllerOptions, DrivingStatusDiagnosticEvent, DrivingStatusEvent, DrivingStatusTuning, DrivingStatusTuningOverrides, DrivingVehicleFrame, EmojiDrivingExpressionMedia, ImageDrivingExpressionMedia, LivePhotoDrivingExpressionMedia, MediaLibraryRef, OFFICIAL_DRIVING_EXPRESSIONS_CONFIG, OFFICIAL_DRIVING_EXPRESSION_FALLBACKS, OrientationValue, ParseDrivingExpressionsOptions, StructuredDrivingExpressionMedia, TgsDrivingExpressionMedia, UnavailableSensorMetric, UnifiedSensorInfoPayload, UnifiedSensorMetric, UnifiedSensorUnavailableReason, Vector3Value, VideoDrivingExpressionMedia, WaitForDrivingExpressionsConfigOptions, buildVehicleFrame, classifyDrivingSnapshot, createDrivingExpressionPlayer, createDrivingStatusController, extractDrivingSnapshotMetrics, isPublicDrivingMediaUrl, parseDrivingExpressionsConfig, readDrivingExpressionsConfig, resolveDrivingExpression, resolveDrivingExpressionStrict, resolveDrivingStatusTuning, tryParseDrivingExpressionsConfig, unifiedSensorInfo, waitForDrivingExpressionsConfig };
|
|
441
|
+
export { AvailableSensorMetric, BATTERY_HEALTH_LABELS, BatteryCapacityValue, BatteryHealth, BatteryPlugged, BatteryStateValue, BatteryStatus, CAR_RUNNING_LABELS, CAR_RUNNING_STATUSES, CAR_RUNNING_STATUS_PRIORITY, CarRunningStatus, CompleteDrivingExpressionsConfig, DEFAULT_DRIVING_STATUS_TUNING, DrivingBaseDetectorStatistics, DrivingControllerSnapshot, DrivingDetectorName, DrivingDetectorRejectionReason, DrivingDetectorStatistics, DrivingDetectorTransitionPhase, DrivingExpressionMedia, DrivingExpressionPlayer, DrivingExpressionPlayerDiagnosticEvent, DrivingExpressionPlayerErrorCategory, DrivingExpressionPlayerOptions, DrivingExpressionPlayerSnapshot, DrivingExpressionResolutionError, DrivingExpressionsConfig, DrivingExpressionsConfigError, DrivingExpressionsConfigErrorCode, DrivingExpressionsConfigInput, DrivingFrameSource, DrivingLongitudinalWindowStatistics, DrivingMetricsCorrection, DrivingRapidLongitudinalStatistics, DrivingSensorProvider, DrivingSnapshotAnalysis, DrivingSnapshotCandidate, DrivingSnapshotMetrics, DrivingSnapshotRejectionReason, DrivingStatusChangeReason, DrivingStatusClock, DrivingStatusController, DrivingStatusControllerOptions, DrivingStatusDiagnosticEvent, DrivingStatusEvent, DrivingStatusTuning, DrivingStatusTuningOverrides, DrivingTurnDetectorStatistics, DrivingVehicleFrame, EmojiDrivingExpressionMedia, ImageDrivingExpressionMedia, LivePhotoDrivingExpressionMedia, MediaLibraryRef, OFFICIAL_DRIVING_EXPRESSIONS_CONFIG, OFFICIAL_DRIVING_EXPRESSION_FALLBACKS, OrientationValue, ParseDrivingExpressionsOptions, StructuredDrivingExpressionMedia, TgsDrivingExpressionMedia, UnavailableSensorMetric, UnifiedSensorInfoPayload, UnifiedSensorMetric, UnifiedSensorUnavailableReason, Vector3Value, VideoDrivingExpressionMedia, WaitForDrivingExpressionsConfigOptions, buildVehicleFrame, classifyDrivingSnapshot, createDrivingExpressionPlayer, createDrivingStatusController, extractDrivingSnapshotMetrics, isPublicDrivingMediaUrl, parseDrivingExpressionsConfig, readDrivingExpressionsConfig, resolveDrivingExpression, resolveDrivingExpressionStrict, resolveDrivingStatusTuning, tryParseDrivingExpressionsConfig, unifiedSensorInfo, waitForDrivingExpressionsConfig };
|