Skip to content
This repository was archived by the owner on Aug 21, 2026. It is now read-only.

feat(lumi-final): update calibration and recordings for lumi_final - #174

Open
kyle-aus wants to merge 17 commits into
mainfrom
feat/lumi-final
Open

feat(lumi-final): update calibration and recordings for lumi_final#174
kyle-aus wants to merge 17 commits into
mainfrom
feat/lumi-final

Conversation

@kyle-aus

@kyle-aus kyle-aus commented Jun 9, 2026

Copy link
Copy Markdown
Collaborator

update mechanics

  • Replace follower/leader calibration JSONs with lumi_final servo values (homing offsets and range min/max from /home/orangepi/.cache)
  • Scale wrist_pitch in 7 recordings by 0.461 to fit lumi_final narrower physical range (55.8 degrees vs 113 degrees on original hardware)
  • Update calibration.md: document per-device cache paths and deploy commands for orangepi-user devices

kyle-aus added 17 commits June 9, 2026 12:47
…chanics

- Replace follower/leader calibration JSONs with lumi_final servo values
  (homing offsets and range min/max from /home/orangepi/.cache)
- Scale wrist_pitch in 7 recordings by 0.461 to fit lumi_final narrower
  physical range (55.8 degrees vs 113 degrees on original hardware)
- Update calibration.md: document per-device cache paths and deploy commands
  for orangepi-user devices
…int limits

AIM_WALL wrist_pitch -60 -> -55.78 deg
AIM_DOWN elbow_pitch 90 -> 70.4 deg, wrist_pitch -90 -> -55.78 deg
servo.py rest_pos elbow_pitch 90 -> 70.4 deg
New follower limits from fresh calibration:
  wrist_pitch +-47.82 deg (was +-55.78)
  base_pitch  +-61.93 deg (was +-98.8)
  elbow_pitch +-62.90 deg (was +-70.4)

- Re-scale wrist_pitch in 7 recordings from originals (scale 0.3956)
- Clamp AIM_DOWN base_pitch -90->-61.93, elbow_pitch 70.4->62.9
- Clamp AIM_WALL/AIM_DOWN wrist_pitch to +-47.82
- Clamp rest_pos base_pitch and elbow_pitch to new limits
After release, torque is disabled and the arm falls to a physical position
that differs from the last known _current_state. Without syncing hardware
state, the first interpolation step snaps the arm to the stale rest_pos.

Also doubles the interpolation duration (10s vs 5s) on resume so the arm
eases back into idle at half speed as requested.
…ondition

The previous attempt set _interpolation_frames=300 (2x duration) but the
progress formula kept dividing by self.duration*fps=150, causing progress
to be negative (clamped to 0) for the first 150 frames. Result: arm
froze for 5 seconds then moved at full speed — perceived as a huge jump.

Fix: store _interpolation_total_frames alongside _interpolation_frames so
the denominator always matches the intended total, regardless of duration.

Also reorder resume_servos to sync hardware state and queue the play event
before starting the event thread, eliminating the race where _continue_playback
could overwrite _current_state before _handle_play reads it.
…_final

Previous values (-61.93 / 62.9) caused a visible drop when torque was cut
because the arm hadn't settled to its gravity floor. New values (-75.88 / 62.4)
match the actual resting position so there is no movement on release.
…tion range

lerobot clips commanded positions to range_min/max, which prevented base_pitch,
elbow_pitch, and wrist_pitch from reaching the natural gravity-rest position.

Add AnimationService.move_to_unclamped() that computes raw encoder targets from
the calibration mid-point and writes Goal_Position directly via scservo_sdk,
bypassing the software clamp while still using the same degree→raw formula.

Update release rest_pos to the measured gravity-rest position of lumi_final
(base_pitch=-75.26, elbow_pitch=-65.02, wrist_pitch=-79.83) and switch
release_servos() to use move_to_unclamped.
…uted encoder targets

move_to_unclamped accessed robot.bus.calibration which may not exist in the
installed lerobot version, causing a silent exception and immediate torque cut.

move_to_raw takes pre-computed raw encoder values (motor_name -> int) and uses
direct STS3215 Goal_Position writes (reg 42) without any bus.calibration access.
release_servos now passes hard-coded raw targets computed from the calibration JSON.
…before idle

After release, servo/resume now:
1. Re-enables torque via _configure_servos_raw
2. Moves all joints to RESUME_STARTUP_RAW over 5s (blocking)
3. Then enters idle animation with normal interpolation

RESUME_STARTUP_RAW: base_yaw=2109 (5.96°), base_pitch=2105 (-18.20°),
elbow_pitch=2233 (-11.68°), wrist_roll=2070 (0°), wrist_pitch=1809 (-68.48°).
wrist_pitch exceeds calibrated range so move_to_raw is used for direct writes.

Also updates start() to use move_to_raw with RESUME_STARTUP_RAW instead of
the old 2-joint STARTUP_POSITION, giving all servos a defined boot position.
Zero now moves to the measured resting position after release rather than
all-joints-0. Uses move_to_raw (bypasses calibration clamp) since
wrist_pitch (-59.18deg, raw 1914) exceeds calibrated range_min=2044.
Also adds _configure_servos_raw before the move to ensure torque is on.

ZERO_RAW: base_yaw=2100, base_pitch=2091, elbow_pitch=2276,
          wrist_roll=2070, wrist_pitch=1914
Matches physical rest position observed on lumi_final hardware.
…on before torque cut

- resume_servos: always stop and join the event loop before calling
  move_to_raw to prevent concurrent bus writes from the animation
  thread thrashing the STS3215 serial bus
- release_servos: poll PRESENT_POSITION for up to 3s after move_to_raw
  to confirm all joints physically reached rest_raw before disabling
  torque — prevents uncontrolled drop when a joint lags under load
leo-super-dev added a commit to autonomous-ai/autonomous-os that referenced this pull request Jun 10, 2026
leo-super-dev added a commit to autonomous-ai/autonomous-os that referenced this pull request Jun 10, 2026
leo-super-dev added a commit to autonomous-ai/autonomous-os that referenced this pull request Jun 10, 2026
leo-super-dev added a commit to autonomous-ai/autonomous-os that referenced this pull request Jun 10, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant