Skip to content

第16章 机器学习与机器人

16 第 16 章 机器学习与机器人

16.1 为什么机器人需要机器学习

表 16-1 传统机器人依赖人工设计的规则和模型,面对复杂多变的真实环境时存在根本性挑战:

传统方法的局限 具体问题 ML 解决思路
手工特征设计 不同场景需要不同特征,难以泛化 深度学习自动学习特征表示
精确建模困难 复杂动力学难以用解析公式描述 数据驱动的模型学习
规则组合爆炸 任务越复杂,规则越难维护 强化学习端到端策略
语义理解缺失 传统感知只有几何,缺乏语义 视觉-语言模型理解场景

上表汇总了为什么机器人需要机器学习中常见的问题现象、可能原因及推荐解决方案,可作为排障时的快速参考手册。

vs. PID 传统方法 ML 方法 手工设计 数据驱动 感知 规则 感知 学习 规划 优化 规划 端到端 控制 控制 策略网络 每个模块人工设计 从数据中学习

图 16-1 上图直观呈现了为什么机器人需要机器学习的组成要素与数据通路,有助于理解系统整体的工作机理。

16.2 监督学习在感知中的应用

16.2.1 深度学习基础回顾

深度学习的核心是多层神经网络通过反向传播自动学习特征表示。

卷积神经网络(CNN)是视觉任务的基石:

输入图像 卷积层×N 池化 全连接 输出 特征图 降采样 分类 类别 边缘/纹理 回归 → 语义 分割 224× 224 × 3

图 16-2 上图以框图形式描绘了深度学习基础回顾的系统架构,清晰呈现了各模块之间的连接关系与信号流向。

16.2.2 视觉感知任务

在第 12 章我们介绍了目标检测(YOLO)和语义分割。这里补充几个机器人特有的视觉任务:

1. 深度估计(Monocular Depth Estimation)

从单张 RGB 图像预测深度图,解决单目相机无深度信息的问题:

import torch

# MiDaS 单目深度估计
model = torch.hub.load("intel-isl/MiDaS", "MiDaS_small")

model.eval()

transform = torch.hub.load("intel-isl/MiDaS", "transforms").small_transform

img = cv2.imread("scene.jpg")
input_batch = transform(img)

with torch.no_grad():
    prediction = model(input_batch)
    depth = prediction.squeeze().cpu().numpy()
# depth: 相对深度图(值越大越远)

2. 光流估计(Optical Flow)

表 16-2 估计连续帧之间像素级的运动,用于动态物体检测和避障:

算法 类型 精度 速度
Lucas-Kanade 经典,稀疏
FlowNet2 深度学习 中(GPU)
RAFT 深度学习 最高 中(GPU)

3. 位姿估计(Pose Estimation)

检测图像中人的关节位置,用于人机交互和安全避让。

16.3 强化学习基础

16.3.1 马尔可夫决策过程(MDP)

强化学习(RL)的数学框架:

