manipulationruka-v2dexterous-manipulationrobot-handpolicy-learningopen-source

Build RUKA-v2: bàn tay robot 16-DOF

Hướng dẫn build RUKA-v2, bàn tay robot open-source tendon-driven cho teleoperation, dexterous manipulation và policy learning.

Nguyễn Anh Tuấn6 tháng 6, 202615 phút đọc
Build RUKA-v2: bàn tay robot 16-DOF

Vì sao RUKA-v2 đáng chú ý?

RUKA-v2 là phiên bản nâng cấp của RUKA, một bàn tay robot humanoid, tendon-driven, open-source từ nhóm New York University và New York University Shanghai. Điểm quan trọng của dự án không chỉ là "bàn tay có nhiều khớp", mà là cách họ thiết kế toàn bộ platform để phục vụ dexterous manipulationrobot learning: CAD có thể sửa, assembly guide có video, software controller có sẵn, teleoperation chạy được với VR/OpenTeach, và pipeline policy learning dùng demonstration thật.

Paper gốc "Ruka-v2: Tendon Driven Open-Source Dexterous Hand with Wrist and Abduction for Robot Learning" được đưa lên arXiv ngày 27/03/2026, bản v2 ngày 30/03/2026. Theo project page, RUKA-v2 bổ sung hai năng lực mà RUKA v1 còn thiếu: 2-DOF wristfinger abduction/adduction. Hai thứ này nghe nhỏ, nhưng trong thao tác thật chúng quyết định rất nhiều: cầm bút từ ống đứng, mở sách, lách tay vào lò/cabinet, nắm vật mỏng, xoay vật trong lòng bàn tay, hoặc căn góc khi thao tác với môi trường hẹp.

Một lưu ý để đọc thông số cho đúng: bài này gọi RUKA-v2 là 16 active DOF vì phần điều khiển/policy dùng 16 vị trí khớp của hand. Paper cũng ghi so sánh theo 20 total DOF / 16 actuated DOF khi tính cả các bậc tự do cơ khí và wrist. Với người build lần đầu, cách hiểu thực dụng là: bạn đang điều khiển 16 actuator/channel chính cho hand-wrist system, còn cơ khí có thêm coupling và cấu trúc khớp giúp chuyển động giống bàn tay người hơn.

Nếu bạn mới đọc về robot hand, hãy nắm ba nền tảng trước: dexterous manipulation, imitation learning và diffusion-style visuomotor policy. RUKA-v2 nằm đúng giao điểm của ba mảng này: hardware đủ linh hoạt, teleoperation đủ tự nhiên, và dữ liệu demonstration đủ sạch để train policy.

Robot manipulation
Robot manipulation

Ý tưởng chính của paper

Thông điệp của paper khá thẳng: thuật toán robot learning đã tiến rất nhanh, nhưng hardware dexterous rẻ, bền, dễ sửa và dễ tái tạo vẫn là nút thắt. Các bàn tay như Shadow Hand rất mạnh nhưng đắt; Allegro/LEAP phổ biến hơn nhưng hình học không giống tay người hoàn toàn và không có wrist tích hợp; nhiều hand tendon-driven có form factor tốt nhưng thiếu docs, thiếu phần mềm hoặc không fully open-source.

RUKA-v2 đi theo hướng tendon-driven: actuator đặt gần forearm/motor base, lực kéo truyền qua tendon tới ngón. Cách này giảm khối lượng distal ở ngón tay, làm bàn tay gọn hơn, dễ giống morphology người hơn. Đổi lại, điều khiển không còn là mapping trực tiếp motor = joint. Tendon có ma sát, slack, tension khác nhau giữa từng build, vì vậy dự án phải giải quyết cả cơ khí lẫn calibration.

Paper đóng góp bốn ý lớn:

Thành phần Ý nghĩa thực tế
2-DOF decoupled parallel wrist Cho flexion/extension và radial/ulnar deviation độc lập, giúp thao tác trong không gian hẹp
Finger abduction/adduction Cho ngón xòe/khép ngang ở MCP, hữu ích khi cầm vật mỏng, bút, sách, hoặc xoay vật
Attachable magnetic encoders Dùng AS5600 12-bit để đo góc khớp khi calibration, giảm phụ thuộc motion capture glove đắt tiền
Open robot learning stack Có code controller, retargeting, teleoperation Franka/OpenTeach và BAKU policy learning

