in the front end API, we have to split between pipetting channels and arms because they do different thing. It’s nice to be able to pass capabilities around as those are the universal interfaces. It’s nice to be able to pass the core gripper arm (transient object) to functions that require an arm
(the machine specific state tracking will need to be tracked by the backend)
In the front end API you are going by capabilities, but what if an arm has the capability to pipette? What if we were to integrate a 6-axis arm that had a automatic tool changer, it could do both pipetting and movement. (i.e. Trilobio has a tool changer on their liquid handler 4 axis arm). This is now no longer an “arm” which its capability is moving plates and it is not longer a channel as it can also move plates! It is both! This is also technically what the CO-RE grips are… they are pipette channels on an arm that can move plates.
An arm has an end-effector that defines its capability, not the way it moves defining it’s capability.
should it not be something like:
star.gantryarm.ichannels
star.gantryarm.iswap
Maybe this just makes things pedantic and hard to share resources?
An arm has an end-effector that defines its capability
Yes, in physical reality that’s the closest since every machine essentially either has a gantry or joint arm. But the question is whether we should model these robots down to that level. Maybe later it will turn out we will benefit from that. For now I am thinking about “abstractions as they functionally occur”, like the arm capability just means resource movement, the liquid handler capability means tip handling and liquid handling. These capabilities are easy to pass around and use in writing robot agnostic code.
Joints are not useful on the front end since they return robot specific values. There is no potential for making it hardware agnostic. You cannot pick up resources at joint locations because we model everything as cartesian since it is universal. Backends will still expose pick_up_at_joint_position, but will have to use _begin_holding_assign_after_drop etc. separately to do the resource updates. (will be relatively straightforward after we have nice abstractions for arm state updates, we currently do not have that in v0.2)