Vì sao cần Behavior Tree cho whole-body VLA?
Cyclo Intelligence là một Physical AI workflow system của ROBOTIS cho AI Worker, OMY, OMX và các robot có ROS 2 topics. Điểm đáng chú ý của đợt cập nhật mới là ROBOTIS không chỉ cho phép record dataset, convert sang LeRobot và deploy policy, mà còn đưa Behavior Tree (BT) vào ngay trong orchestrator để điều phối long-horizon task. Bài đăng gốc trên Open Robotics Discourse mô tả use case rất thực tế: GR00T N1.7 có perception, language understanding và policy inference linh hoạt, nhưng robot ngoài đời vẫn cần safety check, exception handling và rule-based control có tính quyết định. Cyclo Intelligence vì vậy dùng BT Manager để kéo thả các node như JointControl, Rotate, Wait, SendCommand, kết hợp chúng với vòng đời inference của VLA.
Điều này đặc biệt quan trọng với whole-body VLA trên humanoid. Nếu chỉ gọi VLA một lần với câu lệnh “clean the table” rồi để policy chạy liên tục, bạn đang giao cho model cả planning, recovery, posture initialization, timing, stop condition và hardware safety. Đó là một bề mặt lỗi quá lớn. Một hệ thống triển khai nghiêm túc nên tách vai trò:
| Lớp | Nên làm gì | Ví dụ trong Cyclo + GR00T |
|---|---|---|
| Behavior Tree | Quy trình dài, thứ tự bước, loop, pause, recovery | Load model, đưa tay về pose an toàn, quay base, resume VLA, stop, reset |
| GR00T N1.7 VLA | Đoạn thao tác cần perception và language grounding | “Pick up the paper cup”, “place it on the tray” |
| Cyclo Brain runtime | Load policy, đọc camera/state, tạo action chunk, publish command | main-runtime, engine-process, action buffer |
| Low-level robot stack | Control cadence, joint/mobile topics, limit, E-stop | ROS 2 topics, RobotClient, controller của robot |
Nguồn gốc kỹ thuật của bài này gồm project ROBOTIS-GIT/cyclo_intelligence, tài liệu Cyclo Intelligence, manual Behavior Trees, announcement BT-Based Whole-body VLA Framework, repo NVIDIA/Isaac-GR00T, và workflow GR00T-WholeBodyControl. Không có một paper riêng cho Cyclo BT-VLA tại thời điểm viết bài; phần “paper idea” ở đây nên hiểu là ý tưởng hệ thống từ project gốc, còn nền model dựa trên GR00T N1 whitepaper và bản GR00T N1.7 release.

