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 客户端 / 服务端架构与数据流 服务端 Server(仿真世界) Simulator 时钟 / 同步模式 World 地图 / 天气 / 注册表 Actor 车辆 / 行人 / 标志 Sensor 相机 / 雷达 / GNSS Traffic Manager 路径 / 速度决策 物理步进 · 渲染 · 状态更新 客户端 Client(Python API) carla.Client 连接 / 超时 / 端口 World 代理 get_world / get_map Actor 操作 spawn / destroy 控制与回调 apply_control / listen 规划控制算法 决策 → 控制量 读取状态 · 下发指令 · 接收传感器 RPC 数据 指令 状态

二、安装配置:版本、依赖与启动

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 端口并挂载地图资源。

建议固定 CARLA 版本与 Python 包版本,并在项目根目录记录 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 世界、生成车辆、采集传感器并下发控制量的完整能力。下一步的规划控制算法,都将建立在这套“连接—生成—步进—控制—清理”的基本循环之上。