Mục tiêu của bài này
Sáu bài trước đã đi từ bản đồ pipeline, video egocentric, retarget, teleoperation, LMO RL đến kiểm sim-to-real. Bài 7 khép lại series bằng câu hỏi thực dụng nhất: sau khi đã có policy chạy được, ta đánh giá nó như thế nào để biết hệ WholeBodyVLA thật sự tốt hơn một baseline?
Nếu chỉ báo cáo "task success" ở cấp nhiệm vụ, bạn sẽ bỏ lỡ phần quan trọng nhất của humanoid loco-manipulation. Một robot có thể cầm được túi nhưng ngã khi squat. Nó có thể nắm được tay cầm xe đẩy nhưng lệch hướng sau 2 mét. Nó cũng có thể thất bại ở cùng một nhiệm vụ vì ba nguyên nhân khác nhau: perception chọn sai mục tiêu, VLA phát latent không phù hợp, hoặc LMO điều khiển chân bị stumble. Vì vậy, đánh giá VLA toàn thân phải nằm ở cấp subgoal, không chỉ cấp task.
Bài này dùng paper WholeBodyVLA và project page của OpenDriveLab làm template. Trong paper, nhóm tác giả đánh giá trên nguyên mẫu Agibot X2 với ba task chính: Bag Packing, Box Loading và Cart Pushing. Mỗi task được tách thành hai subgoal: Grasp Bags, Move & Squat, Squat & Grasp, Rise & Turn, Grab Handle, và Push Ahead. Bảng kết quả cho thấy WholeBodyVLA đạt trung bình 78.0%, cao hơn Modular Design 64.0%, GR00T w/ LMO 42.0%, OpenVLA-OFT w/ LMO 56.7%, và biến thể dùng velocity-based RL 54.0%.
Nếu bạn chưa đọc các bài nền, nên xem lại Bản đồ pipeline WholeBodyVLA, Video egocentric và LAM, RL và LMO, và Sim-to-real: kiểm trước khi lên G1. Ngoài series, hai bài liên quan là phân tích WholeBodyVLA ICLR 2026 và thu thập dữ liệu GROOT N1 trên G1.
Vì sao không chỉ dùng một con số success rate?
Với robot tay đơn trên bàn, một số "pick success" đôi khi đã đủ để so sánh hai model. Với humanoid toàn thân, một task gồm nhiều pha vật lý khác nhau. Bag Packing không chỉ là grasp bag. Nó còn cần sidestep, squat, đặt túi vào carton và giữ thăng bằng trong lúc tay đưa vật xuống thấp. Box Loading không chỉ là grasp box. Nó cần squat, đứng lên, xoay người, giữ hộp ổn định, rồi đặt lên xe đẩy. Cart Pushing không chỉ là nắm tay cầm. Nó cần bước tới liên tục dưới tải nặng và giữ heading.
Điểm mạnh của bảng WholeBodyVLA là nó không gộp mọi thứ thành một dòng mơ hồ. Mỗi task được chia thành hai cột subgoal. Nếu một method đạt cao ở subgoal đầu nhưng thấp ở subgoal hai, ta biết lỗi nằm ở phần loco-manipulation dài hơn. Ví dụ, biến thể velocity-based RL đạt 22/25 ở Grasp Bags nhưng chỉ 1/25 ở Move & Squat. Nếu chỉ nhìn task average 54.0%, bạn biết nó kém. Nếu nhìn subgoal, bạn biết nó kém ở đâu: chuyển động chân, squat, heading và transition sau manipulation.
Đây là bài học lớn cho nhóm mới làm humanoid: thiết kế benchmark phải giúp debug, không chỉ giúp quảng cáo. Một scorecard tốt phải trả lời được bốn câu hỏi:
| Câu hỏi | Vì sao quan trọng |
|---|---|
| Robot thất bại ở subgoal nào? | Khoanh vùng perception, manipulation, locomotion hoặc transition |
| Failure có lặp lại theo pattern không? | Phân biệt lỗi ngẫu nhiên với lỗi hệ thống |
| Ablation nào làm tụt điểm nhiều nhất? | Biết nên đầu tư vào LAM, LMO, data hay decoder |
| Lỗi có nguy hiểm cho hardware không? | Ưu tiên sửa stumble, collision, quá lực, lệch hướng dưới tải |
Bảng gốc WholeBodyVLA nên được đọc như thế nào?
Paper báo cáo mỗi subgoal trên 25 trial. Dưới đây là bảng chính được viết lại ở dạng dễ copy vào spreadsheet. Các số này không phải con số giả lập; chúng là kết quả được báo cáo trong paper WholeBodyVLA.
| Method | Grasp Bags | Move & Squat | Squat & Grasp | Rise & Turn | Grab Handle | Push Ahead | Avg. Score |
|---|---|---|---|---|---|---|---|
| Modular Design | 22/25 | 12/25 | 9/25 | 9/25 | 22/25 | 22/25 | 64.0% |
| GR00T w/ LMO | 20/25 | 10/25 | 6/25 | 4/25 | 12/25 | 11/25 | 42.0% |
| OpenVLA-OFT w/ LMO | 19/25 | 6/25 | 12/25 | 12/25 | 22/25 | 14/25 | 56.7% |
| WholeBodyVLA | 23/25 | 13/25 | 19/25 | 17/25 | 23/25 | 22/25 | 78.0% |
| WholeBodyVLA w/ velocity-based RL | 22/25 | 1/25 | 16/25 | 3/25 | 24/25 | 15/25 | 54.0% |
| WholeBodyVLA w/o LAM | 15/25 | 4/25 | 8/25 | 6/25 | 16/25 | 10/25 | 39.3% |
| WholeBodyVLA w/ manipulation-only LAM | 24/25 | 7/25 | 17/25 | 11/25 | 20/25 | 14/25 | 63.3% |
| WholeBodyVLA w/ shared LAM | 18/25 | 11/25 | 16/25 | 16/25 | 20/25 | 18/25 | 66.0% |
Có ba điều đáng học từ bảng này.
Thứ nhất, subgoal đầu của mỗi task thường dễ hơn subgoal thứ hai. Grasp Bags, Squat & Grasp, và Grab Handle vẫn khó, nhưng chúng gần hơn với manipulation cục bộ. Move & Squat, Rise & Turn, và Push Ahead chứa nhiều locomotion hơn: bước ngang, đứng lên, xoay, tiến, giữ hướng, giữ tải. Đây là nơi controller thân dưới và latent locomotion bị kiểm tra mạnh hơn.
Thứ hai, LMO quan trọng không phải vì nó làm robot "đi đẹp" trong video, mà vì nó giữ cho quyết định VLA có thể thực thi. WholeBodyVLA đầy đủ đạt 78.0%, còn biến thể velocity-based RL chỉ 54.0%. Paper ghi rằng phần lớn khoảng cách đến từ subgoal thứ hai của mỗi task, tức phần có nhiều locomotion nhất. Điều này khớp với lỗi thực tế: velocity controller có thể tạo gait không nhất quán, path deviation, stumble hoặc vừa xoay vừa tiến ngoài ý muốn.
Thứ ba, LAM là phần giúp dữ liệu video không có action label trở nên hữu ích. Không dùng LAM chỉ đạt 39.3%. Chỉ dùng manipulation-only LAM đạt 63.3%, tốt hơn nhiều nhưng vẫn thua full model, nhất là ở các subgoal cần locomotion. Shared LAM đạt 66.0%, cho thấy một LAM chung vẫn học được nhiều thứ, nhưng tách manipulation LAM và locomotion LAM tốt hơn cho hệ này.
Thiết kế scorecard subgoal cho nhóm của bạn
Nếu bạn đang build benchmark cho G1, X2 hoặc một humanoid khác, đừng copy nguyên task nếu hardware và lab không giống. Hãy copy cấu trúc đánh giá: task dài được tách thành subgoal có tiêu chí pass rõ ràng. Một scorecard tối thiểu nên có các cột sau:
| Cột | Ví dụ | Ghi chú |
|---|---|---|
trial_id |
bagpack_013 |
Mã duy nhất để tìm lại video và log |
task |
bag_packing |
Tên task ở cấp người dùng |
subgoal |
move_and_squat |
Đơn vị chấm điểm chính |
instruction |
put the paper bag into the carton |
Câu lệnh được đưa cho VLA |
start_pose_bin |
near_left, far_right, rotated_30deg |
Giúp phân tích generalization |
object_variant |
brown_bag, white_bag, heavy_box |
Ghi distribution shift |
payload_kg |
0, 5, 50 |
Rất quan trọng với cart pushing |
pass |
true hoặc false |
Pass/fail cho subgoal |
failure_mode |
path_deviation |
Chỉ điền khi fail |
notes |
stopped 30 cm too early |
Mô tả ngắn, không viết essay |
Bạn có thể bắt đầu bằng CSV:
trial_id,task,subgoal,instruction,start_pose_bin,object_variant,payload_kg,pass,failure_mode,notes
bagpack_001,bag_packing,grasp_bags,"grasp the bags",center,brown_bag,0,true,,
bagpack_001,bag_packing,move_and_squat,"place the bags into the carton",center,brown_bag,0,false,early_stop,"stopped before carton; arms could not reach"
boxload_004,box_loading,rise_and_turn,"put the box onto the cart",rotated_30deg,plastic_box,6,false,wrong_orientation,"turned only halfway"
cart_011,cart_pushing,push_ahead,"push the cart forward",center,carton_load,50,false,path_deviation,"drifted right after 1.5 m"
Đừng đợi có dashboard phức tạp mới log. Một CSV tốt cộng video đồng bộ đã đủ để tìm lỗi trong tuần đầu. Dashboard chỉ nên đến sau khi taxonomy ổn định.
Định nghĩa pass/fail cho từng subgoal
Beginner thường mắc lỗi lớn ở đây: định nghĩa pass sau khi đã xem video. Làm vậy sẽ khiến score bị thiên vị. Hãy viết tiêu chí trước khi chạy trial.
| Subgoal | Pass khi | Fail khi |
|---|---|---|
Grasp Bags |
Hai gripper giữ túi đủ ổn định để bắt đầu di chuyển | Không nắm được, túi rơi trước khi di chuyển, nắm nhầm vật |
Move & Squat |
Robot đến vùng carton, squat đủ thấp và đặt túi vào carton | Dừng quá xa, lệch hướng, stumble, squat sai độ cao, túi rơi ngoài carton |
Squat & Grasp |
Robot squat và kẹp hộp bằng hai tay đủ chắc | Không tới được hộp, gripper lệch, hộp trượt, mất cân bằng khi cúi |
Rise & Turn |
Robot đứng lên, xoay đúng hướng xe đẩy và giữ hộp | Rơi hộp, xoay thiếu/quá, vừa xoay vừa tiến không kiểm soát, va vào xe |
Grab Handle |
Hai tay hoặc tay yêu cầu nắm được tay cầm xe | Không với tới, grasp lệch, tay tuột trước khi push |
Push Ahead |
Xe đi theo hướng mục tiêu trong khoảng cách yêu cầu, robot không ngã | Lệch đường, stop quá sớm/quá muộn, stumble, mất grip, đẩy lệch tải |
Với mỗi subgoal, nên có thêm tolerance đo được. Ví dụ:
subgoals:
move_and_squat:
target_region_radius_m: 0.20
final_base_yaw_error_deg: 15
min_squat_depth_m: 0.18
object_must_be_inside_container: true
push_ahead:
min_distance_m: 2.0
max_lateral_drift_m: 0.25
max_heading_error_deg: 12
handle_contact_required: true
Các ngưỡng trên chỉ là ví dụ. Với robot nhỏ trong lab hẹp, min_distance_m có thể là 1 mét. Với cart nặng, bạn có thể cần tiêu chí "không rời tay cầm quá 0.5 giây". Điểm quan trọng là mọi người trong nhóm dùng cùng một định nghĩa.
Chấm ablation: đừng chỉ hỏi model nào thắng
Ablation là cách biến benchmark thành quyết định kỹ thuật. Trong WholeBodyVLA, các ablation nói rõ từng thành phần đóng góp gì:
| Ablation | Câu hỏi kỹ thuật | Điều bảng kết quả gợi ý |
|---|---|---|
w/o LAM |
Nếu bỏ latent pretraining từ video, chỉ finetune bằng teleop thì sao? | Điểm rơi xuống 39.3%, tức video action-free và latent supervision rất quan trọng |
manipulation-only LAM |
Nếu chỉ học LAM từ manipulation, không học locomotion-aware video thì sao? | 63.3%, tốt hơn không LAM nhưng yếu ở các subgoal cần di chuyển |
shared LAM |
Nếu dùng một LAM chung cho mixed data thì sao? | 66.0%, học được nhưng thua thiết kế tách LAM |
velocity-based RL |
Nếu controller thân dưới là velocity tracking thông thường thì sao? | 54.0%, đặc biệt tệ ở Move & Squat và Rise & Turn |
Khi bạn làm ablation nội bộ, hãy giữ ba thứ cố định: cùng task, cùng số trial, cùng tiêu chí pass/fail. Nếu full model chạy 25 trial còn baseline chỉ chạy 10 trial, kết quả rất khó so sánh. Nếu hôm nay object nhẹ và ngày mai object nặng, chênh lệch có thể đến từ setup chứ không phải model.
Một cấu trúc config đơn giản:
benchmark:
date: 2026-06-10
trials_per_subgoal: 25
tasks:
- bag_packing
- box_loading
- cart_pushing
methods:
- name: wholebodyvla_full
manipulation_lam: separate
locomotion_lam: separate
low_level_controller: lmo
- name: no_lam
manipulation_lam: none
locomotion_lam: none
low_level_controller: lmo
- name: manip_only_lam
manipulation_lam: separate
locomotion_lam: none
low_level_controller: lmo
- name: velocity_rl
manipulation_lam: separate
locomotion_lam: separate
low_level_controller: velocity_tracking
Failure taxonomy: log lỗi để sửa hệ thống
Project page WholeBodyVLA cho thấy các failure case baseline như stumble to stop, lose balance, deviate from intended direction, hoặc stop too late. Appendix failure analysis của paper còn chia lỗi thành locomotion failure và pick/place failure, sau đó tách nhỏ thành object unreachable, basket unreachable, wrong orientation, early stop, overshoot, collision, stumble, grasp pose kém hoặc placement lệch.
Với nhóm beginner, hãy bắt đầu từ taxonomy ngắn nhưng đủ dùng:
| Failure mode | Nhóm lỗi | Mô tả |
|---|---|---|
early_stop |
locomotion | Robot dừng trước vùng thao tác, tay không với tới |
overshoot |
locomotion | Robot đi quá điểm cần dừng |
path_deviation |
locomotion | Robot lệch khỏi đường hoặc heading mục tiêu |
turn_with_advance |
locomotion | Robot vừa xoay vừa tiến khi lệnh mong muốn là xoay tại chỗ |
stumble |
locomotion | Chân vấp, thân rung mạnh, cần dừng an toàn |
wrong_orientation |
locomotion | Base quay sai hướng khi bắt đầu manipulation |
bad_grasp_pose |
manipulation | Gripper chạm sai điểm hoặc không kẹp được |
object_slip |
manipulation | Đã nắm nhưng vật tuột trong lúc di chuyển |
misaligned_place |
manipulation | Đặt vật lệch container/cart |
collision |
safety | Va bàn, carton, cart hoặc người vận hành |
Khi annotate, đừng cố gán quá nhiều nhãn. Một trial fail có thể có nguyên nhân dây chuyền, nhưng bạn nên chọn primary_failure_mode và thêm secondary_failure_mode nếu thật cần.
trial_id,primary_failure_mode,secondary_failure_mode,stop_reason,video_start_s,video_end_s
bagpack_001,early_stop,bad_grasp_pose,operator_estop,18.4,31.2
boxload_004,turn_with_advance,collision,timeout,22.0,36.5
cart_011,path_deviation,stumble,operator_estop,10.7,18.9
Một mẹo thực tế: hãy annotate ngay sau buổi chạy, khi cả operator và reviewer còn nhớ điều kiện setup. Nếu để qua ba ngày, bạn sẽ thấy video nhưng không nhớ mặt sàn có trơn không, payload có đúng 50 kg không, hoặc camera có bị lệch mount không.
Tính điểm và đọc kết quả
Với bảng 25 trial/subgoal, công thức rất đơn giản:
from collections import defaultdict
rows = [
{"method": "wholebodyvla", "task": "bag_packing", "subgoal": "grasp_bags", "pass": True},
{"method": "wholebodyvla", "task": "bag_packing", "subgoal": "move_and_squat", "pass": False},
]
score = defaultdict(lambda: {"pass": 0, "total": 0})
for row in rows:
key = (row["method"], row["task"], row["subgoal"])
score[key]["pass"] += int(row["pass"])
score[key]["total"] += 1
for key, value in score.items():
rate = value["pass"] / value["total"]
print(key, f"{value['pass']}/{value['total']}", f"{rate:.1%}")
Nhưng đọc kết quả mới là phần khó. Nếu Grasp Bags cao và Move & Squat thấp, đừng vội train lại manipulation. Hãy xem locomotion video, base trajectory, yaw, squat depth và latency giữa VLA 10 Hz với controller 50 Hz. Nếu Grab Handle cao nhưng Push Ahead thấp, lỗi có thể nằm ở heading control dưới tải, contact với tay cầm, hoặc controller không được train đủ payload. Nếu Squat & Grasp thấp, lỗi có thể là perception của hộp, reach trajectory, hoặc squat height không đủ.
Hãy luôn đọc score theo cặp:
| Pattern | Chẩn đoán ban đầu |
|---|---|
| Subgoal manipulation đầu cao, subgoal locomotion sau thấp | Ưu tiên LMO, command interface, trajectory stopping, squat/turn precision |
| Cả hai subgoal đều thấp | Kiểm tra perception, instruction, camera calibration, dataset mismatch |
| Full model hơn no-LAM nhiều | Latent pretraining có giá trị, nên mở rộng video action-free |
| Manip-only LAM gần full model | Task hiện tại chưa đủ locomotion; benchmark có thể quá hẹp |
| Velocity RL tệ ở transition | Controller cần intent rời rạc, reward directional accuracy hoặc curriculum tốt hơn |
Checklist cho một buổi benchmark
Trước khi chạy:
[ ] Pin commit/model checkpoint cho mọi method
[ ] Reset scene layout và đo vị trí bàn, carton, cart
[ ] Ghi object variant, payload, camera mount, ánh sáng
[ ] Chạy smoke test đứng yên, squat, turn, estop
[ ] Randomize thứ tự method để tránh bias do pin/battery/nhiệt
[ ] Bật record video egocentric, third-person, proprioception, VLA output, LMO command
Trong khi chạy:
[ ] Mỗi trial có trial_id trước khi robot bắt đầu
[ ] Operator không sửa lời nhắc giữa trial
[ ] Nếu estop, ghi stop_reason ngay
[ ] Không chấm pass/fail bằng cảm tính; dùng tiêu chí đã viết
[ ] Không xóa trial xấu trừ khi setup sai rõ ràng và có ghi chú
Sau khi chạy:
[ ] Review video theo subgoal
[ ] Annotate primary failure mode
[ ] Tính score từng subgoal và average
[ ] So sánh ablation cùng số trial
[ ] Chọn 3 lỗi lặp lại nhiều nhất cho sprint tiếp theo
Kết luận
Bài học quan trọng nhất từ WholeBodyVLA không chỉ là con số 78.0%. Bài học là cách nhóm tác giả thiết kế benchmark để thấy được nơi hệ thống mạnh và yếu: task dài được tách thành subgoal, mỗi subgoal có 25 trial, baseline và ablation được đặt cạnh nhau, rồi failure được phân tích theo locomotion và pick/place.
Nếu bạn đang xây VLA toàn thân, hãy bắt đầu với một scorecard nhỏ nhưng nghiêm túc. Ba task, hai subgoal mỗi task, 25 trial mỗi subgoal là đủ để lộ ra nhiều lỗi. Khi scorecard đã ổn, thêm generalization: object khác, start pose khác, tải trọng khác, mặt sàn khác. Đừng để benchmark chỉ là một video đẹp. Hãy làm cho nó trở thành công cụ chỉ đường cho lần thu dữ liệu, lần train LAM, lần sửa LMO và lần deploy tiếp theo.