3、CARLA基础操作:地图加载、车辆生成、传感器配置、手动控制

好,咱们正式开始动手操作CARLA。说实话,很多新手一上来就被CARLA的架构吓住了,觉得它很复杂。其实不然,你只要掌握了四个核心动作——加载地图、生成车辆、配置传感器、手动控制——就能跑起来一个最基本的仿真场景。我个人习惯把这四个步骤称为「CARLA四步走」,今天咱们就一步步拆开来讲。

CARLA基础操作四步走 ① 加载地图 world = client.load_world() ② 生成车辆 world.spawn_actor() ③ 配置传感器 Camera / LiDAR / IMU ④ 手动控制 Keyboard / Wheel 💡 核心逻辑 • 先有世界(地图),才有角色(车辆) • 传感器是车辆的「眼睛」,必须挂载在车上 • 手动控制是调试利器,建议先跑通再上自动驾驶 • 每一步都有对应的API,别死记硬背,理解流程即可

3.1 地图加载——选对地图,事半功倍

CARLA自带的地图其实不少,从简单的直线赛道到复杂的城市路网都有。我个人习惯先用 Town03 或 Town05 做测试,因为这两个地图既有弯道又有直道,场景比较丰富。

核心API:

import carla

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

# 加载地图
world = client.load_world('Town03')

嗯,这里要注意一点:load_world() 会重置整个仿真环境。如果你正在跑一个复杂的场景,突然调用这个函数,所有角色都会被清空。我曾经在调试时不小心多调了一次,结果辛辛苦苦摆好的车辆全没了……所以,建议在脚本开头只调用一次。

小技巧: 如果你不确定当前地图是什么,可以用 world.get_map().name 查看。另外,client.get_available_maps() 可以列出所有可用地图。

3.2 车辆生成——从蓝图库中挑选你的座驾

地图加载好了,接下来就是生成车辆。CARLA里所有可生成的对象都存放在「蓝图库」(Blueprint Library)中。说白了,蓝图就是对象的「出生证明」,定义了车型、颜色、物理属性等。

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

# 挑选一辆车(比如奥迪A2)
vehicle_bp = blueprint_library.find('vehicle.audi.a2')

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

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

你想想看,如果生成点被占用了怎么办?spawn_actor() 会直接报错。我建议用 try_spawn_actor(),它返回 None 而不是抛异常,更安全。

避坑指南: 我曾经在生成车辆时忘记设置 autopilot=True,结果车停在路中间一动不动,后面的车全堵住了。如果你想让车辆自己跑,记得加上:

vehicle.set_autopilot(True)

3.3 传感器配置——给车装上「眼睛」

传感器是自动驾驶仿真的灵魂。CARLA支持摄像头、激光雷达、IMU、GPS等多种传感器。配置传感器的套路都一样:先选蓝图,再设置参数,最后挂载到车辆上。

我拿RGB相机举个例子:

# 相机蓝图
camera_bp = blueprint_library.find('sensor.camera.rgb')
camera_bp.set_attribute('image_size_x', '800')
camera_bp.set_attribute('image_size_y', '600')
camera_bp.set_attribute('fov', '90')

# 挂载位置(相对车辆坐标)
transform = carla.Transform(carla.Location(x=1.5, z=2.4))

# 生成传感器
camera = world.spawn_actor(camera_bp, transform, attach_to=vehicle)

# 监听数据
camera.listen(lambda image: image.save_to_disk('output/%06d.png' % image.frame))

这里有个细节:attach_to 参数决定了传感器跟随哪个父对象。如果不指定,传感器就飘在空中了。我在项目中遇到过有人忘了挂载,结果相机数据全是黑的——因为相机掉到地底下了。

传感器类型 蓝图名称 常用参数
RGB相机 sensor.camera.rgb image_size_x, image_size_y, fov
深度相机 sensor.camera.depth 同上 + 编码格式
激光雷达 sensor.lidar.ray_cast channels, range, points_per_second
IMU sensor.other.imu 无特殊参数
GPS sensor.other.gnss 噪声参数

个人经验: 调试阶段建议先用RGB相机,因为你能直观看到画面。激光雷达的数据是点云,不直观。等相机调通了,再换LiDAR。

3.4 手动控制——用键盘或方向盘开车

最后一步,手动控制。CARLA自带了一个手动控制示例脚本 manual_control.py,但说实话,那个脚本太长了。我一般自己写一个精简版:

import pygame

# 初始化pygame
pygame.init()
display = pygame.display.set_mode((800, 600))
clock = pygame.time.Clock()

# 控制循环
while True:
    for event in pygame.event.get():
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_w:
                vehicle.apply_control(carla.VehicleControl(throttle=0.5))
            elif event.key == pygame.K_s:
                vehicle.apply_control(carla.VehicleControl(brake=0.5))
            elif event.key == pygame.K_a:
                vehicle.apply_control(carla.VehicleControl(steer=-0.3))
            elif event.key == pygame.K_d:
                vehicle.apply_control(carla.VehicleControl(steer=0.3))
    
    clock.tick(60)

为什么用pygame?因为它轻量,而且事件处理简单。你想想看,如果用Qt或者OpenCV,光是窗口事件就得写一堆代码。

注意: 手动控制时,记得把 set_autopilot(False) 关掉,否则你的控制指令会被覆盖。我曾经一边按键盘一边纳闷「车怎么不听使唤」,结果发现autopilot还开着……

好了,以上就是CARLA基础操作的四个核心步骤。你只要照着这个流程走一遍,就能跑起来一个完整的仿真场景。下一节我们会深入讲解如何用Prescan导入场景,到时候再结合CARLA一起玩,效果更棒。

本章总结:

  • 地图加载:client.load_world(),选对地图很重要
  • 车辆生成:从蓝图库挑选,用 spawn_actor() 或 try_spawn_actor()
  • 传感器配置:选蓝图→设参数→挂载→监听数据
  • 手动控制:推荐pygame,简单高效
可可精品资料库