Sơ đồ mental model:

Human hand / VR headset / camera
          |
          v
Retargeting human pose -> desired RUKA-v2 joint angles
          |
          v
Joint-to-motor mapping + calibrated motor limits
          |
          v
Dynamixel motors -> tendon routing -> fingers + wrist
          |
          v
Teleoperation demos -> BAKU visual BC policy -> autonomous rollout

Kiến trúc phần cứng

RUKA-v2 có năm cụm bạn cần hiểu trước khi build:

Cụm Vai trò Điểm cần chú ý khi build
Fingers DIP, PIP, MCP và tendon routing Dây phải đi sạch, không cọ cạnh sắc, không bị xoắn
Knuckle modules MCP flexion và abduction/adduction Lò xo trả về neutral, không siết quá tay
Palm/backhand Gom finger modules và PTFE tubes PTFE tube không được thò quá sâu gây kẹt tendon
2-DOF wrist Flex/extend và radial/ulnar deviation Bearing, washer và pivot phải quay tự do
Motor base/pulleys Giữ Dynamixel và cuốn tendon Knot/pulley phải chắc, nhưng vẫn chỉnh được tension

Điểm hay của wrist là parallel decoupled design. Hai trục wrist có tâm quay chung do ball joint xác định, còn hai chuỗi linkage độc lập kéo từng DOF. Tendon của ngón đi qua gần tâm quay wrist rồi qua routing plate có bearing. Cách này giảm biến thiên chiều dài tendon khi wrist xoay, tức là ngón không bị "tự co" quá nhiều chỉ vì cổ tay đổi pose.

Finger abduction/adduction dùng một tendon riêng cho từng knuckle module và spring return về neutral. Middle finger được giữ cố định như mốc hình học. Điều này làm ngón trỏ, áp út và út có thể xòe/khép tương đối, còn hệ thống vẫn có trục tham chiếu cứng để calibration và retargeting không trôi quá nhiều.

Theo BOM từ docs, electronics chính gồm:

Linh kiện Số lượng Ghi chú
DYNAMIXEL XL330-M288-T 11 Motor nhỏ cho nhiều DOF finger
DYNAMIXEL XM430-W210-R 2 Motor mạnh hơn cho wrist
DYNAMIXEL XL430-W250-T 3 Motor bổ sung cho các trục tải cao
U2D2 1 USB interface cho Dynamixel
12V/5V power supply 1 Cấp nguồn bus/mạch phụ
Braided fishing line 0.75 mm hoặc 0.68 mm 1 Tendon
PTFE tubing 2 mm ID, 4 mm OD 1 Dẫn tendon

Docs cũng liệt kê tool cơ bản: 3D printer, soldering iron, Allen keys M2/M3/M5, tweezers, pliers; optional có sandpaper, drill bits và tip cho brass insert. Với beginner, hai thứ hay làm hỏng build nhất là heat-set insert lệch và tendon routing bẩn. Đừng vội cấp nguồn trước khi bạn có thể kéo từng tendon bằng tay và thấy khớp di chuyển mượt.

Chuẩn bị CAD, in 3D và workspace

Workflow build nên đi từ cơ khí khô tới điện, rồi mới tới software:

1. Tải CAD/STL và BOM
2. In plate set, fingertip replacements, encoder mounts
3. Lắp heat-set inserts
4. Lắp finger tendons và joint strings
5. Lắp knuckle modules
6. Lắp palm, PTFE tubes, wrist connector
7. Lắp wrist, bearing, washer, routing plate
8. Lắp motor base, pulleys, motors
9. Wiring, motor IDs, power-on test
10. Calibration, reset pose, teleoperation

