SO-ARM101 + AmazingHand β€” ACT Grasping Policy

An ACT (Action Chunking Transformer) imitation-learning policy trained on an SO-ARM101 follower arm equipped with an AmazingHand dexterous hand, performing a cube pick-up task.

Hardware

Component Model Notes
Follower arm SO-ARM101 5 Γ— STS3215 (IDs 1–5); original gripper servo #6 removed
End-effector AmazingHand 8 Γ— SCS0009 (IDs 1–8); dedicated serial port + separate power supply
Leader arm SO-ARM101 Full 6 servos; servo #6 (gripper) drives the hand's open/close
Cameras 2 Γ— USB camera top (overhead) + wrist, 640Γ—480 @ 30 fps

Implementation notes: The hand is driven through rustypot (Scs0009PyController) rather than lerobot's Feetech bus β€” SCS0009 (protocol 1) and STS3215 (protocol 0) cannot share a bus. The leader gripper position is mapped linearly onto the hand's open/close pose.

Training Data

  • Dataset: Juxi-Technology/soarm_amazing_hand_pick
  • 20 teleoperated demonstrations, 18,538 frames, 30 fps
  • Task: Pick up the cube with the dexterous hand
  • The cube was recorded at 4 different table positions, 5 episodes each, to cover positional variation

Training Details

Setting Value
Policy ACT
Steps 60,000
Batch size 8
Optimizer AdamW, lr 1e-5, weight decay 1e-4, grad clip 10.0
Vision backbone ResNet-18 (ImageNet pretrained)
chunk_size / n_action_steps 100 / 100
Inputs observation.state (6) + 2 RGB images
Output action (6)

Joint order (6-dim): shoulder_pan.pos, shoulder_lift.pos, elbow_flex.pos, wrist_flex.pos, wrist_roll.pos, gripper.pos

gripper.pos is a virtual dimension β€” the leader gripper opening, mapped to the hand's grasp pose.

Usage

Requires an environment matching this project (a customized lerobot that includes the so_amazing_hand robot definition):

pip install -e ".[amazinghand,training]"

lerobot-rollout \
  --strategy.type=base \
  --policy.path=Juxi-Technology/soarm_amazing_hand_act \
  --device=cuda \
  --robot.type=so101_amazing_hand \
  --robot.port=<follower-port> \
  --robot.hand_port=<hand-port> \
  --robot.id=amazing_hand_follower \
  --robot.cameras='{
    top:   {type: opencv, index_or_path: <top-camera-index>,   width: 640, height: 480, fps: 30},
    wrist: {type: opencv, index_or_path: <wrist-camera-index>, width: 640, height: 480, fps: 30}
  }' \
  --task="Pick up the cube with the dexterous hand" \
  --duration=60

Preconditions:

  1. --task must match the training single_task string exactly
  2. Camera names and index order must match training
  3. The robot must already be calibrated (hand_angles.json, per-joint arm calibration files)
  4. The hand must be on its own serial port with an independent power supply

Limitations

  • Limited positional generalization: performs well near the 4 recorded cube positions; success rate drops noticeably elsewhere
  • Single-shot policy: does not loop autonomously after completing a grasp β€” the object and the arm must be reset manually
  • Environment sensitive: collected under a single scene and lighting condition; changes to camera pose, lighting, or background degrade performance
  • GPU deployment required: CPU inference runs at ~4 Hz (against a 30 Hz target), making motion visibly slow β€” use an NVIDIA GPU (--device=cuda)

Related

  • LeRobot β€” training and deployment framework
  • SO-ARM101 β€” open-source 6-DoF robotic arm
  • AmazingHand β€” open-source dexterous hand
Downloads last month
21
Safetensors
Model size
51.7M params
Tensor type
F32
Β·
Video Preview
loading

Dataset used to train Juxi-Technology/soarm_amazing_hand_act

Paper for Juxi-Technology/soarm_amazing_hand_act