3. 基础操作

CARLA仿真平台采用典型的客户端-服务器(Client-Server)架构,理解并掌握这一架构的启动与连接流程,是进行任何自动驾驶算法开发、传感器仿真或场景测试的前提。本章将系统讲解CARLA服务器的启动参数、客户端的连接方式、图形界面(GUI)的核心功能区,以及命令行工具的使用技巧,帮助您建立起对CARLA运行机制的整体认知。

CARLA 客户端-服务器架构与启动流程 CARLA 服务器 CarlaUE4.sh / CarlaUE4.exe -quality-level=Low/High/Epic -carla-rpc-port=2000 RPC端口:2000 流媒体:2001 TCP/IP CARLA 客户端 Python API / 手动控制 client = CarlaClient('localhost', 2000) world = client.get_world() 传感器数据 控制指令 命令行工具 python3 config.py python3 manual_control.py ./CarlaUE4.sh -carla-settings 启动与连接流程 ① 启动服务器 ./CarlaUE4.sh ② 等待就绪 日志输出"Ready" ③ 客户端连接 CarlaClient() ④ 获取世界 get_world() 端口映射:RPC=2000(控制通道),流媒体=2001(传感器图像传输)

3.1 服务器启动:参数解析与配置策略

CARLA服务器本质上是基于Unreal Engine 4构建的仿真环境进程。在Linux系统中,启动脚本为 CarlaUE4.sh;在Windows系统中,则为 CarlaUE4.exe。启动参数决定了仿真环境的渲染质量、端口配置、地图加载方式等关键属性。

核心启动参数

参数默认值说明推荐场景
-quality-levelEpic渲染质量:Low/Medium/High/Epic低配机器或批量实验用Low,视觉验证用Epic
-carla-rpc-port2000RPC通信端口,客户端连接入口多实例并行时需修改
-carla-streaming-port2001传感器数据流媒体端口与RPC端口配套修改
-mapTown10HD加载指定地图按测试需求选择
-fps无限制固定帧率,如 -fps=20需要确定性仿真时使用
-windowed全屏窗口模式运行调试时便于切换
-carla-settings默认指定JSON配置文件路径自定义传感器或物理参数

启动服务器时,终端会输出大量日志信息。当看到 CARLA server is now running 或 Ready 字样时,表示服务器已成功启动并监听指定端口。此时服务器窗口会显示当前加载的地图场景,但尚未有车辆或行人。

经验提醒:在无图形界面的服务器(如远程SSH)上运行时,可以添加 -nullrhi 参数禁用渲染,仅保留计算能力。这能大幅降低资源占用,适合批量强化学习训练场景。

3.2 客户端连接:Python API 与连接验证

CARLA提供了功能完备的Python API,客户端通过TCP协议与服务器建立连接。连接过程的核心是创建 CarlaClient 对象并调用 get_world() 方法获取当前仿真世界的句柄。

标准连接流程

import carla

# 创建客户端并连接
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)  # 设置超时时间,防止连接阻塞

# 获取世界对象
world = client.get_world()

# 验证连接
print(f"当前地图: {world.get_map().name}")
print(f"当前帧数: {world.get_frame_number()}")

连接过程中需要注意以下几点:

  • 超时设置:set_timeout() 方法必须设置,否则在服务器未就绪时客户端会无限期阻塞。建议设置为5-10秒。
  • 版本匹配:客户端API版本必须与服务器版本严格一致。CARLA 0.9.x系列中,小版本不一致也会导致连接失败。
  • 多客户端支持:CARLA允许最多100个客户端同时连接,但每个客户端只能操作一个世界。
  • 错误处理:连接失败时,RuntimeError 异常会被抛出,应捕获并给出友好提示。
风险提示:如果服务器启动时修改了RPC端口(例如 -carla-rpc-port=3000),客户端连接时必须使用相同端口。端口不匹配是最常见的连接失败原因,且错误信息可能不够直观,需要检查服务器启动日志确认实际监听端口。

3.3 基本界面:CARLA窗口与手动控制

CARLA服务器启动后,会显示一个Unreal Engine渲染窗口。这个窗口不仅是视觉输出,还支持键盘鼠标交互,方便快速验证场景。

界面功能区

区域功能操作方式
主视口显示当前仿真场景,支持自由视角鼠标拖拽旋转,滚轮缩放
顶部工具栏包含播放/暂停、帧步进、地图切换等控制点击图标或快捷键
场景大纲列出当前世界所有Actor(车辆、行人、传感器)点击选中,右键查看属性
输出日志显示CARLA引擎运行日志只读,用于排查错误

CARLA提供了 manual_control.py 示例脚本,运行后可以在仿真环境中手动驾驶车辆。该脚本位于 PythonAPI/examples/ 目录下,支持键盘控制(WASD加速/转向、空格手刹、C切换视角等)。

# 在另一个终端运行手动控制脚本
cd PythonAPI/examples
python3 manual_control.py

手动控制脚本是理解CARLA交互机制的最佳入门工具。它展示了如何获取车辆控制权限、如何读取传感器数据(如相机画面)、如何处理键盘事件等核心API用法。

3.4 命令行工具:配置、测试与调试

CARLA提供了一系列命令行工具,用于配置仿真环境、生成交通流、测试连接等。这些工具位于 PythonAPI/util/ 和 PythonAPI/examples/ 目录下。

