3. 蓝图与生成:蓝图库、生成车辆与行人、设置生成点

好,咱们进入实操环节。这一章要聊的,是CARLA里最核心的操作之一——蓝图与生成。说白了,就是怎么把一辆车、一个行人“变”到仿真世界里来。

我记得刚接触CARLA时,第一反应是:“这玩意儿怎么把车放进去?”后来才发现,它有一套非常优雅的机制——蓝图库。你想想看,就像游戏里选角色一样,蓝图就是角色的模板。

3.1 蓝图库是什么?

蓝图库,英文叫 BLUEPRINT_LIBRARY。它是CARLA世界里所有可生成物体的“大本营”。

我习惯把它理解成一个工厂的模具库。每个模具(蓝图)都定义了物体的类型、外观、物理属性等。你只需要告诉工厂:“我要一个蓝色轿车”,它就能按模具造出来。

核心概念:蓝图 = 物体的模板。它包含了生成该物体所需的所有参数。

在代码里,我们通过 world.get_blueprint_library() 来获取这个库。然后,你可以遍历它,看看里面都有什么宝贝。

# 获取蓝图库
blueprint_library = world.get_blueprint_library()

# 打印所有蓝图ID
for blueprint in blueprint_library:
    print(blueprint.id)

运行这段代码,你会看到一长串列表。有各种品牌的车、不同颜色的自行车、行人、甚至传感器。嗯,这里要注意,蓝图ID是唯一的,就像身份证号。

3.2 如何筛选蓝图?

蓝图库里的东西太多了。你不可能每次都遍历所有。我建议用过滤器来快速定位。

CARLA提供了两种过滤方式:

  • 按ID过滤: 用 filter() 方法,支持通配符。
  • 按属性过滤: 用 find() 方法,精确匹配。

举个例子,我只想要奥迪的车:

# 过滤出所有奥迪车型
audi_blueprints = blueprint_library.filter('vehicle.audi.*')

# 打印看看
for bp in audi_blueprints:
    print(bp.id)

输出结果类似:

vehicle.audi.a2
vehicle.audi.etron
vehicle.audi.tt

我在项目中遇到过一个问题:过滤出来的蓝图,有些属性是只读的。比如车辆的颜色,有些车型不支持修改。所以,生成前最好检查一下。

小技巧: 使用 blueprint.has_attribute('color') 来判断某个属性是否存在。

3.3 生成车辆与行人

有了蓝图,下一步就是生成实体。CARLA用 spawn_actor() 方法来完成。

基本流程是:

  1. 从蓝图库中选一个蓝图。
  2. 设置蓝图属性(比如颜色)。
  3. 指定一个生成点(位置和朝向)。
  4. 调用 spawn_actor()。

来看一个完整的例子:

import carla

# 连接客户端
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
world = client.get_world()

# 获取蓝图库
bp_lib = world.get_blueprint_library()

# 选一辆车
vehicle_bp = bp_lib.find('vehicle.audi.a2')

# 设置颜色(如果支持)
if vehicle_bp.has_attribute('color'):
    vehicle_bp.set_attribute('color', '255,0,0')  # 红色

# 获取一个生成点
spawn_points = world.get_map().get_spawn_points()
spawn_point = spawn_points[0]

# 生成车辆
vehicle = world.spawn_actor(vehicle_bp, spawn_point)

print(f"车辆已生成:{vehicle.id}")

生成行人也是类似的。不过,行人蓝图通常在 walker.pedestrian.* 下。

# 选一个行人蓝图
walker_bp = bp_lib.filter('walker.pedestrian.*')[0]

# 设置行人速度
if walker_bp.has_attribute('speed'):
    walker_bp.set_attribute('speed', '1.5')  # 1.5 m/s

# 生成行人(需要指定位置)
walker_spawn_point = carla.Transform(carla.Location(x=50, y=50, z=0.5))
walker = world.spawn_actor(walker_bp, walker_spawn_point)

注意: 行人的生成点z坐标建议设为0.5左右,否则行人会陷进地面或悬空。我曾经因为这个调试了半天,最后发现是高度没设对。

3.4 设置生成点

生成点,就是物体在仿真世界里的出生位置和朝向。它由 carla.Transform 定义,包含 Location(位置)和 Rotation(旋转)。

CARLA地图自带了很多预定义的生成点。你可以通过 world.get_map().get_spawn_points() 获取。

但有时候,你需要自定义生成点。比如,我想把车放在一个十字路口中央:

# 自定义位置
location = carla.Location(x=100, y=50, z=0.5)

# 自定义朝向(旋转)
rotation = carla.Rotation(yaw=90.0)  # 朝向正东

# 组合成Transform
custom_spawn_point = carla.Transform(location, rotation)

# 生成车辆
vehicle = world.spawn_actor(vehicle_bp, custom_spawn_point)

这里有个坑:生成点不能与其他物体重叠。如果位置被占了,CARLA会报错。我建议生成前先检查一下。

避坑指南: 使用 world.try_spawn_actor() 代替 spawn_actor()。前者在生成失败时不会抛异常,而是返回 None,方便你处理。

3.5 知识体系图

下面这张图,帮你理清本章的核心逻辑:

蓝图与生成核心流程 蓝图库 BLUEPRINT_LIBRARY 筛选蓝图 filter() / find() 设置属性 颜色、速度等 生成点 Transform(Location, Rotation) 生成实体 spawn_actor() Actor对象 可控制、可销毁 核心:蓝图定义“是什么”,生成点定义“在哪里”,spawn_actor() 完成“怎么生成”

3.6 实战小贴士

最后,分享几个我在项目中积累的经验:

  • 批量生成时,记得设置生成间隔。 我曾经一次性生成50辆车,结果CARLA直接卡死。后来每生成一辆,加个 time.sleep(0.1),问题解决。
  • 行人最好用 walker_controller 控制。 否则行人只会站在原地,像个木头人。这个后面章节会细讲。
  • 生成失败时,检查日志。 CARLA的服务器端会输出详细错误信息。比如“Spawn location is not valid”这种,一看就懂。

总结一下: 蓝图是模板,生成点是位置,spawn_actor() 是执行者。三者配合,就能在CARLA世界里创造出你想要的任何物体。

嗯,这一章就到这里。记住,多动手试试,把代码跑起来,你才能真正理解这些概念。

可可精品资料库