Skip to main content

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

physicalai_bimanual_so101_plugin-0.1.0.tar.gz (6.0 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file physicalai_bimanual_so101_plugin-0.1.0.tar.gz.

File metadata

File hashes

Hashes for physicalai_bimanual_so101_plugin-0.1.0.tar.gz
Algorithm Hash digest
SHA256 9ab78d6063f0eb61377582890b53dbcf69fc9a729408afaff39368e5d453fb12
MD5 39582b3842146a99dc51e7d7cc1d77bf
BLAKE2b-256 503814b4b09e49c521c442e418e504cce293b457d1c5cc4a9d99fa57d2595869

See more details on using hashes here.

File details

Details for the file physicalai_bimanual_so101_plugin-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for physicalai_bimanual_so101_plugin-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c10c13cdb75c9bdc4272dcbbae264395662f1951569c50889abdd803ceecc266
MD5 d7a457afd7e03501aee5508e82959a5c
BLAKE2b-256 9657483090f10daa18c6a94711c25fdbfd09985a1fb7c1ea3efe199996c7324a

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page