2. 环境搭建与传感器配置

好,咱们正式开始动手了。这一节,我带你把CARLA的“感官系统”搭起来。说白了,就是让自动驾驶的车子能“看”能“听”能“定位”。

我个人习惯,先把地图加载好,再配传感器。就像盖房子,先有地基,再装门窗。你想想看,如果地图都没加载,传感器往哪儿装?

2.1 地图加载:选对战场

CARLA自带了好几个地图。我刚开始用的时候,总喜欢用Town01,觉得简单。后来发现,简单地图练不出真本事。

核心要点:地图选择决定了你的算法验证场景。别老用同一个地图,会过拟合的。

加载地图的代码其实很简单:

import carla

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

# 加载地图
world = client.load_world('Town03')  # 我个人偏爱Town03,路况丰富

嗯,这里要注意。如果你在Windows上跑,记得先启动CARLA服务端。我踩过这个坑,折腾了半小时才发现服务端没开。

地图名称 特点 适合场景
Town01 简单直路,交叉口少 新手入门、传感器标定
Town03 多车道、环岛、红绿灯 城市工况、决策规划
Town05 高速公路、匝道 高速场景、变道测试

我的小技巧:做感知算法验证时,我建议先用Town03。路况复杂,但又不至于太乱。等算法稳定了,再换Town05上高速。

2.2 天气系统:别只在晴天跑

很多同学做算法,只在大晴天跑。结果一下雨,模型就崩了。我曾经在项目里吃过这个亏——客户要求雨天也能跑,结果我们连夜补数据。

CARLA的天气系统很灵活。你可以调光照、雨量、雾浓度。代码长这样:

weather = carla.WeatherParameters(
    cloudiness=80.0,        # 云量 0-100
    precipitation=60.0,     # 降雨量 0-100
    sun_altitude_angle=30.0 # 太阳高度角
)
world.set_weather(weather)

为什么会这样设置?因为真实场景中,光线变化对摄像头影响最大。你想想看,正午和黄昏,同一个摄像头拍出来的效果天差地别。

避坑指南:我曾经把降雨量调到100,结果激光雷达点云全是噪点。后来才发现,雨滴会反射激光。所以做多传感器融合时,一定要考虑天气对每个传感器的影响。

2.3 摄像头配置:车子的眼睛

摄像头是感知的主力。我一般配三个:前视、左视、右视。这样能覆盖大部分视野。

配置参数里,有几个关键点:

  • 图像分辨率:别贪高。1280x720够用了,太高了算力扛不住。
  • 视场角(FOV):我习惯用90度。太宽了图像畸变大,太窄了盲区多。
  • 位置:装在车顶前部,模拟人眼高度。
camera_bp = blueprint_library.find('sensor.camera.rgb')
camera_bp.set_attribute('image_size_x', '1280')
camera_bp.set_attribute('image_size_y', '720')
camera_bp.set_attribute('fov', '90')

camera_transform = carla.Transform(
    carla.Location(x=1.5, z=2.4),  # 车顶前方
    carla.Rotation(pitch=0)
)
camera = world.spawn_actor(camera_bp, camera_transform, attach_to=vehicle)

我的经验:做目标检测时,记得把摄像头回调函数里的图像转成numpy数组。不然你没法用OpenCV处理。我刚开始就卡在这一步。

2.4 激光雷达:点云的世界

激光雷达,说白了就是发射激光束,测量反射时间。CARLA模拟的LiDAR很真实,连多回波效应都考虑了。

配置参数里,我重点说几个:

参数 推荐值 说明
channels 32 或 64 线数。32线够用,64线更密
range 50-100米 探测距离。太远点云稀疏
points_per_second 1.3e6 每秒点数。影响帧率
lidar_bp = blueprint_library.find('sensor.lidar.ray_cast')
lidar_bp.set_attribute('channels', '32')
lidar_bp.set_attribute('range', '50')
lidar_bp.set_attribute('points_per_second', '1300000')

lidar_transform = carla.Transform(
    carla.Location(x=0.0, z=2.5)  # 车顶中心
)
lidar = world.spawn_actor(lidar_bp, lidar_transform, attach_to=vehicle)

注意:激光雷达的点云数据量很大。如果你用Python处理,记得用numpy向量化操作,别用for循环。不然帧率会掉到让你怀疑人生。

2.5 GPS与IMU:定位的基石

GPS和IMU,一个是绝对定位,一个是相对定位。两者互补。

GPS在CARLA里其实很简单,就是返回经纬度。但要注意,模拟的GPS有噪声,别太当真。

gps_bp = blueprint_library.find('sensor.other.gnss')
gps_bp.set_attribute('noise_alt_stddev', '0.001')
gps = world.spawn_actor(gps_bp, carla.Transform(), attach_to=vehicle)

IMU呢,返回加速度和角速度。我一般用它来做航位推算。嗯,这里要注意,IMU的零偏和噪声参数要调好,不然积分出来的位置会漂。

2.6 知识体系总览

说了这么多,我画张图帮你理一理。这一节的核心逻辑就是:地图是舞台,天气是氛围,传感器是演员。

环境搭建与传感器配置知识体系 CARLA仿真环境 地图加载 (Town01-05) 天气系统 (雨/雾/光照) 传感器配置 摄像头 (RGB/深度/语义) 激光雷达 (点云) GPS + IMU 核心原则:多传感器融合 + 场景多样性 地图是舞台,天气是氛围,传感器是演员

这张图你看懂了吗?从上到下,先选地图,再调天气,最后配传感器。每一步都有讲究。

2.7 实战小贴士

最后,我分享几个实战中总结的经验:

  • 先跑通再优化:别一上来就调参数。先让传感器能出数据,再慢慢调。
  • 多传感器同步:CARLA里每个传感器都有自己的回调。我习惯用一个全局时间戳来对齐数据。
  • 保存配置:把传感器参数写成配置文件。这样换场景时,一键加载,不用手改代码。

记住:环境搭建是自动驾驶算法验证的第一步,也是最容易被忽视的一步。我见过太多人,算法写得漂亮,但传感器配置一塌糊涂,最后结果根本没法用。