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