3. 仿真环境搭建
CARLA 的仿真环境搭建不是“打开客户端就能跑”的简单操作,而是由地图、天气、交通流、传感器、同步模式五个相互耦合的配置层共同决定。规划控制闭环仿真中,任何一层配置不当,都会让控制器的评估结果失真:例如异步模式下传感器时间戳漂移,会让横向误差统计出现虚假抖动;交通流密度过低,则无法暴露换道决策的保守性问题。本节按“先静态、后动态、再时间基准”的顺序,梳理一套可复用的环境搭建流程。
一、核心原理:五层配置与时间基准
CARLA 服务端维护一个世界(World),世界由地图(Map)定义几何与语义,由天气(Weather)定义光照与大气,由交通管理器(Traffic Manager)驱动 NPC 车辆与行人,由传感器(Sensor)采集数据,而同步模式(Synchronous Mode)决定所有 actor 的推进节奏。前四层是“内容”,第五层是“时间基准”,它把内容绑定到固定步长上,使规划控制的输入输出可复现。
关键结论:只要做闭环控制评测,就必须开启同步模式,并让传感器以
sensor_tick 与服务器 fixed_delta_seconds 对齐;否则“同一段轨迹跑两次结果不同”几乎必然发生。二、方法流程:从加载地图到跑通闭环
推荐按以下顺序搭建,避免“先加传感器再改地图”导致的句柄失效问题。
- 加载地图:通过
world = client.load_world('Town03')切换,或启动时用--map参数指定。切换地图会重建世界,之前创建的 actor 与传感器全部失效,因此地图必须最先确定。 - 设置天气:使用
carla.WeatherParameters构造参数对象,再world.set_weather()。若需动态变化,可在同步循环中按帧插值。 - 生成交通流:先
client.get_trafficmanager(port)获取 TM 实例,再批量生成 NPC 车辆并set_autopilot(True, tm_port),最后设置密度、限速差、变道激进程度等参数。 - 配置传感器:在主车(ego vehicle)上挂载 RGB、LiDAR、GNSS、IMU,统一设置
sensor_tick,并注册回调把数据写入队列。 - 开启同步模式:设置
synchronous_mode=True与fixed_delta_seconds,主循环中每步调用world.tick(),等待传感器队列取到本帧数据后再送入规划控制。
settings = world.get_settings()
settings.synchronous_mode = True
settings.fixed_delta_seconds = 0.05 # 20 Hz
world.apply_settings(settings)
tm = client.get_trafficmanager(8000)
tm.set_synchronous_mode(True)
tm.set_global_distance_to_leading_vehicle(2.5)
tm.global_percentage_speed_difference(20.0) # NPC 比限速慢 20%
for i in range(40):
npc = world.spawn_actor(bp, spawn_point)
npc.set_autopilot(True, tm.get_port())
while True:
world.tick()
frame = world.get_snapshot().frame
data = sensor_queue.get(frame) # 阻塞等待本帧传感器数据
control = controller.run_step(data)
ego.apply_control(control)
三、关键参数与配置清单
| 配置项 | 典型取值 | 作用与影响 |
|---|---|---|
| 地图 | Town03 / Town10HD | 决定道路拓扑、车道数与语义标注,影响规划难度 |
| fixed_delta_seconds | 0.05(20 Hz) | 仿真步长,控制周期需与之匹配或整数倍分频 |
| sun_altitude_angle | -10° ~ 70° | 光照方向,影响相机曝光与视觉感知稳定性 |
| precipitation / wetness | 0 ~ 100 | 雨量与路面湿度,影响轮胎附着与制动距离 |
| 车辆数 / 行人 | 40 ~ 120 / 30 ~ 80 | 交通密度,过低无法暴露交互决策缺陷 |
| sensor_tick | 0.05 或 0.1 | 传感器采样周期,必须与仿真步长对齐 |
| TM 端口 | 8000 | 交通管理器实例端口,多实例时需区分 |
四、案例与误区复盘
某次横向控制评测中,同一控制器在两次运行中横向误差标准差相差近 40%。排查发现:第一次运行忘记开启同步模式,传感器回调在异步线程中触发,规划模块拿到的位姿与图像帧号不一致;第二次开启同步后结果稳定。这说明同步模式不是可选项,而是闭环评测的前提。
常见误区一:先创建传感器再
load_world,导致传感器句柄指向已销毁的 actor,回调静默失效。误区二:只设置 synchronous_mode 却忘记 tm.set_synchronous_mode(True),NPC 仍在异步推进,主车与交通流时间基准不一致。误区三:sensor_tick 小于 fixed_delta_seconds,同一仿真步内触发多次回调,队列取帧逻辑错乱。建议把环境搭建封装成
build_world(config) 函数,配置项集中在一个 YAML 中,每次实验记录地图、天气、交通密度、同步参数与随机种子,保证实验可复现。天气与交通流建议做多组对照(晴天/雨天、低密度/高密度),用于评估规划控制算法的鲁棒边界。完成以上五层配置后,仿真环境才具备“可复现、可对照、可评测”的工程属性。后续的规划算法与控制算法,都应在这个统一的时间基准与场景集合上迭代,而不是每次手动改参数、凭感觉判断优劣。