In 3D theo docs dùng layer height 0.2 mm và infill khác nhau theo từng nhóm STL, ví dụ 100%, 50%, 30%. Đừng tự giảm infill cho các part chịu lực như wrist plate hoặc motor base nếu bạn chưa test. RUKA-v2 có nhiều lỗ dowel/bearing nhỏ; sai lệch vài phần mười mm là đủ làm khớp kẹt. Nếu dowel quá khó vào bearing plate, docs gợi ý re-print với layer height lớn hơn hoặc khoan lại lỗ 2.5 mm.

Khi cắm heat-set insert, mẹo từ docs là dùng razor blade ở millimeter cuối để ép insert flush với mặt nhựa. Insert nhô lên sẽ làm plate lệch; insert tụt quá sâu có thể làm screw không ăn ren đủ. Sau mỗi cụm cơ khí, hãy kiểm tra bằng tay:

[OK] Khớp quay tự do khi chưa nối tendon
[OK] Tendon kéo vào thì ngón co đúng hướng
[OK] Thả tendon thì spring/elastic return về neutral
[OK] Không có dây cọ vào cạnh sắc hoặc chéo qua nhau
[OK] Wrist xoay mà finger tendon không bị kéo căng bất thường

Lắp điện và power-on an toàn

RUKA-v2 dùng Dynamixel bus, nên wiring không chỉ là cấp nguồn. Bạn cần đúng motor ID, đúng bus, đúng điện áp, và current limit trước khi thử chuyển động. Docs Step 06 mô tả XT60 pigtails cho 5V và 12V, nối ground/power cho connector 3-pin/4-pin, sau đó nối data wires theo bus tương ứng.

Safety checklist trước power-on:

[ ] Power supply đặt đúng điện áp
[ ] Current limit bật ở mức bảo thủ
[ ] Không để tay người trong vùng kẹp
[ ] Motor ID đúng với side left/right
[ ] Tendon chưa căng quá mức ở reset pose
[ ] USB/U2D2 nhận trên host
[ ] Có thể ngắt nguồn ngay nếu motor chạy sai hướng

Nếu dùng attachable encoder setup, docs mô tả ESP32 QTPy, TCA9548A I2C multiplexer và AS5600 sensors. Mapping mux port mẫu:

Mux port Joint
0 Index abduction
1 Index DIP
2 Index PIP
3 Index MCP
4 Thumb CMC
5 Thumb MCP
6 Thumb DIP

Encoder không bắt buộc để chạy teleoperation cơ bản, nhưng rất đáng dùng nếu bạn muốn đo tracking error, calibrate joint-angle mapping, hoặc train policy ổn định hơn giữa nhiều build.

Cài đặt software

Repo chính là ruka-hand-v2/RUKA-v2 trên GitHub. README dùng Conda với Python 3.10:

git clone --recurse-submodules https://github.com/ruka-hand-v2/RUKA-v2
cd RUKA-v2
conda env create -f environment.yml
conda activate ruka_hand
pip install -r requirements.txt
pip install -e .

Các package đáng chú ý gồm pytorch, dynamixel_sdk, numpy, pandas, opencv-python, hydra-core, wandb, diffusers==0.11.1, einops, h5py, flask, zmq, record3dosfclient. Với máy Linux, nếu bạn gặp lỗi permission khi mở /dev/ttyUSB0, README gợi ý thêm user vào group dialout rồi reboot:

sudo usermod -aG dialout $USER
sudo reboot

Sau khi cắm hand qua USB, kiểm tra port:

ls /dev/ttyUSB*

Rồi cập nhật USB_PORTS trong ruka_hand/utils/constants.py, ví dụ:

USB_PORTS = {
    "left": "/dev/ttyUSB0",
    "right": "/dev/ttyUSB1",
}

Test reset motor:

python scripts/reset_motors.py --hand_type right

Lưu ý nhỏ: README có chỗ dùng --hand_type, phần calibration dùng --hand-type. Khi chạy thực tế, nếu argparse báo lỗi, kiểm tra --help của script tương ứng.

Calibration: bước không được bỏ qua

Tendon-driven hand không thể copy motor limit từ build này sang build khác một cách mù quáng. Độ căng dây, ma sát trong PTFE, knot/pulley, sai số print và độ mòn đều ảnh hưởng. RUKA-v2 cung cấp calibration script để tìm hai biên:

  • in-tension / fully open bound: ngón mở, tendon vừa căng.
  • fully curled bound: ngón co tới giới hạn cơ khí an toàn.

