三、蓝图库:蓝图的概念、获取蓝图、蓝图属性与参数设置

好,咱们今天聊聊蓝图。说实话,刚接触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 蓝图库的结构图

为了让你更直观地理解蓝图库的结构,我画了一张图:

蓝图库结构图 蓝图库 车辆蓝图 传感器蓝图 其他蓝图 vehicle.tesla.model3 vehicle.audi.a2 vehicle.bmw.grandtourer sensor.camera.rgb sensor.lidar.ray_cast sensor.other.gnss static.prop.streetlamp static.prop.trafficcone 每个蓝图包含:color、role_name、sensor_tick 等可设置属性

从这张图可以看出来,蓝图库分三大类:车辆、传感器、其他(比如路灯、交通锥等静态物体)。每个类别下面有具体的蓝图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') 来判断——不是所有蓝图都有颜色属性,比如行人蓝图就没有。嗯,这里要小心。

个人经验:在实际项目中,我一般不会随机生成所有车辆。我会先固定几辆「主角车」(比如特斯拉、奥迪),再随机生成一些「背景车」来填充交通流。这样既保证了可控性,又让场景看起来丰富。

好了,蓝图这块就聊到这儿。记住三个核心操作:获取蓝图库 → 筛选蓝图 → 设置属性。下次你写仿真脚本,第一步就是去蓝图库里挑车,然后给它换个颜色、改个名字,最后扔到地图上。就这么简单。

可可精品资料库