Nếu bạn đang đọc theo hướng triển khai humanoid VLA, nên xem thêm NVIDIA GR00T + SONIC Whole-Body VLA để hiểu nền GR00T N1.7 + SONIC, và WholeBodyVLA teleop-train-deploy tutorial để nắm vòng đời dữ liệu từ teleoperation đến inference. Cyclo Intelligence đứng ở lớp “operation”: nó biến một checkpoint VLA thành một phần của workflow robot có thể bật, tắt, pause, resume và debug.
Ý tưởng chính: VLA là leaf node, không phải toàn bộ robot
Behavior Tree không phải là mô hình học máy. Nó là cấu trúc điều khiển gồm node cha và node con. Sequence chạy từng node theo thứ tự và fail nếu một bước fail. Loop lặp một nhánh. Action node thực hiện việc cụ thể như quay robot, đặt joint pose, chờ vài giây, hoặc gửi command vào inference runtime. Điểm mạnh của BT là trạng thái rất rõ: mỗi node trả RUNNING, SUCCESS hoặc FAILURE; bạn có thể quan sát cây đang chạy đến đâu, node nào active, và vì sao dừng.
Với VLA, BT giải quyết vấn đề “lifecycle” thay vì chỉ “prompt”. GR00T N1.7 tạo action chunk từ image, language instruction và proprioception. Nhưng một long-horizon job trên humanoid thường gồm nhiều đoạn:
- Đưa robot về posture ổn định.
- Xoay hoặc di chuyển base đến vùng thao tác.
- Load checkpoint phù hợp và để model paused trong memory.
- Resume VLA trong một cửa sổ thời gian ngắn cho thao tác cần perception.
- Stop inference để không giữ command cũ chạy quá lâu.
- Reset tay, quay sang vị trí tiếp theo, lặp lại.
- Clear model khi task xong.
Trong repo Cyclo, node SendCommand chính là cầu nối giữa BT và inference pipeline. Nó hỗ trợ bốn command ở mức BT: LOAD, RESUME, STOP, CLEAR. LOAD không chỉ gọi start rồi chạy luôn. Theo source code, LOAD chạy một sequence hai stage: start inference để model được load, sau đó stop inference để policy ở trạng thái paused trong memory. Nhờ vậy node tiếp theo trong BT có thể làm initialization trước khi RESUME. Đây là chi tiết rất hay, vì lỗi phổ biến khi deploy VLA là model bắt đầu sinh action trong khi robot chưa ở pose/camera viewpoint đúng.
Ở mức architecture, Cyclo Brain dùng two-process runtime:
Web UI / BT Manager / CLI
|
v
/<backend>/inference_command
|
v
Main Runtime
- giữ session state
- quản lý action buffer
- publish robot command ở control_hz
|
v
Engine Process
- load GR00T hoặc LeRobot policy
- đọc observations qua RobotClient
- preprocess camera/state/language
- trả action chunk dạng (T, D)
Với GR00T backend, GR00TInference load Gr00tPolicy, đồng bộ Hugging Face token nếu cần backbone gated, khởi tạo RobotClient, đọc camera RGB, joint positions và có thể cả odom cho mobile state. Hàm get_action_chunk() tạo observation dictionary gồm video, state, language, gọi policy.get_action(observation), rồi concatenate các action modality thành một chunk (T, D_total). Main Runtime giữ chunk này trong buffer và pop từng action ở control cadence. Khi buffer rỗng, runtime không lặp lại action cũ; pause, stop, unload hoặc đổi output mode sẽ clear buffer để tránh command stale nhảy vào robot.
GR00T N1.7 và SONIC nằm ở đâu trong stack?
GR00T N1.7 là open reasoning VLA model của NVIDIA cho humanoid. Theo NVIDIA, bản N1.7 dùng Action Cascade architecture: System 2 là vision-language backbone Cosmos-Reason2-2B tạo high-level action tokens; System 1 là Diffusion Transformer tạo continuous motor commands hoặc action representation từ state và token. Bản model công khai có hướng dẫn fine-tune bằng LeRobot format, chạy policy server, và deploy qua server-client inference.
Với whole-body Unitree G1, tài liệu Isaac-GR00T nói GR00T N1.7 hỗ trợ embodiment UNITREE_G1_SONIC thông qua GEAR-SONIC controller. Thay vì bắt VLA dự đoán trực tiếp toàn bộ joint angles, workflow SONIC để VLA dự đoán 64-dimensional latent motion tokens. SONIC decode latent này thành full-body joint commands ở 50 Hz, gồm legs, arms và hands. Cách chia này rất hợp lý: VLA tập trung vào semantics và task-conditioned action, còn learned whole-body controller chịu trách nhiệm chuyển latent thành chuyển động cân bằng, phối hợp toàn thân.