Chạy:

python calibrate_motors.py --hand-type right

Script sẽ yêu cầu bạn điều khiển từng joint bằng phím lên/xuống, xác nhận khi đạt pose mong muốn, rồi lưu motor limits vào RUKA/motor_limits/<left|right>_<tension|curl>_limits.npy. Các limit này được dùng trong ruka_hand/control/hand.py.

Mapping controller trong paper dùng linear interpolation:

p = p_min + c * theta / (theta_max - theta_min) * (p_max - p_min)

theta: desired joint angle
p: motor position command
c: scaling factor bù ma sát, tendon friction, underestimation

Đây không phải model vật lý hoàn hảo. Paper cũng nêu đây là limitation: giả định joint-to-motor linear chưa được formal verification. Nhưng kết quả thực nghiệm cho thấy đủ dùng cho teleoperation và visual behavior cloning nếu calibration tốt. Khi build của bạn lệch nhiều, hãy kiểm tra theo thứ tự: tendon routing, knot slip, motor direction, motor limit, rồi mới tăng scaling factor.

Teleoperation: tạo dữ liệu demonstration

RUKA-v2 hỗ trợ hai hướng teleoperation chính:

python teleop_mediapipe.py

và controller trong ruka_hand/control/controller_retarget.py để dùng với Oculus/OpenTeach. Trong paper, nhóm mount RUKA-v2 lên Franka 7-DOF arm. OpenTeach lấy trajectory từ Oculus headset, map sang end-effector của Franka bằng IK, còn hand pose đi qua retargeting/controller để thành motor commands.

Retargeting dùng ý tưởng từ AnyTeleop: thay vì chỉ match fingertip position, module vector-based retargeting tối ưu joint angles để align link vectors giữa human hand và robot hand. Cách này hợp với robot hand có morphology gần tay người như RUKA-v2.

Checklist cho dataset demonstration:

Mục Khuyến nghị
Camera Fixed RGB camera nhìn rõ hand, object, goal
Proprioception 7-DOF arm state + 16-DOF RUKA-v2 joint positions
Demo/task Paper dùng khoảng 100 teleoperated expert demos mỗi task
Noise Inject Gaussian noise vào joint state để operator tạo recovery behavior
Logging Lưu action, observation, timestamp, success/failure

Training policy với BAKU

Paper dùng BAKU để train autonomous visual behavior cloning policies trên ba task: pen grasping, opening music box, bread pick-and-place. Kiến trúc training được mô tả như sau:

RGB frame from fixed camera ---> ResNet-18 visual encoder --+
                                                            |
23-D proprioception ---------> MLP proprio encoder ---------+--> Transformer trunk
                                                            |
Learned action token ---------------------------------------+
                                                                  |
                                                                  v
                                                        Action-chunking head
                                                                  |
                                                                  v
                                                   Future robot action sequence

Observation space gồm 23 chiều proprioception: 7-DOF Franka arm state và 16-DOF RUKA-v2 joint positions, cộng với RGB stream từ camera cố định. Action head dự đoán một chuỗi action tương lai, giúp policy chạy mượt hơn so với dự đoán từng bước đơn lẻ.

Một training workflow thực dụng cho beginner:

# 1. Thu demonstration bằng teleoperation
# Mỗi episode nên lưu RGB, robot state, action, success flag.

# 2. Kiểm tra dataset
python tools/inspect_dataset.py --data ./data/ruka_pen_pickup

# 3. Train visual BC policy trong BAKU submodule
cd BAKU
python train.py task=ruka_pen_pickup data=../data/ruka_pen_pickup

# 4. Chọn checkpoint theo validation loss và video rollout
python eval.py checkpoint=./checkpoints/ruka_pen_pickup/best.pt

Các command ở bước 2-4 là template để bạn tổ chức pipeline; tên script cụ thể cần theo README của submodule BAKU trong repo bạn clone. Điều quan trọng hơn là format dữ liệu: policy cần cùng camera pose, cùng action normalization, cùng proprioception order giữa train và inference. Nhiều lỗi deployment không đến từ model, mà đến từ việc đổi thứ tự joint hoặc đổi camera calibration sau khi train.

