基础操作:启动CARLA服务器、客户端连接、基本界面与命令行工具的使用
CARLA仿真平台采用典型的客户端-服务器(Client-Server)架构,理解并掌握这一架构的启动与连接流程,是进行任何自动驾驶算法开发、传感器仿真或场景测试的前提。本章将系统讲解CARLA服务器的启动参数、客户端的连接方式、图形界面(GUI)的核心功能区,以及命令行工具的使用技巧,帮助您建立起对CARLA运行机制的整体认知。
3.1 服务器启动:参数解析与配置策略
CARLA服务器本质上是基于Unreal Engine 4构建的仿真环境进程。在Linux系统中,启动脚本为 CarlaUE4.sh;在Windows系统中,则为 CarlaUE4.exe。启动参数决定了仿真环境的渲染质量、端口配置、地图加载方式等关键属性。
核心启动参数
| 参数 | 默认值 | 说明 | 推荐场景 |
|---|---|---|---|
-quality-level | Epic | 渲染质量:Low/Medium/High/Epic | 低配机器或批量实验用Low,视觉验证用Epic |
-carla-rpc-port | 2000 | RPC通信端口,客户端连接入口 | 多实例并行时需修改 |
-carla-streaming-port | 2001 | 传感器数据流媒体端口 | 与RPC端口配套修改 |
-map | Town10HD | 加载指定地图 | 按测试需求选择 |
-fps | 无限制 | 固定帧率,如 -fps=20 | 需要确定性仿真时使用 |
-windowed | 全屏 | 窗口模式运行 | 调试时便于切换 |
-carla-settings | 默认 | 指定JSON配置文件路径 | 自定义传感器或物理参数 |
启动服务器时,终端会输出大量日志信息。当看到 CARLA server is now running 或 Ready 字样时,表示服务器已成功启动并监听指定端口。此时服务器窗口会显示当前加载的地图场景,但尚未有车辆或行人。
-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异常会被抛出,应捕获并给出友好提示。
-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基础操作中,初学者常遇到以下问题,需要特别注意:
AttributeError 或连接后立即断开。解决方案:使用服务器自带的 PythonAPI/carla/dist/ 目录下的carla包,或通过 pip install carla==对应版本 安装。
set_timeout() 或设置过短(如1秒),在服务器加载大型地图时会导致连接超时。建议设置为10秒以上,并在连接前检查服务器日志确认已就绪。
总结本章核心要点:
- 服务器启动参数决定了仿真环境的基础配置,端口规划是多实例运行的关键。
- 客户端连接遵循"创建客户端→设置超时→获取世界"的标准流程,版本匹配是硬性要求。
- 图形界面主要用于视觉验证和手动交互,自动化任务应通过Python API完成。
- 命令行工具是配置和调试的利器,理解其源码有助于深入掌握API。
- 多实例并行时,端口隔离、资源监控和日志分离是保证稳定运行的三要素。
掌握这些基础操作后,您已经具备了在CARLA环境中进行开发的基本能力。下一步可以尝试使用 generate_traffic.py 生成交通流,或通过 manual_control.py 体验驾驶控制,逐步熟悉CARLA的完整功能体系。