不只是安装:用Carla 0.9.14快速创建你的第一个自动驾驶仿真场景(Python API实战)
不只是安装:用Carla 0.9.14快速创建你的第一个自动驾驶仿真场景(Python API实战)
当你第一次打开Carla仿真平台,面对空荡荡的城市街道,是否感到无从下手?本文将带你跳过繁琐的安装过程(假设已完成基础配置),直接进入 实战开发阶段 ——通过Python API快速构建一个包含交通流和可控车辆的动态路口场景。我们将以"创建-控制-扩展"为主线,在30分钟内完成从零到第一个可交互仿真 demo。
1. 启动服务与基础环境校验
在开始构建场景前,确保你的Carla服务端和Python环境已正确联动。打开两个终端窗口,分别执行以下命令:
# 终端1:启动Carla服务端(默认渲染模式)
./CarlaUE4.sh -quality-level=Epic
# 终端2:验证Python客户端连接
python3 -c "import carla; print(f'Carla lib version: {carla.__version__}')"
注意:如果遇到
ModuleNotFoundError错误,请检查是否在安装客户端的虚拟环境中操作。推荐使用conda管理环境:conda create -n carla_env python=3.7 conda activate carla_env pip install carla-0.9.14-cp37-cp37m-manylinux_2_27_x86_64.whl
服务端启动后,你会看到默认的Town03地图。这是我们的"数字画布",接下来将通过代码动态添加元素。
2. 构建基础交通场景
创建一个名为
create_traffic_scene.py
的脚本,使用以下代码生成基础交通流:
import carla
import random
# 连接服务端
client = carla.Client('localhost', 2000)
world = client.get_world()
# 设置交通管理器
traffic_manager = client.get_trafficmanager()
traffic_manager.set_global_distance_to_leading_vehicle(2.5)
# 生成50辆随机车辆
vehicle_blueprints = world.get_blueprint_library().filter('vehicle.*')
spawn_points = world.get_map().get_spawn_points()
for _ in range(50):
blueprint = random.choice(vehicle_blueprints)
spawn_point = random.choice(spawn_points)
vehicle = world.try_spawn_actor(blueprint, spawn_point)
if vehicle:
vehicle.set_autopilot(True, traffic_manager.get_port())
这段代码实现了三个关键功能:
- 建立与Carla服务端的连接
- 配置交通管理器参数(设置跟车距离)
- 在地图随机位置生成50辆自动驾驶车辆
执行脚本后,你会看到城市街道上出现流动的车群。但此时还缺少我们的"主角"——玩家控制车辆。
3. 添加玩家控制车辆
扩展脚本,在相同文件中追加以下代码:
# 生成玩家车辆(特斯拉Model3)
player_bp = world.get_blueprint_library().find('vehicle.tesla.model3')
player_spawn = carla.Transform(
carla.Location(x=120, y=195, z=0.5),
carla.Rotation(pitch=0, yaw=180, roll=0)
)
player = world.spawn_actor(player_bp, player_spawn)
# 设置相机视角
camera_bp = world.get_blueprint_library().find('sensor.camera.rgb')
camera = world.spawn_actor(
camera_bp,
carla.Transform(carla.Location(x=-5, z=3), carla.Rotation(pitch=-20)),
attach_to=player
)
camera.listen(lambda image: image.save_to_disk('output/%06d.png' % image.frame))
现在你有了:
- 一辆可控制的特斯拉Model3(位于特定路口)
- 一个固定在车辆后方的RGB相机
- 持续保存的相机画面(存储在output文件夹)
4. 实现键盘控制与场景交互
为了手动控制车辆,我们需要处理键盘输入。Carla提供了
VehicleControl
类来实现基础控制:
import pygame
from pygame.locals import KMOD_CTRL
# 初始化pygame接收键盘输入
pygame.init()
display = pygame.display.set_mode((300, 300))
controls = {
'throttle': 0,
'steer': 0,
'brake': 0,
'reverse': False
}
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
exit()
keys = pygame.key.get_pressed()
# 油门/刹车控制
if keys[pygame.K_UP]:
controls['throttle'] = min(controls['throttle'] + 0.05, 1)
controls['brake'] = 0
elif keys[pygame.K_DOWN]:
controls['brake'] = min(controls['brake'] + 0.2, 1)
controls['throttle'] = 0
else:
controls['throttle'] = max(controls['throttle'] - 0.05, 0)
controls['brake'] = max(controls['brake'] - 0.1, 0)
# 转向控制
controls['steer'] = 0
if keys[pygame.K_LEFT]:
controls['steer'] = -0.5
if keys[pygame.K_RIGHT]:
controls['steer'] = 0.5
# 传输控制指令
player.apply_control(carla.VehicleControl(
throttle=controls['throttle'],
steer=controls['steer'],
brake=controls['brake'],
reverse=controls['reverse']
))
pygame.display.flip()
控制方案说明:
- 方向键上 :加速
- 方向键下 :刹车
- 左右方向键 :转向
- 自动回正 :松开按键时方向盘逐渐回正
5. 场景扩展与调试技巧
基础场景运行稳定后,可以尝试以下进阶操作:
5.1 添加行人增加场景复杂度
pedestrian_bp = world.get_blueprint_library().filter('walker.pedestrian.*')
controller_bp = world.get_blueprint_library().find('controller.ai.walker')
for _ in range(20):
spawn_point = carla.Transform()
spawn_point.location = world.get_random_location_from_navigation()
if spawn_point.location:
pedestrian = world.try_spawn_actor(random.choice(pedestrian_bp), spawn_point)
if pedestrian:
controller = world.spawn_actor(controller_bp, spawn_point, pedestrian)
controller.start()
controller.go_to_location(world.get_random_location_from_navigation())
5.2 天气与光照动态变化
from carla import WeatherParameters
weather_presets = [
carla.WeatherParameters.ClearNoon,
carla.WeatherParameters.CloudyNoon,
carla.WeatherParameters.WetNoon,
carla.WeatherParameters.HardRainNoon
]
def change_weather():
world.set_weather(random.choice(weather_presets))
pygame.time.set_timer(WEATHER_CHANGE, 30000) # 每30秒切换天气
5.3 常见问题排查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| 车辆悬浮在空中 | 生成点Z坐标错误 |
使用
world.debug.draw_string
可视化生成点
|
| 交通流不移动 | 未设置autopilot |
检查
set_autopilot(True)
调用
|
| 画面卡顿 | 渲染质量过高 |
启动时添加
-quality-level=Low
参数
|
| Python API连接失败 | 端口冲突 | 确认2000/2001端口未被占用 |
6. 数据采集与场景保存
完成场景构建后,你可能需要记录仿真数据。以下代码演示如何保存车辆状态信息:
import csv
def save_vehicle_data(filename='vehicle_data.csv'):
with open(filename, 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['frame', 'x', 'y', 'speed(km/h)'])
def callback(data):
transform = data.transform
velocity = data.velocity
speed = 3.6 * (velocity.x**2 + velocity.y**2 + velocity.z**2)**0.5
writer.writerow([data.frame, transform.location.x, transform.location.y, speed])
player.listen(callback)
要保存整个场景状态(包括所有动态元素),可以使用Carla的
Recorder
功能:
# 开始记录(保存最近30秒数据)
client.start_recorder('recording.log', True)
# 回放记录
client.replay_file('recording.log', 0, 30, 0) # 从0秒开始回放30秒
在实际项目中,我发现合理设置记录时长非常重要——过长的记录会消耗大量内存,而太短的记录可能丢失关键事件。建议根据场景复杂度动态调整,一般交通仿真记录10-60秒即可满足多数测试需求。
更多推荐
所有评论(0)