【无标题】
的完整流程:硬件选型 → 环境部署 → 模型推理 → 机械臂对接(含 ROS 2 示例)→ 闭环控制。全程基于小米开源的。
从零到真机可跑的完整流程:硬件选型 → 环境部署 → 模型推理 → 机械臂对接(含 ROS 2 示例)→ 闭环控制。全程基于小米开源的 Xiaomi-Robotics-0(VLA)。
一、先搞清楚:VLA 输出什么?怎么控制机械臂?
小米 VLA 是端到端:图像 + 语言 → 动作序列。
- 输入:单目 / 双目 / RGB-D 图像 + 中文指令(如 “抓起杯子”)
- 输出:连续动作 chunk(通常是:末端 6D 位姿 + 夹爪开合,7 维向量)
- 控制频率:约 30Hz(80ms / 帧),消费级 GPU 可实时跑
所以流程是:
相机拍照 → VLA 推理 → 得到目标点位姿 → 发给机械臂控制器 → 运动执行

三、部署 VLA 模型(Ubuntu 22.04 示例)
1)拉取官方代码
git
clone https://github.com/XiaomiRobotics/Xiaomi-Robotics-0
cd
Xiaomi-Robotics-0
2)创建虚拟环境 & 安装依赖
bash
conda create -n mibot python=3.12
conda activate mibot
# 安装PyTorch(必须匹配CUDA)
pip
install torch==2.8.0 torchvision==0.23.0 torchaudio==2.8
.0 --index-url https://download.pytorch.org/whl/cu128
pip
install transformers==4.57
.1
pip
install flash-attn==2.8
.3 --no-build-isolation
pip
install -r
requirements.txt

3)下载权重(自动)
bash

python scripts/download_weights.py

• 权重约 4.2GB,自动存到 weights/
4)本地推理测试(图像 + 文字 → 动作)
python
import
torch
import
cv2
from models import
XiaomiRoboticsVLA
from utils import process_image,
decode_robot_action
device
= "cuda" if torch.cuda.is_available() else "cpu"
# 加载模型
model
= XiaomiRoboticsVLA.from_pretrained("weights/xiaomi_robotics_0_lite").to(device)
model
.eval()
# 读一张场景图
img
= cv2.imread("demo.jpg")
img_tensor
= process_image(img).to(device)
# 指令
instruction
= "把红色杯子拿到左边"
# 推理
with torch.no_grad():
action_chunk
= model(img_tensor, instruction) # shape: (T, 7)
# 解码成机械臂可执行指令
cmd
= decode_robot_action(action_chunk)
print("输出动作序列:", cmd)

你会得到类似:
plaintext




[[x0,y0,z0,rx0,ry0,rz0,g0],
[x1,y1,z1,rx1,ry1,rz1,g1],
...]

每一行是一帧末端位姿 + 夹爪状态。

四、对接机械臂(ROS 2 为例)
核心:把 VLA 输出的 7 维动作,转成 ROS 2 的目标位姿并发送给机械臂。
1)假设你的机械臂用 ROS 2 + MoveIt2
• 话题:/arm_controller/follow_joint_trajectory 或 /target_pose
• 消息类型:geometry_msgs/PoseStamped + std_msgs/Float32(夹爪)
2)写一个简单 bridge 节点(Python)
python


运行



import
rclpy
from rclpy.node import
Node
from geometry_msgs.msg import
PoseStamped
from std_msgs.msg import
Float32
import
torch
from models import
XiaomiRoboticsVLA
from utils import
process_image
class VLAToRobot(Node):
def __init__(self):
super().__init__('vla_to_robot')
self
.pose_pub = self.create_publisher(PoseStamped, '/target_pose', 10)
self
.gripper_pub = self.create_publisher(Float32, '/gripper_cmd', 10)
# 加载VLA
self
.device = "cuda"
self
.model = XiaomiRoboticsVLA.from_pretrained("weights/xiaomi_robotics_0_lite").to(self.device)
self
.model.eval()
# 相机订阅(RealSense示例)
self
.create_subscription(Image, '/camera/color/image_raw', self.image_cb, 10)
self
.img = None
self
.instruction = "抓起桌上的杯子"
def image_cb(self, msg):
self
.img =
msg
self
.run_vla()
def run_vla(self):
if self.img is None:
return
# 图像预处理
img_tensor
= process_image(self.img).to(self.device)
with torch.no_grad():
action
= self.model(img_tensor, self.instruction)[0] # 取第一帧
# action: [x,y,z,rx,ry,rz,g]
x
,y,z,rx,ry,rz,g =
action
# 发位姿
pose
= PoseStamped()
pose
.header.frame_id = "base_link"
pose
.pose.position.x =
x
pose
.pose.position.y =
y
pose
.pose.position.z =
z
pose
.pose.orientation.x =
rx
pose
.pose.orientation.y =
ry
pose
.pose.orientation.z =
rz
pose
.pose.orientation.w = 1.0 # 简化
self
.pose_pub.publish(pose)
# 发夹爪
self
.gripper_pub.publish(Float32(data=float(g)))
def main():
rclpy
.init()
node
= VLAToRobot()
rclpy
.spin(node)
if __name__ == "__main__":
main
()

3)关键注意点
• 坐标对齐:VLA 输出是归一化 / 相对坐标,必须标定相机与机械臂基座的外参(手眼标定),否则会抓空。
• 动作平滑:VLA 一次输出一整段 chunk(如 10 帧),逐帧发送 + 插补,避免抖动。
• 安全限位:一定要加关节限位、碰撞检测、急停。

五、完整闭环流程(跑起来)
1. 启动机械臂 ROS 2 驱动 + MoveIt2
2. 启动 RealSense 相机节点
3. 启动 VLA bridge 节点
4. 对着场景说 / 输入指令:“把杯子放到盘子里”
5. 相机实时画面 → VLA 推理 → 输出末端轨迹 → 机械臂执行

六、常见坑 & 避坑
• ❌ 直接用原始输出:VLA 输出是相对 / 归一化坐标,必须手眼标定转成机械臂坐标系。
• ❌ 单相机无深度:尽量用RGB-D / 双目,否则 3D 空间不准,抓不准。
• ❌ 指令太模糊:要用具体动词 + 明确物体,如 “把红色杯子移到右边 5cm”,别用 “处理一下”。

七、下一步(你可以直接做)
1. 先在电脑上跑通单张图→动作的 demo(第三节)
2. 用 ** 仿真环境(如 PyBullet/Isaac Sim)** 对接 VLA,先在模拟器里动起来
3. 再上真实机械臂,先做手眼标定,再跑抓取任务
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)