VnRobo
Về chúng tôiBảng giáBlogLiên hệ
🇺🇸ENĐăng nhậpDùng thử miễn phí
🇺🇸EN
VnRobo logo

Hạ tầng AI cho robot công nghiệp thế hệ mới.

Sản phẩm

  • Tính năng
  • Bảng giá
  • Kiến thức
  • Dịch vụ

Công ty

  • Về chúng tôi
  • Blog
  • Liên hệ

Pháp lý

  • Chính sách bảo mật
  • Điều khoản sử dụng

© 2026 VnRobo. Bảo lưu mọi quyền.

Được tạo với♥tại Việt Nam
VnRobo
Về chúng tôiBảng giáBlogLiên hệ
🇺🇸ENĐăng nhậpDùng thử miễn phí
🇺🇸EN
  1. Trang chủ
  2. Blog
  3. StarVLA-WBC: train VLA WBC cho G1
wholebody-vlaStarVLA-WBCUnitree G1VLAwhole-body controlSIMPLESONICLeRobot

StarVLA-WBC: train VLA WBC cho G1

Hướng dẫn StarVLA-WBC: train policy VLA whole-body cho Unitree G1 trên SIMPLE và deploy an toàn qua WBC/SONIC.

Nguyễn Anh Tuấn11 tháng 9, 202614 phút đọc
StarVLA-WBC: train VLA WBC cho G1

Vì sao StarVLA-WBC đáng chú ý?

StarVLA-WBC là một nhánh tập trung của hệ sinh thái StarVLA, hướng thẳng vào bài toán humanoid whole-body control: từ ảnh egocentric, instruction ngôn ngữ tự nhiên và robot state, model dự đoán một action chunk có ý nghĩa với toàn thân robot, sau đó một WBC stack bên ngoài thực thi phần cân bằng, contact, tracking và safety. Repo gốc nằm tại starVLA/starVLA-WBC. Paper nền là technical report StarVLA: A Lego-like Codebase for Vision-Language-Action Model Developing, trong đó nhóm StarVLA nhấn mạnh kiến trúc modular: backbone VLM hoặc world model tách khỏi action head, dataloader tách khỏi model-specific preprocessing, và evaluation/deployment đi qua interface thống nhất.

Điểm thú vị của StarVLA-WBC không phải là "thay WBC bằng VLA". Ngược lại, ý tưởng chính là không để VLA làm việc của controller. VLA nên quyết định robot cần làm gì trong vài bước tới: tay trái đi đâu, tay phải đóng mở thế nào, thân xoay ra sao, base nên đi theo hướng nào. Nhưng balance, joint limits, timing 50-200 Hz, proprioceptive history, contact constraints và emergency stop vẫn phải nằm ở controller bên ngoài như SONIC, AMO, HOMIE, BFM-Zero hoặc một stack WBC của lab bạn. Đây là ranh giới rất thực dụng cho Unitree G1, vì model VLA lớn thường chạy chậm hơn nhiều so với vòng điều khiển thấp tầng.

Nếu bạn đã đọc bài GR00T N1 G1 WBC deploy, cách nghĩ của StarVLA-WBC sẽ rất quen: policy server ở GPU machine tạo high-level action, còn G1-side controller đảm nhiệm robot thật. Nếu bài ASAP cho G1 tập trung vào sim-to-real dynamics mismatch, StarVLA-WBC tập trung vào một câu hỏi khác: làm sao chuẩn hóa data, action contract và model serving để một VLA policy có thể kết nối với nhiều controller whole-body mà không nhét controller-specific latent vào dataset.

Khuyến nghị công cụ

Stack train/deploy cho VLA

Train trên cloud/workstation, deploy bản tối ưu xuống Jetson hoặc robot computer.

Cloud GPU for VLA / policy training Dùng cho imitation learning, diffusion policy, RL và fine-tuning model robotics. Xem cloud GPU → NVIDIA Jetson Orin NX / Orin Nano Máy deploy edge cho perception, logging và inference đã tối ưu. Xem Jetson → Hugging Face / robotics dataset hosting Lưu dataset, checkpoint và model card để workflow LeRobot/VLA dễ chia sẻ hơn. Xem platform →

Tổng quan interface StarVLA-WBC cho humanoid controller - nguồn: repo starVLA/starVLA-WBC
Tổng quan interface StarVLA-WBC cho humanoid controller - nguồn: repo starVLA/starVLA-WBC

