共计 2156 个字符,预计需要花费 6 分钟才能阅读完成。
为什么选择 CARLA?
在自动驾驶研发中,仿真环境能大幅降低路测成本。CARLA 作为开源仿真平台,相比 AirSim 和 LGSVL 有三大优势:

- 高保真渲染:采用虚幻引擎,支持 PBR 材质和动态光照
- 灵活 API:Python 客户端可实时控制所有元素(天气 / 交通 / 传感器)
- 模块化设计:Actor 系统让车辆 / 行人 /NPC 能独立编程
世界模型解剖图
CARLA 的世界模型像搭积木,分为三层:
-
地图层(Map)
包含道路网格、交通标志、spawn 点(出生点)。通过Town01~Town10预设或自定义 OpenDRIVE 地图 -
蓝图库(Blueprint Library)
预制资产模板,通过world.get_blueprint_library().filter('vehicle.*')调用 -
智能体系统(Actor)
所有动态对象继承自 Actor 基类,包括: - 车辆(Vehicle)
- 传感器(Sensor)
- 行人(Walker)
classDiagram
World "1" *-- "*" Actor
Actor <|-- Vehicle
Actor <|-- Sensor
Actor <|-- Walker
World "1" -- "1" Map
World "1" -- "1" BlueprintLibrary
实战:启动第一个仿真
环境初始化
import carla
# 连接服务器
client = carla.Client('localhost', 2000)
client.set_timeout(10.0) # 避免无响应
# 加载地图和天气
world = client.load_world('Town07') # 选择小镇地图
weather = carla.WeatherParameters(
cloudiness=80.0,
precipitation=30.0 # 模拟雨天
)
world.set_weather(weather)
添加传感器
# 从蓝图库创建摄像头
camera_bp = world.get_blueprint_library().find('sensor.camera.rgb')
camera_bp.set_attribute('image_size_x', '1920')
camera_bp.set_attribute('image_size_y', '1080')
# 将摄像头装在车辆上
camera = world.spawn_actor(
camera_bp,
carla.Transform(carla.Location(x=1.5, z=2.4)), # 车顶位置
attach_to=my_vehicle # 需提前创建的车辆对象
)
# 数据回调函数
def camera_callback(image):
image.save_to_disk('output/%06d.png' % image.frame)
camera.listen(camera_callback) # 开始接收数据
控制 NPC 交通
# 启用交通管理器
traffic_manager = client.get_trafficmanager()
traffic_manager.set_global_distance_to_leading_vehicle(2.5) # 设置安全距离
# 生成 10 辆随机车辆
for i in range(10):
vehicle_bp = random.choice(world.get_blueprint_library().filter('vehicle.*'))
spawn_point = random.choice(world.get_map().get_spawn_points())
npc = world.spawn_actor(vehicle_bp, spawn_point)
npc.set_autopilot(True, traffic_manager.get_port()) # 交给 TM 控制
性能优化三要素
1. 多客户端同步
- 使用
client.reload_world()而非多次创建新世界 - 所有客户端设置相同
fixed_delta_seconds(如 0.05 秒 / 帧)
2. 内存管理
- 必须销毁不再使用的 Actor:
sensor.destroy() - 大数据传输时启用压缩:
camera_bp.set_attribute('compression', 'png')
3. 异步 IO 优化
async def fetch_sensor_data(sensor):
while True:
data = await sensor.async_listen()
process_data(data) # 非阻塞处理
进阶思考方向
- 动态天气测试:通过插值渐变天气参数,观察相机 / 激光雷达的噪声变化
- 大规模交通优化:禁用非关键车辆的物理模拟(
vehicle.set_simulate_physics(False)) - 场景编排系统:用行为树(Behavior Tree)组合路口转向、跟车等基础场景
避坑指南
- ❌ 错误:未调用
actor.destroy()导致僵尸对象 - ✅ 正确:用
try-finally确保资源释放 - ❌ 错误:高频调用
world.tick()引发卡顿 - ✅ 正确:使用
wait_for_tick()异步等待
现在你已经掌握了 CARLA 的核心操作链,接下来可以尝试:
– 导入自定义高精地图
– 集成 ROS/ROS2 桥接
– 复现 nuScenes 等公开数据集场景
正文完
