2. CARLA基础入门
CARLA 是面向自动驾驶研发的开源仿真器,它把“世界模拟、车辆动力学、传感器渲染、交通流控制”拆成多个可独立通信的模块。理解这套架构,是后续编写规划控制闭环代码的前提:只有知道谁在算物理、谁在渲染图像、谁在维护世界状态,才能判断一个控制指令为什么没有生效、一个传感器数据为什么延迟。
一、核心架构:服务端与客户端分离
CARLA 采用 C/S 架构。服务端(Server)运行仿真世界,负责物理步进、地图加载、Actor 生命周期与传感器渲染;客户端(Client)通过 RPC 与服务端通信,用 Python API 读取世界状态、生成车辆、下发控制量。二者可以同机运行,也可以跨机部署。
服务端内部由多个模块协作:Simulator 维护全局时钟与同步模式;World 持有地图、天气、Actor 注册表;Actor 是车辆、行人、传感器、交通标志等实体的基类;Sensor 在仿真步进时采集数据并推送到客户端;Traffic Manager 负责自动驾驶车辆的路径与速度决策。客户端侧则通过 carla.Client 连接,用 world.get_actors() 查询实体,用 vehicle.apply_control() 下发油门、刹车、转向。
二、安装配置:版本、依赖与启动
CARLA 的安装方式主要有三种:官方预编译包、Docker 镜像、源码编译。对规划控制闭环仿真而言,推荐使用与 Python API 版本严格匹配的预编译包,避免 libcarla 与客户端版本不一致导致连接失败。
# 1. 下载并解压 CARLA 0.9.15(Linux 示例)
tar -xzf CARLA_0.9.15.tar.gz
cd CARLA_0.9.15
# 2. 启动服务端(无渲染模式,适合服务器)
./CarlaUE4.sh -RenderOffScreen -quality-level=Low
# 3. 安装 Python 客户端依赖
pip install carla==0.9.15
pip install pygame numpy opencv-python
# 4. 验证连接
python -c "import carla; c=carla.Client('localhost',2000); print(c.get_server_version())"
关键配置项包括:-carla-rpc-port 指定 RPC 端口,默认 2000;-quality-level 控制渲染质量,闭环仿真中常用 Low 以提升实时性;-benchmark 用于性能测试。若使用 Docker,需映射 2000-2002 端口并挂载地图资源。
requirements.txt。版本漂移是“昨天能跑、今天报错”的最常见原因。三、Python API:世界与 Actor 基本操作
Python API 的核心对象只有几个:Client、World、BlueprintLibrary、Actor、Sensor。典型流程是:连接客户端 → 加载地图 → 获取蓝图 → 生成车辆 → 绑定传感器 → 步进世界 → 读取数据 → 下发控制。
import carla
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
world = client.get_world()
# 设置同步模式,保证规划控制闭环可复现
settings = world.get_settings()
settings.synchronous_mode = True
settings.fixed_delta_seconds = 0.05 # 20 Hz
world.apply_settings(settings)
# 生成车辆
bp_lib = world.get_blueprint_library()
vehicle_bp = bp_lib.filter('vehicle.tesla.model3')[0]
spawn_point = world.get_map().get_spawn_points()[0]
vehicle = world.spawn_actor(vehicle_bp, spawn_point)
# 绑定相机传感器
cam_bp = bp_lib.find('sensor.camera.rgb')
cam_bp.set_attribute('image_size_x', '800')
cam_bp.set_attribute('image_size_y', '600')
camera = world.spawn_actor(cam_bp, carla.Transform(carla.Location(x=1.5, z=2.4)), attach_to=vehicle)
camera.listen(lambda image: image.save_to_disk('out/%06d.png' % image.frame))
# 闭环步进:读取状态 → 计算控制 → 下发
for _ in range(200):
world.tick()
control = carla.VehicleControl(throttle=0.4, steer=0.0, brake=0.0)
vehicle.apply_control(control)
# 清理
camera.destroy()
vehicle.destroy()
需要特别注意:在同步模式下,必须由客户端调用 world.tick() 推进仿真,否则世界不会前进;传感器回调在 tick() 后触发,数据帧号与仿真帧对齐。异步模式下则使用 world.wait_for_tick() 或直接轮询。
四、核心对象与常用方法对照
| 对象 | 获取方式 | 常用方法 / 属性 | 闭环中的作用 |
|---|---|---|---|
| Client | carla.Client(host, port) |
get_world()、set_timeout() |
建立连接、加载地图 |
| World | client.get_world() |
tick()、get_actors()、get_map() |
推进仿真、查询实体 |
| BlueprintLibrary | world.get_blueprint_library() |
filter()、find() |
选择车辆与传感器模板 |
| Actor | world.spawn_actor() |
apply_control()、get_transform()、destroy() |
被控对象与状态源 |
| Sensor | world.spawn_actor(bp, tf, attach_to=...) |
listen()、stop() |
感知输入与闭环反馈 |
五、常见误区与复盘
- 忘记设置同步模式:异步下
tick()无效,控制周期与仿真周期不一致,闭环结果不可复现。 - 传感器未 attach_to:传感器固定在世界坐标,车辆运动后数据不再对应车身视角。
- 忘记 destroy:Actor 残留会导致下一次运行 spawn 冲突或内存增长。
- 端口被占用:重复启动服务端会报 RPC 连接失败,需先确认 2000 端口空闲。
- 版本不匹配:客户端与服务端版本不一致时,
get_server_version()会直接暴露问题。
fixed_delta_seconds 必须统一规划。建议先固定 20 Hz 或 50 Hz,再逐步调整,避免“控制抖动”被误判为算法问题。掌握以上内容后,你已经具备用 Python 驱动 CARLA 世界、生成车辆、采集传感器并下发控制量的完整能力。下一步的规划控制算法,都将建立在这套“连接—生成—步进—控制—清理”的基本循环之上。