3. 连续控制问题

在自动驾驶的决策控制链路中,感知模块输出的是环境状态,规划模块给出的是期望轨迹,而真正让车辆“动起来”的,是底层控制器对转向、油门和刹车三个执行机构的连续调节。与游戏 AI 中常见的“上下左右”离散动作不同,车辆控制本质上是一个连续动作空间问题:方向盘转角可以从 -540° 到 +540° 之间取任意实数值,油门开度在 0% 到 100% 之间连续变化,刹车压力同样是一个连续量。理解连续动作空间的特点,是掌握 PPO 与 SAC 这类连续控制算法的前提。

一、连续动作空间的核心特点

连续动作空间最直观的特征是动作取值无限且稠密。在离散空间中,动作集合是有限的,例如 {左转, 直行, 右转} 只有 3 个元素;而在连续空间中,转向角是一个实数区间,理论上存在无穷多个可选动作。这带来三个直接后果:

  • 无法枚举:Q-learning 依赖对每个动作求 Q 值再取最大,连续空间下无法遍历所有动作,传统值函数方法失效。
  • 策略需要参数化:必须用一个函数(通常是神经网络)来表示策略 π(a|s),输出动作分布的参数,而不是一张动作概率表。
  • 动作平滑性要求高:车辆执行机构有物理惯性,相邻时刻的动作不能剧烈跳变,否则会造成乘坐不适甚至失稳。

因此,连续控制问题通常被建模为:策略网络接收状态 s,输出动作分布的均值 μ 和标准差 σ,再从该分布中采样得到动作 a,最后将 a 裁剪到合法区间后发送给执行器。

二、离散化的局限

面对连续动作,一个自然的想法是“把它切成格子”——把转向角离散成 21 个档位,油门离散成 5 个档位。这种做法在小规模问题上可行,但在自动驾驶中会暴露明显缺陷:

维度 离散化方案 动作数量 问题
转向 21 档 21 精度不足,无法微调
油门 5 档 5 加速度阶跃明显
刹车 5 档 5 制动不平顺
联合动作 21×5×5 525 维度爆炸,探索效率低

更严重的是维度灾难:每增加一个连续控制维度,离散动作总数就乘以该维度的档位数。若同时控制转向、油门、刹车、挡位、灯光,动作数量会迅速膨胀到数万甚至数十万,值函数表无法存储,训练样本效率急剧下降。此外,离散化会引入量化误差,车辆永远无法输出两个档位之间的中间值,导致控制精度受限。

注意:离散化并非完全不可用。在动作维度极低、精度要求不高的场景(如简单的车道保持开关控制)中,离散化仍可作为快速原型方案。但在自动驾驶的连续转向与纵向控制中,它通常不是最终选择。

三、确定性策略与随机策略

连续控制中的策略分为两类。确定性策略直接输出一个确定的动作 a = μ(s),例如 DDPG 使用的就是确定性策略。它的优点是动作稳定、易于部署,但缺点是探索能力弱:如果不在动作上额外加噪声,智能体很难发现更优的控制方式。

随机策略则输出一个概率分布 π(a|s),动作从分布中采样得到。PPO 和 SAC 都采用随机策略。随机策略的优点是天然具备探索能力,训练初期可以广泛尝试不同动作;训练后期标准差逐渐减小,策略趋于确定,动作变得平滑。SAC 还通过最大化熵来鼓励探索,使策略在多个可行控制方案之间保持一定随机性,从而提升鲁棒性。

核心区别:确定性策略是“一条路走到黑”,随机策略是“先广泛尝试,再逐步收敛”。在自动驾驶这种高风险场景中,随机策略训练时需要在仿真环境中进行,避免实车探索带来的危险。

四、自动驾驶中的转向、油门、刹车控制

将上述概念落到自动驾驶场景,连续控制的具体对象是三个执行机构:

  • 转向:输出方向盘转角,通常归一化到 [-1, 1],对应最大左转和最大右转。控制频率约 10~50 Hz。
  • 油门:输出开度 [0, 1],0 表示完全松开,1 表示全油门。需要与刹车互斥或协调。
  • 刹车:输出制动压力 [0, 1],0 表示不制动,1 表示最大制动。紧急情况下需要快速响应。

这三个量构成一个三维连续动作向量 a = [steer, throttle, brake]。策略网络需要同时输出这三个值,并保证它们满足物理约束:转向角变化率受限、油门和刹车不能同时为最大值、刹车压力不能超过执行器上限。实际工程中,通常会在策略输出后加一层动作裁剪与平滑滤波,例如:

# 动作后处理示例
steer = np.clip(steer, -1.0, 1.0)
throttle = np.clip(throttle, 0.0, 1.0)
brake = np.clip(brake, 0.0, 1.0)

# 一阶低通滤波,抑制动作抖动
steer_smooth = 0.8 * steer_prev + 0.2 * steer
throttle_smooth = 0.8 * throttle_prev + 0.2 * throttle
brake_smooth = 0.8 * brake_prev + 0.2 * brake

# 油门刹车互斥处理
if throttle_smooth > 0.05 and brake_smooth > 0.05:
    if throttle_smooth > brake_smooth:
        brake_smooth = 0.0
    else:
        throttle_smooth = 0.0

这段后处理逻辑体现了连续控制工程中的一个重要原则:算法输出的是理想动作,执行器接收的是经过约束的动作。PPO 和 SAC 负责学习“应该怎么打方向、踩油门”,而安全层负责保证“打的方向和踩的力度在物理上可行”。

五、常见误区与复盘

误区一:把连续动作当成离散动作处理,用 softmax 输出几个固定档位。这会导致控制精度不足,车辆在弯道中无法微调方向。
误区二:认为随机策略训练完成后仍然随机。实际上训练后期标准差会收敛到很小,策略接近确定性,部署时通常直接取均值动作。
误区三:忽略动作平滑。即使策略输出的动作在数值上连续,相邻时刻的跳变仍会导致车辆抖动,必须加入滤波或动作变化率惩罚。

复盘来看,连续控制问题的关键不在于“动作有多少个”,而在于如何用参数化策略表示无限动作空间,并在探索与稳定之间取得平衡。PPO 通过裁剪概率比限制策略更新幅度,SAC 通过最大熵鼓励探索,两者都适合自动驾驶中的转向、油门、刹车连续控制。下一章将进入 PPO 算法的具体原理,理解它如何将上述连续控制需求转化为可训练的优化目标。

连续动作空间下的自动驾驶控制链路 状态 s 车道线/速度/障碍物 策略网络 π(a|s) 输出 μ 和 σ PPO / SAC 随机策略采样 连续动作 a steer ∈ [-1, 1] throttle ∈ [0, 1] brake ∈ [0, 1] 安全后处理 裁剪 低通滤波 油门刹车互斥 车辆执行器 仿真环境 / 实车 奖励 r 连续控制关键对比 离散化方案 动作数量有限 维度爆炸 量化误差大 连续策略方案 参数化分布 动作平滑 探索与稳定平衡 自动驾驶三要素 转向:方向微调 油门:纵向加速 刹车:安全减速