Trong Cyclo Intelligence, GR00T N1.7 là một backend inference bên cạnh ACT, SmolVLA, XVLA, Pi0, Pi0.5 và Diffusion. UI cho phép chọn GR00T N1.7, bật Docker backend, nhập Task Instruction, nhập Policy Path, rồi Start. BT Manager dùng cùng runtime contract đó thông qua SendCommand. Nói cách khác, bạn không cần viết một ROS 2 node riêng chỉ để bật tắt model trong từng đoạn task; BT node gọi command lifecycle đã có.
Cài đặt Cyclo Intelligence
Beginner nên bắt đầu bằng robot PC hoặc workstation có ROS 2 topics của robot, Docker và camera/joint pipeline hoạt động. Tài liệu ROBOTIS hướng dẫn cài Cyclo Intelligence từ repository chính:
cd $HOME
git clone --recurse-submodules https://github.com/ROBOTIS-GIT/cyclo_intelligence.git
cd $HOME/cyclo_intelligence
./docker/container.sh start
Với máy đã cài trước đó:
cd $HOME/cyclo_intelligence
git pull
git submodule update --init --recursive
./docker/container.sh start
Sau khi container chạy, mở web UI:
http://<robot-ip>/
Trên robot local:
http://127.0.0.1/
Cyclo mount workspace ở:
$HOME/cyclo_intelligence/docker/workspace
Việc đầu tiên trong Home page là chọn đúng robot type. Bấm Refresh Robot Type List, chọn robot, rồi Set Robot Type. Robot type này ảnh hưởng đến orchestrator, recording pipeline, dataset conversion và Cyclo Brain runtime. Nếu chọn sai, policy có thể load được nhưng mapping camera, joint groups hoặc action dimension sẽ sai.
Các command container hữu ích:
./docker/container.sh status
./docker/container.sh logs
./docker/container.sh enter
./docker/container.sh stop
Khi debug, hãy tách ba lớp lỗi. Lỗi Docker là backend OFF, image missing, main process down hoặc engine process down. Lỗi sensor là thiếu camera, thiếu joint group, odom không có data. Lỗi model là checkpoint path sai, Hugging Face token thiếu, modality config không khớp hoặc GPU memory không đủ. Tách như vậy giúp bạn không nhầm lỗi VLA với lỗi runtime.
Chuẩn bị checkpoint GR00T N1.7
Bạn có hai hướng. Hướng nhanh là dùng một checkpoint GR00T N1.7 đã fine-tune đúng robot/task. Docs Cyclo đưa ví dụ Hugging Face repo ID:
ROBOTIS/cyclo_intelligence_groot_n1.7_model
và local path:
/policy_checkpoints/groot/cyclo_intelligence_groot_n1.7_model
Trên host, các checkpoint được bind-mount vào container theo layout:
| Backend | Host path | Container path |
|---|---|---|
| LeRobot | $HOME/cyclo_intelligence/cyclo_brain/policy/lerobot/checkpoints |
/policy_checkpoints/lerobot |
| GR00T | $HOME/cyclo_intelligence/cyclo_brain/policy/groot/checkpoints |
/policy_checkpoints/groot |
Hướng nghiêm túc hơn là fine-tune GR00T N1.7 bằng dữ liệu của robot bạn. Với whole-body G1 + SONIC, workflow NVIDIA gồm ba bước: collect teleop demonstrations bằng SONIC stack, fine-tune Isaac-GR00T N1.7 trên dataset đã export, rồi deploy bằng PolicyServer + SONIC. Nếu bạn chưa có dataset, hãy đọc thêm GR00T N1.7 EgoScale fine-tune để hiểu vì sao N1.7 cải thiện nhờ human egocentric video và cách fine-tune không phá prior sẵn có.
Một lệnh fine-tune dạng tổng quát trong Isaac-GR00T là:
uv run python gr00t/experiment/launch_finetune.py \
--base-model-path nvidia/GR00T-N1.7-3B \
--dataset-path /path/to/your/lerobot_dataset \
--output-dir /path/to/output_checkpoint \
--modality-config-path /path/to/your_modality_config.py \
--embodiment-tag new_embodiment \
--global-batch-size 12 \
--max-steps 2000
Với SONIC, điểm khác biệt là action target trong dataset không nhất thiết là raw full-body joints ở mọi tầng. GR00T có thể học latent action representation để SONIC decode thành whole-body motion. Bạn cần giữ thống nhất controller dùng lúc teleop và controller dùng lúc deploy. NVIDIA technical blog nhấn mạnh rằng WBC được chọn trước khi collect data, vì controller tạo ra joint-space targets trở thành training distribution. Đổi controller sau khi train là đổi phân phối action.
Thiết kế Behavior Tree đầu tiên
Manual Behavior Trees của ROBOTIS đưa một XML example rất sát use case. Rút gọn lại, cây có dạng:
<Sequence name="DemoSequence">
<SendCommand
name="LoadModel"
command="LOAD"
model="groot:n17"
policy_path="/workspace/model/groot/your_model_path"
task_instruction="Pick up the paper cup."
inference_mode="robot"
inference_hz="15"
control_hz="100"
chunk_align_window_s="0.3"/>
<JointControl
name="InitPosition"
enable_head="true"
enable_arms="true"
enable_lift="true"
duration="2.0"/>
<Rotate name="TurnLeft" angle_deg="90.0"/>
<Loop name="RepeatPickPlace" max_iterations="3">
<SendCommand
name="ResumeInference"
command="RESUME"
task_instruction="Pick up the paper cup."/>
<Wait name="HoldInference" duration="3.0"/>
<SendCommand name="StopInference" command="STOP"/>
<JointControl name="InitArms" enable_arms="true" duration="5.0"/>
</Loop>
<SendCommand name="UnloadModel" command="CLEAR"/>
</Sequence>
Giải thích từng bước:
LoadModel: load checkpoint GR00T N1.7 vào memory, nhưng kết thúc ở trạng thái paused. Đây là bước chuẩn bị.InitPosition: đưa head, arms và lift về pose ổn định. Với humanoid, pose ban đầu ảnh hưởng trực tiếp đến camera view và collision risk.Rotate: xoay base hoặc mobile platform để đặt robot vào vùng thao tác.ResumeInference: cho VLA chạy với task instruction cụ thể.Wait: cho policy một cửa sổ thời gian để phát action chunks.StopInference: pause policy, clear logic tiếp theo không bị action buffer kéo dài ngoài ý muốn.InitArms: reset tay trước lần lặp tiếp theo.Clear: unload session khi xong.

