All I2RT arms and the Flow Base communicate over CAN bus at 1 Mbit/s. Each arm requires one USB-CAN adapter (CANable or compatible).
# Check which CAN devices are detected
ls -l /sys/class/net/can*
# Bring up the interface at 1 Mbit/s
sudo ip link set can0 up type can bitrate 1000000Install the provided udev rule so CAN interfaces come up automatically:
sudo sh devices/install_devices.shThis installs a udev rule that runs ip link set ... up for every interface whose name starts with can*.
::: warning Persistent CAN IDs
If you later assign persistent names (e.g. can_follower_l), you may need to update the udev rule to match. See Persistent CAN IDs.
:::
If a CAN device becomes unresponsive:
sh scripts/reset_all_can.shIf you see RTNETLINK answers: Device or resource busy, unplug and replug the USB adapter.
For multi-arm setups (e.g. YAM Cell with 4 arms), assign deterministic names to each adapter using udev rules based on the USB device's serial number or path.
::: tip CANable firmware Visit canable.io/updater to flash candlelight firmware if needed. YAM ships with candlelight pre-flashed. :::
ls -l /sys/class/net/can*
# lrwxrwxrwx ... /sys/class/net/can0 -> ../../devices/.../can0
# lrwxrwxrwx ... /sys/class/net/can1 -> ../../devices/.../can1Plug adapters one at a time and note the serial for each:
udevadm info -a -p /sys/class/net/can0 | grep -i serialsudo vim /etc/udev/rules.d/90-can.rulesAdd one line per adapter:
SUBSYSTEM=="net", ACTION=="add", ATTRS{serial}=="004E00275548501220373234", NAME="can_follower_l"
SUBSYSTEM=="net", ACTION=="add", ATTRS{serial}=="0031005F5548501220373234", NAME="can_follower_r"
::: warning Name length limit
Interface names must start with can and be 13 characters or fewer.
:::
sudo udevadm control --reload-rules && sudo systemctl restart systemd-udevd && sudo udevadm triggerUnplug and replug each adapter, then verify:
ip link showYou should see the named interfaces (can_follower_l, etc.) with state UP.
Recommended naming convention for YAM Cell:
| Arm | Interface name |
|---|---|
| Left follower | can_follower_l |
| Right follower | can_follower_r |
| Left leader | can_leader_l |
| Right leader | can_leader_r |
If the arm was disassembled or the motors replaced, you may need to re-zero them:
python i2rt/motor_config_tool/set_zero.py --channel can0 --motor_id 1Run for each motor ID (1–6 for a standard YAM).
The factory default is a 400 ms safety timeout: if no command is received within 400 ms, the motor enters damping mode. This prevents runaway behavior if the CAN connection drops.
Disable timeout (advanced users only):
python i2rt/motor_config_tool/set_timeout.py --channel can0
python i2rt/motor_config_tool/set_timeout.py --channel can0 # run twiceRe-enable timeout:
python i2rt/motor_config_tool/set_timeout.py --channel can0 --timeout::: danger Safety note Disabling the timeout removes a key safety mechanism. Without it, a failed gravity-compensation loop can produce uncontrolled positive-feedback torque. Always set a PD target when operating without a timeout:
robot = get_yam_robot(channel="can0", zero_gravity_mode=False):::
- Install the battery and power on — the Raspberry Pi display lights up
- Verify the E-stop is not pressed (twist to release)
- Set the CAN selector switch to UP (uses on-board Pi)
- SSH in once the Pi has booted:
ssh i2rt@172.6.2.20 # wired Ethernet (static IP)
# Password: rootIf the pre-installed software is outdated:
ssh i2rt@172.6.2.20
cd ~/i2rt && git pullFor Pi OS firmware, see the Pi SD Card Guide below.
lsblksudo dd if=/dev/sdX of=pi_system.img bs=4M status=progress
sync(replace /dev/sdX with your SD card device, e.g. /dev/sdc)
sudo wipefs -a /dev/sdX
sudo dd if=pi_system.img of=/dev/sdX bs=4M status=progress
synceject /dev/sdXsudo ./pishrink.sh pi_system.img pi_system_shrunk.imgThe latest pre-built Pi firmware image is available in the Flow Base firmware folder.
- Mount the YAM arm on the Flow Base top plate
- Route the CAN cable through the internal cable management
- Connect the arm CAN cable to the on-board CANable adapter
- Set the CAN selector switch to UP (Pi mode)
- SSH into the Pi and launch both arm and base controllers
ssh i2rt@172.6.2.20
python i2rt/flow_base/flow_base_controller.py &
python examples/minimum_gello/minimum_gello.py --gripper linear_4310 --mode follower --can-channel can0