wholebody-vlayubilerobotvlabimanualteleoperation

Xây YUBI gripper cho LeRobot VLA

Hướng dẫn beginner xây YUBI, thu dữ liệu bimanual theo chuẩn LeRobot, rồi train và deploy VLA policy.

Nguyễn Anh Tuấn10 tháng 6, 202616 phút đọc
Xây YUBI gripper cho LeRobot VLA

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:

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/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.

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

ACoT-VLA với LeRobot data
wholebody-vla

ACoT-VLA với LeRobot data

8/6/202616 phút đọc
NT
Fine-tune G0Tiny bằng LeRobot
wholebody-vla

Fine-tune G0Tiny bằng LeRobot

7/6/202614 phút đọc
NT
GR00T whole-body VLA data: sinh data sim
wholebody-vla

GR00T whole-body VLA data: sinh data sim

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