Vì sao YUBI đáng chú ý?
YUBI là viết tắt của Yielding Universal Bidigital Interface, một hệ thống gripper bimanual open-source do Frontier Research Center của Toyota Motor Corporation và AIRoA công bố trong technical report arXiv 2606.10244, tháng 6/2026. Ý tưởng rất thực dụng: thay vì bắt người vận hành điều khiển robot thật, hoặc cầm một pistol-grip UMI khá nặng, YUBI biến chuyển động bóp tự nhiên của ngón tay thành chuyển động mở/đóng của gripper. Người vận hành cầm hai thiết bị YUBI, mỗi thiết bị có wrist camera, Quest controller để track pose 6 DoF, encoder để đo khẩu độ hàm kẹp, rồi ghi dữ liệu thành episode có thể chuyển sang LeRobot.
Điểm mới không chỉ nằm ở phần cơ khí. Paper báo cáo một dataset cực lớn: 8.434 giờ, 1,20 triệu episodes, 119 tasks, thu trên 22 desks bởi 179 operators. Sau đó nhóm train một policy VLA dựa trên pi0.5 trong action space của end-effector trajectory, rồi deploy qua nhiều robot bimanual khác nhau như UR, Franka và Toyota ELEY bằng cách gắn cùng loại YUBI gripper. Đây là hướng rất quan trọng cho cộng đồng VLA: nếu dữ liệu được thu trong không gian của gripper thay vì joint space riêng của từng robot, dataset có thể dùng lại tốt hơn khi đổi embodiment.
Trong bài này, chúng ta sẽ đi theo hướng "beginner có thể follow": hiểu paper, nắm kiến trúc phần cứng/phần mềm, dựng pipeline thu dữ liệu, convert sang LeRobot, train policy, chạy inference và đọc kết quả. Bài không thay thế assembly PDF chính thức, nhưng sẽ đóng vai trò như checklist kỹ thuật để bạn biết mình cần build những khối nào, kiểm tra gì trước khi ghi data, và tại sao từng lựa chọn của YUBI lại phục vụ cho VLA.
Nguồn gốc và tài liệu cần đọc
Các nguồn chính:
- Paper: YUBI: Yielding Universal Bidigital Interface for Bimanual Dexterous Manipulation at Scale
- Project page: https://yubi.airoa.io/
- Hardware repo: Toyota/yubi-hw
- Software repo: airoa-org/yubi-sw
- Data app: airoa-org/yubi-app
- ROS bag to LeRobot converter: airoa-org/rebake
- LeRobot: huggingface/lerobot
Repo phần cứng phát hành CAD, STL, BOM và assembly instructions theo license CERN-OHL-W v2. Repo phần mềm phát hành operator-side bringup, firmware encoder, ROS 2 nodes, Docker Compose, Quest app setup và pipeline kết nối backend. rebake là mảnh ghép quan trọng vì nó decode ROS bag hoặc MCAP thành Parquet + video, sau đó "bake" sang LeRobot v2.1 dataset. Nếu bạn chỉ nhìn YUBI như một gripper cơ khí, bạn sẽ bỏ lỡ điểm mạnh nhất: nó là một data acquisition stack hoàn chỉnh.
Ý tưởng paper trong một sơ đồ
Human fingers
-> YUBI gripper aperture
-> wrist RGB + gripper 6 DoF pose + jaw angle
-> ROS 2 topics
-> rosbag2 / MCAP recording
-> rebake intermediate: Parquet + videos
-> LeRobot v2.1 dataset
-> VLA / imitation policy training
-> robot inference through IK + end-effector control
UMI gốc giải quyết embodiment gap bằng cách để người dùng cầm một gripper giống end-effector của robot. Nhờ vậy, demonstration không còn là bàn tay người cần retarget sang robot hand, mà đã là chuyển động của chính gripper sẽ lắp lên robot. YUBI giữ nguyên triết lý này nhưng thay đổi interface:
| Thành phần | UMI kiểu pistol-grip | YUBI |
|---|---|---|
| Cách bóp | Tay cầm kiểu súng | Ngón cái đối diện ngón trỏ/ngón giữa |
| Khối lượng trong paper | khoảng 780 g | khoảng 319 g gồm 200 g gripper + 119 g controller |
| Tracking | SLAM hoặc VR tùy biến thể | VR-based tracking bằng Quest |
| Cảm giác lực | Offset giữa tay và pinch point | Finger-aligned, haptic trực tiếp hơn |
| Mục tiêu | Robot-free demonstration | Bimanual dexterous data ở quy mô lớn |
Paper nhấn mạnh hai vấn đề của các hệ UMI trước đó. Một là pistol-grip tạo offset giữa ngón tay người và điểm kẹp, làm thao tác nhỏ như nhặt nut M3, gấp, cắm, kéo, lắp trở nên khó hơn. Hai là tracking bằng SLAM có thể drift, còn VR tracking nếu bắt operator đội headset thì mỏi cổ trong session dài. YUBI xử lý bằng cách gắn controller vào chính gripper, đặt headset Quest lên rig cố định cho tabletop mode, và dùng gripper finger-aligned nhẹ hơn.
Kiến trúc phần cứng
YUBI có bốn nhóm phần cứng chính trong repo Toyota/yubi-hw:
| Nhóm | Vai trò | File trong repo |
|---|---|---|
| YUBI Glove | Wearable device để thu finger motion khi teleoperation | STEP/glove, STL/glove |
| YUBI Gripper | Gripper lắp lên robot, actuated bằng DYNAMIXEL servos | STEP/gripper, STL/gripper |
| Stationary desk | Rig bàn để thu dữ liệu ổn định | STL/stationary, docs |
| Portable rig | Rig di động cho household / in-the-wild tasks | STEP/portable, STL/portable |
Một setup tabletop theo paper gồm:
- Hai YUBI devices, trái và phải.
- Wrist camera trên mỗi gripper, paper ghi 100 Hz cho camera onboard trong mô tả sensor stream.
- Quest controller gắn vào YUBI để track pose 6 DoF ở khoảng 80 Hz.
- Magnetic encoder đo jaw aperture khoảng 100 Hz.
- RealSense D435 nhìn từ trên xuống ở 30 Hz, lấy RGB + depth để kiểm tra workspace và hỗ trợ preprocessing.
- Foot pedal để segment action mà operator không cần bỏ tay khỏi gripper.
- Laptop hoặc workstation chạy Docker, ROS 2 graph, web UI và upload pipeline.
Sơ đồ cơ bản:
RealSense D435
|
fixed tabletop frame
|
Quest HMD ---- tracks ---- Quest controllers
| |
YUBI L YUBI R
wrist cam wrist cam
encoder encoder
\ /
ROS 2 graph
|
recording + upload
Nếu build bản portable, headset/HMD được gắn lên ngực, top camera đổi thành fisheye egocentric camera, và dữ liệu vẫn giữ schema giống tabletop mode. Đây là điểm hay: bạn có thể bắt đầu với tabletop cho dễ debug, sau đó mở rộng sang các tác vụ có whole-body motion như đặt khay vào máy rửa chén, cất sách lên kệ hoặc treo áo.
Checklist build phần cứng
Bước đầu tiên là đọc BOM và assembly PDF trong Toyota/yubi-hw/docs. Đừng in 3D trước khi kiểm tra version release, vì repo đã có release fix STL. Với beginner, nên build từng khối, test độc lập, rồi mới lắp thành hệ.
1. Đọc BOM
- Kiểm tra loại fastener, bearing, sensor, cable, servo.
- Tách danh sách "bắt buộc" và "có thể thay thế".
2. In 3D parts
- Dùng STL chính thức.
- In thử một cụm nhỏ để kiểm tra tolerance.
- Giữ orientation giống hướng dẫn nếu assembly PDF yêu cầu.
3. Lắp gripper cơ khí
- Kiểm tra jaw mở/đóng mượt.
- Không siết quá tay ở joint nhỏ.
- Đảm bảo finger path không cạ vào vỏ.
4. Lắp camera, encoder, Quest controller mount
- Cable phải có strain relief.
- Camera trái/phải phải đánh dấu vật lý.
- Encoder phải có zero/min rõ ràng.
5. Test bằng tay trước khi chạy software
- Mở/đóng 100 lần.
- Nhặt vật nhẹ, vật nhỏ, vật nặng vừa phải.
- Quan sát backlash, flex, kẹt cơ khí.
Paper nói mỗi YUBI gripper có thể fabricate dưới 200 USD nếu không tính Quest 3S tracking system. Con số này là lợi thế lớn so với leader-follower teleoperation cần robot thật ở mỗi station. Tuy nhiên, chi phí thật của một data station còn gồm camera, Quest, laptop, bàn, dây, storage, thời gian in 3D và công calibrate. Vì vậy, nếu mục tiêu của bạn là research nhỏ, hãy bắt đầu với một bàn và 10-20 tasks, đừng cố replicate 22 desks như paper ngay lập tức.
Cài đặt phần mềm
Repo airoa-org/yubi-sw yêu cầu Docker, Docker Compose và Make. Nó chứa firmware cho Seeed XIAO ESP32C6 đọc AS5601 encoder, ROS 2 bringup, config cho stationary/portable variant, footpedal, Quest bridge, web video server và kết nối tới backend.
Flow cài đặt thực tế:
# tham khảo hướng dẫn chính thức trong yubi-sw
git clone https://github.com/airoa-org/yubi-sw.git --recursive
cd yubi-sw
# flash firmware encoder một lần cho mỗi board
# DEVICE_ID nên đặt L### hoặc R###, ví dụ L003 / R003
cd tools
sudo -E bash yubi_udev_setup.sh
# hoặc cho portable rig:
sudo -E bash yubi_udev_setup.sh --variant portable
Script udev setup mở GUI để bạn map camera trái/phải, encoder trái/phải, capture MIN cho mỗi gripper khi đóng hoàn toàn, rồi ghi /etc/yubi/encoder_limits.yaml và /etc/udev/rules.d/99-yubi.rules. Đây là bước beginner thường làm sai nhất: nếu camera bị swap hoặc encoder bị ngược, dataset vẫn record được nhưng label sẽ hỏng.
Sau đó cấu hình .env:
cp .env.example .env
# trong .env:
ROBOT_VARIANT=stationary
# hoặc:
ROBOT_VARIANT=portable
Build và chạy:
make docker
docker compose up -d
Container yubi sẽ launch ros2 launch yubi_bringup yubi_data_collection.launch.py, bắt đầu camera USB, RealSense pipeline, footpedal node, rosbridge websocket và task command dispatch node. Nếu bạn cần debug bên trong container:
ros2 topic list
ros2 topic hz /camera/left/image_raw
ros2 topic hz /encoder/left
ros2 launch yubi_bringup yubi_data_collection.launch.py
Quest setup cũng rất quan trọng. YUBI dùng sideloaded app trên Meta Quest; repo hướng dẫn tải APK, bật Developer Mode, rồi install bằng adb install -r. Nếu dùng link wired DHCP qua USB-Ethernet, có script tools/yubi_dhcp_setup.sh để laptop cấp IP cố định cho Quest. Trong config local, bạn cần set quest_ip đúng địa chỉ headset, và set base_url của backend nếu dùng yubi-app.
Dựng data app và ghi episode
yubi-app là web platform để quản lý robot fleet, task, episode và storage. Backend dùng Go/Gin/Bun/PostgreSQL/Redis, frontend dùng Next.js/TypeScript/React/Tailwind. Với local dev:
git clone https://github.com/airoa-org/yubi-app.git
cd yubi-app
cp backend/.env.example backend/.env
cp frontend/.env.sample frontend/.env
make up
make migrate
make seed
Các URL mặc định:
| Service | URL | Vai trò |
|---|---|---|
| Frontend | http://localhost:3000/web |
tạo task, xem episode |
| Backend API | http://localhost:8000 |
robot/backend API |
| LocalStack hoặc MinIO | tùy compose | storage S3-compatible |
Quy trình ghi dữ liệu nên đơn giản:
1. Tạo robot trong web app.
2. Tạo task, ví dụ "pick up the cup and place it on the plate".
3. Assign task cho robot/data station.
4. Operator cầm YUBI trái/phải.
5. Foot pedal bắt đầu segment.
6. Thực hiện sub-action.
7. Foot pedal kết thúc segment.
8. Episode upload vào storage.
9. Reviewer loại bỏ episode lỗi.
Một episode YUBI theo paper gồm hai wrist camera streams, top RealSense stream, relative poses trong wrist frames, metadata task/sub-action, translation t_right, t_left, rotation Euler r_right, r_left, jaw angle d_right, d_left. Sensor được record ở native frequency, sau đó standardized về 30 Hz khi convert sang LeRobot. Với VLA, 30 Hz thường là điểm cân bằng tốt: đủ mượt cho visual-action alignment nhưng không làm dataset phình quá nhanh.
Convert sang LeRobot bằng rebake
ROS bag rất tốt để ghi log, nhưng không phải format lý tưởng cho training. Mỗi lần train mà phải parse lại ROS messages, align clock, reconstruct TF tree và decode video là rất tốn. rebake giải quyết bằng format trung gian Parquet + video, rồi export sang LeRobot v2.1.
git clone --recursive https://github.com/airoa-org/rebake.git
cd rebake
docker compose -f docker/docker-compose.yml up -d --build
docker compose -f docker/docker-compose.yml exec rebake-dev bash
just build
# decode bags / MCAP thành intermediate
rebake-cli export ./yubi_recordings -o ./out -j 8
# bake thành LeRobot dataset
rebake-cli run ./yubi_recordings -c config/pipeline/yubi.yaml -j 8
Output LeRobot nên có dạng:
lerobot_dataset/
├── meta/
│ ├── info.json
│ ├── episodes.jsonl
│ ├── tasks.jsonl
│ └── episodes_stats.jsonl
├── data/
│ └── episode_*.parquet
└── videos/
├── observation.images.left_wrist/
└── observation.images.right_wrist/
Trước khi train, hãy load vài episode và xem lại:
from lerobot.datasets.lerobot_dataset import LeRobotDataset
dataset = LeRobotDataset("local/yubi_demo")
print(dataset.features)
print(dataset.num_episodes)
sample = dataset[0]
print(sample.keys())
Debug checklist:
| Lỗi | Dấu hiệu | Cách xử lý |
|---|---|---|
| Camera left/right bị swap | Tay trái xuất hiện trong video phải | chạy lại udev setup, swap cameras |
| Encoder không đổi | Jaw angle đứng im | kiểm tra USB, firmware DEVICE_ID, capture MIN |
| Pose nhảy | Quest mất tracking | kiểm tra vùng nhìn HMD, ánh sáng, controller battery |
| Action lệch hình | policy học chậm | kiểm tra timestamp, resample 30 Hz, segment foot pedal |
| Task label sai | model làm nhầm lệnh | review metadata/task assignment |
Training policy
Paper dùng policy VLA dựa trên pi0.5, conditioned bằng natural-language instruction và wrist RGB images ở 30 Hz, output relative end-effector poses theo action chunks, ví dụ 32 steps. Đây là lựa chọn hợp lý vì diffusion policy truyền thống hội tụ nhanh ở task đơn giản nhưng paper ghi nhận khó generalize cho bimanual tasks phức tạp. VLA pretrained có lợi thế về language grounding và prior từ dữ liệu lớn.
Nếu bạn bắt đầu nhỏ, đừng train full VLA từ đầu. Lộ trình thực dụng:
Stage 1: sanity model
- 1 task
- 50-200 good episodes
- ACT hoặc Diffusion Policy
- mục tiêu: action/observation format đúng
Stage 2: multi-task small
- 5-10 tasks
- 100-300 episodes/task
- train với language instruction
- mục tiêu: model phân biệt task label
Stage 3: VLA fine-tuning
- 20+ tasks
- nhiều object/background/operator
- pi0.5/OpenVLA/SmolVLA tùy compute
- mục tiêu: generalization qua task và object
Pseudo-config:
dataset:
repo_id: local/yubi_demo
fps: 30
cameras:
- observation.images.left_wrist
- observation.images.right_wrist
state:
- left_gripper_pose
- right_gripper_pose
- left_jaw_angle
- right_jaw_angle
policy:
type: vla
backbone: pi0_5_or_openvla
action_space: relative_end_effector_pose
action_chunk_size: 32
language_conditioning: true
training:
batch_size: 16
lr: 1e-5
augmentations:
- color_jitter
- random_crop
- mild_camera_noise
Với beginner, metric đầu tiên không nên là success rate robot thật. Hãy đo các thứ rẻ hơn: loss theo task, action reconstruction error, jaw-angle error, replay predicted trajectory lên video, và tỷ lệ episode bị loại do metadata/camera lỗi. Khi các metric offline ổn, mới chạy robot thật với tốc độ thấp.
Inference trên robot thật
YUBI giúp giảm đau ở bước deploy vì action là trajectory của gripper, không phải joint command riêng của từng robot. Khi inference:
instruction + wrist images
-> VLA policy
-> relative end-effector pose chunk
-> safety filter
-> per-robot IK solver
-> joint targets
-> low-level robot controller
Paper chạy inference bằng wrist camera và trajectory data, không dùng top-view observations. Predicted trajectory được execute ở control rate thấp hơn, ví dụ 10 Hz, để giữ velocity/acceleration trong giới hạn robot. Đây là chi tiết rất quan trọng: human demonstration có thể nhanh và sắc, nhưng robot arm thật có giới hạn động lực học, joint limit, singularity và collision.
Checklist an toàn:
- Chạy dry-run không vật.
- Giới hạn workspace bounding box.
- Clamp delta position và delta rotation mỗi step.
- Giới hạn jaw closing force / servo current nếu có.
- Có E-stop vật lý.
- Log toàn bộ command và observation.
- Chỉ tăng tốc khi 20-50 rollout đầu ổn định.
Với robot UR/Franka/ELEY, phần khác nhau nằm ở IK, collision model và controller interface. Phần giống nhau là gripper action space. Đây là lý do paper có thể báo cáo một policy multi-task transfer qua nhiều platform khi cùng mount YUBI gripper.
Kết quả paper nói gì?
Các con số chính:
| Hạng mục | Kết quả |
|---|---|
| Dataset duration | 8.434 giờ |
| Episodes | 1,20 triệu |
| Video-language-action triplets | 6,80 triệu demos/sub-actions |
| Tasks | 119 |
| Avg. sub-action/task | 7,99 |
| Collection stations | 22 desks |
| Operators | 179 |
| YUBI handheld mass | khoảng 319 g |
| Per-gripper fabrication | dưới 200 USD, không tính Quest 3S |
User study có 10 operators chưa từng dùng UMI hoặc YUBI. Trong dexterity test nhặt hex nuts M10 đến M3, UMI và YUBI đều tốt ở nut lớn, nhưng YUBI hơn rõ ở nut nhỏ: paper nêu YUBI hơn UMI +20 pp ở M6, +10 pp ở M5, và khoảng 3 lần ở M3. Trong operational efficiency test, YUBI nhanh hơn UMI trên cả năm task, speed-up từ 1,37x tới 4,19x.
Deployment table của paper chạy 20 rollouts/task:
| Robot | Task | Success |
|---|---|---|
| Bimanual UR | Ball in basket | 20/20 |
| Bimanual UR | Stack cup pyramid | 13/20 |
| Bimanual Franka | Unfold glasses | 9/20 |
| Bimanual Franka | Pick and place socks | 18/20 |
| ELEY | Tape in box | 18/20 |
| ELEY | Cup placement | 11/20 |
Đây không phải bằng chứng rằng mọi task đã solved. Paper cũng thừa nhận hạn chế: sub-millimeter precision, tactile-sensitive tasks như tight cable insertion hoặc fragile material handling vẫn khó; recipe kết hợp YUBI data với in-the-wild video và real robot data còn là câu hỏi mở; tận dụng toàn bộ 8.434 giờ cho large-scale VLA pretraining vẫn là hướng tương lai. Nhưng kết quả đủ mạnh để chứng minh YUBI không chỉ là một gadget: nó là một cách thu dữ liệu robot-executable ở quy mô lớn.
Cách bắt đầu nhỏ trong lab của bạn
Nếu bạn mới bắt đầu, hãy đặt mục tiêu 2 tuần như sau:
Ngày 1-2: đọc BOM, order parts, in thử tolerance coupon.
Ngày 3-5: lắp một YUBI, test camera/encoder.
Ngày 6-7: lắp YUBI thứ hai, chạy udev setup, kiểm tra ROS topics.
Ngày 8-9: dựng yubi-app, tạo task, record 20 episodes.
Ngày 10: convert bằng rebake, load LeRobotDataset.
Ngày 11-12: train sanity ACT/Diffusion Policy trên 1 task.
Ngày 13: replay prediction offline.
Ngày 14: nếu có robot, chạy inference tốc độ thấp với safety box.
Chọn task đầu tiên thật dễ: nhặt cốc đặt lên đĩa, nhặt băng keo bỏ vào hộp, hoặc xếp hai block. Đừng chọn task deformable như gấp áo ngay. Bimanual manipulation khó vì lỗi có thể đến từ mọi tầng: cơ khí, tracking, camera, timestamp, task label, policy, IK, controller. YUBI giảm rất nhiều chi phí data collection, nhưng không bỏ qua được kỷ luật kiểm tra dữ liệu.