Ý tưởng paper và project ở mức beginner

Một VLA model truyền thống cho robot arm thường nhận ảnh, text, state rồi trả về action 6-7 DoF: delta end-effector, gripper open/close, hoặc joint target. Với humanoid như Unitree G1, action space rộng và khó hơn nhiều. Robot có legs, waist, two arms, hands, floating base, balance constraints và contact switching. Nếu model trực tiếp dự đoán torque hoặc motor target ở tần số cao, nó phải học cả perception, language, planning, locomotion stability và actuator behavior trong một mạng lớn. Điều này rất khó debug, rất nhạy với latency và nguy hiểm khi deploy.

StarVLA-WBC chọn cách chia tầng:

camera + instruction + robot state
        -> StarVLA-WBC policy
        -> humanoid command / action chunk
        -> external WBC controller
        -> simulator hoặc Unitree G1

Trong technical report StarVLA, đóng góp chính là biến VLA thành một codebase dạng Lego. Bạn có thể thay backbone Qwen-VL bằng world model, thay action head OFT bằng flow matching kiểu Pi0, thay benchmark LIBERO bằng SIMPLE hoặc RoboCasa, nhưng vẫn giữ cùng kiểu config, dataset registry, trainer và policy serving. StarVLA-WBC giữ tinh thần đó nhưng cắt bớt phần không liên quan để tập trung vào humanoid. Nó giữ các family như StarVLA-OFT, StarVLA-PI, StarVLA-GR00T, WM4A/WanPI, đồng thời thêm interface HumanoidCommand, action codec và controller adapter.

Với beginner, hãy nhớ ba lớp:

Lớp Trả lời câu hỏi Ví dụ
VLA policy Robot nên làm gì theo ảnh và instruction? pick object, open faucet, handover
Action contract Model output có nghĩa gì? 36D simple_psi0, 48D g1_joint_reference, 78D SONIC latent route
WBC controller Làm thế nào để robot làm điều đó mà không ngã? SONIC, AMO, HOMIE, BFM-Zero, custom G1 stack

Sự khác biệt quan trọng nằm ở từ "contract". Nếu dataset lưu một vector 78D, bạn phải biết 64 chiều đầu là motion token cho SONIC, 7 chiều sau là left hand, 7 chiều cuối là right hand. Nếu dataset lưu vector 36D simple_psi0, bạn phải biết nó gồm hand, arm, torso, base height, planar velocity, yaw rate và target yaw. Nếu bạn đổi thứ tự joint nhưng không đổi config, model vẫn chạy nhưng hành vi robot sẽ sai. Đây là loại bug nguy hiểm nhất trong humanoid VLA: không crash, nhưng robot làm một chuyển động khác ý bạn.

Kiến trúc StarVLA-WBC

Repo StarVLA-WBC tách kiến trúc thành bốn contract. Đầu tiên là action codec, đọc flat action vector từ model và giải mã thành semantic command. Thứ hai là HumanoidCommand, giữ named joint positions/velocities, floating-base motion, yaw và height. Thứ ba là controller adapter, chuyển semantic command sang native input của controller cụ thể. Cuối cùng là ControllerBackend, trả về HumanoidJointTarget cho simulator hoặc robot bridge.

Bốn tầng từ policy đến controller execution trong StarVLA-WBC - nguồn: repo starVLA/starVLA-WBC
Bốn tầng từ policy đến controller execution trong StarVLA-WBC - nguồn: repo starVLA/starVLA-WBC

Trong SIMPLE integration, một sample gồm một ảnh RGB egocentric, một language instruction và state 32D. Policy mặc định cũ dự đoán action chunk 30 bước, mỗi bước 36D:

Slice Ý nghĩa
0:7 left hand joint targets
7:14 right hand joint targets
14:21 left arm joint targets
21:28 right arm joint targets
28:31 torso roll, pitch, yaw
31 base height
32:34 planar velocity vx, vy
34 yaw rate
35 absolute target yaw

