TORL-VLA: Fine-tune VLA với Cảm Biến Xúc Giác và Online RL để Tăng Độ Chính Xác Thao Tác Tiếp Xúc
Bạn đã từng thấy một robot VLA (Vision-Language-Action) thực hiện pick-and-place hoàn hảo trong lab, nhưng khi gặp vật thể dễ vỡ hoặc cần lực chính xác — nó lại thất bại? Đó là vấn đề cốt lõi mà TORL-VLA (arXiv 2606.09337, tháng 6/2026) giải quyết.
VLA truyền thống là "mù" với lực tiếp xúc. Chúng "nhìn" qua camera và "hành động" dựa trên token ngôn ngữ, nhưng không cảm nhận được áp lực đầu ngón tay. Kết quả: khi điều kiện tiếp xúc lệch khỏi distribution training (vật hơi trơn hơn, vị trí lệch 2mm), policy thất bại theo kiểu rất tệ — kẹp quá mạnh làm vỡ trứng, hoặc cứ retry vô ích không biết dừng.
TORL-VLA giải quyết bằng cách gắn thêm cảm biến xúc giác (tactile sensors) vào ngón tay robot, tích hợp tín hiệu lực vào VLA qua kiến trúc wrench-aware, và thêm một module Online RL nhỏ gọn để tự học thích nghi ngay trong quá trình deploy — không cần thu thập thêm dữ liệu demo, không cần reset về simulator.
Bài viết này hướng dẫn chi tiết từ ý tưởng paper, kiến trúc kỹ thuật, cách thiết lập phần cứng, quy trình training, đến inference và kết quả thực tế.
Tại Sao VLA Cần Cảm Biến Xúc Giác?
Hãy nghĩ về lúc bạn bốc một quả trứng sống. Mắt bạn nhìn trứng, nhưng ngón tay mới là thứ điều chỉnh lực. Nếu bịt mắt, bạn vẫn có thể cầm trứng an toàn bằng xúc giác. Nhưng nếu tê liệt ngón tay, cho dù mắt thấy rõ, bạn vẫn dễ bóp nát trứng.
VLA hiện tại đang ở trạng thái "tê liệt ngón tay" — chỉ thấy, không cảm.
Vấn đề cụ thể với VLA thuần visual:
- Distribution shift khi tiếp xúc: Demo thu thập trong điều kiện lý tưởng. Lúc deploy, vật hơi trượt, lực ngưỡng khác → policy không có cơ chế feedback để điều chỉnh.
- Không biết khi nào đủ lực: Cho vật vào holder cần biết đã "khớp" hay chưa. Camera không đủ độ phân giải để phán đoán 0.5mm, nhưng lực tiếp xúc thì rõ ràng.
- Retry inefficient: Khi thất bại, policy cứ lặp lại hành động cũ vì không có tín hiệu nào nói "cách này sai, thay đổi đi".
TORL-VLA giải quyết cả 3 vấn đề bằng 2 cơ chế chính: Wrench-Aware VLA (cảm biến lực vào model) và Online RL với Intervention-Censored Critic (học thích nghi ngay lúc chạy).
Kiến Trúc TORL-VLA: 2 Stage, 3 Module
TORL-VLA hoạt động theo pipeline 2-stage:
Stage 1 — Wrench-Aware VLA (Reference Model)
Đây là model offline được train trước trên 539 demo trajectories. Nó nhận vào:
- 3 camera feeds: global RealSense D435i, wrist RealSense D405, gripper fisheye
- Language instruction: mô tả task bằng ngôn ngữ tự nhiên
- Tactile wrench history: 12D wrench vector (6D × 2 fingertip) với J=10 samples trong 2 giây gần nhất
Model output 2 thứ cùng lúc:
- Reference action chunk: chuỗi hành động dự đoán (giống VLA thông thường)
- Future wrench sequence: dự đoán lực tiếp xúc trong tương lai gần
Cách tích hợp tactile vào VLA
Điểm sáng tạo là cách fusion. Thay vì inject tactile token vào đầu (early fusion — phá vỡ pretrained features), TORL-VLA dùng late fusion sau khi encode visual-language:
Tactile sensors → 12D wrench × J samples → MLP encoder → Tactile token Pt
Visual-Language encoder → z_vis
Late fusion: Self-attention([Pt; z_vis]) → fused features
Kiến trúc còn có:
- Soft-routing Mixture-of-Experts (MoE): dynamic routing dựa trên wrench context, chọn expert phù hợp cho từng pha tiếp xúc
- Zero-initialized wrench bypass: đường tắt để fine-grained contact info không bị "xay nhuyễn" qua nhiều lớp attention
Loss function train cùng lúc action và wrench:
L_ref = ||û_action - u_action||² + λ_w ||û_wrench - u_wrench||²
Với λ_w = 0.3 — wrench prediction đóng vai trò regularizer, không dominate quá.
Stage 2 — Online RL Module (Refinement)

