Skip to content

Every factory-offset joint is clamped exactly ON its encoder seam — #35 may affect all six #43

Description

@OriNachum

The finding

Probing all six joints by feel (gentle_move driven to each end of its permitted range),
three of them reached the software bound with no contact — still free — and stopped this
close to the encoder seam:

joint reported → raw seam @ raw gap outcome
shoulder_lift 4094 83 85 2 ticks no wall
gripper 4093 82 85 3 ticks no wall
shoulder_pan 4085 74 85 11 ticks no wall

No contact means they could have kept going. Their remaining travel lies across the seam.

Why this is structural, not coincidence

Every joint except elbow_flex still carries the factory offset Ofs = 85. The
commandable bound is reported tick 4095. With Ofs = 85 that is raw 84 — exactly
one tick below the seam, which lives at raw == Ofs == 85.

For every joint at the factory offset, the software bound lands precisely on the seam.

So the arm has been reporting the seam as its boundary. We could not see past it, so we
could not know any of these joints' real ranges. elbow_flex is the only honest row in that
table — real walls at both ends (raw 983 and 3267), with 829 ticks of clearance from its seam —
and only because #35's re-zero moved its seam out of its travel.

Direct physical confirmation

shoulder_lift was left at reported 4094 by a probe. Torque released, and it sagged
under gravity through the seam
— it now reads 2 (raw 87). Nothing commanded it there.
Its travel demonstrably includes the seam.

What this means

The chicken-and-egg, and the way out

To re-zero a joint you need its unreachable arc; you cannot measure the arc until you can see
past the seam. The escape (already proven on elbow_flex): temporarily shift the offset so
the seam moves out of reach, probe freely to find the true travel, then compute the permanent
offset from that
— and restore it if you decide not to commit.

Three probe lessons worth encoding in whatever verb does this

  1. Creep outward; do not command the bound. Shifting the offset also flips which reported
    direction maps to which physical direction, so "drive to reported 4095" can mean "drive
    back into the wall you just found". Stepping outward from the current position is immune.
  2. "Not contacted" is not "no wall". A move can also time out — it could not get there and
    we learned nothing. Conflating that with "reached the bound" silently turns ignorance into a
    measurement. Three outcomes must stay distinct: WALL / EDGE / TIMEOUT.
  3. Mechanical vs environmental. A limit found in one pose is environmental — it is what the
    joint can do given where every other joint happens to be. The mechanical limit is the
    widest envelope ever seen across poses, since an obstacle can only ever make a range smaller.
    Mechanical limits belong in arm_spec (intrinsic, portable); environmental limits belong in
    the map (pose-dependent — and never in the servo's EEPROM).

elbow_flex's walls were confirmed mechanical by this test: probed in three poses
(shoulder_lift 3354 vs 3779, wrist_flex 3963 vs 1366), the wall moved by ≤4 ticks while other
joints moved by hundreds.

Related

Found during the hardware session that proved #35's re-zero — see
docs/hardware-rezero-run-2026-07-12.md. Blocks meaningful progress on #34, since the grid
cannot map a joint-space whose per-joint extents are artifacts.

Metadata

Metadata

Assignees

No one assigned

    Labels

    measurement-integrityThe instrument may be lying — a wrong number here becomes a permanent false fact

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions