⚠ Mount the arm before powering on. The O6 must be secured to a mounting plate or clamped to a workbench before any joint motion. An unsecured arm will tip when joints move.

Step 1: Mechanical Mounting

  1. Attach the O6 base to your mounting plate using the 4× M6 bolts provided. Torque to 8 N·m.
  2. Confirm the mounting surface is stable and does not flex. A wobbly mount causes vibration artifacts in your joint feedback data.
  3. Fold the arm into its shipping/home position: all joints at 0°. Do this manually before power-on.

Step 2: Power Connection

  1. Connect the supplied power supply to the arm's DC input jack (24 V, 15 A).
  2. Do not power on yet — complete CAN bus wiring first.

Step 3: CAN Bus Wiring

Connect the USB-to-CAN adapter between your computer and the arm's CAN port. The connector on the arm is a standard DE-9 (DB9) CAN connector.

The CAN bus setup procedure for the O6 is identical to the OpenArm 101. If you have already configured SocketCAN for OpenArm, skip ahead to Step 4 and just verify can0 comes up correctly.

Step 4: Configure SocketCAN

Power on the arm and then configure the CAN interface on your Linux machine:

# Load kernel modules (required once per boot, or add to /etc/modules)
sudo modprobe can
sudo modprobe can_raw
sudo modprobe slcan

# Find the USB-CAN adapter device (usually /dev/ttyUSB0 or /dev/ttyACM0)
ls /dev/ttyUSB* /dev/ttyACM*

# Bring up the CAN interface at 1 Mbit/s
sudo slcand -o -c -s8 /dev/ttyUSB0 can0
sudo ip link set up can0

# Verify the interface is up
ip link show can0

You should see output like can0: <NOARP,UP,LOWER_UP> mtu 16 .... If the interface is not up, check that the arm is powered on and the USB adapter is recognized.

Make CAN Auto-Start on Boot (Optional)

# Create a systemd service
sudo tee /etc/systemd/system/can0.service <<'EOF'
[Unit]
Description=CAN bus interface can0
After=network.target

[Service]
ExecStartPre=/sbin/modprobe can
ExecStartPre=/sbin/modprobe can_raw
ExecStartPre=/sbin/modprobe slcan
ExecStart=/usr/bin/slcand -o -c -s8 /dev/ttyUSB0 can0
ExecStartPost=/usr/sbin/ip link set up can0
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable can0
sudo systemctl start can0

Step 5: Verify Joint State Readout

Install the LinkerBot SDK and confirm joint telemetry is streaming:

pip install roboticscenter

python3 - <<'EOF'
from roboticscenter.o6 import O6Robot

robot = O6Robot(can_interface="can0")
robot.connect()

state = robot.get_state()
print("Joint positions (rad):", state.joint_positions)
print("Joint velocities (rad/s):", state.joint_velocities)
print("Joint torques (Nm):", state.joint_torques)

robot.disconnect()
EOF

Expected output: six floating-point values per field, all near 0.0 if the arm is in its home position. If you see all zeros with no change, check your CAN wiring. If you get a CanError, run ip link show can0 and confirm the interface is UP.

Step 6: Move to Home Position

Send a command to move all joints to the zero (home) position at slow speed to confirm actuator response:

from roboticscenter.o6 import O6Robot
import time

robot = O6Robot(can_interface="can0")
robot.connect()

print("Moving to home position at 20% speed...")
robot.move_to_home(speed_fraction=0.2)
time.sleep(5)

state = robot.get_state()
print("Final joint positions:", state.joint_positions)
# All values should be near 0.0

robot.disable_torque()
robot.disconnect()
print("Done — joints are gravity-compensated")

Unit 1 Complete When...

The O6 is mounted and powered. ip link show can0 reports the interface as UP. Joint state readout returns six non-zero positions. The arm responds to the home position command and joints are confirmed moving. CAN interface survives a reboot (optional but recommended).