1. 课程导入

在自动驾驶研发链条中,感知负责“看见世界”,规划负责“决定怎么走”,控制负责“把决定变成方向盘、油门和刹车的动作”。三者中,规划与控制直接决定车辆行为是否安全、平滑、可解释。而 CARLA 作为开源高保真仿真器,提供了城市道路、交通参与者、传感器与车辆动力学模型,是验证规划控制算法最常用的工程平台之一。本课程的目标,不是零散地讲几个 API,而是带你搭建一条可运行、可观测、可复现的规划控制闭环仿真工程链路。

本课程的核心命题:让一条“感知输入 → 规划决策 → 控制执行 → 车辆响应 → 再次感知”的闭环,在 CARLA 中稳定跑起来,并能用数据证明它跑得好。

一、学习目标:从“会调 API”到“会做闭环工程”

很多初学者学 CARLA 的路径是:装好环境、跑通示例、调用几个 Python 接口,然后卡在“我的算法怎么接进去”。本课程要解决的就是这个断层。学完后你应当具备四层能力:

  • 环境层:能独立完成 CARLA 服务端启动、Python 客户端连接、地图与天气加载、同步模式配置。
  • 接口层:能读懂并使用 CARLA 的车辆控制接口(carla.VehicleControl)、世界快照(WorldSnapshot)、传感器回调与坐标系约定。
  • 算法层:能实现或接入横向控制(如纯跟踪、Stanley、LQR)与纵向控制(如 PID、速度规划),并完成轨迹跟踪。
  • 工程层:能设计闭环评测指标(横向误差、速度误差、舒适度、碰撞率),并做参数标定与回归测试。

二、核心概念:闭环仿真到底“闭”在哪里

“闭环”是相对“开环”而言的。开环仿真只把一条预设轨迹喂给控制器,看输出对不对;闭环仿真则让控制输出真正作用于车辆模型,车辆运动后改变自身状态与所处场景,再反馈给规划模块,形成持续迭代。CARLA 中这条闭环的关键概念包括:

  • 同步模式(synchronous mode):让仿真时间步与客户端 tick 对齐,保证每帧数据可复现,是闭环实验的前提。
  • 固定时间步(fixed_delta_seconds):决定控制周期,例如 0.05 s 对应 20 Hz 控制频率。
  • 车辆状态反馈:位置、姿态、速度、加速度、航向角,是规划与控制之间的“共同语言”。
  • 参考轨迹:由全局路径规划或地图车道中心线生成,是控制器的跟踪目标。
  • 控制量:油门/刹车(throttle/brake)与转向(steer),经车辆动力学模型转化为下一时刻状态。

下面这张图展示了本课程要搭建的闭环数据流与模块关系,也是后续各章节的骨架:

CARLA 规划控制闭环仿真整体框架 场景与仿真环境层 CARLA Server 地图 / 天气 交通参与者 / NPC 同步模式 + 固定时间步 感知与状态获取 传感器 / 真值状态 位置·速度·航向角 规划决策 全局路径 / 局部轨迹 参考轨迹生成 控制执行 横向:Pure Pursuit 纵向:PID / 速度环 CARLA 车辆动力学模型 throttle / brake / steer → 新状态 位置·速度·姿态更新 闭环评测 横向误差 / 速度误差 舒适度 / 碰撞率 状态反馈 指标回灌 闭环 = 规划 → 控制 → 车辆响应 → 状态反馈 → 重新规划

三、整体框架:一条主线、四个层次

本课程按“环境 → 接口 → 算法 → 工程”四层递进组织。前几章解决“跑得起来”,中间章节解决“接得进去”,后段章节解决“评得清楚”。具体主线如下:

  1. 环境与接口:CARLA 安装、Python API、同步模式、坐标系与车辆控制接口。
  2. 规划基础:全局路径、参考轨迹、局部轨迹生成与轨迹平滑。
  3. 控制算法:横向 Pure Pursuit / Stanley / LQR,纵向 PID 与速度规划。
  4. 闭环工程:评测指标、参数标定、场景回归、日志与可视化。

一个最小可运行的闭环控制循环,代码骨架大致如下:

import carla, time

client = carla.Client("localhost", 2000)
world = client.get_world()
settings = world.get_settings()
settings.synchronous_mode = True
settings.fixed_delta_seconds = 0.05   # 20 Hz 控制周期
world.apply_settings(settings)

vehicle = spawn_vehicle(world)
controller = PurePursuitController(wheelbase=2.8)

while True:
    world.tick()                       # 推进一帧
    state = get_vehicle_state(vehicle) # 位置/速度/航向
    ref_traj = planner.update(state)   # 生成参考轨迹
    control = controller.run(state, ref_traj)
    vehicle.apply_control(control)     # throttle/brake/steer

四、工程价值:为什么值得用 CARLA 做闭环

真实车辆测试成本高、风险大、场景难复现。CARLA 的价值在于把“危险场景”和“极端参数”变成可重复实验:

维度实车测试CARLA 闭环仿真
成本高,需车辆、场地、人员低,单机即可运行
安全性碰撞风险真实存在碰撞可无限次复现
可复现性受天气、交通影响大同步模式 + 固定种子可复现
场景覆盖难以构造极端场景可脚本化生成切入、鬼探头等
评测效率人工记录,周期长自动采集指标,批量回归

五、常见误区与复盘建议

误区一:把开环当闭环。只验证控制器输出曲线,不把控制量真正作用于车辆,等于没做闭环。判断标准是:车辆状态是否反过来影响了下一帧的规划输入。

误区二:忽略同步模式。异步模式下仿真时间与客户端不同步,实验不可复现,指标波动大。闭环实验务必开启同步模式并固定时间步。

误区三:只调控制参数,不看规划质量。横向误差大,很多时候是参考轨迹本身不平滑或曲率突变,而非控制器不行。

复盘建议:每完成一个闭环实验,至少记录四项数据——控制周期、横向误差 RMS、速度误差 RMS、是否发生碰撞。把这三类指标做成表格横向对比,比“看起来跑得还行”可靠得多。