wholebody-vlawholebody-vlahumanoidevaluationloco-manipulationlamlmobenchmark

Đánh giá VLA toàn thân

Cách biến bảng đánh giá WholeBodyVLA thành scorecard subgoal, ablation và failure log cho humanoid loco-manipulation.

Nguyễn Anh Tuấn10 tháng 6, 202615 phút đọc
Đánh giá VLA toàn thân

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 WholeBodyVLAproject 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 2026thu 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/25Grasp Bags nhưng chỉ 1/25Move & 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 & SquatRise & 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.

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

Bản đồ pipeline WholeBodyVLA
wholebody-vla

Bản đồ pipeline WholeBodyVLA

10/6/202616 phút đọc
NT
Scale 20 người và eval whole-body VLA
wholebody-vla

Scale 20 người và eval whole-body VLA

10/6/202615 phút đọc
NT
Video ego cho LAM locomotion
locomotion

Video ego cho LAM locomotion

10/6/202619 phút đọc
NT