Layout này không chứa leg joints. Nó là upper-body joint reference plus floating-base motion intent, không phải full motor command. Vì vậy cùng một frozen policy có thể được thử với nhiều backend: SONIC tự tạo lower-body và balance, AMO tự xử lý locomotion/pelvis, HOMIE xây 456D observation history cho leg ONNX, BFM-Zero dùng motion completion và encoder riêng. Repo cũng hỗ trợ layout mới g1_joint_reference 48D: 29 body joints, 14 hand joints, thêm planar velocity, yaw rate, base height và target yaw. Layout 48D phù hợp hơn nếu bạn muốn controller-neutral full-body reference, nhưng cần backend thật sự biết track trajectory toàn thân.

Với route real robot Unitree G1, StarVLA-WBC dùng ví dụ SONIC/Dex3 rõ hơn: state 72D, action 78D, horizon 8, normalization q99. Action 78D được hiểu là:

action[0:64]   -> SONIC motion latent
action[64:71]  -> left hand joints
action[71:78]  -> right hand joints

Route này thực dụng khi bạn đã có GR00T-WholeBodyControl hoặc SONIC-style WBC, vì high-frequency balance vẫn nằm ở controller đã được thiết kế cho G1. Đổi lại, 64D latent không còn controller-neutral như 36D/48D semantic reference; nó gắn chặt với decoder/controller route bạn chọn.

Một interface StarVLA-WBC có thể nối tới SONIC, AMO, HOMIE và BFM-Zero - nguồn: repo starVLA/starVLA-WBC
Một interface StarVLA-WBC có thể nối tới SONIC, AMO, HOMIE và BFM-Zero - nguồn: repo starVLA/starVLA-WBC

Cài đặt môi trường

Bạn nên dùng một workstation Linux có NVIDIA GPU, CUDA-enabled PyTorch, Python 3.10 trở lên, disk đủ lớn cho dataset và checkpoint. SIMPLE evaluation chạy trong môi trường SIMPLE/Isaac riêng và giao tiếp với policy server qua WebSocket. Real G1 deployment cần thêm Unitree SDK, camera server, network setup và WBC controller stack, nhưng các phần đó không nên nằm trong môi trường training VLA.

Cài StarVLA-WBC:

git clone https://github.com/starVLA/starVLA-WBC.git
cd starVLA-WBC
python -m pip install -r requirements.txt
python -m pip install -e .

Sau đó đặt hoặc link Qwen checkpoint vào:

playground/Pretrained_models/

Hoặc override framework.qwenvl.base_vlm bằng Hugging Face model ID hay local path. Với SIMPLE recipe, README dùng Qwen3-VL-4B-Instruct làm mặc định. Với real G1 SONIC smoke route, YAML mẫu dùng Qwen3.5-0.8B để dễ chạy hơn. Nếu GPU nhỏ, hãy bắt đầu bằng OFT/MLP smoke test, batch nhỏ và MAX_STEPS=1000 trước khi nghĩ tới full run.

Một checklist cài đặt tối thiểu:

  1. python -c "import torch; print(torch.cuda.is_available())" trả về True.
  2. python -m pip show accelerate transformers torch hiển thị đúng environment.
  3. Dataset root có quyền đọc nhanh từ training machine.
  4. Qwen checkpoint load được trong một process mới.
  5. DRY_RUN=1 in ra đúng command trước khi launch training thật.

Train policy trên SIMPLE

SIMPLE là benchmark mô phỏng whole-body cho Unitree G1. StarVLA-WBC tích hợp SIMPLE để train/evaluate policy G1 trên các task như XMovePick, BendPick, Handover, LocoPickBetweenTables, TabletopGrasp, CloseDoor, OpenOven, OpenFaucet và PickAndPlaceAndHugContainer. Data training dùng LeRobot v2.1; evaluation chạy trong SIMPLE/Isaac và gọi policy server ở 50 Hz.

Tải data 10 task:

export SIMPLE_TASKS="G1WholebodyXMovePickTeleop-v0,G1WholebodyBendPickMP-v0,G1WholebodyHandoverTeleop-v0,G1WholebodyLocomotionPickBetweenTablesTeleop-v0,G1WholebodyTabletopGraspMP-v0,G1WholebodyXMoveBendPickTeleop-v0,G1WholebodyCloseDoorTeleop-v0,G1WholebodyOpenOvenTeleop-v0,G1WholebodyOpenFaucetTeleop-v0,G1WholebodyPickAndPlaceAndHugContainerTeleop-v0"
bash examples/simBenchmarks/SIMPLE/train_files/download_simple_data.sh playground/Datasets

Train default StarVLA-PI:

