Skip to main content

Getting Started with the SO-101 Robot Arm

The SO-101 is a 3D-printed 6-DOF robot arm developed by the Robot Studio and Hugging Face. The fastest way to visualize it in Foxglove is LeRobot's native integration; pass --display_mode=foxglove to stream live data with no custom code.

For the full LeRobot guide (dataset replay, recording, and advanced options), see Visualize LeRobot with Foxglove.

Step 1: Install LeRobot

LeRobot requires Python 3.12+. Use uv to set up a virtual environment:

uv venv --python 3.12
source .venv/bin/activate
uv pip install 'lerobot[feetech,dataset_viz]'

See the LeRobot installation guide for system dependencies. Complete hardware setup and calibration following the SO-101 guide before continuing.

Step 2: Stream live data

With your follower and leader arms connected, start teleoperation with Foxglove visualization enabled:

uv run lerobot-teleoperate \
--robot.type=so101_follower \
--robot.port=/dev/ttyUSB0 \
--robot.id=my_follower \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyUSB1 \
--teleop.id=my_leader \
--display_data=true \
--display_mode=foxglove

Replace /dev/ttyUSB0 and /dev/ttyUSB1 with your actual ports (lerobot-find-port). Adjust camera IDs using lerobot-find-cameras opencv.

Move the leader arm — joint positions appear on /observation/state and /action/state, and camera frames stream to /observation/images/front.

Step 3: Connect Foxglove

Make sure you are on the same network as your robot. In Foxglove, select Open connection from the dashboard or left-hand menu.

Select open connection

Select Foxglove WebSocket in the Open a new connection dialog, then enter the URL of the server:

Foxglove WebSocket dialog

Click "Open" to connect.

note

Local development: Use ws://localhost:8765 when running the server on the same machine as Foxglove.

Robot connection: Use ws://ROBOT_IP:8765 when connecting to a server running on your robot, where ROBOT_IP is your robot's IP address on the network.

Import a starter layout. In the layout dropdown in the application toolbar, select Import from file..., and open lerobot_layout.json from the Foxglove SDK examples.

You should now see your robot's data streaming live!

Step 4: Record and replay datasets

Add the same visualization flags when collecting demonstrations:

uv run lerobot-record \
--robot.type=so101_follower \
--robot.port=/dev/ttyUSB0 \
--robot.id=my_follower \
--robot.cameras="{ front: {type: opencv, index_or_path: 0, width: 640, height: 480, fps: 30}}" \
--teleop.type=so101_leader \
--teleop.port=/dev/ttyUSB1 \
--teleop.id=my_leader \
--dataset.repo_id=${HF_USER}/my-dataset \
--dataset.num_episodes=5 \
--dataset.single_task="Pick up the cube" \
--display_data=true \
--display_mode=foxglove

Replay a recorded episode as a seekable timeline:

uv run lerobot-dataset-viz \
--repo-id ${HF_USER}/my-dataset \
--root ~/.cache/huggingface/lerobot/${HF_USER}/my-dataset \
--episode-index 0 \
--display-mode foxglove

Learn more