3、生成第一辆车:蓝图库介绍、生成车辆、设置初始位置、控制车辆运动

好,咱们正式开始动手了。这一章的目标很明确——让第一辆车出现在CARLA世界里,并且能听你使唤。

你想想看,整个自动驾驶仿真,说白了就是围绕「车」展开的。车怎么来?长什么样?停在哪儿?怎么动?这四个问题搞定了,后面的交通流、传感器、场景编排才有基础。

我个人习惯,每次搭建新场景时,都会先手动生成一辆车,确认地图、坐标、蓝图都没问题。这一步看似简单,但我在项目中遇到过好几次「车生成了但看不见」的尴尬——后来发现是坐标掉到地底下去了。嗯,咱们今天就把这些坑提前填上。

3.1 蓝图库是什么?

蓝图(Blueprint)是CARLA里定义车辆、行人、传感器等实体的「模板」。你可以把它理解成汽车的出厂配置单——品牌、型号、颜色、物理属性都在里面。

蓝图库(Blueprint Library)就是所有这些模板的集合。CARLA启动后,它会自动加载当前版本支持的所有蓝图。咱们要做的,就是从库里挑一辆车出来。

核心概念:蓝图 ≠ 实体。蓝图是「设计图」,实体是「造出来的车」。你从蓝图库里拿到的只是一个描述,调用 spawn 方法后才真正生成车辆。

来看一下蓝图库的基本结构:

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

# 查看所有蓝图ID(会打印很长一串)
for bp in blueprint_library:
    print(bp.id)

# 筛选出所有车辆蓝图
vehicle_bps = blueprint_library.filter('vehicle.*')

# 挑一辆具体的车
bp = blueprint_library.find('vehicle.audi.a2')

这里有个小技巧:filter 方法支持通配符。你想看所有宝马?filter('vehicle.bmw.*') 就行。想找自行车?filter('vehicle.*bike*') 也能匹配到。

我的习惯:先打印出所有蓝图ID,用眼睛扫一遍。CARLA 0.9.x 版本大概有40-50种车辆蓝图,记住几个常用的就行——比如 audi.a2、tesla.model3、mustang 这些。我在项目中经常用 tesla.model3,因为它的传感器布局比较规整,适合做原型验证。

3.2 生成车辆——从蓝图到实体

选好蓝图后,下一步就是把它「变」成真实的车。这个过程叫 spawn(生成)。

核心代码就两行:

# 选择蓝图
bp = blueprint_library.find('vehicle.audi.a2')

# 生成车辆
vehicle = world.spawn_actor(bp, transform)

等等,transform 是什么?它是车辆的位置和朝向。CARLA 里用 carla.Transform 表示,包含 location(位置)和 rotation(旋转)。

一个完整的例子:

import carla

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

# 获取蓝图
blueprint_library = world.get_blueprint_library()
bp = blueprint_library.find('vehicle.audi.a2')

# 设置初始位置(x=100, y=50, z=0.3,朝向正北)
transform = carla.Transform(
    carla.Location(x=100, y=50, z=0.3),
    carla.Rotation(yaw=0.0)
)

# 生成车辆
vehicle = world.spawn_actor(bp, transform)

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

注意:z 值设为 0.3 是因为地面高度通常不是 0。CARLA 的地图有起伏,直接设 z=0 可能导致车辆卡在地面里。我建议先设 0.3~0.5,如果发现车辆悬空或陷地,再微调。另外,spawn_actor 如果失败会抛异常,记得用 try-except 包一下。

3.3 设置初始位置——别让车掉坑里

设置位置时,最怕的就是坐标不对。我在项目中踩过最大的坑就是:坐标写死了,换张地图就全废。

CARLA 提供了几个好用的工具:

  • 获取地图生成点:每张地图都有预设的车辆生成点(spawn points),用 world.get_map().get_spawn_points() 就能拿到。
  • 获取随机生成点:随机挑一个,适合快速测试。
  • 手动指定坐标:适合精确控制,但需要提前踩点。

