不只是安装:用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())

这段代码实现了三个关键功能:

  1. 建立与Carla服务端的连接
  2. 配置交通管理器参数(设置跟车距离)
  3. 在地图随机位置生成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秒即可满足多数测试需求。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