三、蓝图库:蓝图的概念、获取蓝图、蓝图属性与参数设置
好,咱们今天聊聊蓝图。说实话,刚接触CARLA那会儿,我对「蓝图」这个词挺懵的。听着像建筑设计图,实际上它就是个「车型模板」或者「物体模板」。你想想看,一辆车在路上跑,它得有颜色、有速度上限、有转向角度对吧?蓝图就是把这些参数打包成一个模板,方便你随时调用。
我个人习惯把蓝图理解成「汽车的DNA」。每个蓝图决定了生成出来的车长什么样、能跑多快、有没有传感器接口。没有蓝图,你连个轮胎都造不出来。
3.1 蓝图到底是什么?
蓝图(Blueprint)在CARLA里是一个数据结构。它定义了某个物体的所有静态属性。比如:
- 车型名称(比如
vehicle.tesla.model3) - 可用的颜色列表
- 最大速度
- 是否有自动驾驶功能
- 传感器类型(如果是传感器蓝图)
说白了,蓝图就是「生产说明书」。你拿着它,调用 spawn_actor(),就能在仿真世界里变出一辆车来。
核心要点:蓝图 ≠ 实体。蓝图是模板,实体是模板造出来的东西。一个蓝图可以生成无数辆车,每辆车可以有不同的颜色、位置,但它们的「底子」是一样的。
3.2 怎么获取蓝图?
获取蓝图很简单,通过 world.get_blueprint_library() 就能拿到整个蓝图库。蓝图库就像一个巨大的超市,里面摆满了各种车辆、行人、传感器、交通标志的模板。
import carla
# 连接客户端
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
world = client.get_world()
# 获取蓝图库
blueprint_library = world.get_blueprint_library()
# 打印所有蓝图ID
for bp in blueprint_library:
print(bp.id)
运行这段代码,你会看到几百个蓝图ID。有车辆、有行人、有自行车、有交通灯、有摄像头、有雷达……嗯,我第一次跑的时候,光看列表就看了五分钟。
但实际开发中,我们不会遍历所有蓝图。更常用的方式是按条件筛选:
# 筛选所有车辆蓝图
vehicle_blueprints = blueprint_library.filter('vehicle.*')
# 筛选所有传感器蓝图
sensor_blueprints = blueprint_library.filter('sensor.*')
# 精确查找某个车型
tesla_bp = blueprint_library.find('vehicle.tesla.model3')
filter() 支持通配符,find() 需要精确ID。我在项目中经常先用 filter() 缩小范围,再手动选一个顺眼的。
小技巧:如果你不确定蓝图ID,可以在CARLA的PythonAPI文档里查,或者直接打印 blueprint_library 的所有ID。我个人习惯把常用车型记下来,比如 vehicle.audi.a2、vehicle.tesla.model3、vehicle.bmw.grandtourer。
3.3 蓝图属性:你能改什么?
拿到蓝图之后,你会发现它自带一堆属性。这些属性决定了生成出来的实体长什么样、能干什么。
咱们先看看一个蓝图有哪些属性:
# 获取特斯拉蓝图
tesla_bp = blueprint_library.find('vehicle.tesla.model3')
# 打印所有可修改的属性
for attr in tesla_bp:
print(f"{attr.id}: {attr.type}, 默认值: {attr.default_value}")
输出大概长这样:
| 属性ID | 类型 | 默认值 | 说明 |
|---|---|---|---|
| color | RGB颜色 | 0, 0, 0 | 车身颜色 |
| role_name | 字符串 | hero | 角色名称,用于区分车辆 |
| sticky_control | 布尔 | True | 是否保持上次控制状态 |
| number_of_wheels | 整数 | 4 | 车轮数量(只读) |
注意,有些属性是只读的(比如 number_of_wheels),你不能把四轮车改成三轮车。但像 color、role_name 这些,你可以随便改。
3.4 参数设置:让车变得不一样
设置参数很简单,就是调用 set_attribute() 方法。我举个例子:
# 获取蓝图
tesla_bp = blueprint_library.find('vehicle.tesla.model3')
# 设置颜色为红色
tesla_bp.set_attribute('color', '255, 0, 0')
# 设置角色名
tesla_bp.set_attribute('role_name', 'my_tesla')
# 生成车辆
spawn_point = random.choice(world.get_map().get_spawn_points())
vehicle = world.spawn_actor(tesla_bp, spawn_point)
这样生成出来的特斯拉就是红色的,角色名叫 my_tesla。
对于传感器蓝图,参数设置就更关键了。比如摄像头:
# 获取摄像头蓝图
camera_bp = blueprint_library.find('sensor.camera.rgb')
# 设置分辨率
camera_bp.set_attribute('image_size_x', '800')
camera_bp.set_attribute('image_size_y', '600')
# 设置视野角度
camera_bp.set_attribute('fov', '90')
# 设置感光度
camera_bp.set_attribute('sensor_tick', '0.1') # 每0.1秒采集一帧
我曾经在项目里踩过一个坑:摄像头默认分辨率是1920x1080,帧率是0.0(表示每帧都采集)。结果跑起来之后,数据量巨大,硬盘直接爆了。后来我把分辨率降到800x600,帧率设成0.1秒一帧,才勉强撑住。
避坑指南:设置传感器参数时,一定要注意 sensor_tick 这个属性。默认是0.0,表示每帧都采集。如果你不需要那么高的频率,建议设成0.1或0.05。否则你的硬盘会哭的——我曾经吃过这个亏,跑了10分钟仿真,生成了20GB的数据。
3.5 蓝图库的结构图
为了让你更直观地理解蓝图库的结构,我画了一张图:
从这张图可以看出来,蓝图库分三大类:车辆、传感器、其他(比如路灯、交通锥等静态物体)。每个类别下面有具体的蓝图ID,每个蓝图又包含一堆可设置的属性。
3.6 实战:随机生成不同颜色的车
最后,咱们来个综合练习。假设你想在仿真里随机生成10辆车,每辆车颜色不同,怎么做?
import carla
import random
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
world = client.get_world()
# 获取所有车辆蓝图
vehicle_bps = world.get_blueprint_library().filter('vehicle.*')
# 获取所有生成点
spawn_points = world.get_map().get_spawn_points()
# 随机生成10辆车
for i in range(10):
# 随机选一个蓝图
bp = random.choice(vehicle_bps)
# 随机设置颜色
if bp.has_attribute('color'):
color = f"{random.randint(0,255)}, {random.randint(0,255)}, {random.randint(0,255)}"
bp.set_attribute('color', color)
# 随机选一个生成点
spawn_point = random.choice(spawn_points)
# 生成车辆
vehicle = world.spawn_actor(bp, spawn_point)
print(f"生成了 {bp.id},颜色: {color}")
这段代码会生成10辆颜色各异的车。注意我用了 bp.has_attribute('color') 来判断——不是所有蓝图都有颜色属性,比如行人蓝图就没有。嗯,这里要小心。
个人经验:在实际项目中,我一般不会随机生成所有车辆。我会先固定几辆「主角车」(比如特斯拉、奥迪),再随机生成一些「背景车」来填充交通流。这样既保证了可控性,又让场景看起来丰富。
好了,蓝图这块就聊到这儿。记住三个核心操作:获取蓝图库 → 筛选蓝图 → 设置属性。下次你写仿真脚本,第一步就是去蓝图库里挑车,然后给它换个颜色、改个名字,最后扔到地图上。就这么简单。