Trong UI, bạn không bắt buộc viết XML bằng tay. BT Manager cho phép kéo node vào canvas, nối edge, chỉnh parameter, auto layout, save XML và load lại cây. Khi bạn thêm custom action Python dưới orchestrator/orchestrator/bt/actions/ hoặc custom control dưới orchestrator/orchestrator/bt/controls/, registry sẽ scan class và tạo catalog. Tên class thành XML tag; constructor kwargs thành ports trong BT Manager. Với beginner, hãy dùng node built-in trước khi viết custom node.
Training pipeline thực tế
Một pipeline training cho Cyclo + GR00T N1.7 nên đi theo thứ tự sau:
1. Chọn task nhỏ, có reset rõ ràng
2. Record demonstrations bằng Cyclo Data hoặc SONIC teleop
3. Kiểm tra camera, joint, mobile state, timestamp
4. Convert dataset sang LeRobot format
5. Fine-tune GR00T N1.7 với modality config đúng robot
6. Copy checkpoint vào GR00T checkpoint path của Cyclo
7. Test dry-run hoặc simulation mode
8. Test robot mode với BT ngắn, có E-stop
9. Mở rộng thành long-horizon BT có loop và recovery
Đừng bắt đầu bằng task quá dài như “dọn cả bàn”. Hãy train một skill như “pick up the paper cup” hoặc “place the object on the tray”. Sau đó dùng BT để ghép nhiều lần skill đó với motion deterministic. Đây là tinh thần của framework: VLA xử lý đoạn khó về perception-contact; BT xử lý trình tự, điều kiện dừng và recovery.
Khi thu data, cần log đủ:
| Dữ liệu | Vì sao cần |
|---|---|
| RGB camera chính | Grounding object và scene |
| Wrist/side camera nếu có | Contact và pose local |
| Joint positions / velocities | State input cho policy |
| Mobile base / odom nếu task có di chuyển | Whole-body hoặc mobile manipulation |
| Language instruction | Điều kiện hóa task |
| Action target từ controller | Supervision cho fine-tune |
Với GR00T, modality config là thứ rất dễ sai. Nếu checkpoint kỳ vọng key video.cam_left_head nhưng robot config xuất camera_left, runtime cần mapping đúng. Cyclo GR00T runtime có logic resolve camera feature sources và joint groups, nhưng bạn vẫn phải kiểm tra robot YAML. Khi action output không khớp dimension, thường nguyên nhân không phải model “ngu”, mà là action modality hoặc embodiment tag không đúng.
Inference và tuning latency
Cyclo cho phép đặt inference_hz, control_hz và chunk_align_window_s. Beginner nên hiểu ba tham số này như sau:
| Tham số | Ý nghĩa | Gợi ý ban đầu |
|---|---|---|
inference_hz |
Tần số model tạo action chunk mới | 10-15 Hz với VLA nặng |
control_hz |
Tần số publish command xuống robot | 50-100 Hz tùy controller |
chunk_align_window_s |
Cửa sổ canh chunk với control loop | 0.2-0.3 s để tránh lệch pha |
GR00T N1.7 có thể chạy PyTorch eager hoặc TensorRT DiT acceleration trong Cyclo runtime. Source code cho thấy nếu request tensorrt_dit, runtime cần file engine như dit_model_bf16.trt; nếu thiếu mà strict mode bật, load sẽ fail. Nếu không strict, Cyclo có thể fallback về PyTorch. Trên robot edge GPU, hãy test PyTorch trước cho đúng behavior, rồi mới tối ưu TensorRT. Tối ưu sớm khi camera mapping chưa đúng chỉ làm debug khó hơn.
Một pattern an toàn cho inference:
LOAD model
-> wait until INFERENCING
-> STOP immediately
-> wait until PAUSED
JointControl / Rotate / setup
RESUME VLA
Wait bounded duration
STOP VLA
Reset deterministic posture
CLEAR at end
Pattern này tránh hai lỗi nguy hiểm. Thứ nhất, VLA không chạy khi robot chưa sẵn sàng. Thứ hai, khi đoạn inference đã hết thời gian, command mới không tiếp tục được publish ngoài nhánh BT. Với whole-body humanoid, hai lỗi này đủ để làm robot va chạm hoặc mất balance, nên lifecycle control đáng giá hơn một prompt dài.
Kết quả và cách đọc demo
Demo công khai của ROBOTIS cho framework này là robot tự động thu gom cốc và đổ thùng rác, được chia sẻ trong bài Open Robotics Discourse. Đây là kết quả định tính, không phải benchmark bảng số liệu như LIBERO hay SimplerEnv. Điểm cần nhìn trong demo không phải “model có hiểu câu lệnh không”, mà là workflow dài được chia thành các đoạn có kiểm soát: robot chuyển posture, chạy inference ở đoạn cần VLA, dừng, chuyển sang bước tiếp theo, rồi lặp.
Kết quả từ phía GR00T N1.7 cũng nên đọc đúng phạm vi. NVIDIA công bố N1.7 là 3B open reasoning VLA model, có commercial license, hỗ trợ LeRobot format, được pretrain bằng EgoScale với 20,854 giờ human egocentric video và validated trên loco-manipulation, tabletop manipulation, bimanual dexterous tasks. Những con số đó nói về năng lực nền của model. Còn kết quả Cyclo BT-VLA nói về engineering pattern: đưa một VLA vào runtime robot có lifecycle rõ, UI quan sát được, và BT debug được.

