一、CARLA是什么架构?Client-Server模式
首先要搞懂CARLA的工作模式:它是客户端-服务器(Client-Server)架构。
简单理解就是:
CarlaUE4.exe= 服务器端,负责渲染画面、跑物理引擎
你的Python脚本= 客户端,负责发指令(生成车辆、控制传感器、获取数据)
两者通过TCP端口2000通信。这就是为什么每次跑脚本前都要先打开CarlaUE4.exe——你得先把服务器启动起来,客户端才能连上。
个人经验:很多新手报错time-out,90%都是因为没开CarlaUE4.exe,或者端口被占了。
二、四大核心概念:World / Map / Actor / Blueprint
CARLA的所有操作,本质上都是围绕这四个对象展开的。我用一个类比帮你理解:
CARLA概念 | 现实世界类比 | 通俗解释 |
|---|---|---|
World | 整个游戏世界 | 你所在的整个仿真环境,所有东西都在里面 |
Map | 地图 | 具体用哪张地图,比如Town04、Town06 |
Actor | 演员/物体 | 世界里所有看得见摸得着的东西——车、人、红绿灯、传感器 |
Blueprint | 模板/图纸 | Actor的图纸,告诉你这个物体长什么样、有什么属性 |
2.1 Client:连接CARLA的入口
Client是你和CARLA服务器打交道的第一个对象。所有操作都从它开始:
import carla 连接到本地的CARLA服务器 client = carla.Client('localhost', 2000) client.set_timeout(10.0) # 设置10秒超时就这两行代码,你就和CARLA建立了通信。后面所有操作都是通过client来的。
2.2 World:整个仿真世界
World代表当前的仿真世界。你可以把它理解成游戏里的整个地图+所有物体。
# 获取世界对象 world = client.get_world() 获取当前地图名称 map_name = world.get_map().name print(f"当前地图:{map_name}")World能干什么?
生成车辆、行人(spawn_actor)
获取所有Actor(get_actors)
设置天气(weather)
切换地图(load_map)
2.3 Blueprint:Actor的图纸
Blueprint是模板。CARLA里有几百种Blueprint——不同型号的车、不同类型的传感器、不同款式的行人。
你要生成一辆车,首先得从Blueprint库里找到这辆车的图纸:
# 获取Blueprint库 blueprint_library = world.get_blueprint_library() 找到所有车辆类型的蓝图 vehicle_blueprints = blueprint_library.filter('vehicle.*') 选第一辆车(随便选一辆) vehicle_bp = vehicle_blueprints[0] print(f"选中的车辆:{vehicle_bp.id}")踩坑提醒:filter('vehicle.*')返回的是一个列表,不是单个对象。新手经常忘了取[0],直接拿去生成,结果报错。
2.4 Actor:世界里的每个物体
Actor就是演员——世界里所有的东西都是Actor。车是Actor,人是Actor,红绿灯是Actor,摄像头也是Actor。
# 从蓝图生成一辆车,放到指定位置 transform = carla.Transform() # 默认位置(原点) vehicle = world.spawn_actor(vehicle_bp, transform) 现在vehicle就是一个Actor对象了,你可以控制它 print(f"车辆ID:{vehicle.id}") print(f"车辆类型:{vehicle.type_id}")关键点:生成Actor之后,CARLA会在场景里渲染出来。你可以通过代码控制它的行为——加速、刹车、转向、开关传感器。
三、第一个Hello World:生成一辆自动驾驶的车
光说概念太抽象,直接上代码。下面这个脚本做三件事:
连接CARLA
在地图上随机位置生成一辆车
打开自动驾驶模式,让它自己开
import carla import random import time def main(): # ========== 第一步:连接CARLA服务器 ========== client = carla.Client('localhost', 2000) client.set_timeout(10.0) print("✅ 成功连接到CARLA服务器") # ========== 第二步:获取世界和蓝图库 ========== world = client.get_world() blueprint_library = world.get_blueprint_library() 筛选所有车辆蓝图 vehicle_blueprints = blueprint_library.filter('vehicle.*') print(f"找到 {len(vehicle_blueprints)} 种车辆") ========== 第三步:随机选一辆车,随机位置生成 ========== 随机选一辆车 vehicle_bp = random.choice(vehicle_blueprints) 随机选一个生成位置(地图上的出生点) spawn_points = world.get_map().get_spawn_points() spawn_point = random.choice(spawn_points) 生成车辆 vehicle = world.spawn_actor(vehicle_bp, spawn_point) print(f"✅ 成功生成车辆:{vehicle.type_id}") ========== 第四步:开启自动驾驶 ========== vehicle.set_autopilot(True) print("✅ 自动驾驶已开启,车辆开始行驶") ========== 第五步:保持运行,按Ctrl+C退出 ========== try: while True: # 每秒钟打印一次车辆位置 transform = vehicle.get_transform() location = transform.location print(f"车辆位置:x={location.x:.1f}, y={location.y:.1f}, z={location.z:.1f}") # 暂停1秒 time.sleep(1) except KeyboardInterrupt: print("\n🛑 正在清理...") finally: # 销毁车辆,释放资源 vehicle.destroy() print("✅ 车辆已销毁,仿真结束") if name == 'main': main()四、运行效果说明
按下面的步骤运行:
先打开CarlaUE4.exe(等它加载完)
打开另一个终端,运行上面的脚本:
python hello_carla.py正常输出应该是这样:
✅ 成功连接到CARLA服务器 找到 80 种车辆 ✅ 成功生成车辆:vehicle.tesla.model3 ✅ 自动驾驶已开启,车辆开始行驶 车辆位置:x=125.3, y=-5.2, z=0.0 车辆位置:x=128.7, y=-5.3, z=0.0 车辆位置:x=132.1, y=-5.4, z=0.0 ...同时你在CARLA画面里应该能看到:一辆车从出生点开始,沿着道路自己开,遇到红绿灯会停,遇到拐弯会自己转。
个人经验:如果车生成了但不动,90%是因为没开自动驾驶,或者地图里没有交通灯/导航线。换Town04或Town05这种路网成熟的地图试试。
五、常见报错与解决方案
报错1:RuntimeError: time-out of 10000ms while waiting for the simulator
原因:CARLA服务器没启动,或者端口不对。
解决:
确认CarlaUE4.exe已经打开
检查端口2000是不是被占了
如果换了端口,Python连接时也要改:
client = carla.Client('localhost', 3000) # 改成你启动的端口报错2:AttributeError: NoneType object has no attribute id
原因:车辆生成失败,spawn_actor返回了None。
解决:
生成位置被别的东西占了(比如别的车)
换个生成位置试试
先把之前的车都销毁:
# 销毁所有车辆 for actor in world.get_actors().filter('vehicle.*'): actor.destroy()报错3:车辆生成了但不动
原因:没开自动驾驶,或者地图里没有导航线。
解决:
确认调用了
vehicle.set_autopilot(True)换个地图(Town04或Town05路网最完整)
检查是不是开了同步模式导致的
报错4:No module named carla
原因:Python API没装对,或者conda环境不对。
解决:
确认你在正确的conda环境里
重新安装egg包:
easy_install carla-0.9.16-py3.7-win-amd64.egg六、本章小结
今天讲了CARLA最核心的四个概念:
Client:你和CARLA通信的入口
World:整个仿真世界
Blueprint:物体的模板/图纸
Actor:世界里具体的物体(车、人、传感器)
理解了这四个,你就理解了CARLA 80%的API。后面所有的传感器、交通管理、场景设计,都是围绕这四个对象展开的。
📚 相关阅读
上一篇:
📖 参考资料
CARLA官方文档:https://carla.readthedocs.io/
CARLA Core Concepts:https://carla.readthedocs.io/en/latest/core_concepts/
CARLA Python API:https://carla.readthedocs.io/en/latest/python_api/