Add Legacy Starlet Support#1002
Conversation
|
Error with this running on non-legacy units. |
|
This PR works with firmware:
|
|
Swapped the |
b825083 to
85abf7f
Compare
|
could you please explain why you removed the 9mm check for the 2009 version? is it because the channels are in reverse order? |
|
also I am understanding correctly with the channels being reversed, channel 0 is now at the front of the robot? while this makes more sense, I would actually propose just unifying this in PLR so that channel 0 always refers to the back. we have done this for all robots so far, based on this being the case historically. I would propose also doing it for this older firmware version (abstracting over their api) so that code works more smoothly between different firmware versions and with the shared plr logic |
1a5db95 to
c1ac38f
Compare
The 9mm bypass was an accidental legacy-firmware relaxation. The legacy firmware errs when aspirating from troughplates. I can do one tip-at-a-time, but never all tips simultaneously from a troughplate. The PR has been rolled back. |
grippers work CORE8 successful, but resource min spacing error in troughplates
It's a game of whack-a-mole determining which parameters are accepted by the legacy firmware and which commands are not. H0DQ is a pre-pickup dispensing-drive move. Modified so that it only runs on firmware that supports it. po gating applied with aspirate and dispense. legacy firmware command tests to assert legacy PIP AS omits po, gi, gj, gk, lk, ik, sd, se, sz, and io.
c1ac38f to
8c66d05
Compare
Nice catch, Rick. I don't know how the channels got reversed. Again, I think this was a unintended modification committed during troubleshooting. |
|
I found unintended changes in the original branch, so I rebuilt this PR branch from the verified minimal legacy-firmware update. The diff is now limited to STAR_backend.py and STAR_tests.py, preserving the legacy Starlet compatibility behavior while removing unrelated changes. I force-updated the branch with --force-with-lease to keep the existing PR discussion and CI context attached to the clean version. @rickwierenga , will you kindly review? |
|
|
||
| def _pip_y_bounds(self) -> Tuple[float, float]: | ||
| """Return PIP Y bounds as a normalized ``(min_y, max_y)`` tuple.""" | ||
| min_y = self.extended_conf.left_arm_min_y_position | ||
| max_y = self.extended_conf.pip_maximal_y_position | ||
| return min(min_y, max_y), max(min_y, max_y) |
There was a problem hiding this comment.
why would the max y be lower than min y? i do not understand why they are being compared here
There was a problem hiding this comment.
why would the max y be lower than min y? i do not understand why they are being compared here
Normally it should not be. This is handling a legacy STARlet firmware quirk we observed on hardware: the extended configuration can report invalid/reversed PIP Y bounds, for example left_arm_min_y_position = 606.5 and pip_maximal_y_position = 6.0.
That bad interval made ensure_can_reach_position() reject valid CORE8 positions during tip pickup. _normalize_extended_configuration_y_bounds() fixes the known invalid values during setup, and _pip_y_bounds() defensively returns the bounds as an ordered (min_y, max_y) tuple for reachability/safety call sites.
So the comparison is not because max is expected to be lower than min on valid firmware; it is there to tolerate bad legacy firmware-reported bounds without disabling the reachability guard entirely.
There was a problem hiding this comment.
is that the only problem or are the channels actually reversed as originally reported? does higher y still mean towards the back of the robot? is channel 0 still the backmost channel?
There was a problem hiding this comment.
I ran a hardware confirmation script on the legacy STARlet to answer the channel/Y-axis questions directly.
This PR does not reverse channel order or change the deck coordinate model. After setup, the legacy firmware-reported PIP Y bounds were normalized to:
left_arm_min_y_position:6.00 mmpip_maximal_y_position:606.50 mm- normalized interval:
(6.00, 606.50) mm
So the change is only correcting invalid firmware-reported bounds before reachability checks.
For CORE8 channel mapping, PLR mapped tip_rack_1000["A8:H8"] with use_channels=[0..7] as:
- channel 0 -> A8, Y
337.8 mm - channel 1 -> B8, Y
328.8 mm - channel 2 -> C8, Y
319.8 mm - channel 3 -> D8, Y
310.8 mm - channel 4 -> E8, Y
301.8 mm - channel 5 -> F8, Y
292.8 mm - channel 6 -> G8, Y
283.8 mm - channel 7 -> H8, Y
274.8 mm
This confirms:
- channels are not reversed
- higher Y is still treated as toward the back of the robot
- channel 0 remains the backmost channel
I also checked that the reachability guard was not bypassed. Valid A8:H8 pickup targets all returned reachable=True, while deliberately invalid targets still failed:
- channel 0 at
y=-20.0 mm:reachable=False - channel 7 at
y=800.0 mm:reachable=False
So ensure_can_reach_position() remains active. This PR fixes bad legacy firmware inputs to the reachability logic; it does not suppress the guard or change channel numbering/direction.
This PR adds compatibility support for STARlet systems running May 2009 legacy firmware (6.2S 2009-05-04). It updates CoRe 8, CoRe 96, and CoRe gripper handling for older firmware command sets and reported geometry, and adds regression coverage for the legacy behaviors. On hardware, CoRe 8, CoRe 96, and CoRe gripper operations were verified to work.