Đây là "bộ não thích nghi" nhỏ gọn chạy song song với Stage 1 trong lúc deploy. Nó gồm:
Stage Estimator: Phân loại robot đang ở giai đoạn nào của task (pre-contact, in-contact, placement, release) → route đến actor-critic head phù hợp.
Actor-Critic Refinement:
- Actor: nhận reference action từ Stage 1 + wrench hiện tại + wrench predicted → output refined action
- Critic: đánh giá quality của refined action
Robot re-query Stage 1 mỗi K=10 steps (0.5 giây ở 20Hz), nghĩa là có cả plan từ VLA và real-time refinement từ RL.
Intervention-Censored Critic — Giải Pháp Credit Assignment
Đây là đóng góp lý thuyết quan trọng nhất của paper. Vấn đề: trong Online RL với robot, con người hay can thiệp (intervene) khi robot sắp phạm lỗi. Nếu sau can thiệp robot thành công, standard critic sẽ nghĩ "hành động trước can thiệp là tốt" — credit assignment sai hoàn toàn.
TORL-VLA giải quyết bằng Intervention-Censored (IC) Critic:
# Khi không có intervention:
y_task = r_t + γ^K * min_Q_task(s_{t+K}, a_{t+K})
# Khi có intervention (m_int = 1):
y_ic = r_t - c_int + (1 - done) * (1 - m_int) * γ^K * min_Q_ic(...)
m_int là mask chỉ boundary của intervention. Khi m_int=1, bootstrap bị loại bỏ và một intervention cost c_int được áp vào. Ý nghĩa: "hành động này dẫn đến can thiệp → đây là transition xấu, đừng credit cho success tiếp theo".
Actor loss kết hợp 3 terms:
L_π = λ_bc * L_bc - λ_task * E[min_Q_task] + λ_ic * E[ΔQ_ic]
L_bc: behavior cloning để không drift xa reference modelmin_Q_task: maximize task value (thành công task)ΔQ_ic: penalize intervention-prone actions
Phần Cứng Cần Thiết
Robot Platform
Paper dùng Piper robotic arm của AgileX Robotics với Pika gripper. Đây là arm 6-DOF giá thành hợp lý (~$8k USD), khá phổ biến trong nghiên cứu.
Tuy nhiên, kiến trúc TORL-VLA không lock-in với Piper — bất kỳ arm nào có wrist-mountable gripper và USB/SPI interface đều có thể adapt.
Tactile Sensors — Tacta Fingertip Sensors

