Part II: Teleoperation and data collection · §22 of 43

zeus (as cabled now)

CAN adapter: a single PEAK PCAN-USB Pro FD (peak_usb driver) with two channels. It always creates can0 for channel 1 and can1 for channel 2, so the names are stable. The cables are in the opposite order to the ROS 2 defaults:

Physical armFollower busMini port (stable path)
Leftcan0 (PCAN Ch1)/dev/serial/by-id/usb-1a86_USB_Single_Serial_5876043720-if00
Rightcan1 (PCAN Ch2)/dev/serial/by-id/usb-1a86_USB_Single_Serial_5876043592-if00

How zeus is cabled: one PCAN adapter, two channels, one per follower arm. The Minis connect over USB serial by stable path.

flowchart LR
  pcan["PCAN-USB Pro FD<br/>peak_usb"]:::hw
  pcan ==>|Ch1| c0["can0"] ==> la["left follower"]:::arm
  pcan ==>|Ch2| c1["can1"] ==> ra["right follower"]:::arm
  ml["left Mini<br/>serial …043720"] -.->|teleop| la
  mr["right Mini<br/>serial …043592"] -.->|teleop| ra
  classDef hw fill:#c2410c1f,stroke:#c2410c
  classDef arm fill:#0f766e1f,stroke:#0f766e

Consequences:

  • LeRobot / zeus tools: left = can0, right = can1 (already the defaults in ~/Documents/openarm_lerobot).
  • ROS 2: every real-hardware launch needs right_can_interface:=can1 left_can_interface:=can0 (the defaults are the reverse). bash /root/scripts/openarm_launch.sh real passes them for you; a launch typed without them (2026-10-10) sent the right arm’s motions to the left arm. Identify the arms after every launch (§12.2).
  • If someone swaps the PCAN cables back to the ROS order (right on Ch1), change LEFT_CAN/RIGHT_CAN at the top of setup_openarm_lerobot.sh and the DEFAULTS in safe_teleop.py / compare_mini_follower.py, and drop the ROS arguments.
  • Never use /dev/ttyACM0/1 for the Minis: they’re numbered in plug order and swap. A swapped Mini inverts joints 2 and 7 (§18), and LeRobot writes the calibration offsets of one Mini into the other.
  • The CAN interfaces lose their configuration whenever the PCAN adapter is unplugged (they come back down: “Network is down”). Re-run setup_openarm_lerobot.sh (or lerobot-setup-can --mode=setup --interfaces=can0,can1).

Physically label both PCAN cables and both Minis left/right.

How to re-identify which is which

  • Follower bus: power only one arm and run lerobot-setup-can --mode=test --interfaces=can0,can1; only that arm’s interface reports motors. Or move one follower joint by hand while compare_mini_follower.py runs: the matching column changes.
  • Mini: unplug one Mini’s USB and see which entry disappears from ls /dev/serial/by-id/.