data_mix=simple_psi0_all_ten_tasks \
NUM_PROCESSES=8 \
bash examples/simBenchmarks/SIMPLE/train_files/run_simple_train.sh

Nếu muốn baseline trực tiếp hơn, dùng StarVLA-OFT với YAML OFT:

config_yaml=examples/simBenchmarks/SIMPLE/train_files/starvla_simple_psi0_qwenoft.yaml \
Framework_name=StarVLA-OFT \
bash examples/simBenchmarks/SIMPLE/train_files/run_simple_train.sh

Các biến hữu ích: NUM_MACHINES, MACHINE_RANK, MAIN_PROCESS_IP, MAIN_PROCESS_PORT, MAX_TRAIN_STEPS, REPEATED_DIFFUSION_STEPS, WANDB_MODE. Khi mới học, chạy:

DRY_RUN=1 \
data_mix=simple_psi0_all_ten_tasks \
bash examples/simBenchmarks/SIMPLE/train_files/run_simple_train.sh

Lệnh dry-run không train, chỉ giúp bạn kiểm tra config đã resolve đúng chưa. Beginner thường lỗi ở data_root_dir, checkpoint path, num_processes, hoặc base_vlm. Đừng đợi job fail sau 30 phút mới phát hiện sai path.

Training real G1 route với LeRobot dataset

SIMPLE giúp bạn hiểu action contract trong simulation. Nhưng nếu muốn đi tới Unitree G1 thật, bạn cần demonstration data có schema nhất quán. StarVLA-WBC mô tả một route tham chiếu dùng NVlabs/GR00T-WholeBodyControl: teleop/data collection xuất LeRobot v2.1, StarVLA train policy, StarVLA WebSocket policy server thay thế model-serving layer, còn SONIC/WBC bên ngoài thực thi trên G1. LeRobot cũng đã có Unitree G1 docs, hỗ trợ cả biến thể 23 DoF và 29 DoF, teleoperation, recording, training và RTC inference.

Dataset ví dụ trong StarVLA-WBC có dạng:

playground/Datasets/UnitreeG1_WholeBody/lerobot/test_sonic/
  data/chunk-000/episode_000000.parquet
  videos/chunk-000/observation.images.ego_view/episode_000000.mp4
  meta/
    info.json
    modality.json
    episodes.jsonl
    tasks.jsonl

Schema được ghi rõ: fps 50, 49 episodes, 56,919 frames, video key observation.images.ego_view, task text "pick the toy on the table, and put it into the box." Các tensor đáng chú ý gồm observation.state 43D, observation.eef_state 14D, action.wbc 43D, action.motion_token 64D, left/right hand joints 7D mỗi bên, teleop.smpl_pose 63D, VR position 9D và orientation 18D. First training registry đề xuất action 78D: action.motion_token + teleop.left_hand_joints + teleop.right_hand_joints.

Validate trước khi train:

export DATASET=playground/Datasets/UnitreeG1_WholeBody/lerobot/test_sonic

python3 - <<'PY'
import json, os
from pathlib import Path
dataset = Path(os.environ["DATASET"])
info = json.loads((dataset / "meta/info.json").read_text())
modality = json.loads((dataset / "meta/modality.json").read_text())
print("fps:", info.get("fps"))
print("episodes:", info.get("total_episodes"))
print("features:", sorted(info.get("features", {}).keys()))
print("state groups:", sorted(modality.get("state", {}).keys()))
print("action groups:", sorted(modality.get("action", {}).keys()))
PY

Train smoke route:

WANDB_MODE=disabled \
BATCH=1 \
MAX_STEPS=1000 \
bash examples/realRobots/UnitreeG1_WholeBody/step2_training/train_files/run_starvla_qwenoft_g1_sonic_train.sh

YAML starvla_qwenoft_g1_sonic.yaml giữ các thông số chính: framework StarVLA-OFT, action model MLP, action_dim: 78, state_dim: 72, action_horizon: 8, image size 224x224, gradient accumulation 4, learning rate base 2e-5, Qwen interface 1e-5, action model 1e-4, save interval 200 và save_format: pt. Với dataset nhỏ, mục tiêu đầu tiên không phải SOTA. Mục tiêu là chứng minh registry load được, một batch có shape [8, 78], output hữu hạn, checkpoint reload được, và statistics đi kèm checkpoint không bị tách rời.

Inference và evaluation

