In
--guided mode the CLI first asks you to hold every selected joint somewhere inside its operating range (away from the end stops) and press Enter once — it captures each joint’s in-range start reference concurrently. It then walks the selected arm joints one at a time (the gripper is auto-calibrated at runtime): for each, move it to the prompted end stop and press Enter. If the motion is in the expected direction the zero is committed immediately. If you moved the wrong way, the CLI keeps your starting reference and asks you to travel to the other end stop instead; pressing Enter there sets the zero. Press Ctrl-C to skip a joint.
wrist_2 and wrist_3 are special: their end stops are the only ones that are not laser-aligned, so per unit one stop can be better placed than the other. For these two joints the guided flow accepts either end stop — move to whichever you trust and press Enter. Which side a robot was zeroed at is detected automatically at runtime from the encoder reading (zeroed at the upper stop, all readings are ≤ 0; at the lower stop, ≥ 0), so no side has to be recorded anywhere and robots zeroed by the older forced-side flow keep working unchanged. The only requirement: don’t park these joints exactly at an end stop when connecting, since that one position is ambiguous.
After
--guided calibration each motor’s encoder zero coincides with its calibration end stop. AxolArm carries a per-joint offset internally so the public API (positions, motion_control, etc.) stays in joint frame (0 = rest position); for wrist_2/wrist_3 the offset’s sign is detected from the encoder at connect time. Damiao motors (WRIST_2, WRIST_3) need a power cycle for the new zero to take effect.