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 知识体系总览
说了这么多,我画张图帮你理一理。这一节的核心逻辑就是:地图是舞台,天气是氛围,传感器是演员。
这张图你看懂了吗?从上到下,先选地图,再调天气,最后配传感器。每一步都有讲究。
2.7 实战小贴士
最后,我分享几个实战中总结的经验:
- 先跑通再优化:别一上来就调参数。先让传感器能出数据,再慢慢调。
- 多传感器同步:CARLA里每个传感器都有自己的回调。我习惯用一个全局时间戳来对齐数据。
- 保存配置:把传感器参数写成配置文件。这样换场景时,一键加载,不用手改代码。
记住:环境搭建是自动驾驶算法验证的第一步,也是最容易被忽视的一步。我见过太多人,算法写得漂亮,但传感器配置一塌糊涂,最后结果根本没法用。