← Back to the workspace

SO-101 Classroom

Explore how a robot arm moves, save a sequence, and write a Python program that produces the same movements.

Start with a small movement

  1. In Move, change Base rotation from 0° to 15°. Predict whether X, Y, or Z will change the most. Check the coordinates.
  2. In Teach, name the position “Turn right,” use a 3-second travel time, and save it.
  3. Return Base rotation to 0° and save “Return.”
  4. Use Check to inspect the sequence. Then choose Step to run one movement.
  5. Choose Run simulation to replay the whole sequence. Export the motion data if you want to graph it.

Write the same movement in Python

import robot

robot.move(shoulder_pan=15, duration=3, name="Turn right")
robot.wait(0.5)
robot.move(shoulder_pan=0, duration=3, name="Return")
print(robot.position())

Choose Build sequence. Python creates saved positions; it does not immediately move a physical robot. Standard Python loops, functions, arithmetic, and the bundled standard library are available. Package installation is not part of this interface.

Command Meaning
robot.move(...) Set one or more joint targets. Omitted joints retain their previous target.
robot.grip(70) Set gripper opening to 70%. This is opening, not grip force.
robot.wait(1) Pause one second after the previous movement.
robot.position() Return the last requested pose in the script. This is not a sensor reading.

The five arm angles use degrees. Joint names are shoulder_pan, shoulder_lift, elbow_flex, wrist_flex, and wrist_roll. Gripper uses a 0–100% opening scale.

Find the problem

In Check, select “Shoulder angle offset +8°.” Run a small sequence and select Shoulder in the motion plot. Record the requested value and measured value at two times. Is their difference constant? Which setup step would you recheck?

Try “Elbow fails to follow” with a sequence that changes the elbow, or “Position feedback lost.” These are teaching examples. They do not represent a physical fault on a connected arm.

Coordinates and paths

The grid spacing is 50 mm. Coordinates refer to the official model's base frame. Red is X, green is Y, and blue is Z. The small axes at the gripper show the tool frame. The orange line shows the tool path through your saved joint positions.

A straight change in joint angles usually creates a curved tool path. “Move toward a point” uses a numerical inverse-kinematics solver. It targets position only and may not find every valid solution. A failed search does not prove a point is unreachable.

Save and transfer

Save project downloads a .so101 JSON file. It contains the robot model, units, named joint positions, travel times, and pauses. Open it in the teacher station, check it, and preview it before enabling the real follower arm. Calibration files and computer-specific ports never travel with student projects.

A browser save is kept on this device. Download projects to keep a durable copy or move them to another computer. Opening an exported project does not run Python code or move hardware.

Teacher station

Run the local teacher launcher on the Mac connected by USB. Station → Scan USB ports lists attached adapters. Connect one arm at a time and choose its role. Connection reads motor identity, operating mode, position, voltage, and temperature; it does not enable torque.

Follow the illustrated Seeed guide for the remaining board and cable assembly. The Pro leader uses 5 V and the follower uses 12 V; confirm the adapter labels. Calibrate the leader and follower separately. Leader calibration supports reading and saving hand-taught poses; live simultaneous leader/follower teleoperation is not included in this release.

During calibration, support the arm before releasing torque. Capture each joint's reference position, then a positive 10° position to establish direction (closed and fully open for the gripper). Sweep the usable travel by hand. The software computes direction, scale, and limits and saves them for that adapter and role. It never drives blindly into a hard stop. Match the reference shown in the model, and verify all measured angles before enabling motion.

“Read physical pose into preview” copies the measured pose into the workspace. Save it in Teach. For real movement, use the separate hardware buttons; sliders only change the preview. The controller applies measured limits and a 15°/s speed limit. Software Stop requests a position hold; releasing torque is separate because an unsupported arm may fall. A power or USB failure can prevent a software stop from reaching the motors.

Teacher Python can use the same browser runtime, or explicitly trusted local Python. Local Python has access to the Mac's files and installed libraries. It is not a sandbox. Student project imports never execute local Python.

Working with the simulation

In Python, choose Play dance to load and run a short example in the simulator. Download the .py file, change beat or turns, and build a new version. This button does not command physical hardware.

Click an arm part to select its joint. Drag the part or its rotation ring to change the target. Drag the background to orbit the camera. Press Escape during a drag to restore the starting target. Dragging and sliders resume paused physics and send targets immediately. The displayed arm follows the physics model, so it may lag behind a target or stop against an object.

Use Expand editor in Python for more programming space. Line numbers and Go to error line help locate exceptions. Python help explains every robot command and includes practice programs. Motion details and saved positions collapse separately; playback controls remain accessible.

In Objects, add a block, sphere, or cylinder. Drag it across the table, or hold Shift while dragging to change its height. Escape cancels the placement. Release to save its new starting position; physics stays paused until you resume. Objects are placed upright at their configured rotation. Set its mass in grams, dimensions and center position in millimeters, and friction coefficient. Apply changes to reset the scene. Load gripper load test places a 50 g block between the jaws and pauses. Run simulation to grip, lift, rotate, and release. Change the mass and reset to compare. Export saves these settings with your sequence.

See physics sources and model limits. Simulated objects are not a map of the physical workspace.

What the simulation checks

MuJoCo simulates gravity, limited motor torque, friction, and contact with added objects. The model uses published estimates and has not been fitted to this physical arm. A clear check report is not proof that physical movement is safe. The teacher must inspect the workspace and begin with small movements.

Sources and licenses

The detailed geometry and joint transforms come from The Robot Studio SO-101 model (Apache 2.0). The model uses its “new calibration” convention; this application's gripper percentage maps 0–100% to −10–100° of the model jaw joint. This is an application convention, not a LeRobot calibration file.

Rendering uses Three.js (MIT). Browser Python uses Pyodide 0.27.7 (MPL 2.0) and CPython (PSF license). License notices are bundled with the application. Consult Seeed's LeRobot guide and LeRobot's SO-101 documentation for the original hardware workflow.