Skip to content

SO-101 is a low-cost arm with 6 joints, made by TheRobotStudio. This model comes from SO-ARM100 by TheRobotStudio, under the Apache-2.0 licence. Not made by Lucen Robotics. Listed as a reference model for simulation.

arm6 joints0.632 kg in simulation50 Hz

Use with your AI

Add this to your AI’s MCP settings (.mcp.json for Claude Code). A read-only key is enough to browse. Nothing here starts a robot. Use the hub from your AI.

{
  "mcpServers": {
    "lucen": {
      "command": "lucen-mcp",
      "env": {
        "LUCEN_API_KEY": "lucen_sk_...",
        "LUCEN_API_URL": "https://api.mousemouse.ai"
      }
    }
  }
}

Or give your AI the task in words. The prompt names the tools and the exact commands.

You have the MouseMouse MCP server (lucen-mcp) configured against https://api.mousemouse.ai.
Work with the robot repo lucen/so-101 on that hub.
1. Read its card with get_robot_card(owner, repo) and its policies with search_repos(kind="model", robot="lucen/so-101").
2. To train for it, submit a run with submit_training using template ppo_mujoco and robot "lucen/so-101" (the CLI equivalent is: lucen runs create --template ppo_mujoco --robot lucen/so-101 --executor worker).
3. Never start, stop or steer a robot: a handoff is request_deploy, and a person approves it in the Inbox.
SO-101, standing in its home pose

Move its joints, or let it fall under gravity, in your browser. About 10 MB the first time. Open the full simulator

README

README.md

SO-101

SO-101 is a low-cost arm with 6 joints, made by TheRobotStudio. This model comes from SO-ARM100 by TheRobotStudio, under the Apache-2.0 licence. The licence text is in LICENSE.

Not made by Lucen Robotics. Listed as a reference model for simulation.

The source is a URDF. MuJoCo's own compiler converted it to the MJCF in this repo. The servo values below are the STS3215's, from the maker's simulation files.

How it was set up

The files come from Simulation/SO101 in SO-ARM100, at commit eecbe3e. The robot card was drafted from the model by lucen robot init, as in Add your robot.

The model file does not state the values below. Each one comes from the source beside it.

SettingValueWhere it comes from
Basefixed to the worldan arm bolted to a table (a URDF cannot say)
Control rate50 Hzthe rate the Add your robot guide uses (a starting point)
Actionjoint position targetthe STS3215 servo's position mode: absolute targets
Stiffness (kp)17.8vendor's Simulation/SO101/joints_properties.xml, class sts3215: <position kp="17.8">
Damping (kd)0.6vendor's joints_properties.xml: <joint damping="0.60"> (its <position> has kv 0)
Armature0.028vendor's joints_properties.xml: armature="0.028"
Friction loss0.052vendor's joints_properties.xml: frictionloss="0.052"
What a policy sensesjoint positions, joint velocitiesthe STS3215's encoder
Commandjoint targetsa fixed-base arm commanded in joint space
Everything elseread from the model filethe MJCF MuJoCo's compiler converted from the URDF (visuals kept), joint order, qpos0 as the default pose, ranges and velocity limits from the URDF.

A value marked as a starting point is not the maker's own. The checks on the robot page show how it behaves.

One line was added to so101_new_calib.xml. The robot check asked for it by name:

<contact><exclude body1="base_link" body2="shoulder_link"/></contact>

The base and shoulder meshes overlap by 27.9 mm at rest. That jams shoulder_pan until the pair is excluded from contact.