Đây là component quan trọng nhất và ít quen thuộc nhất. Paper dùng Tacta fingertip sensors — 2 sensor gắn trên 2 mặt trong của ngón gripper:
- Kích thước: 21×18.5×4.5mm (rất nhỏ gọn)
- Array: 6×8 piezoelectric elements
- Output: 48 giá trị áp lực → convert sang 6D wrench vector (Fx, Fy, Fz, Mx, My, Mz)
- 2 sensor → 12D wrench vector tổng
Chuyển đổi tactile array → wrench:
# Mỗi sensor: 6×8 array của pressure values
tactile_left = sensor_left.read() # shape: (6, 8)
tactile_right = sensor_right.read() # shape: (6, 8)
# Convert sang wrench qua calibrated transform
wrench_left = calibration_matrix_left @ tactile_left.flatten() # → 6D
wrench_right = calibration_matrix_right @ tactile_right.flatten() # → 6D
# Concatenate
wrench_12d = np.concatenate([wrench_left, wrench_right]) # → 12D
Calibration matrix được xác định qua quá trình hand-eye calibration kết hợp FEM simulation của gripper geometry.
Camera Setup
3 camera với vai trò khác nhau:
| Camera | Vị trí | Vai trò |
|---|---|---|
| RealSense D435i | Global (nhìn toàn cảnh) | Scene understanding, object detection |
| RealSense D405 | Wrist (gần vật) | Fine manipulation, grasping alignment |
| Fisheye | Gripper | Visibility trong không gian hẹp |
Cả 3 sync ở 20Hz với timestamp alignment, tránh temporal mismatch giữa visual và tactile data.
Quy Trình Training
Bước 1: Thu Thập Demo
Thu thập 539 trajectories toàn task (full-task execution, không chỉ subtask). Mỗi trajectory được record:
- 3 camera streams
- 12D wrench history (10 samples × 2.0s)
- Joint positions + velocities
- Language instruction
- Success/failure label
Tips thu thập demo chất lượng cao:
- Thực hiện task ở tốc độ bình thường, không cố tình chậm
- Ghi cả failure recovery (robot hay người recover)
- Đánh label can thiệp (intervention timestamp) để IC Critic dùng sau
- Rải đều các subtask condition (cup orientation, latch angle, egg position)
Bước 2: Train Reference Model (Wrench-Aware VLA)
# Cài dependencies
pip install torch torchvision transformers einops
# Train
python train_reference.py \
--data_dir ./data/demos \
--base_model pi0.5 \
--enable_moe \
--enable_wrench_bypass \
--wrench_loss_weight 0.3 \
--batch_size 32 \
--lr 1e-4 \
--epochs 100 \
--output_dir ./checkpoints/reference
Với dữ liệu 539 trajectories và model pi0.5 làm backbone, training mất khoảng 6-8 giờ trên A100.
Loss sẽ hội tụ theo dạng:
Epoch 10: L_action=0.24, L_wrench=0.18, L_total=0.29
Epoch 50: L_action=0.09, L_wrench=0.07, L_total=0.11
Epoch 100: L_action=0.06, L_wrench=0.05, L_total=0.075
Bước 3: Train Online RL (Adaptation Phase)
Online RL không train trước offline — nó train trực tiếp trên robot theo quy trình:
Warmup Phase (trước khi deploy):
# 300 demo chunks, 5k gradient updates
# Mục đích: khởi tạo actor gần reference policy
warmup_trainer = OnlineRLWarmup(
demo_buffer=demo_buffer,
n_chunks=300,
n_gradient_steps=5000
)
warmup_trainer.train(actor, critic)
Main Interaction Phase (trên robot thật):
# 120.8 phút robot interaction time
# Update ratio: 5 gradient steps / transition
online_trainer = OnlineRLTrainer(
actor=actor,
task_critic=task_critic,
ic_critic=ic_critic,
update_to_data_ratio=5,
gamma=0.99,
tau=0.005 # EMA cho target network
)
for episode in robot_episodes:
trajectory = robot.rollout(actor, reference_model)
online_trainer.update(trajectory)
Lưu ý về intervention logging:
# Khi người can thiệp, ghi lại timestamp
def on_human_intervention(t):
intervention_mask[t] = 1.0
intervention_cost[t] = -1.0 # c_int
# IC Critic dùng mask này để cắt bootstrap
Các Task Thực Nghiệm

Task 1: Coffee Cup Placement
- Mô tả: Đặt cốc cà phê vào holder chật, visibility thấp (góc camera bị che)
- Thách thức: Cần lực vừa đủ để cup "snap" vào vị trí, không quá mạnh gây đổ
- Tactile signal: Khi cup đặt đúng, wrench profile thay đổi đột ngột và ổn định
Task 2: Latch Manipulation
- Mô tả: Cầm, lật và khóa cơ học một cái chốt (mechanical latch)
- Thách thức: 3 giai đoạn tiếp xúc phức tạp — grip → flip → lock, mỗi giai đoạn cần profile lực khác nhau
- Tactile signal: Latch "click" tạo wrench spike, Stage Estimator dùng để detect transition
Task 3: Egg Handling
- Mô tả: Cầm trứng sống và đặt vào khay
- Thách thức: Trứng dễ vỡ nếu quá mạnh, dễ trượt nếu quá nhẹ
- Tactile signal: Optimal wrench range rất hẹp (~0.3N-0.8N trên mỗi fingertip)
Full-task: Thực hiện cả 3 task liên tiếp trong một autonomous rollout.
Kết Quả

