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 负责学习“应该怎么打方向、踩油门”,而安全层负责保证“打的方向和踩的力度在物理上可行”。
五、常见误区与复盘
误区二:认为随机策略训练完成后仍然随机。实际上训练后期标准差会收敛到很小,策略接近确定性,部署时通常直接取均值动作。
误区三:忽略动作平滑。即使策略输出的动作在数值上连续,相邻时刻的跳变仍会导致车辆抖动,必须加入滤波或动作变化率惩罚。
复盘来看,连续控制问题的关键不在于“动作有多少个”,而在于如何用参数化策略表示无限动作空间,并在探索与稳定之间取得平衡。PPO 通过裁剪概率比限制策略更新幅度,SAC 通过最大熵鼓励探索,两者都适合自动驾驶中的转向、油门、刹车连续控制。下一章将进入 PPO 算法的具体原理,理解它如何将上述连续控制需求转化为可训练的优化目标。