Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(shared-data): add deck schema v6 #17250

Draft
wants to merge 8 commits into
base: edge
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
508 changes: 508 additions & 0 deletions shared-data/deck/definitions/6/ot2_short_trash.json

Large diffs are not rendered by default.

508 changes: 508 additions & 0 deletions shared-data/deck/definitions/6/ot2_standard.json

Large diffs are not rendered by default.

1,612 changes: 1,612 additions & 0 deletions shared-data/deck/definitions/6/ot3_standard.json

Large diffs are not rendered by default.

352 changes: 352 additions & 0 deletions shared-data/deck/schemas/6.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,352 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "opentronsDeckSchemaV6",
"definitions": {
"positiveNumber": {
"type": "number",
"minimum": 0
},
"xyzArray": {
"type": "array",
"description": "Array of 3 numbers, [x, y, z]",
"items": { "type": "number" },
"minItems": 3,
"maxItems": 3
},
"coordinates": {
"type": "object",
"additionalProperties": false,
"required": ["x", "y", "z"],
"properties": {
"x": {
"type": "number"
},
"y": {
"type": "number"
},
"z": {
"type": "number"
}
}
},
"boundingBox": {
"type": "object",
"required": ["xDimension", "yDimension", "zDimension"],
"properties": {
"xDimension": { "$ref": "#/definitions/positiveNumber" },
"yDimension": { "$ref": "#/definitions/positiveNumber" },
"zDimension": { "$ref": "#/definitions/positiveNumber" }
}
},
"locatingFeature": {
"type": "object",
"required": ["locatingFeatureId", "offsetVector"],
"properties": {
"locatingFeatureId": {
"type": "string",
"description": "The name of a kind of locating feature that will be looked up in labware. Common ones are backLeft, frontLeft, wellA1, center, but others may be used."
},
"offsetVector": {
"$ref": "#/definitions/xyzArray",
"description": "A vector from the origin of the thing that has the locating feature (i.e. an addressable area) to the key point of the locating feature."
}
}
}
Copy link
Contributor

@SyntaxColoring SyntaxColoring Jan 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Locating feature names are not constrained to enums because we expect a fairly wide number of them.

I agree with not constraining them to enums, for versioning churn reasons, but I do think we'll need some central documented source that lists them all out and describes their semantics.

Like, what if we did something roughly like this:

"anyOf": [
  { "const": "backLeft": "description": "..."},
  { "const": "center": "description": "..."},
  { "type": "string", "description": "reserved for future expansion" }
]

Alternatively, I guess this documentation could live in the labware definition schema. I don't have a preference.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh definitely! I was trying to remember how to do this and couldn't haha. I'll add that.

},
"description": "Deck specifications, where x,y,z (0,0,0) is at front the bottom left corner.",
"type": "object",
"additionalProperties": false,
"required": [
"otId",
"schemaVersion",
"cornerOffsetFromOrigin",
"dimensions",
"metadata",
"robot",
"locations",
"cutoutFixtures"
],
"properties": {
"otId": {
"description": "Unique internal ID generated using UUID",
"type": "string"
},
"schemaVersion": {
"description": "Schema version of a deck is a single integer",
"enum": [6]
},
"cornerOffsetFromOrigin": {
"$ref": "#/definitions/xyzArray",
"description": "Position of left-front-bottom corner of entire deck to robot coordinate system origin"
},
"dimensions": {
"$ref": "#/definitions/xyzArray",
"description": "Outer dimensions of a deck bounding box"
},
"metadata": {
"description": "Optional metadata about the Deck",
"type": "object",
"properties": {
"displayName": {
"description": "A short, human-readable name for the deck",
"type": "string"
},
"tags": {
"description": "Tags to be used in searching for this deck",
"type": "array",
"items": {
"type": "string"
}
}
}
},
"robot": {
"type": "object",
"required": ["model"],
"properties": {
"model": {
"description": "Model of the robot",
"type": "string",
"enum": ["OT-2 Standard", "OT-3 Standard"]
}
}
},
"locations": {
"type": "object",
"required": [
"addressableAreas",
"calibrationPoints",
"cutouts",
"legacyFixtures"
],
"properties": {
"addressableAreas": {
"type": "array",
"items": {
"type": "object",
"description": "An addressable area is a named area in 3D space that the robot can interact with--for example, as a place to drop tips, or hold a labware.",
"required": [
"id",
"areaType",
"offsetFromCutoutFixture",
"boundingBox",
"displayName"
],
"properties": {
"id": {
"description": "Unique identifier for slot",
"type": "string"
},
"areaType": {
"description": "The type of addressable area, defining allowed behavior.",
"type": "string",
"enum": [
"slot",
"stagingSlot",
"movableTrash",
"fixedTrash",
"wasteChute",
"lidDock",
"absorbanceReader",
"temperatureModule",
"magneticBlock",
"thermocycler",
"heaterShaker",
"flexStacker"
]
},
"offsetFromCutoutFixture": {
"$ref": "#/definitions/xyzArray",
"description": "The offset from the origin of the cutout fixture that's providing this addressable area (which is currently identical to the position of the underlying cutout), to the -x, -y, -z corner of this addressable area's bounding box."
},
"locatingFeatures": {
"type": "array",
"items": {
"$ref": "#/definitions/locatingFeature",
"description": "A locating feature to which a labware can be related. The array is in order of preference."
}
},
"boundingBox": {
"description": "The active area (both pipettes can reach) of this addressable area.",
"$ref": "#/definitions/boundingBox"
},
"displayName": {
"description": "A human-readable nickname for this area e.g. \"Slot A1\" or \"Trash Bin in A1\"",
"type": "string"
},
"compatibleModuleTypes": {
"description": "OT-2 Only parameter. An array of module types that can be placed in this area. The module type names can be found in the moduleType field of a module definition.",
"type": "array",
"items": {
"type": "string"
}
},
"ableToDropTips": {
"description": "Whether tips are allowed to be dropped into this area. If `true`, the top-center of the `boundingBox` should be a good location for the bottom-center of all the tips when they're dropped.",
"type": "boolean"
},
"ableToDropLabware": {
"description": "Whether labware is allowed to be dropped (different from being placed) into this area. If `true`, the top-center of the `boundingBox` should be a good location for the bottom-center of the labware when it's dropped.",
"type": "boolean"
}
}
}
},
"calibrationPoints": {
"type": "array",
"description": "Key points for deck calibration",
"items": {
"type": "object",
"required": ["id", "position", "displayName"],
"properties": {
"id": {
"description": "Unique identifier for calibration point",
"type": "string"
},
"position": {
"$ref": "#/definitions/xyzArray"
},
"displayName": {
"description": "An optional human-readable nickname for this point Eg \"Slot 3 Cross\" or \"Slot 1 Dot\"",
"type": "string"
}
}
}
},
"cutouts": {
"type": "array",
"description": "The machined cutout slots on the deck surface.",
"items": {
"type": "object",
"required": ["id", "position", "displayName"],
"properties": {
"id": {
"description": "Unique identifier for the cutout",
"type": "string"
},
"position": {
"description": "Absolute position of the cutout",
"$ref": "#/definitions/xyzArray"
},
"displayName": {
"description": "An optional human-readable nickname for this cutout e.g. \"Cutout A1\"",
"type": "string"
}
}
}
},
"legacyFixtures": {
"type": "array",
"description": "Fixed position objects on the deck and fixture-dependant Module labware Eg Plate Reader Lid.",
"items": {
"type": "object",
"required": ["id", "displayName"],
"properties": {
"id": {
"description": "Unique identifier for fixed object",
"type": "string"
},
"labware": {
"description": "Valid labware loadName for fixed object",
"type": "string"
},
"slot": {
"description": "Slot location of the fixed object",
"type": "string"
},
"displayName": {
"description": "An optional human-readable nickname for this fixture Eg \"Tall Fixed Trash\" or \"Short Fixed Trash\"",
"type": "string"
}
}
}
}
}
},
"cutoutFixtures": {
"type": "array",
"items": {
"description": "A cutout fixture is a physical thing that can be mounted onto one of the deck cutouts.",
"type": "object",
"required": [
"id",
"expectOpentronsModuleSerialNumber",
"mayMountTo",
"displayName",
"providesAddressableAreas",
"fixtureGroup",
"height"
],
"properties": {
"id": {
"description": "Unique identifier for the cutout fixture.",
"type": "string"
},
"expectOpentronsModuleSerialNumber": {
"description": "Determines whether or not a fixture expects a serial number for a connected Opentrons Module.",
"type": "boolean"
},
"mayMountTo": {
"description": "A list of compatible cutouts this fixture may be mounted to. These must match `id`s in `cutouts`.",
"type": "array",
"items": {
"type": "string"
}
},
"displayName": {
"description": "A human-readable nickname for this area e.g. \"Standard Right Slot\" or \"Slot With Movable Trash\"",
"type": "string"
},
"providesAddressableAreas": {
"description": "The addressable areas that this cutout fixture provides, when it's mounted. It can provide different addressable areas depending on where it's mounted. Keys must match values from this object's `mayMountTo`. Values must match `id`s from `addressableAreas`.",
"type": "object",
"additionalProperties": {
"type": "array",
"items": {
"type": "string"
}
}
},
"fixtureGroup": {
"description": "The map of fixtures that must exist in the deck configuration if this fixture exists, with the mounting location acting as a key to determine the location of the rest of the group.",
"type": "object",
"additionalProperties": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {
"type": "string"
}
}
}
},
"height": {
"description": "The vertical distance (mm) from the cutout fixture's origin to its tallest physical feature that an instrument could collide with.",
"type": "number"
}
}
}
},
"gripperOffsets": {
"type": "object",
"description": "Offsets to be added when calculating the coordinates a gripper should go to when picking up or dropping a labware on this deck.",
"properties": {
"default": {
"type": "object",
"properties": {
"pickUpOffset": {
"$ref": "#/definitions/coordinates",
"description": "Offset added to calculate pick-up coordinates of a labware placed on this deck."
},
"dropOffset": {
"$ref": "#/definitions/coordinates",
"description": "Offset added to calculate drop coordinates of a labware placed on this deck."
}
},
"required": ["pickUpOffset", "dropOffset"]
}
},
"required": ["default"]
}
}
}
Loading
Loading