So Sánh với Baselines (30 trials mỗi method)
| Method | Cup | Latch | Egg | Full-Task | Avg Time (s) |
|---|---|---|---|---|---|
| π0.5 (baseline VLA) | 18/30 | 15/30 | 20/30 | 12/30 | 199.65 |
| TA-VLA | 19/30 | 17/30 | 20/30 | 12/30 | 204.45 |
| ForceVLA | 21/30 | 20/30 | 22/30 | 15/30 | 195.34 |
| TORL-VLA w/o RL | 25/30 | 23/30 | 25/30 | 21/30 | 191.91 |
| RLT (ablation) | 26/30 | 25/30 | 25/30 | 23/30 | 175.23 |
| TORL-VLA | 30/30 | 29/30 | 30/30 | 28/30 | 165.45 |
Một vài điểm đáng chú ý:
- TORL-VLA đạt 100% trên Cup và Egg — hoàn hảo trên 30 trials
- Full-task 28/30 vs 12/30 của π0.5 — cải thiện 133%
- Thời gian thực thi nhanh hơn: 165.45s vs 199.65s của π0.5 — ít retry hơn, efficient hơn
- TORL-VLA w/o RL (chỉ wrench-aware, không online RL) đã tốt hơn baseline nhiều — chứng minh tactile integration có giá trị độc lập
Ablation Insights
Kết quả ablation cho thấy:
- MoE routing: contribution lớn nhất trong reference model — không có MoE, success rate giảm mạnh nhất
- Wrench bypass: quan trọng cho Egg task (cần fine-grained force control)
- IC Critic: đóng góp lớn nhất ở Latch task — vì Latch có nhiều can thiệp nhất trong training
Inference Pipeline
Sau khi train xong, inference chạy như sau:
import torch
from torl_vla import TORLVLAAgent
agent = TORLVLAAgent(
reference_model_path="./checkpoints/reference/best.pt",
rl_actor_path="./checkpoints/online_rl/actor_final.pt",
rl_critic_path="./checkpoints/online_rl/critic_final.pt",
device="cuda"
)
# Robot control loop
while not task_done:
# Lấy observations
obs = {
"images": {
"global": cam_global.capture(),
"wrist": cam_wrist.capture(),
"gripper": cam_fisheye.capture()
},
"wrench_history": tactile_buffer.get_last(n=10), # 10×12D
"language": "Place the coffee cup into the holder"
}
# Stage 1: Reference action từ Wrench-Aware VLA
ref_action, pred_wrench = agent.reference_predict(obs)
# Stage 2: Refined action từ Online RL Actor
stage = agent.estimate_stage(obs)
refined_action = agent.rl_refine(obs, ref_action, pred_wrench, stage)
# Execute
robot.execute(refined_action)
# Cập nhật tactile buffer
tactile_buffer.append(tactile_sensors.read())
Replanning period K=10 steps (0.5s) cho phép cân bằng giữa computation cost và responsiveness.
Roadmap Code Release
Tại thời điểm bài viết (tháng 7/2026), code chính thức từ tác giả vẫn đang Coming Soon trên project page. Tuy nhiên, community đã có reproduction:
- openpi-RLT: Reproduction của RLT baseline (phiên bản không có IC Critic) — đây là ablation setting của TORL-VLA, hữu ích để hiểu online RL component
- Paper: TORL-VLA arXiv 2606.09337
- Project page: torl-vla.github.io
Để theo dõi code release chính thức, star/watch project page hoặc GitHub của các tác giả (Huaihang Zheng et al., Beijing Institute of Technology).
So Sánh Với Các Hướng Tiếp Cận Khác
| Approach | Tactile? | Online Adapt? | Offline Train Only? | Khi nào dùng |
|---|---|---|---|---|
| VLA thuần (π0.5, OpenVLA) | ✗ | ✗ | ✓ | Task không tiếp xúc, pick-place đơn giản |
| TA-VLA / ForceVLA | ✓ | ✗ | ✓ | Có tactile, distribution shift ít |
| Online RL thuần (RLT) | ✓ | ✓ | ✗ | Có robot time, không cần language grounding |
| TORL-VLA | ✓ | ✓ | ✗ | Contact-rich, cần robustness cao |
Tradeoff chính: TORL-VLA cần ~120 phút robot interaction time cho online adaptation — đây là cost thực tế cần cân nhắc khi triển khai.
Kết Luận
TORL-VLA là bước tiến quan trọng cho thao tác tiếp xúc chính xác cao. Ba đóng góp chính:
- Wrench-Aware VLA: Late fusion + MoE + bypass — tích hợp tactile mà không phá pretrained features
- Online RL với IC Critic: học thích nghi trên robot thật, giải quyết credit assignment khi có can thiệp người
- Stage-specific refinement: routing thông minh theo pha tiếp xúc
Kết quả 28/30 full-task (vs 12/30 baseline) cho thấy cả 2 component đều đóng góp độc lập và bổ sung cho nhau.
Nếu bạn đang build manipulation system cho contact-rich tasks (assembly, peg-in-hole, fragile object handling), kiến trúc này đáng để theo dõi kỹ khi code chính thức được release.