Với SIMPLE, evaluation gồm hai process: policy server và SIMPLE client. Trước tiên tải evaluation assets:

SIMPLE_ROOT=/path/to/SIMPLE \
SIMPLE_TASKS="G1WholebodyXMovePickTeleop-v0" \
bash examples/simBenchmarks/SIMPLE/eval_files/download_simple_eval_data.sh

Start policy server:

bash examples/simBenchmarks/SIMPLE/eval_files/run_policy_server.sh \
  /path/to/checkpoints/steps_100000_pytorch_model.pt 0 22520

Chạy một task:

SIMPLE_ROOT=/path/to/SIMPLE \
STARVLA_SIMPLE_SERVER_HOST=127.0.0.1 \
STARVLA_SIMPLE_SERVER_PORT=22520 \
NUM_EPISODES=10 \
bash examples/simBenchmarks/SIMPLE/eval_files/run_simple_eval.sh \
  G1WholebodyXMovePickTeleop-v0 level-0

Bạn có thể chọn controller bằng STARVLA_SIMPLE_CONTROLLER=sonic, amo, homie, bfm-zero, hoặc auto. auto giữ assignment gốc của SIMPLE: SONIC cho Teleop tasks và AMO cho MP tasks. Điểm kỹ thuật cần giữ cố định khi so sánh controller: task, episode, randomization level, reset state, policy checkpoint, action normalization, action layout, execution horizon, language instruction, image preprocessing, state 32D, success criterion và maximum steps. Repo nhấn mạnh VLA backend được gọi ở 50 Hz; Teleop/SONIC giữ target qua bốn physics substeps 5 ms, native G1 giữ qua mười substeps 2 ms. Nếu bạn thêm decimation phía controller khiến backend chỉ chạy 12.5 Hz, result bị xem là invalid.

Kết quả đã báo cáo

Trên 10-task SIMPLE suite, StarVLA-WBC báo cáo StarVLA-PI / QwenPi co-trained một model duy nhất trong 100k steps đạt 245/300 episode thành công, tức 81.67%. Trong cùng bảng, SIMPLE Psi0 official dùng mỗi task một policy riêng và đạt 226/300, tức 75.33%. StarVLA-WanPI / WanPi co-trained 12 task nhưng eval trên cùng 10-task subset đạt 90/300, tức 30.00%. Đây là một kết quả quan trọng: một policy QwenPi multi-task có thể cạnh tranh tốt với setup per-task, nhưng không phải mọi backbone/action head đều tự nhiên tốt.

Ở controller-backend study, nhóm freeze cùng checkpoint QwenPi step 100k, giữ nguyên request/action contract và chỉ đổi backend. Native SIMPLE assignment đạt 245/300. HOMIE đạt 138/300, AMO 55/300, BFM-Zero 62/300. Không nên đọc bảng này như ranking controller tuyệt đối. Nó đo alignment giữa distribution 36D mà policy đã học và adapter/runtime cụ thể. Nếu train lại riêng cho từng backend, kết quả có thể khác.

Kết luận thực tế cho engineer: kết quả tốt nhất hiện tại vẫn là route có training data và deployment controller khớp nhau. Nếu data Teleop dùng SONIC, deploy SONIC sẽ ít semantic gap hơn. Nếu muốn backend khác, hãy audit command semantics, observation/history, control law, native command, timing và success criteria.

Deploy qua WBC trên Unitree G1

Real deployment trong StarVLA-WBC không yêu cầu StarVLA sở hữu toàn bộ Unitree stack. Shape được khuyến nghị:

StarVLA checkpoint
  -> StarVLA WebSocket policy server
  -> G1 policy client / adapter
  -> user-owned controller stack
  -> Unitree G1

Start server trên GPU machine:

export PYTHONPATH=$(pwd):${PYTHONPATH}

CUDA_VISIBLE_DEVICES=0 python deployment/model_server/server_policy.py \
  --ckpt_path /path/to/g1/checkpoints/steps_<N>_pytorch_model.pt \
  --port 5694 \
  --use_bf16

G1 adapter cần lấy camera image và robot state, tạo request:

{
    "examples": [{
        "image": [cam0, cam1],
        "state": state,
        "lang": prompt,
    }],
    "unnorm_key": "unitree_g1_sonic",
}

