3. CARLA基础入门
各位同学,欢迎来到CARLA的世界。
说实话,我第一次接触CARLA的时候,心里也犯嘀咕——这玩意儿到底怎么玩?装了半天环境,启动起来黑乎乎一片,连个车都看不到。后来摸爬滚打了一段时间,才慢慢理清了它的套路。今天这一章,我就带你走一遍最基础的路:怎么装、怎么启动、以及那几个绕不开的核心概念。
3.1 CARLA的安装与启动
先说说安装。CARLA目前支持Windows和Linux两种系统。我个人习惯用Ubuntu 20.04,因为踩坑少,社区支持也最全。如果你用Windows,也不是不行,但有些编译上的小问题需要额外处理。
安装步骤(以Ubuntu 20.04为例):
- 下载CARLA包:去官方GitHub Release页面,下载最新的稳定版压缩包。我建议下载完整版(包含所有地图和资产),大概几个G。
- 解压:找个干净的目录,比如
~/carla,解压进去。 - 安装依赖:主要是Python环境和一些图形库。运行
pip install -r requirements.txt就行。 - 启动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(),然后遍历一下,看看有哪些好玩的车型。有一次我为了测试激光雷达,专门找了一辆带车顶架的卡车蓝图,结果发现它的碰撞箱有点问题……嗯,这就是另一个故事了。
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('示例结束')
这段代码做了几件事:连接服务器、生成一辆随机车、在车顶装一个RGB摄像头、让车跑5秒并保存图像。你运行后,会在 output/ 目录下看到一堆PNG图片。打开一张看看——嗯,这就是CARLA的「眼睛」。
为什么选摄像头?因为传感器是自动驾驶的「五官」。没有传感器,车就是瞎子。后面我们会陆续讲到激光雷达、毫米波雷达、GPS等。但今天,先让摄像头带我们入门。
attach_to 参数,结果摄像头飘在半空中,拍出来的画面全是天空。后来检查了半天才发现,传感器必须绑定到一个Actor上才能随动。
好了,这一章的内容就到这里。你学会了安装、启动、理解了世界-Actor-蓝图的关系,还亲手跑了一个传感器示例。说实话,这些基础打牢了,后面的联合仿真才能玩得转。
可可精品资料库