@konitif/viewer-3d 0.284.1
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/LICENSE.md +21 -0
- package/README.md +34 -0
- package/dist/balanceFootprintDefinition.d.ts +7 -0
- package/dist/balanceFootprintDefinition.d.ts.map +1 -0
- package/dist/balanceFootprintDefinition.js +2 -0
- package/dist/balanceFootprintDefinition.js.map +1 -0
- package/dist/diagnosticContactDefinition.d.ts +7 -0
- package/dist/diagnosticContactDefinition.d.ts.map +1 -0
- package/dist/diagnosticContactDefinition.js +2 -0
- package/dist/diagnosticContactDefinition.js.map +1 -0
- package/dist/handTipDefinition.d.ts +13 -0
- package/dist/handTipDefinition.d.ts.map +1 -0
- package/dist/handTipDefinition.js +2 -0
- package/dist/handTipDefinition.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +19 -0
- package/dist/index.js.map +1 -0
- package/dist/jointHandleDefinition.d.ts +23 -0
- package/dist/jointHandleDefinition.d.ts.map +1 -0
- package/dist/jointHandleDefinition.js +2 -0
- package/dist/jointHandleDefinition.js.map +1 -0
- package/dist/ledPlacementDefinition.d.ts +38 -0
- package/dist/ledPlacementDefinition.d.ts.map +1 -0
- package/dist/ledPlacementDefinition.js +2 -0
- package/dist/ledPlacementDefinition.js.map +1 -0
- package/dist/ledReferenceFrame.d.ts +26 -0
- package/dist/ledReferenceFrame.d.ts.map +1 -0
- package/dist/ledReferenceFrame.js +2 -0
- package/dist/ledReferenceFrame.js.map +1 -0
- package/dist/ledRingCalibration.d.ts +22 -0
- package/dist/ledRingCalibration.d.ts.map +1 -0
- package/dist/ledRingCalibration.js +2 -0
- package/dist/ledRingCalibration.js.map +1 -0
- package/dist/renderer/AnimationLoop.d.ts +18 -0
- package/dist/renderer/AnimationLoop.d.ts.map +1 -0
- package/dist/renderer/AnimationLoop.js +39 -0
- package/dist/renderer/AnimationLoop.js.map +1 -0
- package/dist/renderer/CameraController.d.ts +154 -0
- package/dist/renderer/CameraController.d.ts.map +1 -0
- package/dist/renderer/CameraController.js +469 -0
- package/dist/renderer/CameraController.js.map +1 -0
- package/dist/renderer/NavigationPhysicsObservation.d.ts +25 -0
- package/dist/renderer/NavigationPhysicsObservation.d.ts.map +1 -0
- package/dist/renderer/NavigationPhysicsObservation.js +81 -0
- package/dist/renderer/NavigationPhysicsObservation.js.map +1 -0
- package/dist/renderer/ObservedRobotGroundingProjection.d.ts +206 -0
- package/dist/renderer/ObservedRobotGroundingProjection.d.ts.map +1 -0
- package/dist/renderer/ObservedRobotGroundingProjection.js +522 -0
- package/dist/renderer/ObservedRobotGroundingProjection.js.map +1 -0
- package/dist/renderer/ObservedRobotPresentationBuffer.d.ts +71 -0
- package/dist/renderer/ObservedRobotPresentationBuffer.d.ts.map +1 -0
- package/dist/renderer/ObservedRobotPresentationBuffer.js +226 -0
- package/dist/renderer/ObservedRobotPresentationBuffer.js.map +1 -0
- package/dist/renderer/PerformanceMonitor.d.ts +38 -0
- package/dist/renderer/PerformanceMonitor.d.ts.map +1 -0
- package/dist/renderer/PerformanceMonitor.js +84 -0
- package/dist/renderer/PerformanceMonitor.js.map +1 -0
- package/dist/renderer/ProjectileInteraction.d.ts +57 -0
- package/dist/renderer/ProjectileInteraction.d.ts.map +1 -0
- package/dist/renderer/ProjectileInteraction.js +152 -0
- package/dist/renderer/ProjectileInteraction.js.map +1 -0
- package/dist/renderer/RobotComparisonVisibilityTransition.d.ts +12 -0
- package/dist/renderer/RobotComparisonVisibilityTransition.d.ts.map +1 -0
- package/dist/renderer/RobotComparisonVisibilityTransition.js +23 -0
- package/dist/renderer/RobotComparisonVisibilityTransition.js.map +1 -0
- package/dist/renderer/RobotPoseTransition.d.ts +34 -0
- package/dist/renderer/RobotPoseTransition.d.ts.map +1 -0
- package/dist/renderer/RobotPoseTransition.js +66 -0
- package/dist/renderer/RobotPoseTransition.js.map +1 -0
- package/dist/renderer/RobotPostureCompensation.d.ts +31 -0
- package/dist/renderer/RobotPostureCompensation.d.ts.map +1 -0
- package/dist/renderer/RobotPostureCompensation.js +60 -0
- package/dist/renderer/RobotPostureCompensation.js.map +1 -0
- package/dist/renderer/SelectionController.d.ts +24 -0
- package/dist/renderer/SelectionController.d.ts.map +1 -0
- package/dist/renderer/SelectionController.js +68 -0
- package/dist/renderer/SelectionController.js.map +1 -0
- package/dist/renderer/TemporalProjectionModel.d.ts +71 -0
- package/dist/renderer/TemporalProjectionModel.d.ts.map +1 -0
- package/dist/renderer/TemporalProjectionModel.js +363 -0
- package/dist/renderer/TemporalProjectionModel.js.map +1 -0
- package/dist/renderer/Viewer3DRenderer.d.ts +1137 -0
- package/dist/renderer/Viewer3DRenderer.d.ts.map +1 -0
- package/dist/renderer/Viewer3DRenderer.js +10655 -0
- package/dist/renderer/Viewer3DRenderer.js.map +1 -0
- package/dist/renderer/ViewerExperimentCollector.d.ts +27 -0
- package/dist/renderer/ViewerExperimentCollector.d.ts.map +1 -0
- package/dist/renderer/ViewerExperimentCollector.js +2 -0
- package/dist/renderer/ViewerExperimentCollector.js.map +1 -0
- package/dist/renderer/ViewerExperimentPort.d.ts +19 -0
- package/dist/renderer/ViewerExperimentPort.d.ts.map +1 -0
- package/dist/renderer/ViewerExperimentPort.js +2 -0
- package/dist/renderer/ViewerExperimentPort.js.map +1 -0
- package/dist/renderer/ViewerFrameSignals.d.ts +13 -0
- package/dist/renderer/ViewerFrameSignals.d.ts.map +1 -0
- package/dist/renderer/ViewerFrameSignals.js +73 -0
- package/dist/renderer/ViewerFrameSignals.js.map +1 -0
- package/dist/renderer/ViewerHistoryData.d.ts +59 -0
- package/dist/renderer/ViewerHistoryData.d.ts.map +1 -0
- package/dist/renderer/ViewerHistoryData.js +2 -0
- package/dist/renderer/ViewerHistoryData.js.map +1 -0
- package/dist/renderer/ViewerHistoryPort.d.ts +15 -0
- package/dist/renderer/ViewerHistoryPort.d.ts.map +1 -0
- package/dist/renderer/ViewerHistoryPort.js +2 -0
- package/dist/renderer/ViewerHistoryPort.js.map +1 -0
- package/dist/renderer/ViewerIncarnationHealth.d.ts +14 -0
- package/dist/renderer/ViewerIncarnationHealth.d.ts.map +1 -0
- package/dist/renderer/ViewerIncarnationHealth.js +13 -0
- package/dist/renderer/ViewerIncarnationHealth.js.map +1 -0
- package/dist/renderer/ViewerInputBindings.d.ts +19 -0
- package/dist/renderer/ViewerInputBindings.d.ts.map +1 -0
- package/dist/renderer/ViewerInputBindings.js +44 -0
- package/dist/renderer/ViewerInputBindings.js.map +1 -0
- package/dist/renderer/ViewerMetadata.d.ts +11 -0
- package/dist/renderer/ViewerMetadata.d.ts.map +1 -0
- package/dist/renderer/ViewerMetadata.js +8 -0
- package/dist/renderer/ViewerMetadata.js.map +1 -0
- package/dist/renderer/ViewerPlaybackCompletionPolicy.d.ts +29 -0
- package/dist/renderer/ViewerPlaybackCompletionPolicy.d.ts.map +1 -0
- package/dist/renderer/ViewerPlaybackCompletionPolicy.js +27 -0
- package/dist/renderer/ViewerPlaybackCompletionPolicy.js.map +1 -0
- package/dist/renderer/ViewerProjectileParticleRenderer.d.ts +21 -0
- package/dist/renderer/ViewerProjectileParticleRenderer.d.ts.map +1 -0
- package/dist/renderer/ViewerProjectileParticleRenderer.js +134 -0
- package/dist/renderer/ViewerProjectileParticleRenderer.js.map +1 -0
- package/dist/renderer/ViewerResizePresentation.d.ts +16 -0
- package/dist/renderer/ViewerResizePresentation.d.ts.map +1 -0
- package/dist/renderer/ViewerResizePresentation.js +12 -0
- package/dist/renderer/ViewerResizePresentation.js.map +1 -0
- package/dist/renderer/ViewerTemporalProjectionExperimentAdapter.d.ts +34 -0
- package/dist/renderer/ViewerTemporalProjectionExperimentAdapter.d.ts.map +1 -0
- package/dist/renderer/ViewerTemporalProjectionExperimentAdapter.js +130 -0
- package/dist/renderer/ViewerTemporalProjectionExperimentAdapter.js.map +1 -0
- package/dist/renderer/ViewerTemporalScheduler.d.ts +6 -0
- package/dist/renderer/ViewerTemporalScheduler.d.ts.map +1 -0
- package/dist/renderer/ViewerTemporalScheduler.js +12 -0
- package/dist/renderer/ViewerTemporalScheduler.js.map +1 -0
- package/dist/renderer/VisualGroundLayer.d.ts +110 -0
- package/dist/renderer/VisualGroundLayer.d.ts.map +1 -0
- package/dist/renderer/VisualGroundLayer.js +576 -0
- package/dist/renderer/VisualGroundLayer.js.map +1 -0
- package/dist/renderer/displayFrameRate.d.ts +5 -0
- package/dist/renderer/displayFrameRate.d.ts.map +1 -0
- package/dist/renderer/displayFrameRate.js +23 -0
- package/dist/renderer/displayFrameRate.js.map +1 -0
- package/dist/renderer/index.d.ts +20 -0
- package/dist/renderer/index.d.ts.map +1 -0
- package/dist/renderer/index.js +18 -0
- package/dist/renderer/index.js.map +1 -0
- package/dist/renderer/physics/ViewerJointResolution.d.ts +19 -0
- package/dist/renderer/physics/ViewerJointResolution.d.ts.map +1 -0
- package/dist/renderer/physics/ViewerJointResolution.js +24 -0
- package/dist/renderer/physics/ViewerJointResolution.js.map +1 -0
- package/dist/renderer/physics/ViewerPhysicsFrame.d.ts +9 -0
- package/dist/renderer/physics/ViewerPhysicsFrame.d.ts.map +1 -0
- package/dist/renderer/physics/ViewerPhysicsFrame.js +26 -0
- package/dist/renderer/physics/ViewerPhysicsFrame.js.map +1 -0
- package/dist/renderer/physics/ViewerPhysicsJointMapping.d.ts +11 -0
- package/dist/renderer/physics/ViewerPhysicsJointMapping.d.ts.map +1 -0
- package/dist/renderer/physics/ViewerPhysicsJointMapping.js +20 -0
- package/dist/renderer/physics/ViewerPhysicsJointMapping.js.map +1 -0
- package/dist/renderer/physics/ViewerPhysicsMetadata.d.ts +20 -0
- package/dist/renderer/physics/ViewerPhysicsMetadata.d.ts.map +1 -0
- package/dist/renderer/physics/ViewerPhysicsMetadata.js +49 -0
- package/dist/renderer/physics/ViewerPhysicsMetadata.js.map +1 -0
- package/dist/renderer/robotViewerMotion.d.ts +49 -0
- package/dist/renderer/robotViewerMotion.d.ts.map +1 -0
- package/dist/renderer/robotViewerMotion.js +253 -0
- package/dist/renderer/robotViewerMotion.js.map +1 -0
- package/dist/supportDefinition.d.ts +11 -0
- package/dist/supportDefinition.d.ts.map +1 -0
- package/dist/supportDefinition.js +2 -0
- package/dist/supportDefinition.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
function finiteOrNull(value) {
|
|
2
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
3
|
+
}
|
|
4
|
+
const IDENTITY_QUATERNION = { x: 0, y: 0, z: 0, w: 1 };
|
|
5
|
+
const SUPPORT_PLANE_EPSILON = 1e-10;
|
|
6
|
+
const DEFAULT_MAX_INCLINATION_CORRECTION_RADIANS = Math.PI / 9;
|
|
7
|
+
const DEFAULT_MAX_SUPPORT_ANCHOR_CORRECTION_METERS = 0.08;
|
|
8
|
+
const DEFAULT_ACTIVE_SUPPORT_CONTACT_BAND_METERS = 0.025;
|
|
9
|
+
const DEFAULT_ACTIVE_SUPPORT_RELEASE_HYSTERESIS_METERS = 0.015;
|
|
10
|
+
const DEFAULT_TEMPORAL_SUPPORT_REACQUIRE_DISTANCE_METERS = 0.06;
|
|
11
|
+
function isFiniteSupportPoint(point) {
|
|
12
|
+
return Number.isFinite(point.x) && Number.isFinite(point.y) && Number.isFinite(point.z);
|
|
13
|
+
}
|
|
14
|
+
function resolveSupportCentroid(supportPoints) {
|
|
15
|
+
if (supportPoints.length === 0 || supportPoints.some((point) => !isFiniteSupportPoint(point))) {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
const centroid = supportPoints.reduce((sum, point) => ({ x: sum.x + point.x, y: sum.y + point.y, z: sum.z + point.z }), { x: 0, y: 0, z: 0 });
|
|
19
|
+
return {
|
|
20
|
+
x: centroid.x / supportPoints.length,
|
|
21
|
+
y: centroid.y / supportPoints.length,
|
|
22
|
+
z: centroid.z / supportPoints.length
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Selects only sole anchors that belong to the lowest contact band.
|
|
27
|
+
*
|
|
28
|
+
* The robot model exposes eight semantic FSR frames, but their presence does
|
|
29
|
+
* not mean both feet currently support the body. Feeding a lifted foot into
|
|
30
|
+
* the support plane makes its animated centroid a hidden root controller.
|
|
31
|
+
* This projection keeps the lowest, physically plausible contact subset,
|
|
32
|
+
* preserves its stable identities, and uses a wider release band for the
|
|
33
|
+
* previous support. That hysteresis prevents millimetric telemetry noise from
|
|
34
|
+
* repeatedly releasing and reacquiring the static-friction anchor.
|
|
35
|
+
*/
|
|
36
|
+
export function resolveObservedRobotActiveSupportProjection(input) {
|
|
37
|
+
const contactBandMeters = Number.isFinite(input.contactBandMeters)
|
|
38
|
+
? Math.max(0, input.contactBandMeters ?? 0)
|
|
39
|
+
: DEFAULT_ACTIVE_SUPPORT_CONTACT_BAND_METERS;
|
|
40
|
+
const releaseContactBandMeters = Number.isFinite(input.releaseContactBandMeters)
|
|
41
|
+
? Math.max(contactBandMeters, input.releaseContactBandMeters ?? contactBandMeters)
|
|
42
|
+
: contactBandMeters + DEFAULT_ACTIVE_SUPPORT_RELEASE_HYSTERESIS_METERS;
|
|
43
|
+
const hasStableContactIds = input.contactIds?.length === input.supportPoints.length;
|
|
44
|
+
const hasSupportGroups = input.supportGroupIds?.length === input.supportPoints.length;
|
|
45
|
+
const previousActiveContactIdSet = new Set(input.previousActiveContactIds ?? []);
|
|
46
|
+
const finiteEntries = input.supportPoints
|
|
47
|
+
.map((point, index) => ({
|
|
48
|
+
point,
|
|
49
|
+
index,
|
|
50
|
+
contactId: hasStableContactIds ? input.contactIds[index] : String(index),
|
|
51
|
+
supportGroupId: hasSupportGroups ? input.supportGroupIds[index] : null
|
|
52
|
+
}))
|
|
53
|
+
.filter(({ point }) => isFiniteSupportPoint(point));
|
|
54
|
+
const supportMinimumY = finiteEntries.reduce((minimum, { point }) => Math.min(minimum, point.y), Number.POSITIVE_INFINITY);
|
|
55
|
+
if (!Number.isFinite(supportMinimumY)) {
|
|
56
|
+
return {
|
|
57
|
+
status: 'unavailable',
|
|
58
|
+
supportPoints: [],
|
|
59
|
+
activeIndices: [],
|
|
60
|
+
activeContactIds: [],
|
|
61
|
+
sourceContactCount: finiteEntries.length,
|
|
62
|
+
activeContactCount: 0,
|
|
63
|
+
supportMinimumY: null,
|
|
64
|
+
contactBandMeters,
|
|
65
|
+
releaseContactBandMeters
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const activeSupportGroupIds = new Set();
|
|
69
|
+
if (hasSupportGroups) {
|
|
70
|
+
const minimumByGroup = new Map();
|
|
71
|
+
for (const { point, supportGroupId } of finiteEntries) {
|
|
72
|
+
if (!supportGroupId)
|
|
73
|
+
continue;
|
|
74
|
+
minimumByGroup.set(supportGroupId, Math.min(minimumByGroup.get(supportGroupId) ?? Number.POSITIVE_INFINITY, point.y));
|
|
75
|
+
}
|
|
76
|
+
const contactIdsByGroup = new Map();
|
|
77
|
+
for (const { contactId, supportGroupId } of finiteEntries) {
|
|
78
|
+
if (!supportGroupId)
|
|
79
|
+
continue;
|
|
80
|
+
const contactIds = contactIdsByGroup.get(supportGroupId) ?? [];
|
|
81
|
+
contactIds.push(contactId);
|
|
82
|
+
contactIdsByGroup.set(supportGroupId, contactIds);
|
|
83
|
+
}
|
|
84
|
+
for (const [supportGroupId, minimumY] of minimumByGroup) {
|
|
85
|
+
const wasPreviouslyActive = (contactIdsByGroup.get(supportGroupId) ?? []).some((contactId) => previousActiveContactIdSet.has(contactId));
|
|
86
|
+
const activeBandMeters = wasPreviouslyActive
|
|
87
|
+
? releaseContactBandMeters
|
|
88
|
+
: contactBandMeters;
|
|
89
|
+
if (minimumY <= supportMinimumY + activeBandMeters) {
|
|
90
|
+
activeSupportGroupIds.add(supportGroupId);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Once one anchor of a rigid sole reaches the contact band, keep the whole
|
|
95
|
+
// sole as one stable support identity. Selecting its corners independently
|
|
96
|
+
// makes tiny roll/pitch variations repeatedly release static friction.
|
|
97
|
+
const activeEntries = finiteEntries.filter(({ point, supportGroupId }) => hasSupportGroups
|
|
98
|
+
? Boolean(supportGroupId && activeSupportGroupIds.has(supportGroupId))
|
|
99
|
+
: point.y <= supportMinimumY + contactBandMeters);
|
|
100
|
+
const resolved = activeEntries.length >= 3;
|
|
101
|
+
return {
|
|
102
|
+
status: resolved ? 'resolved' : 'unavailable',
|
|
103
|
+
supportPoints: resolved ? activeEntries.map(({ point }) => point) : [],
|
|
104
|
+
activeIndices: resolved ? activeEntries.map(({ index }) => index) : [],
|
|
105
|
+
activeContactIds: resolved ? activeEntries.map(({ contactId }) => contactId) : [],
|
|
106
|
+
sourceContactCount: finiteEntries.length,
|
|
107
|
+
activeContactCount: resolved ? activeEntries.length : 0,
|
|
108
|
+
supportMinimumY,
|
|
109
|
+
contactBandMeters,
|
|
110
|
+
releaseContactBandMeters
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Keeps a stable support footprint across consecutive observed joint frames.
|
|
115
|
+
*
|
|
116
|
+
* Joint telemetry contains no authoritative world-space root translation.
|
|
117
|
+
* Once a valid foot-support subset is acquired, small centroid changes are
|
|
118
|
+
* therefore presentation artefacts caused by the articulated model and are
|
|
119
|
+
* cancelled as static friction. A changed contact subset or a discontinuity
|
|
120
|
+
* beyond the bounded threshold reacquires the anchor instead of inventing a
|
|
121
|
+
* robot trajectory.
|
|
122
|
+
*/
|
|
123
|
+
export function resolveObservedRobotTemporalSupportAnchorProjection(input) {
|
|
124
|
+
const unavailable = () => ({
|
|
125
|
+
status: 'unavailable',
|
|
126
|
+
state: null,
|
|
127
|
+
supportContactCount: 0,
|
|
128
|
+
offsetX: 0,
|
|
129
|
+
offsetZ: 0,
|
|
130
|
+
requestedOffsetMeters: 0,
|
|
131
|
+
affectedRootAxes: [],
|
|
132
|
+
constraintModel: 'unconstrained',
|
|
133
|
+
physicsAffected: false
|
|
134
|
+
});
|
|
135
|
+
if (input.supportEligible === false ||
|
|
136
|
+
input.supportPoints.length < 3 ||
|
|
137
|
+
input.supportPoints.length !== input.activeIndices.length) {
|
|
138
|
+
return unavailable();
|
|
139
|
+
}
|
|
140
|
+
const centroid = resolveSupportCentroid(input.supportPoints);
|
|
141
|
+
if (!centroid || input.activeIndices.some((index) => !Number.isInteger(index) || index < 0)) {
|
|
142
|
+
return unavailable();
|
|
143
|
+
}
|
|
144
|
+
const stableContactIds = input.activeContactIds?.length === input.supportPoints.length
|
|
145
|
+
? input.activeContactIds
|
|
146
|
+
: input.activeIndices.map(String);
|
|
147
|
+
const supportSignature = [...stableContactIds].sort().join('|');
|
|
148
|
+
const acquiredState = {
|
|
149
|
+
anchorX: centroid.x,
|
|
150
|
+
anchorZ: centroid.z,
|
|
151
|
+
supportSignature,
|
|
152
|
+
supportContactCount: input.supportPoints.length,
|
|
153
|
+
activeContactIds: [...stableContactIds].sort()
|
|
154
|
+
};
|
|
155
|
+
const previousState = input.previousState;
|
|
156
|
+
if (!previousState) {
|
|
157
|
+
return {
|
|
158
|
+
status: 'acquired',
|
|
159
|
+
state: acquiredState,
|
|
160
|
+
supportContactCount: input.supportPoints.length,
|
|
161
|
+
offsetX: 0,
|
|
162
|
+
offsetZ: 0,
|
|
163
|
+
requestedOffsetMeters: 0,
|
|
164
|
+
affectedRootAxes: [],
|
|
165
|
+
constraintModel: 'temporal-support-static-friction',
|
|
166
|
+
physicsAffected: false
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (previousState.supportSignature !== supportSignature ||
|
|
170
|
+
previousState.supportContactCount !== input.supportPoints.length) {
|
|
171
|
+
return {
|
|
172
|
+
status: 'reacquired',
|
|
173
|
+
state: acquiredState,
|
|
174
|
+
supportContactCount: input.supportPoints.length,
|
|
175
|
+
offsetX: 0,
|
|
176
|
+
offsetZ: 0,
|
|
177
|
+
requestedOffsetMeters: 0,
|
|
178
|
+
affectedRootAxes: [],
|
|
179
|
+
constraintModel: 'temporal-support-static-friction',
|
|
180
|
+
physicsAffected: false
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
const offsetX = previousState.anchorX - centroid.x;
|
|
184
|
+
const offsetZ = previousState.anchorZ - centroid.z;
|
|
185
|
+
const requestedOffsetMeters = Math.hypot(offsetX, offsetZ);
|
|
186
|
+
const reacquireDistanceMeters = Number.isFinite(input.reacquireDistanceMeters)
|
|
187
|
+
? Math.max(0, input.reacquireDistanceMeters ?? 0)
|
|
188
|
+
: DEFAULT_TEMPORAL_SUPPORT_REACQUIRE_DISTANCE_METERS;
|
|
189
|
+
if (requestedOffsetMeters > reacquireDistanceMeters) {
|
|
190
|
+
return {
|
|
191
|
+
status: 'reacquired',
|
|
192
|
+
state: acquiredState,
|
|
193
|
+
supportContactCount: input.supportPoints.length,
|
|
194
|
+
offsetX: 0,
|
|
195
|
+
offsetZ: 0,
|
|
196
|
+
requestedOffsetMeters,
|
|
197
|
+
affectedRootAxes: [],
|
|
198
|
+
constraintModel: 'temporal-support-static-friction',
|
|
199
|
+
physicsAffected: false
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
status: 'preserved',
|
|
204
|
+
state: previousState,
|
|
205
|
+
supportContactCount: input.supportPoints.length,
|
|
206
|
+
offsetX,
|
|
207
|
+
offsetZ,
|
|
208
|
+
requestedOffsetMeters,
|
|
209
|
+
affectedRootAxes: ['x', 'z'],
|
|
210
|
+
constraintModel: 'temporal-support-static-friction',
|
|
211
|
+
physicsAffected: false
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Preserves the world-space support footprint while a missing root
|
|
216
|
+
* inclination is completed for presentation.
|
|
217
|
+
*
|
|
218
|
+
* Rotating the observed model around its authored root (usually near the
|
|
219
|
+
* torso) moves the sole anchors laterally. The inverse centroid delta makes
|
|
220
|
+
* the support polygon the effective pivot instead. Y remains owned by the
|
|
221
|
+
* grounding projection, and the bounded X/Z correction is a static-friction
|
|
222
|
+
* constraint only: it does not integrate velocity or alter observed joints.
|
|
223
|
+
*/
|
|
224
|
+
export function resolveObservedRobotSupportAnchorProjection(input) {
|
|
225
|
+
const unavailable = (supportContactCount = 0) => ({
|
|
226
|
+
status: 'unavailable',
|
|
227
|
+
supportContactCount,
|
|
228
|
+
offsetX: 0,
|
|
229
|
+
offsetZ: 0,
|
|
230
|
+
requestedOffsetMeters: 0,
|
|
231
|
+
appliedOffsetMeters: 0,
|
|
232
|
+
affectedRootAxes: [],
|
|
233
|
+
constraintModel: 'unconstrained',
|
|
234
|
+
physicsAffected: false
|
|
235
|
+
});
|
|
236
|
+
if (input.supportEligible === false ||
|
|
237
|
+
input.supportPointsBefore.length < 3 ||
|
|
238
|
+
input.supportPointsBefore.length !== input.supportPointsAfter.length) {
|
|
239
|
+
return unavailable(input.supportPointsBefore.length);
|
|
240
|
+
}
|
|
241
|
+
const before = resolveSupportCentroid(input.supportPointsBefore);
|
|
242
|
+
const after = resolveSupportCentroid(input.supportPointsAfter);
|
|
243
|
+
if (!before || !after)
|
|
244
|
+
return unavailable(input.supportPointsBefore.length);
|
|
245
|
+
const requestedOffsetX = before.x - after.x;
|
|
246
|
+
const requestedOffsetZ = before.z - after.z;
|
|
247
|
+
const requestedOffsetMeters = Math.hypot(requestedOffsetX, requestedOffsetZ);
|
|
248
|
+
const maxCorrectionMeters = Number.isFinite(input.maxCorrectionMeters)
|
|
249
|
+
? Math.max(0, input.maxCorrectionMeters ?? 0)
|
|
250
|
+
: DEFAULT_MAX_SUPPORT_ANCHOR_CORRECTION_METERS;
|
|
251
|
+
const scale = requestedOffsetMeters > maxCorrectionMeters && requestedOffsetMeters > SUPPORT_PLANE_EPSILON
|
|
252
|
+
? maxCorrectionMeters / requestedOffsetMeters
|
|
253
|
+
: 1;
|
|
254
|
+
const offsetX = requestedOffsetX * scale;
|
|
255
|
+
const offsetZ = requestedOffsetZ * scale;
|
|
256
|
+
const appliedOffsetMeters = requestedOffsetMeters * scale;
|
|
257
|
+
return {
|
|
258
|
+
status: scale < 1 ? 'clamped' : 'preserved',
|
|
259
|
+
supportContactCount: input.supportPointsBefore.length,
|
|
260
|
+
offsetX,
|
|
261
|
+
offsetZ,
|
|
262
|
+
requestedOffsetMeters,
|
|
263
|
+
appliedOffsetMeters,
|
|
264
|
+
affectedRootAxes: ['x', 'z'],
|
|
265
|
+
constraintModel: 'support-centroid-static-friction',
|
|
266
|
+
physicsAffected: false
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Fits y = ax + bz + c through the semantic sole anchors and returns the
|
|
271
|
+
* shortest world-space rotation that aligns that support plane with world up.
|
|
272
|
+
*
|
|
273
|
+
* This is deliberately a quasi-static contact constraint, not a dynamics
|
|
274
|
+
* simulation: observed joints remain authoritative and only the missing root
|
|
275
|
+
* roll/pitch presentation is inferred. The bounded correction cannot inject
|
|
276
|
+
* velocity, oscillation or a competing pose history.
|
|
277
|
+
*/
|
|
278
|
+
export function resolveObservedRobotSupportInclinationProjection(input) {
|
|
279
|
+
const supportPoints = input.supportPoints.filter(isFiniteSupportPoint);
|
|
280
|
+
const unavailable = () => ({
|
|
281
|
+
status: 'unavailable',
|
|
282
|
+
supportContactCount: supportPoints.length,
|
|
283
|
+
supportNormal: null,
|
|
284
|
+
correctionQuaternion: { ...IDENTITY_QUATERNION },
|
|
285
|
+
correctionAngleRadians: 0,
|
|
286
|
+
correctionClamped: false,
|
|
287
|
+
affectedRootAxes: [],
|
|
288
|
+
constraintModel: 'unconstrained',
|
|
289
|
+
physicsAffected: false
|
|
290
|
+
});
|
|
291
|
+
if (!input.enabled || input.supportEligible === false || supportPoints.length < 3) {
|
|
292
|
+
return unavailable();
|
|
293
|
+
}
|
|
294
|
+
const center = supportPoints.reduce((sum, point) => ({ x: sum.x + point.x, y: sum.y + point.y, z: sum.z + point.z }), { x: 0, y: 0, z: 0 });
|
|
295
|
+
center.x /= supportPoints.length;
|
|
296
|
+
center.y /= supportPoints.length;
|
|
297
|
+
center.z /= supportPoints.length;
|
|
298
|
+
let xx = 0;
|
|
299
|
+
let xz = 0;
|
|
300
|
+
let zz = 0;
|
|
301
|
+
let xy = 0;
|
|
302
|
+
let zy = 0;
|
|
303
|
+
for (const point of supportPoints) {
|
|
304
|
+
const x = point.x - center.x;
|
|
305
|
+
const y = point.y - center.y;
|
|
306
|
+
const z = point.z - center.z;
|
|
307
|
+
xx += x * x;
|
|
308
|
+
xz += x * z;
|
|
309
|
+
zz += z * z;
|
|
310
|
+
xy += x * y;
|
|
311
|
+
zy += z * y;
|
|
312
|
+
}
|
|
313
|
+
const determinant = xx * zz - xz * xz;
|
|
314
|
+
if (!Number.isFinite(determinant) || Math.abs(determinant) <= SUPPORT_PLANE_EPSILON) {
|
|
315
|
+
return unavailable();
|
|
316
|
+
}
|
|
317
|
+
const slopeX = (xy * zz - zy * xz) / determinant;
|
|
318
|
+
const slopeZ = (zy * xx - xy * xz) / determinant;
|
|
319
|
+
const normalLength = Math.hypot(slopeX, 1, slopeZ);
|
|
320
|
+
if (!Number.isFinite(normalLength) || normalLength <= SUPPORT_PLANE_EPSILON) {
|
|
321
|
+
return unavailable();
|
|
322
|
+
}
|
|
323
|
+
const supportNormal = {
|
|
324
|
+
x: -slopeX / normalLength,
|
|
325
|
+
y: 1 / normalLength,
|
|
326
|
+
z: -slopeZ / normalLength
|
|
327
|
+
};
|
|
328
|
+
const rawAngle = Math.acos(Math.max(-1, Math.min(1, supportNormal.y)));
|
|
329
|
+
const maxCorrectionRadians = Number.isFinite(input.maxCorrectionRadians)
|
|
330
|
+
? Math.max(0, Math.min(Math.PI / 2, input.maxCorrectionRadians ?? 0))
|
|
331
|
+
: DEFAULT_MAX_INCLINATION_CORRECTION_RADIANS;
|
|
332
|
+
const correctionAngleRadians = Math.min(rawAngle, maxCorrectionRadians);
|
|
333
|
+
if (correctionAngleRadians <= 1e-7) {
|
|
334
|
+
return {
|
|
335
|
+
status: 'aligned',
|
|
336
|
+
supportContactCount: supportPoints.length,
|
|
337
|
+
supportNormal,
|
|
338
|
+
correctionQuaternion: { ...IDENTITY_QUATERNION },
|
|
339
|
+
correctionAngleRadians: 0,
|
|
340
|
+
correctionClamped: false,
|
|
341
|
+
affectedRootAxes: [],
|
|
342
|
+
constraintModel: 'quasi-static-rigid-contact',
|
|
343
|
+
physicsAffected: false
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
// cross(supportNormal, worldUp), normalized. The axis is horizontal, so the
|
|
347
|
+
// correction contains roll/pitch only and cannot modify observed yaw.
|
|
348
|
+
const axisX = -supportNormal.z;
|
|
349
|
+
const axisZ = supportNormal.x;
|
|
350
|
+
const axisLength = Math.hypot(axisX, axisZ);
|
|
351
|
+
if (!Number.isFinite(axisLength) || axisLength <= SUPPORT_PLANE_EPSILON) {
|
|
352
|
+
return unavailable();
|
|
353
|
+
}
|
|
354
|
+
const halfAngle = correctionAngleRadians / 2;
|
|
355
|
+
const sinHalfAngle = Math.sin(halfAngle);
|
|
356
|
+
return {
|
|
357
|
+
status: 'corrected',
|
|
358
|
+
supportContactCount: supportPoints.length,
|
|
359
|
+
supportNormal,
|
|
360
|
+
correctionQuaternion: {
|
|
361
|
+
x: (axisX / axisLength) * sinHalfAngle,
|
|
362
|
+
y: 0,
|
|
363
|
+
z: (axisZ / axisLength) * sinHalfAngle,
|
|
364
|
+
w: Math.cos(halfAngle)
|
|
365
|
+
},
|
|
366
|
+
correctionAngleRadians,
|
|
367
|
+
correctionClamped: rawAngle > correctionAngleRadians + 1e-7,
|
|
368
|
+
affectedRootAxes: ['roll', 'pitch'],
|
|
369
|
+
constraintModel: 'quasi-static-rigid-contact',
|
|
370
|
+
physicsAffected: false
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Decides whether sole anchors may complete the missing root inclination.
|
|
375
|
+
*
|
|
376
|
+
* The feet are only a valid support authority while their rendered envelope
|
|
377
|
+
* belongs to the lowest body contact band. When the torso, back, arms or any
|
|
378
|
+
* other collider is lower, the robot is treated as body-supported: its
|
|
379
|
+
* observed orientation is preserved and no "stand it back up" correction is
|
|
380
|
+
* invented locally.
|
|
381
|
+
*/
|
|
382
|
+
export function resolveObservedRobotFootSupportEligibility(input) {
|
|
383
|
+
const footGeometryMinimumY = finiteOrNull(input.footGeometryMinimumY);
|
|
384
|
+
const bodyEnvelopeMinimumY = finiteOrNull(input.bodyEnvelopeMinimumY);
|
|
385
|
+
const contactBandMeters = Number.isFinite(input.contactBandMeters)
|
|
386
|
+
? Math.max(0, input.contactBandMeters ?? 0)
|
|
387
|
+
: 0.025;
|
|
388
|
+
if (footGeometryMinimumY === null || bodyEnvelopeMinimumY === null) {
|
|
389
|
+
return {
|
|
390
|
+
eligible: false,
|
|
391
|
+
footGeometryMinimumY,
|
|
392
|
+
bodyEnvelopeMinimumY,
|
|
393
|
+
separationMeters: null
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
const separationMeters = footGeometryMinimumY - bodyEnvelopeMinimumY;
|
|
397
|
+
return {
|
|
398
|
+
eligible: separationMeters <= contactBandMeters,
|
|
399
|
+
footGeometryMinimumY,
|
|
400
|
+
bodyEnvelopeMinimumY,
|
|
401
|
+
separationMeters
|
|
402
|
+
};
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* Resolves the surface that must visually meet the support plane.
|
|
406
|
+
*
|
|
407
|
+
* FSR frames describe where support can be observed, but their origins live
|
|
408
|
+
* inside the foot assembly and are not guaranteed to coincide with the
|
|
409
|
+
* rendered sole. Prefer the rendered foot envelope for the vertical contact
|
|
410
|
+
* correction, while retaining the FSR count as evidence for the projection.
|
|
411
|
+
*
|
|
412
|
+
* Whole-body colliders decide which support regime is active, but simplified
|
|
413
|
+
* collision geometry is not a reliable visible contact surface. When both are
|
|
414
|
+
* available, align the rendered envelope to the floor and report explicitly
|
|
415
|
+
* that the contact was collider-guided. This covers back, belly and side
|
|
416
|
+
* contacts without making an approximate collider visibly float or penetrate.
|
|
417
|
+
*/
|
|
418
|
+
export function resolveObservedRobotSupportSurface(input) {
|
|
419
|
+
const supportContactCount = Number.isFinite(input.supportContactCount)
|
|
420
|
+
? Math.max(0, Math.trunc(input.supportContactCount ?? 0))
|
|
421
|
+
: 0;
|
|
422
|
+
const collisionEnvelopeMinimumY = finiteOrNull(input.collisionEnvelopeMinimumY);
|
|
423
|
+
const robotBoundsMinimumY = finiteOrNull(input.robotBoundsMinimumY);
|
|
424
|
+
if (collisionEnvelopeMinimumY !== null && robotBoundsMinimumY !== null) {
|
|
425
|
+
return {
|
|
426
|
+
supportMinimumY: robotBoundsMinimumY,
|
|
427
|
+
supportContactCount,
|
|
428
|
+
source: 'collision-guided-render-envelope'
|
|
429
|
+
};
|
|
430
|
+
}
|
|
431
|
+
if (collisionEnvelopeMinimumY !== null) {
|
|
432
|
+
return {
|
|
433
|
+
supportMinimumY: collisionEnvelopeMinimumY,
|
|
434
|
+
supportContactCount,
|
|
435
|
+
source: 'collision-envelope'
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
if (robotBoundsMinimumY !== null) {
|
|
439
|
+
return {
|
|
440
|
+
supportMinimumY: robotBoundsMinimumY,
|
|
441
|
+
supportContactCount,
|
|
442
|
+
source: 'robot-bounds'
|
|
443
|
+
};
|
|
444
|
+
}
|
|
445
|
+
const footGeometryMinimumY = finiteOrNull(input.footGeometryMinimumY);
|
|
446
|
+
if (footGeometryMinimumY !== null) {
|
|
447
|
+
return {
|
|
448
|
+
supportMinimumY: footGeometryMinimumY,
|
|
449
|
+
supportContactCount,
|
|
450
|
+
source: 'foot-geometry'
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
const contactMinimumY = finiteOrNull(input.contactMinimumY);
|
|
454
|
+
if (supportContactCount > 0 && contactMinimumY !== null) {
|
|
455
|
+
return {
|
|
456
|
+
supportMinimumY: contactMinimumY,
|
|
457
|
+
supportContactCount,
|
|
458
|
+
source: 'foot-contact-anchors'
|
|
459
|
+
};
|
|
460
|
+
}
|
|
461
|
+
return { supportMinimumY: null, supportContactCount: 0, source: 'robot-bounds' };
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Completes the missing world-height component of an observed robot pose.
|
|
465
|
+
*
|
|
466
|
+
* Joint values remain observed facts. The vertical offset is an explicit,
|
|
467
|
+
* deterministic support-plane inference and never steps a physics simulation.
|
|
468
|
+
* This vertical stage never changes X/Z. The companion support-anchor
|
|
469
|
+
* projection may only apply the inverse centroid delta required to preserve
|
|
470
|
+
* static contact, without becoming the robot pose authority.
|
|
471
|
+
*/
|
|
472
|
+
export function resolveObservedRobotGroundingProjection(input) {
|
|
473
|
+
const floorY = Number.isFinite(input.floorY) ? input.floorY : 0;
|
|
474
|
+
const supportContactCount = Number.isFinite(input.supportContactCount)
|
|
475
|
+
? Math.max(0, Math.trunc(input.supportContactCount ?? 0))
|
|
476
|
+
: 0;
|
|
477
|
+
if (!input.enabled) {
|
|
478
|
+
return {
|
|
479
|
+
status: 'disabled',
|
|
480
|
+
source: 'unavailable',
|
|
481
|
+
floorY,
|
|
482
|
+
supportMinimumY: null,
|
|
483
|
+
supportContactCount: 0,
|
|
484
|
+
offsetY: 0,
|
|
485
|
+
inferred: false,
|
|
486
|
+
contactMode: 'unconstrained',
|
|
487
|
+
affectedRootAxes: [],
|
|
488
|
+
physicsAffected: false
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
if (typeof input.supportMinimumY !== 'number' || !Number.isFinite(input.supportMinimumY)) {
|
|
492
|
+
return {
|
|
493
|
+
status: 'unavailable',
|
|
494
|
+
source: 'unavailable',
|
|
495
|
+
floorY,
|
|
496
|
+
supportMinimumY: null,
|
|
497
|
+
supportContactCount: 0,
|
|
498
|
+
offsetY: 0,
|
|
499
|
+
inferred: false,
|
|
500
|
+
contactMode: 'unconstrained',
|
|
501
|
+
affectedRootAxes: [],
|
|
502
|
+
physicsAffected: false
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
return {
|
|
506
|
+
status: 'grounded',
|
|
507
|
+
source: input.source,
|
|
508
|
+
floorY,
|
|
509
|
+
supportMinimumY: input.supportMinimumY,
|
|
510
|
+
supportContactCount,
|
|
511
|
+
offsetY: floorY - input.supportMinimumY,
|
|
512
|
+
inferred: true,
|
|
513
|
+
contactMode: input.source === 'collision-guided-render-envelope' ||
|
|
514
|
+
input.source === 'collision-envelope' ||
|
|
515
|
+
input.source === 'robot-bounds'
|
|
516
|
+
? 'collision-envelope-static-contact'
|
|
517
|
+
: 'support-plane-static-friction',
|
|
518
|
+
affectedRootAxes: ['y'],
|
|
519
|
+
physicsAffected: false
|
|
520
|
+
};
|
|
521
|
+
}
|
|
522
|
+
//# sourceMappingURL=ObservedRobotGroundingProjection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObservedRobotGroundingProjection.js","sourceRoot":"","sources":["../../src/renderer/ObservedRobotGroundingProjection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
export type ObservedRobotPresentationMode = 'raw' | 'interpolated';
|
|
2
|
+
export type ObservedRobotPresentationFallbackReason = 'none' | 'insufficient_samples' | 'invalid_sample' | 'sample_gap' | 'discontinuity';
|
|
3
|
+
export interface ObservedRobotPresentationSample {
|
|
4
|
+
sampleId: string;
|
|
5
|
+
connectionId: string;
|
|
6
|
+
sourceObservedAtSeconds: number | null;
|
|
7
|
+
receivedAtMs: number;
|
|
8
|
+
jointValues: Readonly<Record<string, number>>;
|
|
9
|
+
}
|
|
10
|
+
export interface ObservedRobotPresentationConfig {
|
|
11
|
+
minimumTransitionMs: number;
|
|
12
|
+
maximumTransitionMs: number;
|
|
13
|
+
maximumSampleGapMs: number;
|
|
14
|
+
}
|
|
15
|
+
export interface ObservedRobotPresentationFrame {
|
|
16
|
+
mode: ObservedRobotPresentationMode;
|
|
17
|
+
state: 'raw' | 'interpolated' | 'fallback';
|
|
18
|
+
fallbackReason: ObservedRobotPresentationFallbackReason;
|
|
19
|
+
provenance: 'observed-raw' | 'observed-interpolated';
|
|
20
|
+
sourceSampleIds: readonly string[];
|
|
21
|
+
connectionId: string;
|
|
22
|
+
sourceObservedAtSeconds: number | null;
|
|
23
|
+
renderedAtMs: number;
|
|
24
|
+
latestReceivedAtMs: number;
|
|
25
|
+
interpolationAlpha: number;
|
|
26
|
+
transitionDurationMs: number;
|
|
27
|
+
active: boolean;
|
|
28
|
+
jointValues: Readonly<Record<string, number>>;
|
|
29
|
+
}
|
|
30
|
+
export interface ObservedRobotPresentationStatus {
|
|
31
|
+
mode: ObservedRobotPresentationMode;
|
|
32
|
+
state: ObservedRobotPresentationFrame['state'] | 'empty';
|
|
33
|
+
fallbackReason: ObservedRobotPresentationFallbackReason;
|
|
34
|
+
provenance: ObservedRobotPresentationFrame['provenance'] | null;
|
|
35
|
+
sourceSampleIds: readonly string[];
|
|
36
|
+
interpolationAlpha: number;
|
|
37
|
+
transitionDurationMs: number;
|
|
38
|
+
active: boolean;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Reconstructs only the visible pose of an observed robot between admitted
|
|
42
|
+
* telemetry samples. Source observations remain immutable and never inherit
|
|
43
|
+
* values produced by this presentation buffer.
|
|
44
|
+
*
|
|
45
|
+
* The transition clock is the local receipt clock. The upstream
|
|
46
|
+
* sourceObservedAtSeconds value is retained as provenance, but it is not used
|
|
47
|
+
* for interpolation because its clock domain is not part of the observation
|
|
48
|
+
* contract yet.
|
|
49
|
+
*/
|
|
50
|
+
export declare class ObservedRobotPresentationBuffer {
|
|
51
|
+
private readonly config;
|
|
52
|
+
private mode;
|
|
53
|
+
private latestSample;
|
|
54
|
+
private transitionStartValues;
|
|
55
|
+
private transitionSourceSampleIds;
|
|
56
|
+
private transitionStartedAtMs;
|
|
57
|
+
private transitionDurationMs;
|
|
58
|
+
private pendingFallbackReason;
|
|
59
|
+
private status;
|
|
60
|
+
constructor(config?: Partial<ObservedRobotPresentationConfig>);
|
|
61
|
+
setMode(mode: ObservedRobotPresentationMode): void;
|
|
62
|
+
getMode(): ObservedRobotPresentationMode;
|
|
63
|
+
getStatus(): ObservedRobotPresentationStatus;
|
|
64
|
+
getConfig(): ObservedRobotPresentationConfig;
|
|
65
|
+
reset(reason?: ObservedRobotPresentationFallbackReason): void;
|
|
66
|
+
ingest(sample: ObservedRobotPresentationSample): boolean;
|
|
67
|
+
project(renderedAtMs: number): ObservedRobotPresentationFrame | null;
|
|
68
|
+
isActive(renderedAtMs: number): boolean;
|
|
69
|
+
private acceptFirstSample;
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=ObservedRobotPresentationBuffer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ObservedRobotPresentationBuffer.d.ts","sourceRoot":"","sources":["../../src/renderer/ObservedRobotPresentationBuffer.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,6BAA6B,GAAG,KAAK,GAAG,cAAc,CAAC;AAEnE,MAAM,MAAM,uCAAuC,GAC/C,MAAM,GACN,sBAAsB,GACtB,gBAAgB,GAChB,YAAY,GACZ,eAAe,CAAC;AAEpB,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,+BAA+B;IAC9C,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,8BAA8B;IAC7C,IAAI,EAAE,6BAA6B,CAAC;IACpC,KAAK,EAAE,KAAK,GAAG,cAAc,GAAG,UAAU,CAAC;IAC3C,cAAc,EAAE,uCAAuC,CAAC;IACxD,UAAU,EAAE,cAAc,GAAG,uBAAuB,CAAC;IACrD,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,+BAA+B;IAC9C,IAAI,EAAE,6BAA6B,CAAC;IACpC,KAAK,EAAE,8BAA8B,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACzD,cAAc,EAAE,uCAAuC,CAAC;IACxD,UAAU,EAAE,8BAA8B,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IAChE,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;CACjB;AAmBD;;;;;;;;;GASG;AACH,qBAAa,+BAA+B;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,IAAI,CAAiD;IAC7D,OAAO,CAAC,YAAY,CAAgD;IACpE,OAAO,CAAC,qBAAqB,CAAwC;IACrE,OAAO,CAAC,yBAAyB,CAAyB;IAC1D,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,qBAAqB,CAAmE;IAChG,OAAO,CAAC,MAAM,CAAiD;gBAEnD,MAAM,GAAE,OAAO,CAAC,+BAA+B,CAAM;IAmBjE,OAAO,CAAC,IAAI,EAAE,6BAA6B,GAAG,IAAI;IAMlD,OAAO,IAAI,6BAA6B;IAIxC,SAAS,IAAI,+BAA+B;IAI5C,SAAS,IAAI,+BAA+B;IAI5C,KAAK,CAAC,MAAM,GAAE,uCAAyD,GAAG,IAAI;IAc9E,MAAM,CAAC,MAAM,EAAE,+BAA+B,GAAG,OAAO;IA4DxD,OAAO,CAAC,YAAY,EAAE,MAAM,GAAG,8BAA8B,GAAG,IAAI;IAmEpE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO;IAUvC,OAAO,CAAC,iBAAiB;CAY1B"}
|