$$ MDP = (\mathcal{S}, \mathcal{A}, P, R, \gamma) $$

  • $\mathcal{S}$:状态空间
  • $\mathcal{A}$:动作空间
  • $P(s'|s, a)$:状态转移概率
  • $R(s, a)$:奖励函数
  • $\gamma \in [0, 1)$:折扣因子

目标:找到策略 $\pi(a|s)$ 最大化累积奖励:

$$ \max_\pi \mathbb{E}\left[\sum_{t=0}^{\infty} \gamma^t R(s_t, a_t)\right] $$

强化学习交互循环 状态 s_t 环境 智能体 动作 a_t 奖励 r_t 下一状态 s_{t+1}

图 16-3 该框图展示了马尔可夫决策过程(MDP)的核心结构,读者可以从中把握各功能单元的层次划分与协作方式。

16.3.2 值函数与策略梯度

两大类 RL 方法:

基于值函数(Value-based):学习状态-动作值 $Q(s, a)$,选择使 $Q$ 最大的动作。

$$ Q^(s, a) = R(s, a) + \gamma \sum_{s'} P(s'|s, a) \max_{a'} Q^(s', a') $$

代表算法:DQN、Double DQN、Dueling DQN

基于策略梯度(Policy Gradient):直接优化策略网络参数。

$$ \nabla_\theta J(\theta) = \mathbb{E}{\pi\theta} \left[\nabla_\theta \log \pi_\theta(a|s) \cdot A(s, a)\right] $$

代表算法:PPO、SAC、TD3

16.3.3 常用 RL 算法对比

表 16-3 常用 RL 算法对比

算法 类型 动作空间 特点 适用场景
DQN 值函数 离散 简单,稳定 网格导航
PPO 策略梯度 连续/离散 鲁棒,易调参 运动控制
SAC Actor-Critic 连续 样本效率高 精细操作
TD3 Actor-Critic 连续 解决过估计 机器人控制

通过上表的对比可以看出,不同方案在算法、类型、动作空间等等方面各有优劣,实际选型时应结合具体应用场景综合权衡。

16.4 强化学习用于机器人控制

16.4.1 经典控制 vs RL 控制

vs 经典控制 RL 控制 需要精确模型 无需精确模型 系统辨识 仿真训练 控制器设计 策略网络学习 (PID/MPC) (神经网络) 参数调优 Sim-to-Real 迁移

图 16-4 上图直观呈现了经典控制 vs RL 控制的组成要素与数据通路,有助于理解系统整体的工作机理。

16.4.2 仿真训练环境

RL 训练需要大量交互数据,在真实机器人上直接训练效率低且有安全风险。仿真器提供安全、可并行、可加速的训练环境:

表 16-4 仿真训练环境

仿真器 开发者 特点 适用场景
Gazebo Open Robotics 开源,ROS2 集成 移动机器人、通用
Isaac Sim NVIDIA GPU 加速物理,光线追踪 大规模并行训练
MuJoCo DeepMind 精确接触模拟 操作臂、灵巧手
PyBullet Erwin Coumans Python 友好,轻量 教学、快速原型

上表对仿真训练环境中各方案的特性进行了横向对比,便于读者根据实际需求选择最合适的技术路线。

16.4.3 Sim-to-Real 迁移

仿真中训练的策略直接部署到真实机器人通常效果不佳(Reality Gap)。常用的迁移方法:

1. 域随机化(Domain Randomization)

在训练时随机化仿真参数(摄擦系数、质量、视觉纹理等),使策略对不确定性具有鲁棒性。

2. 系统辨识(System Identification)

精确测量真实系统参数,在仿真中复现。

3. 域适应(Domain Adaptation)

使用对抗学习等方法使仿真特征与真实特征对齐。

# PyBullet 简单 RL 训练示例
import gymnasium as gym
from stable_baselines3 import PPO

# 创建差速机器人导航环境
env = gym.make("CartPole-v1")  # 基础示例

# PPO 训练
model = PPO("MlpPolicy", env, verbose=1,
            learning_rate=3e-4,
            n_steps=2048,
            batch_size=64)
model.learn(total_timesteps=100000)

# 评估
obs, _ = env.reset()
for _ in range(1000):
    action, _ = model.predict(obs, deterministic=True)
    obs, reward, terminated, truncated, info = env.step(action)
    if terminated or truncated:
        obs, _ = env.reset()

16.5 模仿学习

16.5.1 从示范中学习

模仿学习(Imitation Learning)从人类示范中直接学习策略,绕过奖励函数设计:

s, a πa s) 专家示范 学习策略 自主执行 人类操作 神经 机器人 遥控机器人 网络 自主 录制数据 训练 拟合 部署 运行

图 16-5 上图以框图形式描绘了从示范中学习的系统架构,清晰呈现了各模块之间的连接关系与信号流向。

两种主要方法:

表 16-5 从示范中学习

方法 原理 优点 缺点
行为克隆(BC) 监督学习拟合 $(s, a)$ 对 简单直接 分布偏移(compounding error)
DAgger 迭代收集修正数据 解决分布偏移 需要专家在线标注

通过上表的对比可以看出,不同方案在方法、原理、优点等等方面各有优劣,实际选型时应结合具体应用场景综合权衡。

16.5.2 行为克隆实现

import torch
import torch.nn as nn
import numpy as np

class PolicyNetwork(nn.Module):
    def __init__(self, state_dim, action_dim):
        super().__init__()
        self.net = nn.Sequential(
            nn.Linear(state_dim, 256),
            nn.ReLU(),
            nn.Linear(256, 256),
            nn.ReLU(),
            nn.Linear(256, action_dim),
            nn.Tanh()  # 动作归一化到 [-1, 1]
        )

    def forward(self, state):
        return self.net(state)

# 训练行为克隆
def train_bc(expert_states, expert_actions, epochs=100):
    model = PolicyNetwork(state_dim=6, action_dim=2)  # [v, omega]
    optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
    criterion = nn.MSELoss()

    states = torch.FloatTensor(expert_states)
    actions = torch.FloatTensor(expert_actions)

    for epoch in range(epochs):
        pred_actions = model(states)
        loss = criterion(pred_actions, actions)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        if epoch % 10 == 0:
            print(f"Epoch {epoch}, Loss: {loss.item():.4f}")

    return model

16.6 基础模型与具身智能

16.6.1 大语言模型 + 机器人

2023 年以来,大语言模型(LLM)和视觉-语言模型(VLM)开始深入机器人领域,形成具身智能(Embodied AI)的新范式:

自然语言指令 LLM/VLM 机器人动作 帮我把桌上 1. 导航到桌子 的杯子拿来 理解 + 规划 2. 识别杯子 任务分解 3. 伸手抓取 4. 导航到人 5. 递出 场景感知 (相机/LiDAR)

图 16-6 该框图展示了大语言模型 + 机器人的核心结构,读者可以从中把握各功能单元的层次划分与协作方式。

16.6.2 代表性工作

表 16-6 代表性工作

系统 机构 方法 关键创新
SayCan Google LLM + 可行性评分 LLM 提议动作,机器人评估可行性
Code as Policies Google LLM 生成控制代码 将自然语言转为 Python 控制程序
RT-2 Google DeepMind VLM 直接输出动作 视觉-语言-动作端到端模型
Mobile ALOHA Stanford 双臂灵巧操作 低成本全身遥操作+模仿学习
Open X-Embodiment Google et al. 跨机器人数据集 统一 53 种机器人的数据训练

上表对代表性工作中各方案的特性进行了横向对比,便于读者根据实际需求选择最合适的技术路线。

16.6.3 语义 SLAM 与场景图

将深度学习的语义理解与 SLAM 建图结合:

. . + . . . . . 传统 SLAM 语义 SLAM 点/线特征 物体级特征 几何地图 语义标注地图 场景图 桌子 杯子 椅子

图 16-7 上图直观呈现了语义 SLAM 与场景图的组成要素与数据通路,有助于理解系统整体的工作机理。

场景图(Scene Graph)将环境表示为物体节点和关系边的图结构:

  • 节点:物体(桌子、椅子、杯子)及其属性(位置、颜色、大小)

  • 边:空间关系(on、near、inside)

  • 应用:支持基于自然语言的导航("去放着红色杯子的那张桌子旁")

16.7 机器学习在机器人各模块的应用总览

机器学习 × 机器人全栈 感知层 估计层 规划层 控制层 目标检测 学习型 学习型 RL 控制 深度估计 里程计 路径规划 模仿学习 语义分割 Neural 行为树 自适应 (第12章) SLAM 任务规划 (10.6节) 特征自动 数据驱动 经验驱动 端到端 提取 状态估计 决策 策略

图 16-8 上图以框图形式描绘了机器学习在机器人各模块的应用总览的系统架构,清晰呈现了各模块之间的连接关系与信号流向。

表 16-7 机器学习在机器人各模块的应用总览

应用领域 ML 方法 替代/增强的传统方法 成熟度
目标检测 YOLO, DETR 手工特征+分类器 工业部署
深度估计 MiDaS, ZoeDepth 双目匹配 半成熟
里程计 DROID-SLAM, TartanVO 特征点法 VO 研究阶段
路径规划 RL+图搜索 A*/RRT 研究阶段
运动控制 PPO, SAC PID/MPC 仿真成熟
抓取规划 GraspNet, Contact-GraspNet 解析方法 半成熟
任务规划 LLM+VLM 有限状态机 早期研究

通过上表的对比可以看出,不同方案在应用领域、ML 方法、替代/增强的传统方法等等方面各有优劣,实际选型时应结合具体应用场景综合权衡。

16.8 实践:基于 RL 的导航策略

16.8.1 环境设计

使用 Gazebo 仿真创建一个简单的避障导航环境:

# 基于 ROS2 的 RL 导航环境(简化版)
import gymnasium as gym
import numpy as np

class GazeboNavEnv(gym.Env):
    """差速机器人避障导航环境"""

    def __init__(self):
        super().__init__()
        # 状态:[激光雷达 24 点, 目标方向, 目标距离]
        self.observation_space = gym.spaces.Box(
            low=0, high=10, shape=(26,), dtype=np.float32)
        # 动作:[线速度, 角速度]
        self.action_space = gym.spaces.Box(
            low=np.array([0.0, -1.0]),
            high=np.array([0.5, 1.0]),
            dtype=np.float32)

    def step(self, action):
        v, omega = action
        # 发送速度指令到 Gazebo
        self._send_cmd_vel(v, omega)

        # 获取新状态
        obs = self._get_observation()

        # 计算奖励
        reward = self._compute_reward(obs)

        # 判断是否结束
        terminated = self._check_collision() or self._check_goal_reached()

        return obs, reward, terminated, False, {}

    def _compute_reward(self, obs):
        """奖励函数设计"""
        min_laser = np.min(obs[:24])
        goal_dist = obs[25]

        reward = 0.0
        # 接近目标奖励
        reward += (self.prev_goal_dist - goal_dist) * 10.0
        # 碰撞惩罚
        if min_laser < 0.2:
            reward -= 100.0
        # 靠近障碍物惩罚
        elif min_laser < 0.5:
            reward -= 1.0
        # 到达目标奖励
        if goal_dist < 0.3:
            reward += 200.0

        self.prev_goal_dist = goal_dist
        return reward

16.8.2 训练与评估

from stable_baselines3 import PPO
from stable_baselines3.common.vec_env import SubprocVecEnv

# 多环境并行训练(加速数据收集)
def make_env():
    return GazeboNavEnv()

env = SubprocVecEnv([make_env for _ in range(4)])

# PPO 训练
model = PPO(
    "MlpPolicy", env,
    learning_rate=3e-4,
    n_steps=2048,
    batch_size=256,
    n_epochs=10,
    gamma=0.99,
    verbose=1,
    tensorboard_log="./nav_tensorboard/"
)

model.learn(total_timesteps=1_000_000)
model.save("nav_policy_ppo")

16.9 前沿展望

表 16-8 机器学习与机器人的融合正在加速演进,以下是值得关注的方向:

方向 描述 代表工作 挑战
世界模型 学习环境的物理模型用于规划 Dreamer, IRIS 模型精度与泛化
Foundation Models for Robotics 预训练大模型适配机器人 RT-2, Octo 数据集规模、泛化性
Sim-to-Real 零样本 仅在仿真训练,直接部署 域随机化+课程学习 Reality Gap
多模态融合 视觉+触觉+力+语言联合学习 RoboCasa 传感器对齐
安全 RL 满足安全约束的强化学习 Constrained RL 约束满足与性能

上表对前沿展望中各方案的特性进行了横向对比,便于读者根据实际需求选择最合适的技术路线。

16.10 小结与习题

本章概览了机器学习在机器人系统中的应用,从监督学习感知、强化学习控制到模仿学习和具身智能。机器学习正在改变机器人系统的每一层——从感知到规划到控制,但距离大规模工业部署仍有差距。

监督 强化 模仿 基础 前沿 学习 学习 学习 模型 展望 感知能力 控制策略 从示范学 语言交互 (视觉/深度) (避障/操作) (行为克隆) (具身智能)

图 16-9 该框图展示了小结与习题的核心结构,读者可以从中把握各功能单元的层次划分与协作方式。

习题

??? question "16-1 奖励函数设计" 为差速机器人设计一个"走廊跟随"任务的强化学习奖励函数。机器人需要沿走廊中线行驶,遇到 T 字路口向右转。讨论奖励的各个分量及其权重。

??? question "16-2 Sim-to-Real Gap" 列举至少 5 种导致仿真与真实环境差异的因素。对于差速机器人的避障导航任务,哪些因素影响最大?域随机化如何缓解这些问题?

??? question "16-3 行为克隆 vs RL" 对于"差速机器人循线行驶"任务,分别设计行为克隆和强化学习的解决方案。对比两种方法在数据需求、训练效率、泛化能力方面的差异。

??? question "16-4 LLM + 机器人" 假设你有一个配备相机和机械臂的移动机器人,设计一个系统架构使其能理解自然语言指令"把桌上的红色杯子放到柜子里"。画出从语言理解到动作执行的完整流程图,标注每个模块使用的技术。

??? question "16-5 综合项目" 使用 stable-baselines3 和 Gymnasium,训练一个 PPO 策略完成 CartPole-v1 任务(或自定义的机器人导航任务)。记录训练曲线(reward vs timesteps),分析超参数(learning_rate, n_steps, gamma)对训练效果的影响。


16.11 本章测验

Quiz results are saved to your browser's local storage and will persist between sessions.

#

1) 在深度学习中,单目深度估计网络为什么需要使用大量数据训练?

#

2) PPO(Proximal Policy Optimization)相比原始策略梯度方法的改进是什么?

#

3) 行为克隆(Behavior Cloning)最主要的局限性是什么?

#

4) 具身智能(Embodied AI)中"大语言模型作为任务规划器"的典型架构是怎样的?

Quiz Progress

0 / 0 questions answered (0%)

0 correct