具身机器人从0到1实践技术指南
具身智能真正难的地方,不是让一个大模型“会说话”,而是让它在真实世界里完成一个闭环:看见环境、理解任务、制定动作、控制身体、获得反馈,再根据反馈继续行动。
这意味着,具身机器人不是简单地把视觉大模型、语言模型和机械臂拼在一起。一个可运行的具身机器人系统,至少同时涉及机械结构、传感器、实时控制、运动规划、计算机视觉、机器人操作系统、仿真、机器学习以及安全工程。
如果从0开始做一个具身机器人项目,最容易踩的坑就是一上来就追求“人形机器人+大模型+端到端控制”。对于工程团队而言,更现实的路线应该是:
先让机器人稳定运动,再让它稳定感知,再让它完成固定任务,最后才引入大模型和学习型策略。
本文以一个具备移动底盘、RGB-D相机和机械臂的机器人为例,从硬件选型、ROS 2系统架构、仿真环境、感知、定位导航、机械臂控制,到VLM/VLA接入和真实机器人部署,完整梳理一套从0到1的工程路线。
一、先定义“具身机器人”到底要解决什么问题
具身机器人可以抽象成一个连续闭环:
┌──────────────────────┐
│ 用户任务 │
│ “把桌上的杯子拿过来” │
└──────────┬───────────┘
↓
┌─────────────────┐
│ 任务理解 / VLM │
└────────┬────────┘
↓
┌─────────────────┐
│ Task Planner │
│ 任务分解与规划 │
└────────┬────────┘
↓
┌────────────────┴────────────────┐
↓ ↓
┌─────────────────┐ ┌─────────────────┐
│ Navigation │ │ Manipulation │
│ 移动导航 │ │ 机械臂操作 │
└────────┬────────┘ └────────┬────────┘
↓ ↓
┌─────────────────┐ ┌─────────────────┐
│ Localization │ │ Motion Planning│
│ 定位 / SLAM │ │ MoveIt 2 │
└────────┬────────┘ └────────┬────────┘
└────────────────┬────────────────┘
↓
┌───────────────┐
│ Low-level Ctrl│
│ 底层控制 │
└───────┬───────┘
↓
┌───────────────┐
│ Robot Hardware│
└───────┬───────┘
↓
Sensors / State Feedback
│
└──────→ 上层决策
从工程角度看,这个闭环可以进一步划分为五层:
身体层:电机、关节、底盘、机械臂、夹爪。
感知层:摄像头、深度相机、激光雷达、IMU、编码器。
运动层:定位、SLAM、导航、逆运动学、轨迹规划、控制。
智能层:视觉识别、VLM、LLM、VLA、任务规划。
系统层:ROS 2、日志、监控、安全、OTA、仿真与数据闭环。
其中最重要的一点是:
大模型不是整个机器人系统。
大模型负责“理解”和“规划”的部分,而实时控制、碰撞检测、轨迹跟踪等任务仍然应该由确定性的机器人软件完成。
二、第一步:选择一个能够真正跑起来的机器人形态
从0到1阶段,不建议直接设计复杂的人形机器人。
原因很简单:人形机器人同时具有双足行走、平衡控制、双臂协调、全身运动规划等问题。任何一个环节出现问题,都可能让整个项目陷入硬件调试。
更适合作为第一台具身机器人的方案是:
移动底盘
+
机械臂
+
RGB-D相机
+
激光雷达
+
IMU
+
NVIDIA Jetson / x86 GPU主机
例如:
RGB-D Camera
│
↓
┌─────────────────┐
│ Perception Node │
└────────┬────────┘
│
┌────────────────┼────────────────┐
↓ ↓ ↓
Objects Depth Pose
│ │ │
└────────────────┼────────────────┘
↓
Task Planning
│
┌───────────┴───────────┐
↓ ↓
Navigation Manipulation
↓ ↓
Mobile Base Arm Controller
硬件选型时,不应该只看算力和机械臂负载,更应该关注驱动是否开放、ROS 2支持是否成熟、SDK是否稳定、传感器时间同步是否可靠。
一个机器人项目最大的隐性成本,往往不是机械臂本身,而是驱动程序、通信协议和各种“只有厂家工程师知道”的配置。
三、第二步:建立ROS 2作为机器人软件总线
目前构建机器人应用时,ROS 2仍然是非常重要的基础设施。
ROS 2提供Topic、Service和Action三种主要通信模式:Topic适合连续传感器数据,Service适合短时间请求响应,Action适合具有反馈和取消能力的长任务。
一个实际项目建议采用类似下面的目录结构:
robot_ws/
├── src/
│ ├── robot_description/
│ ├── robot_bringup/
│ ├── robot_hardware/
│ ├── robot_navigation/
│ ├── robot_manipulation/
│ ├── robot_perception/
│ ├── robot_tasks/
│ ├── robot_interfaces/
│ └── robot_ai/
│
├── config/
│ ├── sensors.yaml
│ ├── navigation.yaml
│ ├── controllers.yaml
│ └── perception.yaml
│
├── launch/
│ ├── simulation.launch.py
│ └── robot.launch.py
│
└── docker/
└── Dockerfile
其中:
robot_description
↓
robot_hardware
↓
robot_perception
↓
robot_navigation / robot_manipulation
↓
robot_tasks
↓
robot_ai
应该保持比较清晰的依赖方向。
不要让大模型节点直接控制电机。
正确的架构应该是:
LLM / VLM
│
│ “移动到桌子旁”
↓
Task Planner
│
│ Navigation Goal
↓
Nav2
│
↓
Controller
│
↓
Motor
而不是:
LLM
↓
直接发送电机PWM
后者几乎必然会把系统安全性、确定性和可维护性全部搞乱。
四、第三步:建立机器人模型URDF/Xacro
机器人软件开发的第一个真正技术关卡,是让计算机“知道机器人长什么样”。
通常需要建立:
base_link
│
├── lidar_link
│
├── camera_link
│
└── arm_base_link
│
├── link1
├── link2
├── link3
├── link4
├── link5
└── gripper
URDF主要描述机器人:
link
joint
inertial
collision
visual
transmission
例如一个简单关节:
<joint name="joint1" type="revolute">
<parent link="base_link"/>
<child link="link1"/>
<origin xyz="0 0 0.2" rpy="0 0 0"/>
<axis xyz="0 0 1"/>
<limit
lower="-3.14"
upper="3.14"
effort="20"
velocity="2.0"/>
</joint>
真正用于仿真时,还需要认真设置质量、惯量、摩擦、碰撞模型等参数。
很多“仿真跑得很好,真机完全不一样”的问题,根源并不是AI模型,而是:
仿真质量 ≠ 真实质量
仿真摩擦 ≠ 真实摩擦
仿真关节阻尼 ≠ 真实关节阻尼
仿真相机 ≠ 真实相机
所以机器人模型不是简单画一个3D外壳。
它实际上是整个运动规划和仿真系统的物理基础。
五、第四步:不要直接上真机,先建立仿真环境
具身机器人开发非常适合采用Simulation First。
目前常见的机器人仿真方案包括Gazebo、MuJoCo和NVIDIA Isaac Sim等。
其中Isaac Sim支持URDF、MJCF、CAD等机器人资产导入,并能够进行物理仿真、传感器模拟、ROS 2连接以及软件在环和硬件在环测试。
一个比较完整的开发链路是:
CAD / URDF
↓
Robot Model
↓
Simulation
↓
Sensor Simulation
↓
ROS 2
↓
Navigation / Manipulation
↓
AI Model
↓
Simulation Evaluation
↓
Real Robot
仿真环境至少应该包含:
Robot
├── Physics
├── Camera
├── LiDAR
├── IMU
├── Joint Encoder
└── Collision
Environment
├── Floor
├── Walls
├── Table
├── Objects
└── Dynamic Obstacles
更进一步,可以加入随机化:
Lighting ± random
Object Pose ± random
Camera Noise ± random
Friction ± random
Mass ± random
Texture ± random
这就是Domain Randomization。
目的不是让仿真看起来更漂亮,而是降低模型对某一个固定仿真环境的过拟合。
六、第五步:建立机器人感知系统
具身机器人首先需要回答:
“我现在看到了什么?”
最基础的感知系统可以这样设计:
RGB Camera ──────┐
│
Depth Camera ────┼──→ Perception
│
LiDAR ───────────┤
│
IMU ─────────────┘
视觉部分可以分成三个层次:
1. 目标检测
例如:
输入:
桌子上有杯子、手机、书
输出:
cup bbox + confidence
phone bbox + confidence
book bbox + confidence
2. 深度估计
RGB-D相机可以获得:
(u, v, depth)
结合相机内参:
fx fy
cx cy
可以把像素转换成相机坐标:
Z = depth
X = (u - cx) * Z / fx
Y = (v - cy) * Z / fy
得到:
P_camera = [X, Y, Z]
3. 坐标变换
真正控制机械臂之前,还必须把:
Camera Frame
转换成:
Robot Base Frame
即:
P_base = T_base_camera × P_camera
这一步依赖TF2。
如果外参误差只有几厘米,对于“识别物体”可能没什么问题,但对于夹取动作来说可能直接导致抓空。
所以:
具身机器人不是“视觉识别准确率高”就够了,而是必须把识别结果准确地转换成机器人可以执行的空间坐标。
七、第六步:先把导航跑通
如果机器人有移动底盘,那么导航是从0到1阶段最值得优先完成的能力之一。
Nav2是ROS 2生态中的移动机器人自主导航框架,提供规划器、控制器、行为以及状态估计、地图和Costmap等模块。
典型导航链路:
LiDAR
↓
SLAM / Localization
↓
Map
↓
Global Planner
↓
Global Path
↓
Local Controller
↓
cmd_vel
↓
Mobile Base
一个简单任务:
“去厨房”
最终应该被转换为:
{
"action": "navigate",
"goal": {
"x": 4.21,
"y": 2.38,
"yaw": 1.57
}
}
然后由Nav2执行。
这里有一个非常重要的架构原则:
大模型输出任务目标,Nav2负责实际导航。
例如LLM:
用户:
去厨房拿杯子
LLM:
1. navigate(kitchen)
2. detect(cup)
3. grasp(cup)
4. navigate(user)
5. release(cup)
LLM负责任务分解,而不是计算机器人每一帧的速度。
八、第七步:机械臂必须独立跑通
机械臂系统需要解决四个核心问题:
Forward Kinematics
Inverse Kinematics
Motion Planning
Trajectory Control
对于机械臂:
Joint State
↓
Forward Kinematics
↓
End Effector Pose
反过来:
Target Pose
↓
Inverse Kinematics
↓
Joint Target
↓
Trajectory Planner
↓
Controller
MoveIt 2是ROS 2生态中重要的机械臂运动规划平台,覆盖运动规划、操作、3D感知、运动学和控制等能力。
工程上可以采用:
Perception
↓
Object Pose
↓
Grasp Pose Generator
↓
MoveIt 2
↓
Collision Check
↓
Trajectory
↓
Controller
尤其需要注意:
不要把“目标位置”直接等同于“抓取位置”。
例如识别出:
cup center = (0.4, 0.2, 0.8)
真正需要的是:
grasp_position
grasp_orientation
approach_direction
gripper_width
即:
Object Pose
↓
Grasp Pose
↓
Approach
↓
Pre-grasp
↓
Grasp
↓
Lift
这才是完整的抓取动作。
九、第八步:加入视觉语言模型
当机器人已经能够:
移动
定位
看见物体
操作机械臂
这时候再引入VLM,系统才真正开始具备“语义理解”。
例如:
用户:
“把桌上最小的红色物体拿给我。”
传统程序需要:
红色?
物体?
尺寸?
哪个是最小?
而VLM可以首先完成语义层解析:
{
"object_type": "object",
"color": "red",
"selection": "smallest"
}
随后由视觉系统完成候选目标定位。
最终:
VLM
↓
Semantic Goal
↓
Perception
↓
Object Pose
↓
Grasp Planner
↓
MoveIt 2
↓
Robot
这比让大模型直接输出关节角度更加可靠。
十、第九步:从LLM Agent升级到机器人Agent
机器人Agent的核心并不是“让LLM一直思考”。
真正需要的是一个受约束的任务状态机。
例如:
TASK_START
↓
UNDERSTAND
↓
NAVIGATE
↓
SEARCH_OBJECT
↓
VERIFY_OBJECT
↓
PLAN_GRASP
↓
EXECUTE_GRASP
↓
VERIFY_GRASP
↓
RETURN
↓
RELEASE
↓
TASK_SUCCESS
每一步都应该有:
Precondition
Action
Observation
Success Condition
Failure Condition
Recovery
例如抓取:
def grasp_object(object_id):
pose = perception.get_pose(object_id)
if pose.confidence < 0.8:
return Retry("low perception confidence")
grasp = grasp_planner.plan(pose)
if not grasp.valid:
return Retry("no valid grasp")
result = moveit.execute(grasp.trajectory)
if not result.success:
return Recovery("motion failed")
if not gripper.verify_object():
return Recovery("grasp failed")
return Success()
这比:
llm("请把杯子拿起来")
可靠得多。
十一、第十步:理解VLA,而不是盲目追求端到端
近年来具身智能的重要方向之一是Vision-Language-Action,即VLA。
RT-2等研究探索了将视觉、语言和机器人动作统一到模型中,使模型可以利用大规模视觉语言预训练获得更强的机器人泛化能力。RT-2论文报告了在机器人任务中对新物体和自然语言指令的泛化能力。
VLA可以抽象为:
Image
+
Language
+
Robot State
↓
VLA Model
↓
Action
但实际工程中不能简单理解为:
Camera → VLA → Motor
更合理的是:
┌───────────────┐
Camera ─────────→│ │
Language ───────→│ VLA │
Robot State ────→│ │
└───────┬───────┘
↓
High-Level Action
↓
Safety / Constraint
↓
Motion Controller
↓
Robot
VLA适合承担:
语义理解
操作策略
泛化
动作序列生成
而底层控制依然应该保留:
关节限制
碰撞检测
力矩限制
急停
速度限制
工作空间限制
十二、机器人Agent的核心代码架构
一个实际项目可以采用如下架构:
robot_ai/
├── agent/
│ ├── planner.py
│ ├── executor.py
│ ├── memory.py
│ └── state_machine.py
│
├── perception/
│ ├── detector.py
│ ├── pose.py
│ └── tracker.py
│
├── navigation/
│ └── nav_client.py
│
├── manipulation/
│ ├── grasp.py
│ └── moveit_client.py
│
├── safety/
│ ├── limits.py
│ └── validator.py
│
└── interfaces/
└── robot_api.py
Agent只调用抽象工具:
class RobotTools:
async def navigate(self, location):
...
async def detect(self, object_name):
...
async def grasp(self, object_id):
...
async def release(self):
...
async def get_robot_state(self):
...
LLM看到的是:
navigate()
detect()
grasp()
release()
而不是:
set_joint_1_position()
set_motor_pwm()
这样可以形成清晰的安全边界。
十三、ROS 2通信设计不能忽略QoS
机器人系统不是普通Web应用。
例如:
Camera Image
LiDAR
IMU
Joint State
这些数据对实时性和可靠性的要求并不一样。
ROS 2的QoS允许针对可靠性、历史、队列深度、持久性等进行配置,并且不同QoS组合可能影响发布者与订阅者之间的通信兼容性。
例如传感器数据:
reliability = BEST_EFFORT
history = KEEP_LAST
depth = small
而关键控制命令可能更倾向:
reliability = RELIABLE
不能所有Topic都使用同一个默认配置。
对于高频数据,还应该关注:
timestamp
message age
period
jitter
packet loss
ROS 2本身提供Topic统计能力,可以用于分析消息年龄和消息周期。
十四、实时控制和AI推理必须解耦
这是具身机器人项目最重要的工程原则之一。
假设机械臂控制周期:
1 kHz
而VLM推理需要:
200 ms
那么:
VLM
200ms
显然不能直接承担:
1ms control loop
正确架构:
AI Layer
│
10~20 Hz
│
↓
Motion Planning
│
10~100 Hz
│
↓
Robot Controller
│
500~1000 Hz
│
↓
Motor
ROS 2的Executor负责调度订阅、Timer、Service和Action等回调,不同Callback Group可以进一步控制并发执行关系。
因此不要把:
AI inference
image processing
database
logging
和:
real-time control
塞进同一个线程。
十五、必须建立安全层
具身机器人与普通AI应用最大的区别,就是AI输出错误之后可能真的撞到人。
因此机器人应该建立独立Safety Layer:
AI Action
↓
┌──────────────┐
│ Safety Layer │
└───────┬──────┘
↓
Constraint Check
↓
┌────────────┼────────────┐
↓ ↓ ↓
Workspace Velocity Collision
Check Limit Check
└────────────┼────────────┘
↓
Execute
例如:
def validate_action(action, robot_state):
if not workspace.valid(action.target):
return False
if action.velocity > MAX_VELOCITY:
return False
if collision_checker.will_collide(action):
return False
if robot_state.estop:
return False
return True
安全机制必须独立于LLM。
不能出现:
LLM:
“我觉得应该停止。”
然后把它当成真正的急停系统。
急停应该由硬件、驱动器或者确定性的安全控制链路负责。
十六、机器人系统需要“状态”和“记忆”
具身Agent不是一次性问答。
例如:
用户:
把杯子拿给我。
机器人:
找到杯子。
用户:
不是那个,是旁边那个。
机器人:
……
这时候系统必须保存:
Task State
Robot State
Object State
Environment State
Action History
Failure History
可以建立短期世界状态:
{
"robot": {
"x": 2.13,
"y": 1.82,
"battery": 72
},
"objects": [
{
"id": "cup_01",
"type": "cup",
"position": [1.2, 2.3, 0.8],
"confidence": 0.94
}
],
"task": {
"status": "searching",
"target": "cup_01"
}
}
这个状态应该来自机器人真实系统,而不是完全由LLM维护。
十七、数据闭环比模型参数更重要
如果真正要把机器人做成产品,最终一定会遇到:
机器人为什么失败?
这时候不能只看:
模型准确率
而应该记录完整轨迹:
Observation
↓
Decision
↓
Action
↓
Robot State
↓
Outcome
例如:
episode_000001
├── camera/
├── depth/
├── joint_states/
├── odometry/
├── actions/
├── task.json
├── result.json
└── events.log
最终得到:
成功轨迹
失败轨迹
人工纠正
异常轨迹
这些数据才是后续:
Fine-tuning
Imitation Learning
Behavior Cloning
VLA Training
Reward Modeling
真正有价值的训练资产。
十八、从仿真到真实机器人必须经过SIL/HIL
建议建立三层测试:
第一层:纯仿真
Simulation
↓
ROS 2
↓
AI
第二层:硬件在环
Real Controller
↓
Simulation
第三层:真实机器人
Real Sensors
↓
Real Controller
↓
Real Actuator
Isaac Sim官方工作流本身就覆盖了软件在环、硬件在环、ROS 2以及Jetson部署等方向。
这样可以把风险逐层释放,而不是第一次运行代码就让机器人拿着机械臂冲向桌子。
十九、一个可落地的0到1开发计划
如果团队只有2~5名工程师,可以采用下面的节奏。
第1阶段:机器人基础
目标:
Robot Boot
↓
ROS 2
↓
Sensors
↓
Motor
完成:
URDF
ROS 2驱动
Camera
LiDAR
IMU
Joint State
Teleoperation
验收标准:
能稳定连续运行数小时,不出现节点崩溃和控制失联。
第2阶段:导航
完成:
SLAM
Localization
Navigation
Obstacle Avoidance
验收:
A点 → B点
连续运行100次,统计:
成功率
平均时间
路径长度
碰撞次数
定位丢失次数
第3阶段:机械臂
完成:
IK
MoveIt 2
Collision
Grasp
Release
先不要追求“任何东西都能抓”。
先固定:
一个杯子
一个桌子
一个抓取位置
把成功率做到稳定,再扩展。
第4阶段:视觉
加入:
Object Detection
Depth
Pose Estimation
Tracking
实现:
看到杯子
↓
获得三维位置
↓
生成抓取姿态
第5阶段:VLM
加入:
Language
+
Vision
实现:
“找到红色杯子”
然后转成:
detect(red cup)
第6阶段:Agent
加入:
Planner
Tool Calling
State Machine
Memory
Recovery
最终完成:
“去厨房拿一个杯子给我”
机器人自主执行:
Navigate
→ Search
→ Identify
→ Grasp
→ Return
→ Release
二十、最终系统架构
一个比较完整的0到1具身机器人,可以落成:
User
│
↓
┌───────────────┐
│ LLM / VLM / │
│ VLA Agent │
└───────┬───────┘
↓
┌───────────────┐
│ Task Planner │
│ State Machine │
└───────┬───────┘
↓
┌─────────────┼─────────────┐
↓ ↓ ↓
Navigation Perception Manipulation
│ │ │
Nav2 Detection/Pose MoveIt 2
│ │ │
└───────────────┼──────────────┘
↓
Safety Layer
↓
Robot Controller
↓
┌────────────────┐
│ Robot Hardware │
└───────┬────────┘
↓
Sensors / State
│
└──────────────→ Feedback
这套架构的核心思想可以概括成一句话:
AI负责“想做什么”,机器人软件负责“怎么做”,控制器负责“安全地做”。
二十一、从0到1最容易犯的十个错误
1. 一开始就做人形机器人
复杂度直接爆炸。
2. 先训练大模型,再做机器人
顺序反了。
应该先把机器人能力做出来,再决定AI需要解决什么问题。
3. 让LLM直接控制电机
不安全,也不可控。
4. 没有仿真环境
导致每次测试都消耗真实硬件时间。
5. 不记录完整传感器数据
最终无法分析失败原因。
6. 忽略时间同步
RGB、Depth、IMU和Robot State如果时间戳不一致,空间融合会产生非常诡异的问题。
7. 忽略坐标系
机器人系统里:
map
odom
base_link
camera_link
tool0
每一个frame都不能靠“感觉”。
8. 所有ROS 2 Topic使用默认QoS
不同数据流应该有不同策略。
9. AI和实时控制混在一起
AI推理一次卡顿,就可能拖垮控制循环。
10. 只测Demo,不测失败
真正的机器人产品不是:
Demo成功一次
而是:
1000次任务
970次成功
20次可恢复失败
10次安全停止
0次危险动作
二十二、结语:具身机器人的核心不是“更大的模型”
具身机器人最终要解决的不是一个单纯的AI问题,而是一个复杂的系统工程问题。
从0到1最合理的技术路线不是:
大模型
↓
VLA
↓
人形机器人
而应该是:
机器人硬件
↓
ROS 2
↓
传感器
↓
运动控制
↓
定位导航
↓
机械臂规划
↓
视觉感知
↓
任务规划
↓
VLM
↓
Agent
↓
VLA
↓
数据闭环
↓
规模化部署
ROS 2解决机器人系统之间的通信与执行基础设施,Nav2负责移动导航,MoveIt 2负责操作和运动规划,Isaac Sim等工具解决仿真、测试和数据生成,而VLM/VLA负责进一步提升机器人对复杂环境和自然语言任务的理解能力。
真正成熟的具身机器人系统,应该形成一个稳定的闭环:
Perception
↓
Understanding
↓
Planning
↓
Action
↓
Feedback
↓
Recovery
↓
Learning
其中任何一层都不能依赖“模型应该会自己解决”。
如果从工程实践的角度只记住一个原则,那就是:
先做机器人,再做智能;先做闭环,再做模型;先保证安全,再追求泛化。
这才是具身机器人真正从0走向1的路径。
参考资料
ROS 2 Documentation,官方文档,涵盖ROS 2通信接口、QoS、Executor、Lifecycle等核心机制。
NVIDIA Isaac Sim Documentation,官方机器人仿真、ROS 2、SIL/HIL和合成数据生成技术文档。
Brohan et al., RT-2: Vision-Language-Action Models Transfer Web Knowledge to Robotic Control, arXiv:2307.15818,VLA机器人学习代表性研究。