3、CARLA基础入门:CARLA的安装与启动、核心概念(世界、Actor、蓝图)、第一个传感器仿真示例

各位同学,欢迎来到CARLA的世界。

说实话,我第一次接触CARLA的时候,心里也犯嘀咕——这玩意儿到底怎么玩?装了半天环境,启动起来黑乎乎一片,连个车都看不到。后来摸爬滚打了一段时间,才慢慢理清了它的套路。今天这一章,我就带你走一遍最基础的路:怎么装、怎么启动、以及那几个绕不开的核心概念。

3.1 CARLA的安装与启动

先说说安装。CARLA目前支持Windows和Linux两种系统。我个人习惯用Ubuntu 20.04,因为踩坑少,社区支持也最全。如果你用Windows,也不是不行,但有些编译上的小问题需要额外处理。

安装步骤(以Ubuntu 20.04为例):

  1. 下载CARLA包:去官方GitHub Release页面,下载最新的稳定版压缩包。我建议下载完整版(包含所有地图和资产),大概几个G。
  2. 解压:找个干净的目录,比如 ~/carla,解压进去。
  3. 安装依赖:主要是Python环境和一些图形库。运行 pip install -r requirements.txt 就行。
  4. 启动CARLA服务器:进入CARLA根目录,运行 ./CarlaUE4.sh(Linux)或 CarlaUE4.exe(Windows)。
注意: 启动时如果报错缺少 libomp5 之类的库,别慌。运行 sudo apt-get install libomp5 就能解决。我曾经在服务器上部署时,因为没装图形界面,折腾了半天才发现需要加 -RenderOffScreen 参数。

启动成功后,你会看到一个黑乎乎的窗口,里面有个空旷的城镇。嗯,这就是CARLA的默认地图——Town01。别急着点鼠标,先看看终端输出,确认没有报错。

3.2 核心概念:世界、Actor、蓝图

这三个概念,说白了就是CARLA的骨架。你想想看,一个仿真场景,总得有个地方(世界),里面放点东西(Actor),这些东西怎么造出来的(蓝图)。

3.2.1 世界(World)

世界就是整个仿真环境的容器。它包含了地图、天气、交通规则,以及所有动态物体的状态。在代码里,我们通过 client.get_world() 来获取当前世界对象。

我刚开始做项目时,总以为世界就是一张地图。其实不对。世界还管理着时间步长、光照、甚至行人AI的决策逻辑。你可以把它理解成一个「上帝视角」的控制器。

3.2.2 Actor

Actor是世界中所有动态实体的统称。车辆、行人、传感器、交通标志,甚至路灯,都是Actor。每个Actor都有一个唯一的ID,你可以通过ID来操控它。

举个例子:你想让一辆车加速,就得先拿到这辆车的Actor对象,然后调用 apply_control() 方法。嗯,这里要注意,Actor的操控是异步的,别指望一调用就立刻生效。

3.2.3 蓝图(Blueprint)

蓝图是Actor的「出生证明」。它定义了Actor的类型、颜色、物理属性、传感器配置等。CARLA内置了几百种蓝图,从奥迪A2到自行车,应有尽有。

我个人习惯把蓝图库打印出来看看:blueprint_library = world.get_blueprint_library(),然后遍历一下,看看有哪些好玩的车型。有一次我为了测试激光雷达,专门找了一辆带车顶架的卡车蓝图,结果发现它的碰撞箱有点问题……嗯,这就是另一个故事了。

核心关系图: 客户端 → 世界 → 蓝图库 → 生成Actor → 操控Actor
客户端 世界 蓝图库 Actor 核心关系:客户端获取世界,世界管理蓝图库和Actor

3.3 第一个传感器仿真示例

光说不练假把式。我们来写一个最简单的传感器示例:在车上装一个摄像头,看看它能看到什么。

代码示例:

import carla
import random
import time

# 连接CARLA服务器
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)

# 获取世界
world = client.get_world()

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

# 选择一辆车(随机选一个车型)
vehicle_bp = random.choice(blueprint_library.filter('vehicle.*'))

# 找一个生成点
spawn_points = world.get_map().get_spawn_points()
spawn_point = random.choice(spawn_points)

# 生成车辆
vehicle = world.spawn_actor(vehicle_bp, spawn_point)
print(f'生成了车辆: {vehicle.type_id}')

# 选择摄像头蓝图
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')

# 将摄像头安装在车顶
camera_transform = carla.Transform(carla.Location(x=1.5, z=2.4))
camera = world.spawn_actor(camera_bp, camera_transform, attach_to=vehicle)

# 定义回调函数,保存图像
def process_image(image):
    image.save_to_disk(f'output/{image.frame:06d}.png')
    print(f'保存了第 {image.frame} 帧图像')

# 开始监听
camera.listen(process_image)

# 让车辆动起来
vehicle.apply_control(carla.VehicleControl(throttle=0.5, steer=0.0))

# 跑一会儿
time.sleep(5)

# 清理
camera.stop()
camera.destroy()
vehicle.destroy()
print('示例结束')
小提示: 运行前记得先启动CARLA服务器。如果报连接超时,检查一下端口2000是否被占用。我遇到过几次,都是因为之前没关干净进程。

这段代码做了几件事:连接服务器、生成一辆随机车、在车顶装一个RGB摄像头、让车跑5秒并保存图像。你运行后,会在 output/ 目录下看到一堆PNG图片。打开一张看看——嗯,这就是CARLA的「眼睛」。

为什么选摄像头?因为传感器是自动驾驶的「五官」。没有传感器,车就是瞎子。后面我们会陆续讲到激光雷达、毫米波雷达、GPS等。但今天,先让摄像头带我们入门。

避坑指南: 我曾经在生成传感器时忘了设置 attach_to 参数,结果摄像头飘在半空中,拍出来的画面全是天空。后来检查了半天才发现,传感器必须绑定到一个Actor上才能随动。

好了,这一章的内容就到这里。你学会了安装、启动、理解了世界-Actor-蓝图的关系,还亲手跑了一个传感器示例。说实话,这些基础打牢了,后面的联合仿真才能玩得转。

可可精品资料库