常用工具清单

工具名称功能典型用法
config.py查看/修改世界设置(天气、时间、物理)python3 config.py --weather ClearNoon
generate_traffic.py生成大量NPC车辆和行人python3 generate_traffic.py -n 50
manual_control.py手动驾驶车辆python3 manual_control.py --rolename=hero
spawn_npc.py生成单个NPC车辆python3 spawn_npc.py -c 10
list_assets.py列出所有可用的蓝图(车辆、行人、传感器)python3 list_assets.py
show_recorder.py回放录制的仿真数据python3 show_recorder.py -f recording.log

config.py 实战:调整天气与时间

# 查看当前世界设置
python3 config.py

# 设置晴天正午
python3 config.py --weather ClearNoon

# 设置雨天黄昏
python3 config.py --weather SoftRainSunset

# 固定时间步长(用于确定性仿真)
python3 config.py --fps 20

这些工具本质上都是通过Python API与服务器交互,因此理解其源码有助于深入掌握CARLA的编程接口。例如,config.py 内部调用了 world.set_weather() 和 world.set_time_of_day() 等方法。

3.5 案例拆解:多实例并行仿真环境搭建

在强化学习或大规模数据采集场景中,往往需要同时运行多个CARLA实例以提升效率。以下是一个完整的双实例并行环境搭建案例。

背景与目标

某自动驾驶团队需要在8块GPU的服务器上并行运行4个CARLA仿真环境,每个环境独立运行不同的地图和天气条件,用于并行采集训练数据。初始方案是直接启动4个默认配置的CARLA实例,但发现端口冲突导致后启动的实例无法正常工作。

问题分析

CARLA默认使用2000端口作为RPC端口,2001作为流媒体端口。多个实例同时启动时,后启动的实例会因端口被占用而失败。此外,默认渲染质量(Epic)会消耗大量GPU显存,4个实例同时运行可能导致显存溢出。

解决方案

# 实例1:Town01,低渲染质量,端口2000/2001
./CarlaUE4.sh -map=Town01 -quality-level=Low -carla-rpc-port=2000 -carla-streaming-port=2001 &

# 实例2:Town02,低渲染质量,端口3000/3001
./CarlaUE4.sh -map=Town02 -quality-level=Low -carla-rpc-port=3000 -carla-streaming-port=3001 &

# 实例3:Town03,中渲染质量,端口4000/4001
./CarlaUE4.sh -map=Town03 -quality-level=Medium -carla-rpc-port=4000 -carla-streaming-port=4001 &

# 实例4:Town04,低渲染质量,端口5000/5001
./CarlaUE4.sh -map=Town04 -quality-level=Low -carla-rpc-port=5000 -carla-streaming-port=5001 &

客户端连接时,需要为每个实例创建独立的 CarlaClient 对象:

clients = []
for port in [2000, 3000, 4000, 5000]:
    client = carla.Client('localhost', port)
    client.set_timeout(10.0)
    world = client.get_world()
    clients.append((client, world))
    print(f"已连接实例,端口: {port}, 地图: {world.get_map().name}")

结果与复盘

通过端口隔离和渲染质量降级,4个实例成功并行运行。每个实例的帧率稳定在20-30 FPS,满足数据采集需求。关键经验总结:

  • 端口规划:建议使用2000+1000*n的规律分配端口,便于记忆和脚本管理。
  • 资源监控:使用 nvidia-smi 实时监控显存占用,避免超限。
  • 日志分离:为每个实例重定向日志文件,便于排查问题。
  • 优雅关闭:编写脚本统一关闭所有实例,避免残留进程占用端口。

3.6 常见误区与总结复盘

在CARLA基础操作中,初学者常遇到以下问题,需要特别注意:

误区一:忽略版本匹配。CARLA的Python API与服务器版本必须完全一致。使用pip安装的carla包版本与服务器版本不一致时,会出现 AttributeError 或连接后立即断开。解决方案:使用服务器自带的 PythonAPI/carla/dist/ 目录下的carla包,或通过 pip install carla==对应版本 安装。
误区二:超时设置不当。不设置 set_timeout() 或设置过短(如1秒),在服务器加载大型地图时会导致连接超时。建议设置为10秒以上,并在连接前检查服务器日志确认已就绪。
误区三:混淆服务器与客户端概念。服务器负责渲染和物理计算,客户端负责逻辑控制。修改天气、生成车辆等操作必须通过客户端API完成,直接在服务器窗口操作无效。

总结本章核心要点:

  1. 服务器启动参数决定了仿真环境的基础配置,端口规划是多实例运行的关键。
  2. 客户端连接遵循"创建客户端→设置超时→获取世界"的标准流程,版本匹配是硬性要求。
  3. 图形界面主要用于视觉验证和手动交互,自动化任务应通过Python API完成。
  4. 命令行工具是配置和调试的利器,理解其源码有助于深入掌握API。
  5. 多实例并行时,端口隔离、资源监控和日志分离是保证稳定运行的三要素。

掌握这些基础操作后,您已经具备了在CARLA环境中进行开发的基本能力。下一步可以尝试使用 generate_traffic.py 生成交通流,或通过 manual_control.py 体验驾驶控制,逐步熟悉CARLA的完整功能体系。