-
Notifications
You must be signed in to change notification settings - Fork 179
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
sfoster1
wants to merge
8
commits into
edge
Choose a base branch
from
exec-80-deck-slot-defs-for-locating-features
base: edge
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from 5 commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
d8dea4b
feat(shared-data): add deck schema v6
sfoster1 f6b8a1e
Merge branch 'edge' into exec-80-deck-slot-defs-for-locating-features
sfoster1 5902ee4
don't need unitvector anymore
sfoster1 ff8782d
fixup: keep the version default
sfoster1 4af7431
fixup: add missing stacker configuration
sfoster1 340e366
update: make defs a little more complex
sfoster1 5feaee1
remove incorrect z=0 notes
sfoster1 e8264ae
ah, i see
sfoster1 File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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." | ||
} | ||
} | ||
} | ||
}, | ||
"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"] | ||
} | ||
} | ||
} |
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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:
Alternatively, I guess this documentation could live in the labware definition schema. I don't have a preference.
There was a problem hiding this comment.
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.