PhysicalAI Bimanual SO-101 Plugin
Third-party bimanual SO-101 robot arm plugin for PhysicalAI.
Composes two SO-101 arms (left + right) behind the Robot protocol.
| Class | Robot | Motors | Protocol |
|---|---|---|---|
BimanualSO101 |
Dual 6-DOF STS3215 arms | Feetech STS3215 | POSITION |
Installation
uv add physicalai-bimanual-so101-plugin
feetech-servo-sdk is included as a core dependency.
Usage
Calibrated follower
import numpy as np
from physicalai.robot import connect
from physicalai_bimanual_so101_plugin import BimanualSO101
# Build left and right arms manually
from physicalai.robot.so101 import SO101, SO101Calibration
left_cal = SO101Calibration.from_path("left_calibration.json")
right_cal = SO101Calibration.from_path("right_calibration.json")
left = SO101(port="/dev/ttyACM0", calibration=left_cal, role="follower")
right = SO101(port="/dev/ttyACM1", calibration=right_cal, role="follower")
robot = BimanualSO101(left=left, right=right)
with connect(robot) as arm:
obs = arm.get_observation() # shape (12,)
action = obs.joint_positions.copy()
arm.send_action(action)
Uncalibrated bringup mode
from physicalai.robot import connect
from physicalai_bimanual_so101_plugin import BimanualSO101
from physicalai.robot.so101 import SO101
left = SO101.uncalibrated(port="/dev/ttyACM0", role="follower")
right = SO101.uncalibrated(port="/dev/ttyACM1", role="follower")
robot = BimanualSO101(left=left, right=right)
Leader (read-only teleoperation)
from physicalai.robot import connect
from physicalai.robot.so101 import SO101
from physicalai_bimanual_so101_plugin import BimanualSO101
left = SO101.uncalibrated(port="/dev/ttyACM0", role="leader")
right = SO101.uncalibrated(port="/dev/ttyACM1", role="leader")
robot = BimanualSO101(left=left, right=right)
with connect(robot) as arm:
while True:
obs = arm.get_observation()
print(obs.joint_positions)
URDF Model
from physicalai_bimanual_so101_plugin import get_urdf_path
urdf_path = get_urdf_path()
| URDF | Model | Use |
|---|---|---|
so101_dual/so101_dual.urdf |
Bimanual SO-101 | Kinematics & visualization |
Two arms mounted 0.4 m apart: left at +0.2 m (Y), right at -0.2 m (Y).
Joint Order
Left arm (indices 0-5): left_shoulder_pan, left_shoulder_lift, left_elbow_flex, left_wrist_flex, left_wrist_roll, left_gripper
Right arm (indices 6-11): right_shoulder_pan, right_shoulder_lift, right_elbow_flex, right_wrist_flex, right_wrist_roll, right_gripper
Acknowledgments
URDF model generated from Onshape via onshape-to-robot. SO-101 arm by LeRobot.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file physicalai_bimanual_so101_plugin-0.1.0.tar.gz.
File metadata
- Download URL: physicalai_bimanual_so101_plugin-0.1.0.tar.gz
- Upload date:
- Size: 6.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9ab78d6063f0eb61377582890b53dbcf69fc9a729408afaff39368e5d453fb12
|
|
| MD5 |
39582b3842146a99dc51e7d7cc1d77bf
|
|
| BLAKE2b-256 |
503814b4b09e49c521c442e418e504cce293b457d1c5cc4a9d99fa57d2595869
|
File details
Details for the file physicalai_bimanual_so101_plugin-0.1.0-py3-none-any.whl.
File metadata
- Download URL: physicalai_bimanual_so101_plugin-0.1.0-py3-none-any.whl
- Upload date:
- Size: 6.0 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c10c13cdb75c9bdc4272dcbbae264395662f1951569c50889abdd803ceecc266
|
|
| MD5 |
d7a457afd7e03501aee5508e82959a5c
|
|
| BLAKE2b-256 |
9657483090f10daa18c6a94711c25fdbfd09985a1fb7c1ea3efe199996c7324a
|