mirror of
https://github.com/ruvnet/RuView.git
synced 2026-09-01 21:15:56 +00:00
feat(nlos): add consumer transient sensing pipeline
This commit is contained in:
159
docs/schemas/ruview-nlos-track-v1.schema.json
Normal file
159
docs/schemas/ruview-nlos-track-v1.schema.json
Normal file
@@ -0,0 +1,159 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://ruview.ai/schemas/ruview-nlos-track-v1.schema.json",
|
||||
"title": "RuView NLOS track envelope v1",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"schema", "sessionId", "sequence", "capturedAtUnixMs", "expiresAtUnixMs",
|
||||
"source", "evidenceLevel", "algorithmVersion", "calibrationHash", "provenance", "tracks"
|
||||
],
|
||||
"properties": {
|
||||
"schema": { "const": "ruview.nlos.track.v1" },
|
||||
"sessionId": { "$ref": "#/$defs/label" },
|
||||
"sequence": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
|
||||
"capturedAtUnixMs": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
|
||||
"expiresAtUnixMs": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
|
||||
"source": { "enum": ["live", "replay", "synthetic"] },
|
||||
"evidenceLevel": { "enum": ["l0_synthetic", "l1_measured", "l2_calibrated"] },
|
||||
"algorithmVersion": { "$ref": "#/$defs/label" },
|
||||
"calibrationHash": { "$ref": "#/$defs/sha256" },
|
||||
"provenance": { "$ref": "#/$defs/provenance" },
|
||||
"tracks": {
|
||||
"type": "array",
|
||||
"maxItems": 16,
|
||||
"items": { "$ref": "#/$defs/track" }
|
||||
}
|
||||
},
|
||||
"allOf": [
|
||||
{
|
||||
"if": { "properties": { "source": { "const": "synthetic" } }, "required": ["source"] },
|
||||
"then": {
|
||||
"properties": {
|
||||
"evidenceLevel": { "const": "l0_synthetic" },
|
||||
"calibrationHash": { "const": "0000000000000000000000000000000000000000000000000000000000000000" },
|
||||
"provenance": {
|
||||
"properties": {
|
||||
"transientKind": { "const": "replay" },
|
||||
"transport": { "const": "replay" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": { "properties": { "source": { "const": "live" } }, "required": ["source"] },
|
||||
"then": {
|
||||
"properties": {
|
||||
"evidenceLevel": { "enum": ["l1_measured", "l2_calibrated"] },
|
||||
"provenance": {
|
||||
"properties": {
|
||||
"transientKind": { "enum": ["raw_histogram", "compact_normalized_histogram"] },
|
||||
"histogramPreserved": { "const": true },
|
||||
"transport": { "enum": ["usb_serial", "ruview_server"] }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": { "properties": { "source": { "const": "replay" } }, "required": ["source"] },
|
||||
"then": {
|
||||
"properties": {
|
||||
"provenance": {
|
||||
"properties": {
|
||||
"transientKind": { "const": "replay" },
|
||||
"histogramPreserved": { "const": true },
|
||||
"transport": { "const": "replay" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
"properties": { "evidenceLevel": { "const": "l2_calibrated" } },
|
||||
"required": ["evidenceLevel"]
|
||||
},
|
||||
"then": {
|
||||
"properties": {
|
||||
"calibrationHash": {
|
||||
"not": { "const": "0000000000000000000000000000000000000000000000000000000000000000" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"$defs": {
|
||||
"label": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]+$" },
|
||||
"sha256": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
|
||||
"unit": { "type": "number", "minimum": 0, "maximum": 1 },
|
||||
"vector": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["x", "y", "z"],
|
||||
"properties": { "x": { "type": "number" }, "y": { "type": "number" }, "z": { "type": "number" } }
|
||||
},
|
||||
"positionVector": {
|
||||
"type": "object", "additionalProperties": false, "required": ["x", "y", "z"],
|
||||
"properties": {
|
||||
"x": { "type": "number", "minimum": -100, "maximum": 100 },
|
||||
"y": { "type": "number", "minimum": -100, "maximum": 100 },
|
||||
"z": { "type": "number", "minimum": -100, "maximum": 100 }
|
||||
}
|
||||
},
|
||||
"velocityVector": {
|
||||
"type": "object", "additionalProperties": false, "required": ["x", "y", "z"],
|
||||
"properties": {
|
||||
"x": { "type": "number", "minimum": -20, "maximum": 20 },
|
||||
"y": { "type": "number", "minimum": -20, "maximum": 20 },
|
||||
"z": { "type": "number", "minimum": -20, "maximum": 20 }
|
||||
}
|
||||
},
|
||||
"covarianceVector": {
|
||||
"type": "object", "additionalProperties": false, "required": ["x", "y", "z"],
|
||||
"properties": {
|
||||
"x": { "type": "number", "minimum": 0, "maximum": 10 },
|
||||
"y": { "type": "number", "minimum": 0, "maximum": 10 },
|
||||
"z": { "type": "number", "minimum": 0, "maximum": 10 }
|
||||
}
|
||||
},
|
||||
"provenance": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["sensorId", "sensorModel", "firmwareVersion", "transientKind", "histogramPreserved", "transport"],
|
||||
"properties": {
|
||||
"sensorId": { "$ref": "#/$defs/label" },
|
||||
"sensorModel": { "$ref": "#/$defs/label" },
|
||||
"firmwareVersion": { "$ref": "#/$defs/label" },
|
||||
"transientKind": { "enum": ["raw_histogram", "compact_normalized_histogram", "depth_only", "replay"] },
|
||||
"histogramPreserved": { "type": "boolean" },
|
||||
"transport": { "enum": ["usb_serial", "ruview_server", "replay"] }
|
||||
}
|
||||
},
|
||||
"track": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"trackId", "state", "positionM", "velocityMps", "covarianceDiagonalM2",
|
||||
"confidence", "posteriorEntropy", "signalQuality", "modalityContributions"
|
||||
],
|
||||
"properties": {
|
||||
"trackId": { "$ref": "#/$defs/label" },
|
||||
"state": { "enum": ["tracking", "degraded", "unknown"] },
|
||||
"positionM": { "$ref": "#/$defs/positionVector" },
|
||||
"velocityMps": { "$ref": "#/$defs/velocityVector" },
|
||||
"covarianceDiagonalM2": { "$ref": "#/$defs/covarianceVector" },
|
||||
"confidence": { "$ref": "#/$defs/unit" },
|
||||
"posteriorEntropy": { "type": "number", "minimum": 0 },
|
||||
"signalQuality": { "$ref": "#/$defs/unit" },
|
||||
"modalityContributions": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["lidar", "csi"],
|
||||
"properties": { "lidar": { "$ref": "#/$defs/unit" }, "csi": { "$ref": "#/$defs/unit" } }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
132
docs/schemas/ruview-nlos-transient-v1.schema.json
Normal file
132
docs/schemas/ruview-nlos-transient-v1.schema.json
Normal file
@@ -0,0 +1,132 @@
|
||||
{
|
||||
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
||||
"$id": "https://ruview.ai/schemas/ruview-nlos-transient-v1.schema.json",
|
||||
"title": "RuView raw optical transient frame v1",
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": [
|
||||
"schema", "sessionId", "sequence", "capturedAtUnixMs", "monotonicNs", "source",
|
||||
"evidenceLevel", "binWidthPs", "startBin", "sensorPose", "calibrationHash", "provenance", "zones"
|
||||
],
|
||||
"properties": {
|
||||
"schema": { "const": "ruview.nlos.transient.v1" },
|
||||
"sessionId": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]+$" },
|
||||
"sequence": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
|
||||
"capturedAtUnixMs": { "type": "integer", "minimum": 0, "maximum": 9007199254740991 },
|
||||
"monotonicNs": { "type": "integer", "minimum": 0 },
|
||||
"source": { "enum": ["live", "replay", "synthetic"] },
|
||||
"evidenceLevel": { "enum": ["l0_synthetic", "l1_measured", "l2_calibrated"] },
|
||||
"binWidthPs": { "type": "number", "minimum": 1, "maximum": 10000 },
|
||||
"startBin": { "type": "integer", "minimum": 0, "maximum": 65535 },
|
||||
"sensorPose": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["translationM", "quaternionXyzw"],
|
||||
"properties": {
|
||||
"translationM": { "$ref": "#/$defs/vector" },
|
||||
"quaternionXyzw": {
|
||||
"type": "array", "minItems": 4, "maxItems": 4,
|
||||
"items": { "type": "number", "minimum": -1, "maximum": 1 }
|
||||
}
|
||||
}
|
||||
},
|
||||
"calibrationHash": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
|
||||
"provenance": {
|
||||
"type": "object",
|
||||
"additionalProperties": false,
|
||||
"required": ["sensorId", "sensorModel", "firmwareVersion", "transientKind", "histogramPreserved", "transport"],
|
||||
"properties": {
|
||||
"sensorId": { "$ref": "#/$defs/label" },
|
||||
"sensorModel": { "$ref": "#/$defs/label" },
|
||||
"firmwareVersion": { "$ref": "#/$defs/label" },
|
||||
"transientKind": { "enum": ["raw_histogram", "compact_normalized_histogram", "depth_only", "replay"] },
|
||||
"histogramPreserved": { "type": "boolean" },
|
||||
"transport": { "enum": ["usb_serial", "ruview_server", "replay"] }
|
||||
}
|
||||
},
|
||||
"zones": {
|
||||
"type": "array", "minItems": 1, "maxItems": 64,
|
||||
"items": {
|
||||
"type": "object", "additionalProperties": false,
|
||||
"required": ["zoneId", "wallPointM", "distanceM", "ambient", "histogram"],
|
||||
"properties": {
|
||||
"zoneId": { "type": "integer", "minimum": 0, "maximum": 63 },
|
||||
"wallPointM": { "$ref": "#/$defs/vector" },
|
||||
"distanceM": { "type": "number", "minimum": 0.01, "maximum": 10 },
|
||||
"ambient": { "type": "integer", "minimum": 0, "maximum": 4294967295 },
|
||||
"histogram": {
|
||||
"type": "array", "minItems": 8, "maxItems": 128,
|
||||
"items": { "type": "integer", "minimum": 0, "maximum": 65535 }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"allOf": [
|
||||
{
|
||||
"if": { "properties": { "source": { "const": "synthetic" } }, "required": ["source"] },
|
||||
"then": {
|
||||
"properties": {
|
||||
"evidenceLevel": { "const": "l0_synthetic" },
|
||||
"calibrationHash": { "const": "0000000000000000000000000000000000000000000000000000000000000000" },
|
||||
"provenance": {
|
||||
"properties": {
|
||||
"transientKind": { "const": "replay" },
|
||||
"transport": { "const": "replay" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": { "properties": { "source": { "const": "live" } }, "required": ["source"] },
|
||||
"then": {
|
||||
"properties": {
|
||||
"evidenceLevel": { "enum": ["l1_measured", "l2_calibrated"] },
|
||||
"provenance": {
|
||||
"properties": {
|
||||
"transientKind": { "enum": ["raw_histogram", "compact_normalized_histogram"] },
|
||||
"histogramPreserved": { "const": true },
|
||||
"transport": { "enum": ["usb_serial", "ruview_server"] }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": { "properties": { "source": { "const": "replay" } }, "required": ["source"] },
|
||||
"then": {
|
||||
"properties": {
|
||||
"provenance": {
|
||||
"properties": {
|
||||
"transientKind": { "const": "replay" },
|
||||
"histogramPreserved": { "const": true },
|
||||
"transport": { "const": "replay" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"if": {
|
||||
"properties": { "evidenceLevel": { "const": "l2_calibrated" } },
|
||||
"required": ["evidenceLevel"]
|
||||
},
|
||||
"then": {
|
||||
"properties": {
|
||||
"calibrationHash": {
|
||||
"not": { "const": "0000000000000000000000000000000000000000000000000000000000000000" }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"$defs": {
|
||||
"label": { "type": "string", "minLength": 1, "maxLength": 64, "pattern": "^[A-Za-z0-9_.:-]+$" },
|
||||
"vector": {
|
||||
"type": "object", "additionalProperties": false,
|
||||
"required": ["x", "y", "z"],
|
||||
"properties": { "x": { "type": "number" }, "y": { "type": "number" }, "z": { "type": "number" } }
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user