2. CARLA基础与环境搭建
在进入大规模场景批量验证之前,必须先把 CARLA 的“地基”打牢。本节围绕 CARLA 的架构、仿真器安装、Python API、客户端-服务器通信以及地图与传感器基础配置展开,目标是让你能够独立启动一个可编程控制的仿真环境,并理解后续批量验证脚本所依赖的每一个基础环节。
一、CARLA 架构:客户端-服务器分离
CARLA 采用典型的客户端-服务器(Client-Server)架构。服务器端(CarlaUE4)负责渲染、物理模拟、传感器数据生成和世界状态维护;客户端(Python API)负责发送控制指令、读取传感器数据、查询世界信息。两者通过 TCP 协议通信,默认端口为 2000(世界端口)和 2001(流端口)。
这种分离设计带来两个关键优势:其一,仿真器可以运行在高性能 GPU 机器上,而控制脚本可以运行在任意 Python 环境;其二,多个客户端可以同时连接同一个服务器,便于并行测试。理解这一点,是后续批量验证中“一个服务器、多个验证任务”模式的前提。
二、仿真器安装与启动
CARLA 官方提供预编译包和源码编译两种方式。对于大规模验证工程,推荐使用 预编译包 + Python API wheel 的组合,部署快、依赖少。以下以 Ubuntu 环境为例:
# 1. 下载并解压 CARLA 0.9.15
wget https://carla-releases.s3.eu-west-3.amazonaws.com/Linux/CARLA_0.9.15.tar.gz
tar -xzf CARLA_0.9.15.tar.gz -C ~/carla
# 2. 安装 Python API
cd ~/carla/PythonAPI/carla/dist
pip install carla-0.9.15-cp38-cp38-linux_x86_64.whl
# 3. 启动服务器(无渲染模式,适合批量验证)
cd ~/carla
./CarlaUE4.sh -RenderOffScreen -carla-port=2000
-RenderOffScreen 关闭图形界面,可显著降低 GPU 占用,同时支持多实例并行启动。三、Python API 核心对象
CARLA Python API 的对象模型非常清晰,掌握以下五个核心对象即可完成大部分操作:
| 对象 | 获取方式 | 作用 |
|---|---|---|
| Client | carla.Client(host, port) | 连接服务器,管理世界与地图 |
| World | client.get_world() | 当前仿真世界,包含所有 actor |
| BlueprintLibrary | world.get_blueprint_library() | 查询可用车辆、传感器蓝图 |
| Actor | world.spawn_actor(bp, transform) | 生成的车辆、行人、传感器实例 |
| SensorData | 传感器回调参数 | 图像、点云、GPS 等原始数据 |
四、客户端-服务器通信与同步模式
默认情况下,CARLA 运行在异步模式:服务器按自身频率推进,客户端随时读取最新状态。但在批量验证中,异步模式会导致数据与场景状态不一致。因此必须切换到同步模式:
settings = world.get_settings()
settings.synchronous_mode = True
settings.fixed_delta_seconds = 0.05 # 20 FPS
world.apply_settings(settings)
# 每个仿真步必须显式推进
world.tick()
world.tick(),服务器会一直等待,导致仿真“卡死”。批量脚本中务必确保每个验证任务都正确推进 tick。五、地图与传感器基础配置
地图决定了场景的拓扑结构。CARLA 内置 Town01 至 Town10 等多张地图,可通过 world.load_world('Town03') 切换。批量验证时,建议将地图名称、天气、车辆密度等作为配置参数统一管理。
传感器配置是数据采集的关键。以 RGB 相机和激光雷达为例:
# RGB 相机
cam_bp = bp_lib.find('sensor.camera.rgb')
cam_bp.set_attribute('image_size_x', '800')
cam_bp.set_attribute('image_size_y', '600')
cam_bp.set_attribute('fov', '90')
# 激光雷达
lidar_bp = bp_lib.find('sensor.lidar.ray_cast')
lidar_bp.set_attribute('range', '50')
lidar_bp.set_attribute('channels', '32')
lidar_bp.set_attribute('points_per_second', '100000')
传感器通过 listen() 注册回调函数,数据以异步方式到达。在同步模式下,传感器数据会与当前 tick 严格对齐,这是批量验证中保证数据可复现的基础。
六、常见误区与复盘
- 端口冲突:多个 CARLA 实例必须使用不同端口,否则客户端会连接到错误的服务器。
- 忘记销毁 actor:批量验证中反复生成车辆和传感器而不销毁,会导致内存暴涨和仿真变慢。
- 同步模式与传感器回调顺序:传感器回调在 tick 之后触发,若在回调中再次调用 tick 会造成死锁。
- 地图切换后引用失效:load_world 后原有的 world 对象和 actor 引用全部失效,必须重新获取。