测试用例:
PythonAPI/examples/vehicle_gallery.py
carla_1
该测试用例是一个 车辆模型展示工具 :
依次在 CARLA 仿真世界中同一位置生成所有可用的车辆类型,并让 观察者视角(Spectator)围绕每辆车做环绕飞行 ,用于直观查看不同车辆的外观。
🔑 主要模块解析
1. get_transform(vehicle_location, angle, d=6.4)
- 作用:计算观察者(Spectator)在环绕车辆时应处的位置与朝向。
- 参数 :
vehicle_location:车辆当前位置(carla.Location)angle:环绕角度(单位:度,0° 表示正右方)d=6.4:环绕半径(米)
- 实现逻辑 :
- 在车辆周围 X-Y 平面上以半径
d做圆周运动 - Z 坐标固定为 2.0 米(略高于车辆)
- 摄像机 始终朝向车辆中心 (通过
yaw=180 + angle实现) - 同时设置 俯视角
-15°(pitch=-15),获得更自然的观察视角
- 在车辆周围 X-Y 平面上以半径
- 返回值 :一个完整的
carla.Transform(包含位置和旋转)
✅ 这是典型的 第三人称环绕相机(Orbit Camera) 实现。
2. 连接与初始化
python
client = carla.Client('localhost', 2000)
world = client.get_world()
spectator = world.get_spectator()
- 连接到指定 IP 和端口的 CARLA 服务器
- 获取仿真世界(
world)和主视角观察者(spectator)
3. 车辆蓝图遍历
python
vehicle_blueprints = world.get_blueprint_library().filter('vehicle')
location = random.choice(world.get_map().get_spawn_points()).location
- 获取所有车辆类型的蓝图(如轿车、卡车、摩托车等)
- 随机选择一个地图出生点的位置(仅位置,忽略原始朝向)
4. 主展示循环
python
for blueprint in vehicle_blueprints:
# 在固定位置生成当前车辆
transform = carla.Transform(location, carla.Rotation(yaw=-45.0))
vehicle = world.spawn_actor(blueprint, transform)
try:
print(vehicle.type_id) # 打印当前车辆类型
angle = 0
while angle < 356:
# 等待仿真推进一帧
timestamp = world.wait_for_tick().timestamp
# 按仿真时间增量更新角度(60度/秒)
angle += timestamp.delta_seconds * 60.0
# 更新观察者视角
spectator.set_transform(get_transform(vehicle.get_location(), angle - 90))
finally:
vehicle.destroy() # 确保车辆被销毁
- 逐个生成车辆 :所有车辆出现在同一位置,朝向
-45° - 同步环绕 :
- 使用
world.wait_for_tick()保证与仿真步长同步 - 角速度 = 60 度/秒 → 约 6 秒完成一圈
- 初始偏移
-90°使起始视角位于车辆正前方
- 使用
- 安全清理:无论是否异常,车辆都会被销毁,避免残留
🎯 核心机制总结
| 机制 | 说明 |
|---|---|
| 环绕相机 | 通过三角函数计算观察者位置,结合 yaw 控制朝向,实现平滑环绕 |
| 仿真同步 | 使用 wait_for_tick() 获取精确时间步长,确保旋转速度稳定 |
| 批量展示 | 遍历所有 vehicle 蓝图,自动切换模型 |
| 资源管理 | finally 块确保每个车辆在展示后被销毁 |
该脚本是 CARLA 中展示 Actor 控制、Transform 操作、同步仿真 的典型官方示例,常用于快速预览车辆资产或演示环绕视角效果。