IPG Module
The IPG (Integrated Plate Gripper) is the plate transport arm on the Hamilton Microlab Vantage. It picks up and places microplates between positions on the deck.
Prerequisites
- A switched on Microlab Vantage device with IPG installed
- A plate carrier and a plate on the deck
- A running Microlab Vantage connector
- Basic understanding of how labware is used (See the using standard labware tutorial)
- Basic understanding of labware transports (See the labware transport guide)
Grip Parameters
Grip Height and Width
Grip height and grip width are read from the labware definition — grab_height sets the vertical grip position (distance from the top of the plate), and grip width is taken from labware.dimensions.x or .y depending on the gripper orientation. See the plates guide for how these fields are defined on a labware class.
Grip Direction
The IPG arm position and gripper orientation are encoded together in the GripDirection enum, accessible via IPG.GripDirection. The first letter is the arm position (R=Right, F=Front, L=Left, B=Back) and the second is the gripper orientation.
from unitelabs.liquid_handling.hamilton import Vantage
# GripDirection is accessible as a class attribute on the IPG
# e.g. vantage.ipg.GripDirection.LR (arm Left, gripper facing Right)
When only an arm position matters (gripper orientation preserved from current hardware state), use IPG.ArmPosition:
# vantage.ipg.ArmPosition.LEFT
Passing None for a direction uses the IPG's current orientation.
These values are passed to the pick_up_direction and drop_direction parameters of transfer(), pick_up_from(), and put_down() described in the sections below.
For example, to approach from the right when picking up and drop from the front:
await vantage.ipg.transfer(
labware=plate,
target=plate_carrier[1],
pick_up_direction=vantage.ipg.GripDirection.RL, # arm Right, gripper facing Left
drop_direction=vantage.ipg.GripDirection.FF, # arm Front, gripper facing Front
)
pick_up_direction and drop_direction carefully to avoid collision of arm and gripper with carriers, labware, and other deck components. Always verify directions against your deck layout before running a protocol. Make sure there are no deck components higher than traverse_height on your instrument.Basic Setup
from unitelabs.liquid_handling.hamilton import Vantage
from unitelabs.labware import Standard96Plate
from unitelabs.labware.hamilton import PLT_CAR_L5MD_A0
vantage = Vantage(name="Microlab Vantage")
await vantage.configure()
await vantage.initialize()
plate_carrier = PLT_CAR_L5MD_A0()
plate = Standard96Plate()
plate_carrier[0] = plate
vantage.deck.add(plate_carrier, track=10)
Labware transport
Transfer Labware
transfer() is the most common IPG operation; it picks up labware from its current location and places it at a target carrier site in a single call. Minimally, only labware and target parameters are required:
await vantage.ipg.transfer(
labware=plate,
target=plate_carrier[1],
)
To control approach and drop directions, the optional parameters pick_up_direction and drop_direction can be used (see Grip Direction). This is important to avoid collisions with other deck components.
await vantage.ipg.transfer(
labware=plate,
target=plate_carrier[1],
pick_up_direction=vantage.ipg.GripDirection.LR,
drop_direction=vantage.ipg.ArmPosition.LEFT,
)
transfer_from() is a variant that takes a source carrier site instead of a labware reference — useful when you want to move whatever plate occupies a slot without holding a Python reference to it.
await vantage.ipg.transfer_from(
source=plate_carrier[0],
target=plate_carrier[1],
)
Pick Up and Put Down Separately
For more control, pick_up() and put_down() can be called independently. Use pick_up_from() when working with a carrier site, or pick_up() when you already hold a reference to the labware object.
# Pick up from a carrier site
await vantage.ipg.pick_up_from(
source=plate_carrier[0],
pick_up_direction=vantage.ipg.GripDirection.RL,
)
# Pick up by labware reference
await vantage.ipg.pick_up(
labware=plate,
pick_up_direction=vantage.ipg.ArmPosition.RL,
)
# Put down onto a carrier site
await vantage.ipg.put_down(
target=plate_carrier[2],
drop_direction=vantage.ipg.GripDirection.RR,
)
Transfer parameters
Parameters for transfer() and transfer_from() methods. pick_up(), pick_up_from() and put_down() use the relevant subset of these parameters.
| Parameter | Default | Description |
|---|---|---|
labware / source | — | The labware object (transfer) or source carrier site (transfer_from) to pick up. |
target | — | The carrier site or plate where to put the labware down. |
pick_up_direction | None | Approach direction for pick-up. Accepts GripDirection (arm + gripper orientation), ArmPosition (arm only, gripper orientation preserved from hardware state), or None (current direction used for both pick-up and drop). |
drop_direction | None | Approach direction for drop. Same options as pick_up_direction. Defaults to the resolved pick_up_direction when None. |
strength | 100 | Grip strength in 0.1 N units (range 0–160, i.e. 0–16 N). |
pick_up_offset | None | Vector(dx, dy, dz) offset in mm applied to the pick-up position. |
drop_offset | None | Vector(dx, dy, dz) offset in mm applied to the drop position. |
width_offset | 0 | Offset in mm added to the grip width derived from the labware dimensions. |
grip_gap | 6 | Initial and final gap in mm between gripper in open state and labware. |
min_traverse_height | None | Minimum safe traverse height in mm. Defaults to the system value. |
IPG Operations
Recovery with drop_labware
drop_labware() was introduced in LHSDK version 0.30.0 and allows the user to discard the currently held labware at the current gripper location. It opens the gripper fingers by a small amount at a time and does not require the IPG to be initialized. Use to recover after a run abort that left a plate gripped in the IPG fingers. You might need to run the command multiple times, as it only opens gripper fingers a small amount at a time.
dropped = await vantage.ipg.drop_labware()
drop_labware() releases the plate at whatever position the IPG is currently in and can result in spillage or sample loss. Only use it as a recovery action, not as a substitute for put_down().Home IPG
When you are done, using any other tool (e.g. the pipettes) will return the IPG back to its home position. You can also home IPG explicitly:
await vantage.ipg.home()
IPG State
Query the current hardware state of the IPG:
await vantage.ipg.has_labware() # True if the gripper is holding a plate
await vantage.ipg.current_location() # Vector with the gripper center's absolute position
await vantage.ipg.current_direction() # GripDirection the gripper is currently facing
await vantage.ipg.current_grip_width() # Current distance between gripper fingers in mm
IPG Positioning
move_to() and move_by() give direct control over the gripper position. The IPG must be active (i.e. holding labware or explicitly activated).
from unitelabs.labware import Vector
await vantage.ipg.move_to(location=Vector(x=200, y=200, z=300))
await vantage.ipg.move_by(offset=Vector(x=10, y=0, z=0))
Manual Gripper Width Control
Sometimes it is necessary to manually control the gripper fingers width, for example for teaching.
open_to() and close_to() move the gripper fingers to an absolute width. open_by() and close_by() move them relative to the current width.
# Move fingers to an absolute width in mm
await vantage.ipg.open_to(110)
await vantage.ipg.close_to(100)
# Move fingers relative to the current width
await vantage.ipg.open_by(10)
await vantage.ipg.close_by(10)
open_to() releases any labware currently held by the gripper. close_to() raises a RuntimeError if labware is currently held by the IPG. This prevents accidental damage to the IPG as the command performs an unconditional finger move without gripping logic. The optional strength parameter is accepted for API parity with the iSWAP, but is not used by the IPG implementation.