2. 世界与客户端:理解CARLA世界、客户端-服务器架构、连接与断开

好,咱们正式开始动手了。这一章,我要带你搞清楚CARLA最核心的运作模式——客户端-服务器架构。说白了,就是搞明白「谁在干活,谁在指挥」。

我个人习惯把CARLA比作一个「自动驾驶游乐场」。服务器就是游乐场本身,它负责搭建场景、控制车辆物理、渲染画面。而客户端呢?就是你手里的遥控器,你通过它给游乐场发指令:「给我一辆车」、「让行人过马路」、「把天气改成下雨」。

2.1 世界(World)是什么?

在CARLA里,「世界」这个概念很直观。它就是整个仿真环境的容器。你想想看,一个仿真场景里有什么?有地图、有车辆、有行人、有交通灯、有天气……所有这些,都装在这个叫「世界」的大盒子里。

我在项目中遇到过一个问题:刚启动CARLA时,世界是空的,只有一张地图。你得通过客户端去「填充」它。所以,理解世界,就是理解你接下来所有操作的目标对象。

核心要点:世界 = 地图 + 所有动态物体(车辆、行人、传感器)+ 环境参数(天气、时间)

2.2 客户端-服务器架构

这个架构其实不复杂。我画了一张图,帮你理清关系:

CARLA 服务器 端口:2000(默认) 负责:物理仿真、渲染 管理:世界、车辆、行人 客户端(你的Python脚本) 发送指令:生成车辆 接收数据:传感器信息 控制逻辑:你的算法 请求(指令) 响应(数据) 客户端通过TCP连接与服务器通信 一个服务器可以连接多个客户端

嗯,这里要注意:服务器和客户端可以运行在同一台电脑上,也可以跨网络。我刚开始学的时候,一直以为必须分开两台机器,其实完全没必要。本地开发时,你开一个终端跑服务器,另一个终端跑Python脚本,它们就通过localhost:2000通信。

2.3 连接与断开

好,理论说完了,咱们直接上代码。这是最基础的操作——连接服务器并获取世界。

import carla

# 1. 创建客户端,连接到本地服务器的2000端口
client = carla.Client('localhost', 2000)

# 2. 设置超时时间(秒)
#    我曾经因为没设超时,脚本卡住不动了整整10分钟...
client.set_timeout(10.0)

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

# 4. 打印世界信息,确认连接成功
print(f"当前地图: {world.get_map().name}")
print(f"天气: {world.get_weather()}")

# 5. 断开连接(其实Python脚本结束时会自动断开)
#    但我建议显式清理
client = None
world = None
print("连接已断开")

避坑指南:我曾经遇到过一个问题——连接超时。原因是服务器还没启动完,客户端就开始连了。解决办法很简单:要么等服务器完全启动(看到终端输出"CARLA server is running"),要么把超时时间设长一点,比如30秒。

2.4 常用操作与技巧

连接上之后,你肯定想干点什么。这里我列几个最常用的操作:

操作 代码 说明
获取当前世界 world = client.get_world() 最常用,拿到世界对象
加载新地图 world = client.load_world('Town01') 切换地图,会重置所有物体
重新加载世界 client.reload_world() 重置当前地图到初始状态
获取可用地图列表 maps = client.get_available_maps() 返回所有地图名称的列表

警告:调用 load_world() 或 reload_world() 时,当前世界中的所有物体(车辆、行人、传感器)都会被销毁。如果你有正在运行的仿真,记得先保存状态或重新生成。

2.5 多客户端场景

你可能会问:能不能多个客户端同时连同一个服务器?答案是肯定的。我做过一个项目,一个客户端负责控制主车,另一个客户端负责控制交通流(其他车辆和行人)。它们互不干扰,共享同一个世界。

但要注意一点:多个客户端同时修改同一个物体(比如两段代码都想控制同一辆车),就会产生冲突。解决办法是——每个客户端只控制自己生成的那部分物体,别去抢别人的。

# 客户端A:控制主车
client_a = carla.Client('localhost', 2000)
world_a = client_a.get_world()
# ... 生成并控制主车

# 客户端B:控制交通流
client_b = carla.Client('localhost', 2000)
world_b = client_b.get_world()
# ... 生成并控制其他车辆

2.6 本章小结

这一章的内容其实就三件事:

  • 世界是仿真环境的容器,包含地图、物体和天气
  • 客户端-服务器架构中,服务器负责仿真,客户端负责控制
  • 连接就是创建客户端、设置超时、获取世界;断开就是清理对象

我个人觉得,理解这个架构比背代码更重要。你只要记住「客户端发指令,服务器干活」这个核心逻辑,后面所有章节的内容都会变得很自然。

嗯,下一章咱们会深入世界内部,看看怎么操作车辆和传感器。但今天先把连接搞熟,多跑几遍代码,别急着往下赶。

可可精品资料库