Server trả actions shape [B, T, action_dim]. Adapter split action, clip theo group, kiểm tra stale action, rồi publish sang SONIC decoder, C++ deploy hoặc custom G1 controller bridge. Adapter không nên tự normalize lại nếu policy server đã trả unnormalized chunk; nhiệm vụ của adapter là grouping, clipping, freshness check và controller publishing.

Dry-run order nên là:

  1. Replay một recorded episode qua policy và adapter.
  2. Inspect từng action group khi actuator disabled.
  3. Chạy toàn bộ interface trong simulation hoặc controller dry-run.
  4. Kết nối robot với policy paused và verify state freshness.
  5. Enable low-speed motion cho một số action group nhỏ.
  6. Mở rộng dần sau khi timing, limits và e-stop đã ổn.

Safety tối thiểu gồm emergency stop độc lập với StarVLA, action clipping theo group, velocity/acceleration limits, stale action timeout, camera/state freshness, policy pause command, controller health check và operator procedure rõ ràng. Nếu thiếu một mục, hãy ở lại simulation.

Lỗi phổ biến và cách debug

Lỗi đầu tiên là camera mismatch. Training dùng observation.images.ego_view, nhưng deploy lại gửi global view, crop khác, RGB/BGR đảo hoặc resize không giống 224x224. Hãy lưu first request audit: image, state, instruction, predicted action chunk.

Lỗi thứ hai là state/action order mismatch. Với G1, chỉ cần đổi left/right arm hoặc hand sign là robot đã hành xử sai. Hãy in schema từ meta/modality.json, so với data_config.py, so với adapter split logic.

Lỗi thứ ba là normalization mismatch. SIMPLE cũ dùng min_max; G1 SONIC route dùng q99 (q01/q99). Checkpoint, dataset_statistics.json và YAML phải đi cùng nhau.

Lỗi thứ tư là timing mismatch. Policy action horizon có thể là 8 hoặc 30; controller update có thể 50 Hz, 200 Hz hoặc 500 Hz. Bạn phải biết chunk được giữ bao lâu, có interpolation không, stale timeout là bao nhiêu.

Lỗi cuối cùng là đọc sai kết quả benchmark. Một model co-trained 10 task khác với 10 model per-task. Một replacement backend test khác với retraining backend. Hãy ghi rõ training scope, checkpoint step, tasks, levels, episode count và controller assignment.

Bài viết liên quan

  • GR00T N1 G1 WBC deploy
  • ASAP: train agile skills cho Unitree G1
  • FineVLA dual-arm VLA tutorial
NT

Nguyễn Anh Tuấn

Robotics & AI Engineer. Building VnRobo — sharing knowledge about robot learning, VLA models, and automation.

Khám phá VnRobo

Fleet MonitoringROS 2 IntegrationAMR Solutions

Bài viết liên quan

Tutorial
Teleop PICO và dữ liệu LeRobot cho VLA
GR00TSONICPICOPhần 5
wholebody-vla

Teleop PICO và dữ liệu LeRobot cho VLA

Hướng dẫn luồng PICO teleop, zmq_manager, data exporter và LeRobot v2.1 cho VLA trên SONIC.

13/6/202615 phút đọc
NT
Deep Dive
Kiến trúc SONIC cho WBC humanoid
GR00TSONICwhole-body controlPhần 1
wholebody-vla

Kiến trúc SONIC cho WBC humanoid

Bóc tách GR00T-WholeBodyControl qua decoupled_wbc, gear_sonic và gear_sonic_deploy để hiểu SONIC từ paper đến repo.

13/6/202614 phút đọc
NT
Tutorial
PoseVLA: pretrain 3D pose cho π0.5
PoseVLApi0.5RoboTwin
wholebody-vla

PoseVLA: pretrain 3D pose cho π0.5

Hướng dẫn PoseVLA open-source: cài đặt, pretrain 3D pose, post-train RoboTwin, inference và vì sao scaled training đạt gần 89%.

24/8/202615 phút đọc
NT
VnRobo logo

Hạ tầng AI cho robot công nghiệp thế hệ mới.

Sản phẩm

  • Tính năng
  • Bảng giá
  • Kiến thức
  • Dịch vụ

Công ty

  • Về chúng tôi
  • Blog
  • Liên hệ

Pháp lý

  • Chính sách bảo mật
  • Điều khoản sử dụng

© 2026 VnRobo. Bảo lưu mọi quyền.

Được tạo với♥tại Việt Nam