ROBOTIS cũng có một bài Discourse liên quan về expert intervention cho VLA fine-tuning: thêm 100 episode can thiệp vào 150 episode ban đầu giúp success rate tăng từ 62% lên 93%. Đây không phải cùng một benchmark với BT-VLA demo, nhưng nó củng cố cùng một thông điệp thực dụng: triển khai VLA tốt không chỉ là chọn model lớn hơn. Bạn cần pipeline thu data, runtime, intervention, recovery và orchestration.
Checklist triển khai cho beginner
Trước khi chạy robot thật, hãy đi qua checklist này:
| Mục | Kiểm tra |
|---|---|
| Robot type | UI đã chọn đúng robot type và connected |
| Cameras | Topic camera có frame mới, rotation đúng |
| Joint groups | YAML joint group khớp modality config |
| Model path | Checkpoint nằm đúng /policy_checkpoints/groot/... |
| Hugging Face token | Có quyền tải GR00T/Cosmos backbone nếu checkpoint cần |
| Dry-run | publish_to_robot=false hoặc simulation mode chạy được |
| BT lifecycle | LOAD -> PAUSED -> RESUME -> STOP -> CLEAR đúng phase |
| Safety | E-stop, workspace bounds, velocity limit, operator sẵn sàng |
| Logging | Lưu inference recording để debug regressions |
Nếu một cây BT fail, đừng sửa prompt đầu tiên. Hãy xem node nào trả failure. Nếu LoadModel fail, kiểm tra backend process, checkpoint, token và GPU. Nếu ResumeInference fail, kiểm tra phase /task/inference_status. Nếu robot không di chuyển dù model chạy, kiểm tra output mode, action buffer và command topics. Nếu robot di chuyển sai hướng, kiểm tra camera mapping, joint order, action normalization và embodiment tag.
Khi nào nên dùng BT + VLA?
Dùng BT + VLA khi task của bạn có cấu trúc lặp hoặc có nhiều đoạn deterministic xen kẽ đoạn manipulation mở. Ví dụ: dọn từng cốc trên bàn, lấy vật từ nhiều vị trí, mở ngăn kéo rồi pick object, hoặc mobile manipulation trong môi trường bán cố định. BT cho phép bạn cố định những thứ đã biết và chỉ dùng VLA ở phần cần semantic generalization.
Không nên dùng BT như cách che giấu policy yếu. Nếu skill VLA “pick up the paper cup” chỉ thành công 20%, loop BT sẽ chỉ lặp lỗi nhanh hơn. Khi đó hãy quay về collect data, intervention, fine-tune, hoặc giới hạn workspace. Ngược lại, nếu policy skill đạt 80-90% trên đoạn ngắn, BT có thể giúp biến nó thành workflow dài ổn định hơn bằng reset, timeout và recovery.
Kết luận ngắn: Cyclo Intelligence không biến GR00T N1.7 thành một robot OS hoàn chỉnh, nhưng nó đưa ra một pattern triển khai rất đáng học. Hãy coi GR00T N1.7 là semantic motor skill, SONIC/WBC là whole-body execution layer, Cyclo Brain là runtime action-chunk layer, và Behavior Tree là lớp orchestration. Khi bốn lớp này được tách rõ, bạn có thể debug, mở rộng và vận hành humanoid VLA một cách có kiểm soát hơn nhiều.



