You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
5.8 KiB
5.8 KiB
Joint Calibration Log
Using simple basis change: R_delta_robot = R_basis @ R_delta_xr @ R_basis.T
Decomposition order for shoulders: YXZ Euler (matches URDF: pitch(Y), roll(X), yaw(Z))
l_shoulder_pitch (joint 15) - DONE
- Robot motion: sine ±0.6 rad, period 8s (arm forward/backward)
- XR parent-child: chest -> l_upper
- Result: Y component (YXZ Euler) correlates positively with robot motion
- Robot +0.57 → XR Y ≈ +0.3 to +0.6
- Robot -0.58 → XR Y ≈ -1.0 to -1.1
- Sign:
SIGN_SH_L[0] = +1(CORRECT, same sign) - Note: X (roll) had constant negative offset (~-0.4 to -0.8), likely natural arm rotation during pitch motion
l_shoulder_roll (joint 16) - DONE
- Robot motion: sine ±0.6 rad, period 8s (arm out to left side)
- XR parent-child: chest -> l_upper
- Result: Z component (YXZ Euler) correlates with robot roll, NOT X
- Robot +0.60 → Z ≈ +0.93 to +1.23
- Robot -0.60 → Z ≈ +0.05 (can't push arm into body)
- Sign: +1 (same sign)
- Important: This means YXZ Euler order may be wrong, or axis assignment needs swapping (roll=Z, yaw=X?)
l_shoulder_yaw (joint 17) - DONE
- Robot motion: sine ±0.4 rad, period 8s (upper arm twist inward/outward)
- XR parent-child: chest -> l_upper
- Result: X component (YXZ Euler) correlates negatively with robot yaw
- Robot +0.40 → X ≈ -0.90 to -0.98
- Robot -0.40 → X ≈ -0.001 to -0.09
- Sign: -1 (inverted)
LEFT SHOULDER SUMMARY
- Pitch → Y component of YXZ, sign +1
- Roll → Z component of YXZ, sign +1
- Yaw → X component of YXZ, sign -1
- Effective Euler order is YZX, not YXZ!
- Code fix:
as_euler('YZX')gives (pitch, roll, yaw) directly, with yaw negated
l_elbow (joint 18) - DONE
- Robot motion: sine ±0.7 rad, period 8s (elbow bend/extend)
- XR parent-child: l_upper -> l_lower
- Result: Z component (YXZ Euler) correlates positively with robot elbow
- Robot +0.69 → Z ≈ +0.82 to +0.92
- Robot -0.69 → Z ≈ -0.65 to -0.93
- Sign: +1 (same sign)
- Note: Currently code extracts Y[0] for elbow, should use Z[2]
r_shoulder_pitch (joint 22) - DONE
- Robot motion: sine ±0.6 rad, period 8s (right arm forward/backward)
- XR parent-child: chest -> r_upper
- Result: Y component (YXZ Euler) has weak positive correlation
- Large constant offset (~0.8 rad) - user's arm drifted forward
- Robot +0.6 → Y ≈ 0.92, Robot -0.6 → Y ≈ 0.76 (difference ~0.16)
- Sign: +1 (same as left, weak signal)
- Note: Right arm Quest tracking is significantly weaker than left
r_shoulder_roll (joint 23) - DONE
- Robot motion: sine ±0.6 rad, period 8s (right arm out to side)
- XR parent-child: chest -> r_upper
- Result: Z component (YXZ Euler) correlates (weak/intermittent signal)
- Robot -0.60 (arm out) → Z ≈ -0.82 to -0.96 (strong cycles)
- Robot +0.60 (arm in) → Z ≈ +0.07
- Sign: +1 (same sign)
- Note: Very noisy, right arm Quest tracking weak
r_shoulder_yaw (joint 24) - SKIPPED
- Assumed same as left: X component, sign -1 (right arm tracking too weak for subtle yaw)
r_elbow (joint 25) - DONE
- Robot motion: sine ±0.7 rad, period 8s (right elbow bend)
- XR parent-child: r_upper -> r_lower
- Result: ALL axes near zero (max ±0.07 despite ±0.7 robot motion)
- Quest right arm tracking is extremely weak - barely detects elbow bend
- Assumed: Same mapping as left elbow (Z component, sign +1)
EXTENT TUNING
l_shoulder_pitch (joint 15)
- Backward (positive): +0.8 rad (+45.8 deg) — OK
- Forward (negative): -2.4 rad (-137.5 deg) — OK
- Note: positive = backward, negative = forward for this joint
- Settings: amplitude=1.6, offset=-0.8
l_shoulder_roll (joint 16)
- Inward (negative): ~0 rad (0 deg) — just touching body, no clipping
- Outward (positive): +1.585 rad (+91 deg) — arm straight out to side
- Settings: amplitude=0.8, offset=0.785
- Note: needs outward bias to avoid body clipping
l_shoulder_yaw (joint 17)
- Inward (positive): +1.15 rad (+66 deg)
- Outward (negative): -1.15 rad (-66 deg)
- Settings: amplitude=1.15, offset=0.0
- Note: clips into body at rest pose but OK since other joints move arm away in practice
l_elbow (joint 18)
- Extend (negative): -0.8 rad (-45.8 deg)
- Bend (positive): +1.33 rad (+76.2 deg)
- Settings: amplitude=1.065, offset=0.265
- Note: positive = bend, negative = extend (opposite of label in joint_test.py)
l_wrist_roll (joint 19)
- Palm down (positive): +1.35 rad (+77.3 deg)
- Palm up (negative): -1.35 rad (-77.3 deg)
- Settings: amplitude=1.35, offset=0.0
- Note: positive = palm down, negative = palm up (opposite of label)
l_wrist_pitch (joint 20)
- Wrist down (positive): +0.8 rad (+45.8 deg)
- Wrist up (negative): -0.8 rad (-45.8 deg)
- Settings: amplitude=0.8, offset=0.0
- Directions confirmed correct
l_wrist_yaw (joint 21)
- Inward (negative): -1.28 rad (-73 deg)
- Outward (positive): +0.5 rad (+29 deg)
- Settings: amplitude=0.89, offset=-0.39
- Note: negative = inward, positive = outward
OVERALL AXIS MAPPING SUMMARY
After R_basis @ R_delta @ R_basis.T + as_euler('YXZ') → (Y, X, Z):
Shoulder (chest → upper_arm) — parent roughly upright:
- Robot pitch (Y joint) = Y component [0], sign +1
- Robot roll (X joint) = Z component [2], sign +1
- Robot yaw (Z joint) = X component [1], sign -1
Elbow (upper_arm → lower_arm) — parent hangs down:
- Robot pitch (Y joint) = Z component [2], sign +1
- Note: axis mapping differs from shoulder because parent orientation differs
Why axes differ per joint:
The basis change R_basis @ R_delta @ R_basis.T treats the delta as if in XR world-aligned frame,
but the delta is in the PARENT's local frame. When the parent hangs down (upper arm), its local
axes are rotated ~90° from world, causing the axis mapping to shift.