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 manipulation và robot 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 wrist và finger 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.

Ý 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, record3d và osfclient. 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
- Project page: ruka-hand-v2.github.io
- Paper: arXiv:2603.26660
- Code: GitHub ruka-hand-v2/RUKA-v2
- Assembly docs: RUKA-V2 GitBook