共计 2907 个字符,预计需要花费 8 分钟才能阅读完成。
背景与痛点
自动驾驶开发中最关键的环节之一就是获取高质量的训练数据。真实世界的数据采集不仅成本高昂(需要专业车辆、传感器和驾驶员),还面临天气、交通法规和隐私等限制。此外,人工标注这些数据更是耗时费力,尤其是 3D 物体检测和语义分割等任务。

CARLA 仿真平台完美解决了这些痛点:
- 可 7×24 小时不间断生成数据
- 支持多传感器同步采集
- 自动生成像素级标注
- 能模拟各种极端天气和交通场景
CARLA 环境配置
基础环境搭建
- 硬件建议:至少 16GB 内存的 GPU 工作站(如 NVIDIA RTX 3060 及以上)
- 从 CARLA 官网下载预编译包(推荐 0.9.13 版本)
- 安装 Python 依赖:
pip install pygame numpy opencv-python
传感器配置方案
典型自动驾驶传感器套件配置示例:
# 传感器参数配置示例
camera_config = {
'type': 'sensor.camera.rgb',
'x': 1.5, 'y': 0, 'z': 2.4, # 安装位置(米)
'roll': 0, 'pitch': 0, 'yaw': 0, # 旋转角度
'width': 1920, 'height': 1080, # 分辨率
'fov': 90 # 视场角
}
lidar_config = {
'type': 'sensor.lidar.ray_cast',
'x': 1.5, 'y': 0, 'z': 2.4,
'rotation_frequency': 20, # 转速(Hz)
'points_per_second': 100000,
'range': 100 # 探测距离(米)
}
数据采集实战
基础采集脚本
以下代码展示如何同步采集 RGB 图像和激光雷达数据:
import carla
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 = blueprint_library.filter('model3')[0]
# 生成车辆
spawn_point = world.get_map().get_spawn_points()[0]
vehicle = world.spawn_actor(vehicle_bp, spawn_point)
# 创建传感器回调函数
def sensor_callback(data, path):
data.save_to_disk(path)
# 添加摄像头
camera_bp = blueprint_library.find('sensor.camera.rgb')
camera = world.spawn_actor(camera_bp, carla.Transform(), attach_to=vehicle)
camera.listen(lambda image: sensor_callback(image, 'output/rgb/%06d.png' % image.frame))
# 添加激光雷达
lidar_bp = blueprint_library.find('sensor.lidar.ray_cast')
lidar = world.spawn_actor(lidar_bp, carla.Transform(), attach_to=vehicle)
lidar.listen(lambda point_cloud: sensor_callback(point_cloud, 'output/lidar/%06d.ply' % point_cloud.frame))
# 运行采集
try:
while True:
world.tick()
time.sleep(0.05)
except KeyboardInterrupt:
pass
finally:
# 销毁对象
camera.destroy()
lidar.destroy()
vehicle.destroy()
自动化标注
CARLA 原生标注类型
CARLA 支持自动生成以下标注数据:
- 语义分割(像素级类别标签)
- 实例分割(区分同类物体)
- 3D 边界框(带物体类别和运动状态)
- 深度图
- 表面法线
格式转换示例
将 CARLA 的 3D 边界框转换为 KITTI 格式:
def carla_to_kitti(carla_bbox):
"""
参数:
carla_bbox: carla.BoundingBox 对象
"""
# 坐标系转换:CARLA 左前上 → KITTI 右前下
location = carla_bbox.location
rotation = carla_bbox.rotation
extent = carla_bbox.extent
kitti_bbox = {
'type': 'Car',
'truncated': 0.0,
'occluded': 0,
'alpha': -np.arctan2(location.y, location.x) - rotation.yaw,
'bbox': [0, 0, 100, 100], # 2D 框需单独计算
'dimensions': [extent.z*2, extent.y*2, extent.x*2], # 高, 宽, 长
'location': [location.x, location.y - extent.y, location.z - extent.z],
'rotation_y': np.deg2rad(rotation.yaw)
}
return kitti_bbox
避坑指南
数据同步问题
现象:不同传感器时间戳不一致
解决方案:
- 使用
world.tick()统一时间步 - 检查传感器配置中的
sensor_tick参数 - 后期通过帧号对齐数据
传感器噪声模拟
CARLA 默认提供理想传感器数据,可通过以下方式添加噪声:
# 为摄像头添加噪声
camera_bp.set_attribute('enable_postprocess_effects', 'True')
camera_bp.set_attribute('motion_blur_intensity', '0.5')
# 为激光雷达添加噪声
lidar_bp.set_attribute('dropoff_general_rate', '0.1')
性能优化
大规模采集技巧
- 使用
set_async_mode(True)启用异步模式 - 多车并行采集:在 Town07 等大场景中部署多辆采集车
- 数据压缩存储:
- 图像保存为.jpg
- 点云使用.las 压缩格式
- 关闭不必要的渲染:
settings = world.get_settings() settings.no_rendering_mode = True world.apply_settings(settings)
结语
通过本文介绍的方法,我在一周内就构建了包含 10 万帧的多模态数据集。建议读者先尝试在 CARLA 的 Town01 简单场景中验证流程,再扩展到复杂场景。虽然仿真数据不能完全替代真实数据,但通过领域自适应等技术,可以显著减少对真实数据的依赖。下一步我将探索如何将 CARLA 数据与 nuScenes 等真实数据集混合训练,欢迎在评论区交流你的实践经验。
正文完
