1. 项目概述
在机器人控制领域,将视觉语言模型(VLA)与物理仿真平台集成是一个极具挑战性的任务。本文将详细记录如何将Lingbot-VLA模型通过WebSocket协议接入RoboTwin2.0仿真平台的完整过程。这个技术方案实现了从视觉输入到动作输出的端到端闭环控制,为机器人智能控制研究提供了一个可复现的参考实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与检查
2.1 系统环境验证
在开始配置前,必须确保基础环境满足要求。以下是关键检查点:
bash复制# 检查NVIDIA驱动和CUDA版本
nvidia-smi
# 输出应显示驱动版本和CUDA版本,如:
# NVIDIA-SMI 575.57.08 Driver Version: 575.57.08 CUDA Version: 12.9
# 检查Vulkan库
ls -l /usr/lib/x86_64-linux-gnu/libvulkan.so*
# 正常应显示类似:
# lrwxrwxrwx 1 root root 20 Feb 10 2020 /usr/lib/x86_64-linux-gnu/libvulkan.so.1 -> libvulkan.so.1.2.131
# -rw-r--r-- 1 root root 346840 Feb 10 2020 /usr/lib/x86_64-linux-gnu/libvulkan.so.1.2.131
# 检查系统版本
cat /etc/os-release
# 确认是Ubuntu 20.04 LTS
注意:如果Vulkan库未安装,在个人裸机环境需要执行:
sudo apt install libvulkan1 mesa-vulkan-drivers vulkan-tools
2.2 Conda环境管理
由于RoboTwin和Lingbot-VLA对Python版本要求不同,必须创建独立环境:
bash复制# 检查conda状态
conda --version
conda env list
# 创建RoboTwin环境(Python 3.10)
conda create -n RoboTwin python=3.10 -y
# 创建Lingbot环境(Python 3.12.3)
conda create -n lingbot python=3.12.3 -y
3. RoboTwin环境配置
3.1 基础环境搭建
bash复制conda activate RoboTwin
# 安装CUDA Toolkit 12.1
conda install -c "nvidia/label/cuda-12.1.0" cuda-toolkit -y
nvcc --version # 验证安装
# 克隆仓库(使用镜像加速)
git clone https://ghfast.top/https://github.com/RoboTwin-Platform/RoboTwin.git
cd RoboTwin
bash script/_install.sh
# 下载资产(使用国内镜像)
export HF_ENDPOINT=https://hf-mirror.com
bash script/_download_assets.sh
3.2 数据处理流程
以click_bell任务为例:
bash复制# 创建数据目录
mkdir -p data/click_bell
# 下载特定任务数据
huggingface-cli download --repo-type dataset TianxingChen/RoboTwin2.0 \
--include "dataset/click_bell/aloha-agilex_clean*" \
--local-dir . --resume-download
# 整理并解压数据
mv dataset/click_bell/aloha-agilex_clean* data/click_bell/
cd data/click_bell
unzip aloha-agilex_clean*.zip
mv aloha-agilex_clean_50 aloha-agilex_clean
# 数据转换
cd ../../policy/pi0
bash process_data_pi0.sh click_bell aloha-agilex_clean 50
# 清理并准备训练数据
rm -rf training_data/aloha-agilex_clean/episode_*
mkdir -p training_data/aloha-agilex_clean/
cp -r processed_data/click_bell-aloha-agilex_clean-50 training_data/aloha-agilex_clean/
# 转换为Lerobot格式
export UV_INDEX_URL=https://mirrors.ustc.edu.cn/pypi/web/simple
unset LEROBOT_HOME
export HF_LEROBOT_HOME=/mnt/public/lwb/test_project/RoboTwin/policy/pi0/lerobot_data
bash generate.sh ./training_data/aloha-agilex_clean/ click_bell_aloha_repo
4. Lingbot-VLA环境配置
4.1 基础环境搭建
bash复制conda activate lingbot
# 安装指定版本PyTorch
pip install torch==2.8.0 torchvision==0.23.0 torchaudio==2.8.0 \
--index-url https://download.pytorch.org/whl/cu128
# 克隆并安装Lerobot
GIT_LFS_SKIP_SMUDGE=1 git clone https://github.com/huggingface/lerobot.git
cd lerobot
git checkout 0cf864870cf29f4738d3ade893e6fd13fbd7cdb5
pip install -e .
cd /mnt/public/lwb/test_project
# 安装Flash Attention
conda install -c "nvidia/label/cuda-12.1.0" cuda-toolkit -y
pip install ninja
FLASH_ATTENTION_FORCE_BUILD=TRUE pip install flash-attn --no-build-isolation
4.2 Lingbot-VLA安装
bash复制# 使用镜像克隆
git clone https://ghfast.top/https://github.com/robbyant/lingbot-vla.git
cd lingbot-vla/
# 配置Git镜像
git config --global url."https://ghfast.top/https://github.com/".insteadOf "https://github.com/"
git submodule update --init --recursive
pip install -e .
pip install -r requirements.txt
# 关键依赖修复
pip install "numpy==1.26.4" "fsspec==2025.3.0" \
"opencv-python-headless==4.9.0.80" "rerun-sdk==0.21.0"
pip install xformers==0.0.28.post3 --no-deps
# 安装视觉子模块
cd ./lingbotvla/models/vla/vision_models/lingbot-depth/
pip install -e . --no-deps
cd ../MoGe
pip install -e . --no-deps
cd ../../../../
5. 模型训练与评估
5.1 模型下载
bash复制export HF_ENDPOINT=https://hf-mirror.com
# 下载基础模型
python3 scripts/download_hf_model.py --repo_id robbyant/lingbot-vla-4b --local_dir lingbot-vla-4b
cd lingbot-vla-4b
mv lingbot-vla-4b/* .
rmdir lingbot-vla-4b
cd ..
# 下载Qwen2.5-VL底座权重
huggingface-cli download --repo-type model Qwen/Qwen2.5-VL-3B-Instruct \
--local-dir Qwen2.5-VL-3B-Instruct
5.2 训练配置
bash复制export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
bash train.sh tasks/vla/train_lingbotvla.py ./configs/vla/robotwin_load20000h.yaml \
--model.model_path /mnt/public/lwb/test_project/lingbot-vla/lingbot-vla-4b \
--data.train_path /mnt/public/lwb/test_project/RoboTwin/policy/pi0/lerobot_data/click_bell_aloha_repo \
--train.output_dir /mnt/public/lwb/test_project/lingbot-vla/output_click_bell_aloha \
--model.tokenizer_path /mnt/public/lwb/test_project/lingbot-vla/Qwen2.5-VL-3B-Instruct \
--train.micro_batch_size 4 \
--train.global_batch_size 32
5.3 WebSocket服务部署
训练完成后,启动服务端:
bash复制python -m deploy.lingbot_robotwin_policy \
--model_path /mnt/public/lwb/test_project/lingbot-vla/output_click_bell_aloha/checkpoints/global_step_8280/hf_ckpt \
--use_length 50 \
--port 8080
6. RoboTwin客户端配置
在另一个终端中配置RoboTwin环境:
bash复制conda activate RoboTwin
# 安装必要依赖
pip install safetensors transformers huggingface_hub
pip install draccus einops datasets omegaconf jsonlines deepdiff
# 同步transformers版本
LINGBOT_VER=$(/mnt/public/lwb/miniconda3/envs/lingbot/bin/pip show transformers | grep Version | awk '{print $2}')
pip install transformers==$LINGBOT_VER
pip install diffusers psutil ipdb torchdata msgpack websockets blobfile
# 修改eval_policy_client.py
nano /mnt/public/lwb/test_project/RoboTwin/script/eval_policy_client.py
# 注释掉: get_model = eval_function_decorator(policy_name, "get_model", conda_env=policy_conda_env)
# 替换视频编码器
sed -i 's/libx264/libopenh264/g' /mnt/public/lwb/test_project/RoboTwin/script/eval_policy.py
sed -i 's/libx264/libopenh264/g' /mnt/public/lwb/test_project/RoboTwin/envs/utils/images_to_video.py
7. WebSocket接口实现
创建policy/lingbot_wrapper.py:
python复制import sys
import numpy as np
sys.path.insert(0, "/mnt/public/lwb/test_project/lingbot-vla")
from deploy.websocket_client_policy import WebsocketClientPolicy
def get_model(usr_args):
port = usr_args.get("port", 8080)
print(f"🔗 正在通过 WebSocket 连接大脑 (端口: {port})...")
return WebsocketClientPolicy(host="127.0.0.1", port=port)
def reset_model(model):
model.reset("aloha-agilex")
def eval(TASK_ENV, model, observation):
TASK_ENV.eval_video_log = True
raw_obs = observation.get('observation', observation)
cam_high = raw_obs['head_camera']['rgb']
cam_left = raw_obs['left_camera']['rgb'] if 'left_camera' in raw_obs else raw_obs['wrist_camera']['rgb']
cam_right = raw_obs['right_camera']['rgb'] if 'right_camera' in raw_obs else raw_obs['wrist_camera']['rgb']
state = observation.get('qpos', raw_obs.get('qpos', np.zeros(14, dtype=np.float32)))
instruction = TASK_ENV.get_instruction()
payload = {
"observation.images.cam_high": cam_high,
"observation.images.cam_left_wrist": cam_left,
"observation.images.cam_right_wrist": cam_right,
"observation.state": state,
"task": instruction
}
response = model.infer(payload)
action_data = response['action'] if isinstance(response, dict) else response
actions = np.atleast_2d(action_data)
for act in actions:
TASK_ENV.take_action(act)
8. 启动评估
bash复制export PYTHONPATH=""
export PYTHONHOME=""
export PYTHONPATH=/mnt/public/lwb/test_project/RoboTwin:/mnt/public/lwb/test_project/lingbot-vla
python script/eval_policy.py \
--config policy/Your_Policy/deploy_policy.yml \
--overrides policy_name policy.lingbot_wrapper task_name click_bell task_config demo_clean ckpt_setting default seed 0 port 8080 eval_video_log True
9. 多任务扩展
9.1 补充任务数据
bash复制export HF_ENDPOINT=https://hf-mirror.com
export UV_INDEX_URL=https://mirrors.ustc.edu.cn/pypi/web/simple
export HF_LEROBOT_HOME=/mnt/public/lwb/test_project/RoboTwin/policy/pi0/lerobot_data
# 对其他任务重复类似click_bell的数据处理流程
# open_microwave, stack_blocks_three, place_shoe, put_object_cabinet
9.2 多任务训练
bash复制export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
DATA_BASE="/mnt/public/lwb/test_project/RoboTwin/policy/pi0/lerobot_data"
# 对每个任务启动训练
nohup bash train.sh tasks/vla/train_lingbotvla.py ./configs/vla/robotwin_load20000h.yaml \
--model.model_path /mnt/public/lwb/test_project/lingbot-vla/lingbot-vla-4b \
--data.train_path ${DATA_BASE}/open_microwave_aloha_repo \
--train.output_dir /mnt/public/lwb/test_project/lingbot-vla/output_open_microwave_aloha \
--model.tokenizer_path /mnt/public/lwb/test_project/lingbot-vla/Qwen2.5-VL-3B-Instruct \
--train.micro_batch_size 4 \
--train.global_batch_size 32 > train_open_microwave.log 2>&1 &
# 其他任务类似...
10. 经验总结与注意事项
-
环境隔离至关重要:RoboTwin和Lingbot-VLA的Python版本要求不同,必须使用独立的conda环境,避免依赖冲突。
-
版本锁定策略:PyTorch、CUDA Toolkit等关键依赖必须严格锁定版本,特别是:
- RoboTwin需要Python 3.10 + CUDA 12.1
- Lingbot-VLA需要Python 3.12.3 + PyTorch 2.8.0
-
国内加速配置:
- 使用
HF_ENDPOINT=https://hf-mirror.com加速Hugging Face资源下载 - 配置Git镜像加速代码克隆
- 使用国内PyPI镜像加速Python包安装
- 使用
-
WebSocket通信要点:
- 确保服务端和客户端使用相同的端口
- 数据格式必须严格对齐,特别是图像和状态数据的结构
- 动作解析需要考虑多步执行(chunking)的情况
-
常见问题排查:
- 如果遇到
nvcc: command not found,检查CUDA Toolkit是否正确安装 - 视频编码问题可以通过替换libx264为libopenh264解决
- 依赖冲突时,优先使用
--no-deps选项安装关键包
- 如果遇到
-
性能优化建议:
- 使用
PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True改善显存管理 - 对于多任务训练,合理设置
micro_batch_size和global_batch_size - 考虑使用
nohup和后台运行长时间训练任务
- 使用
这套方案成功实现了视觉语言模型与机器人仿真平台的高效集成,通过WebSocket协议建立了稳定的通信桥梁。在实际应用中,可以根据具体任务需求调整模型结构和接口协议,这套架构为类似项目提供了可靠的技术参考。