Inference và rollout an toàn

Khi chạy policy thật, đừng nhảy thẳng từ checkpoint sang full-speed autonomous manipulation. Dùng ba mức:

Mức Mục tiêu Cách chạy
Dry run Kiểm tra tensor, action range Không cấp nguồn motor, chỉ log action
Shadow mode So action policy với teleop/human Cấp nguồn nhưng không cho robot chạm object nguy hiểm
Closed-loop rollout Thử task thật Tốc độ thấp, emergency stop sẵn sàng

Pseudo-code inference:

while robot.is_enabled():
    rgb = camera.read()
    arm_q = franka.get_joint_state()
    hand_q = ruka.get_joint_state()

    obs = {
        "rgb": rgb,
        "proprio": concat(arm_q, hand_q),
    }

    action_chunk = policy.predict(obs)

    for action in action_chunk:
        if safety_filter(action):
            robot.send_action(action)
        else:
            robot.stop()
            break

Thêm safety filter tối thiểu:

- Clamp joint command trong calibrated limits
- Clamp delta action mỗi control step
- Stop nếu tendon tension/motor current tăng bất thường
- Stop nếu object rời workspace camera
- Stop nếu wrist gần singular/khớp chạm hard stop

Kết quả paper

Các con số đáng nhớ:

Hạng mục Kết quả
So với RUKA v1 Giảm 51.3% mean completion time, tăng 21.2% overall success rate trong user study
Teleoperation 10 single-arm tasks và 3 bimanual tasks
Policy learning 3 autonomous tasks: pen, music box, bread pick-and-place
Thermal endurance 5 giờ continuous operation, không thermal shutdown
Finger DIP-PIP payload 1200 g trong 15 s
Non-thumb MCP payload 780 g trong 15 s
Thumb payload 835 g trong 20 s
Wrist supination/pronation 1215 g trong 20 s
Controller accuracy Average joint angle error 8.26 độ, 10.68% normalized

Task policy rollout được đánh giá ở 10 vị trí khởi tạo ngẫu nhiên, mỗi vị trí 5 rollout closed-loop. Paper báo mean/std được scale theo thang 10: pen picking 5.4 +/- 3.1 / 10, music box opening 5.8 +/- 3.8 / 10, bread pick-and-place 5.6 +/- 2.9 / 10. Đây chưa phải "solved", nhưng đủ cho thấy platform có thể tạo dữ liệu thật và train policy thật, không chỉ demo teleoperation.

Lỗi beginner hay gặp

Triệu chứng Nguyên nhân thường gặp Cách xử lý
Ngón không mở hết Tendon vẫn còn căng ở open bound Calibrate lại in-tension bound
Ngón co không hết Knot slip, pulley lỏng, tendon routing ma sát Kiểm tra knot/pulley/PTFE
Wrist xoay làm ngón co Tendon không đi gần rotation center hoặc bị kẹt routing plate Mở wrist kiểm tra route
Motor nóng nhanh Current limit cao, tendon căng quá mức, khớp kẹt Giảm current, tháo tendon test cơ khí
Policy train tốt nhưng rollout fail Camera pose đổi, joint order sai, normalization lệch Freeze camera, log schema, replay dataset

Nguồn tham khảo

Bài viết liên quan

NT

Nguyễn Anh Tuấn

Robotics & AI Engineer. Building VnRobo — sharing knowledge about robot learning, VLA models, and automation.

Khám phá VnRobo

Bài viết liên quan

Dexterous Manipulation: Thao tác bàn tay robot
manipulation

Dexterous Manipulation: Thao tác bàn tay robot

22/2/20268 phút đọc
NT
Upgrade lên D405: khi nào nên thay GoPro trong UMI và cách làm
manipulation

Upgrade lên D405: khi nào nên thay GoPro trong UMI và cách làm

6/6/20267 phút đọc
NT
AffordanceVLA: VLA hiểu affordance
manipulation

AffordanceVLA: VLA hiểu affordance

6/6/202612 phút đọc
NT