---
name: project_smith300_rebuild
description: "Smith300-faithful arm rebuild from our locked parts; key learning = our vs smith300 servo STLs are different models, so align by KINEMATICS not mesh registration"
metadata: 
  node_type: memory
  type: project
  originSessionId: f6b5d2b8-94fd-4193-ba95-68aa32076e95
---

Rebuilding a faithful smith300-layout arm from our LOCKED parts ([[project_locked_base_parts]]),
in `/data/cameron/repos/smith300_para_stuff/param_smith_arm.py` (separate from the finished
clean-modular `param_arm.py`).

**Key learning (2026-06-24):** our servo `st3215.stl` (19151 verts, 42537mm3, from the correct STEP)
and smith300's `sts3215_03a_v1.stl` (9526 verts, 36215mm3) are DIFFERENT CAD models — no exact rigid
transform aligns them. So mesh registration (servo_align.py) was a dead end. **Use OUR model only.**

**Approach (corrected, Cameron 2026-06-24):** do NOT hardcode smith300's joint rpy onto our servos
(makes joints move right but servo bodies physically implausible = a hack). Instead build a CLEAN MODULAR
chain from our parts where **each joint axis = our servo's own output (+Y)** (physically correct), then
reproduce smith300's joint-axis RELATIONSHIPS (relative rotation between consecutive joint axes, from
smith300.urdf FK) via the CONNECTOR orientations — smith300 as a GUIDE for the DOF variety only. Result:
smith300-like varied DOF, every servo mounted sensibly. Drop mesh registration + smith300 servo mesh
entirely. Full detail in vault `agents/cad/robot_build_state.md` RESUME-HERE block.

**DONE (2026-06-24):** implemented as `param_smith_arm.py` -> `smith300_faithful.urdf`. The connector
rotation is a clean CONJUGATION: `R_our = C^-1 @ R_smith @ C`, C=Rx(90deg) (our +Y -> smith300 +Z).
`compute_bends.py` derives + verifies the bends (consecutive joint-axis angles match smith300 exactly:
90,0,0,90,90,0). Clean modular chain, 0 self-collision over full joint sweep. Pinged Cameron to verify
shape/plausibility before tuning lift direction + connector geometry + 7-link fidex regen.