来看代码:

# 方法1:使用地图预设生成点
spawn_points = world.get_map().get_spawn_points()
transform = spawn_points[0]  # 取第一个

# 方法2:随机选一个
import random
transform = random.choice(spawn_points)

# 方法3:手动指定(推荐先用地图工具测量)
transform = carla.Transform(
    carla.Location(x=150.0, y=30.0, z=0.5),
    carla.Rotation(yaw=90.0)  # 朝东
)

避坑指南:我曾经在 Town03 里手动设了一个坐标,结果车直接掉到地图边界外面去了。后来我养成一个习惯——每次手动设坐标前,先用 world.debug.draw_point() 把位置标出来看看。

# 调试用:在目标位置画一个红点
world.debug.draw_point(
    carla.Location(x=150.0, y=30.0, z=0.5),
    size=0.2,
    color=carla.Color(r=255, g=0, b=0),
    life_time=10.0
)

3.4 控制车辆运动——让它跑起来

车生成了,位置也对了,接下来就是让它动。CARLA 控制车辆有两种方式:

控制方式 适用场景 控制粒度
应用控制命令(apply_control) 直接控制油门、刹车、转向 精细(每帧可调)
设置自动驾驶(set_autopilot) 让CARLA内置AI驾驶 粗粒度(只设开关)

咱们先看手动控制:

# 创建控制对象
control = carla.VehicleControl()

# 设置油门(0~1)
control.throttle = 0.5

# 设置转向(-1~1,负值左转)
control.steer = 0.0

# 设置刹车(0~1)
control.brake = 0.0

# 应用控制
vehicle.apply_control(control)

嗯,这里要注意:apply_control 只生效一帧。如果你想让车持续运动,需要在游戏循环里每帧都调用。

一个简单的运动循环:

import time

# 让车以50%油门直线行驶5秒
control = carla.VehicleControl()
control.throttle = 0.5
control.steer = 0.0

for i in range(100):  # 假设每帧0.05秒,共5秒
    vehicle.apply_control(control)
    time.sleep(0.05)

# 停车
control.throttle = 0.0
control.brake = 1.0
vehicle.apply_control(control)

核心要点:手动控制时,你是在模拟「驾驶员操作」。油门、刹车、转向都是连续值,不是开关。0.5 的油门不等于 50% 速度,而是 50% 的踏板深度。实际速度还受车重、路面摩擦、空气阻力影响——CARLA 的物理引擎会算这些。

如果想省事,直接开自动驾驶:

# 开启自动驾驶(使用CARLA内置的Traffic Manager)
vehicle.set_autopilot(True)

# 关闭自动驾驶
vehicle.set_autopilot(False)

自动驾驶模式下,车会自己沿着道路行驶,遵守交通规则。但注意——它不会主动避让行人或静态障碍物,这个后面咱们会讲到怎么优化。

3.5 本章知识体系

下面这张图帮你理清今天的内容:

生成第一辆车:核心流程 1. 蓝图库 选择车型模板 2. 生成车辆 spawn_actor() 3. 设置位置 Transform + Location 4. 控制运动 apply_control() 位置设置方式 • 地图预设生成点 • 随机选择 • 手动指定坐标 • 调试:draw_point() 控制方式 • 手动控制(精细) throttle/steer/brake • 自动驾驶(粗粒度) set_autopilot(True)

这张图把今天的四个步骤串起来了。你可以把它贴在工位旁边,每次写生成代码时扫一眼,不容易漏步骤。

个人经验:刚开始学的时候,我总喜欢把「生成」和「控制」写在一起。后来发现这样调试很痛苦——车都还没生成,控制代码就先报错了。我现在的习惯是:先生成,确认车在正确位置,再写控制逻辑。分步调试,效率高很多。

好了,第一辆车已经跑起来了。你可以在CARLA窗口里看到它,也可以试试改改油门值、换个车型、换个位置。动手试一下,比看十遍代码都管用。

可可精品资料库