Step 1: Mechanical Mounting
- Attach the O6 base to your mounting plate using the 4× M6 bolts provided. Torque to 8 N·m.
- Confirm the mounting surface is stable and does not flex. A wobbly mount causes vibration artifacts in your joint feedback data.
- Fold the arm into its shipping/home position: all joints at 0°. Do this manually before power-on.
Step 2: Power Connection
- Connect the supplied power supply to the arm's DC input jack (24 V, 15 A).
- 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.
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).