1. 传感器概述
大家好,我是你们这趟CARLA实战课的老司机。今天咱们来聊聊传感器——自动驾驶仿真里最核心的“眼睛”和“耳朵”。
说实话,我刚接触CARLA那会儿,面对一堆传感器蓝图ID,头都大了。什么sensor.camera.rgb、sensor.lidar.ray_cast,看着像乱码。但用久了你会发现,这套命名规则其实挺有逻辑的。今天我就带你把它们捋清楚。
1.1 传感器类型概览
CARLA支持的传感器,说白了就是两大类:视觉类和物理测量类。视觉类包括各种相机,物理测量类包括激光雷达、毫米波雷达、GNSS、IMU等。
我个人习惯把传感器按“感知维度”来分:
- RGB相机:最直观,输出彩色图像。你想想看,人眼看到什么,它就拍到什么。
- 深度相机:每个像素存的是距离值,不是颜色。做3D重建时特别好用。
- 语义分割相机:给每个像素打标签——这是路、那是车、那是行人。我在做数据标注时,这玩意儿能省一半人力。
- 实例分割相机:比语义更进一步,能区分同一类物体的不同个体。比如两辆车,它能标出“车A”和“车B”。
- 激光雷达:发射激光束,测量反射回来的时间,生成点云。嗯,这里要注意,CARLA的激光雷达是模拟的射线投射,不是真实物理扫描。
- 毫米波雷达:输出距离、速度、角度信息。我在项目中遇到过,雷达数据噪声大,但胜在稳定,雨雾天也不怕。
- GNSS:全球导航卫星系统,说白了就是GPS。但仿真里它返回的是完美定位,没有真实环境里的多径效应。
- IMU:惯性测量单元,输出加速度和角速度。做车辆动力学分析时必备。
核心要点:每种传感器都有对应的蓝图ID,格式统一为 sensor.<类型>.<子类型>。比如 sensor.camera.rgb、sensor.lidar.ray_cast。
1.2 传感器蓝图ID一览
蓝图ID是CARLA里创建传感器的“身份证”。你通过它告诉CARLA:“嘿,给我造一个RGB相机”。下面这张表是我整理的最常用传感器蓝图ID,建议收藏。
| 传感器类型 | 蓝图ID | 主要用途 |
|---|---|---|
| RGB相机 | sensor.camera.rgb |
视觉感知、目标检测 |
| 深度相机 | sensor.camera.depth |
距离估计、3D重建 |
| 语义分割相机 | sensor.camera.semantic_segmentation |
场景理解、数据集制作 |
| 实例分割相机 | sensor.camera.instance_segmentation |
个体识别、跟踪 |
| 光流相机 | sensor.camera.optical_flow |
运动估计、目标跟踪 |
| 激光雷达 | sensor.lidar.ray_cast |
点云生成、障碍物检测 |
| 毫米波雷达 | sensor.other.radar |
距离速度测量、自适应巡航 |
| GNSS | sensor.other.gnss |
全局定位 |
| IMU | sensor.other.imu |
姿态估计、惯性导航 |
| 障碍物检测 | sensor.other.obstacle |
碰撞预警、路径规划 |
小技巧:如果你不确定当前CARLA版本支持哪些传感器,可以在Python里运行 blueprint_library.filter('sensor.*') 来列出所有传感器蓝图。我每次换版本都会跑一遍这个命令,确保没遗漏。
1.3 传感器属性概览
每个传感器蓝图都有一堆属性可以配置。说白了,就是调参。你调得好,数据质量就高;调得不好,后面算法全白搭。
我挑几个最常用的传感器,说说它们的核心属性。
1.3.1 相机类属性
- image_size_x / image_size_y:图像宽高,单位像素。常用的是1920x1080,但如果你做实时仿真,建议降到1280x720,帧率能翻倍。
- fov:视场角,单位度。默认90°,但做环视系统时,我习惯用120°的鱼眼效果。
- sensor_tick:采集间隔,单位秒。0.1表示每秒10帧。注意,不是设得越小越好,CPU扛不住。
- lens_circle_falloff:镜头边缘衰减。做鱼眼模拟时这个参数很关键。
1.3.2 激光雷达属性
- channels:激光线束数量。16线、32线、64线、128线。线束越多,点云越密,但计算量也越大。我在项目中用过64线,效果不错。
- range:最大探测距离,单位米。一般设100米,高速场景建议200米。
- points_per_second:每秒点数。这个值决定了点云密度。默认56000,但如果你想要高精度,可以调到100000以上。
- rotation_frequency:旋转频率,单位Hz。10Hz是常规设置,20Hz适合高速场景。
- upper_fov / lower_fov:垂直视场角。一般设-30°到+10°,覆盖地面到前方。
1.3.3 毫米波雷达属性
- horizontal_fov:水平视场角,单位度。默认30°,但做多目标跟踪时,我建议设到60°。
- vertical_fov:垂直视场角,单位度。一般6°左右。
- range:探测距离,单位米。100米是常规值。
- points_per_second:每秒输出点数。雷达点数比激光雷达少得多,但胜在直接输出速度信息。
避坑指南:我曾经在调激光雷达参数时,把 points_per_second 设得过高,结果仿真直接卡死。后来发现,这个值要和你的硬件性能匹配。建议先从默认值开始,逐步往上调,找到平衡点。
1.4 如何创建传感器实例
光说不练假把式。咱们来看看怎么在CARLA里创建一个传感器。下面这段代码,我习惯把它放在脚本开头,作为“传感器工厂”。
import carla
# 连接到CARLA服务器
client = carla.Client('localhost', 2000)
world = client.get_world()
# 获取蓝图库
blueprint_library = world.get_blueprint_library()
# 创建RGB相机蓝图
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_bp.set_attribute('sensor_tick', '0.1')
# 创建激光雷达蓝图
lidar_bp = blueprint_library.find('sensor.lidar.ray_cast')
lidar_bp.set_attribute('channels', '64')
lidar_bp.set_attribute('range', '100')
lidar_bp.set_attribute('points_per_second', '100000')
lidar_bp.set_attribute('rotation_frequency', '10')
lidar_bp.set_attribute('upper_fov', '10')
lidar_bp.set_attribute('lower_fov', '-30')
print("传感器蓝图创建完成,准备挂载到车辆上...")
你看,代码其实不复杂。关键是理解每个属性的含义,以及它们对数据质量的影响。
经验之谈:我个人习惯在创建传感器后,先打印一下它的所有属性,确认设置正确。用 print(camera_bp.get_attributes()) 就能看到完整的属性列表。这个小习惯帮我避免过好几次低级错误。
1.5 传感器挂载与数据采集
传感器创建好了,得挂到车上才能用。CARLA里通过 spawn_actor 和 attach_to 来实现。你可以指定挂载的相对位置和旋转角度。
# 获取一辆车
vehicle_bp = blueprint_library.filter('vehicle.*')[0]
spawn_point = world.get_map().get_spawn_points()[0]
vehicle = world.spawn_actor(vehicle_bp, spawn_point)
# 挂载相机到车辆前挡风玻璃位置
camera_transform = carla.Transform(carla.Location(x=1.5, z=2.4))
camera = world.spawn_actor(camera_bp, camera_transform, attach_to=vehicle)
# 挂载激光雷达到车顶
lidar_transform = carla.Transform(carla.Location(x=0, z=2.5))
lidar = world.spawn_actor(lidar_bp, lidar_transform, attach_to=vehicle)
print("传感器已挂载,开始监听数据...")
挂载位置很关键。你想想看,相机装在车顶和装在保险杠上,看到的画面完全不同。做数据录制时,一定要保持传感器位置的一致性,否则训练出来的模型会“水土不服”。
小建议:如果你做多传感器融合,建议把所有传感器都挂载到同一个参考坐标系下。我一般以车辆后轴中心为原点,这样标定起来方便。
1.6 本章小结
好了,传感器概述就聊到这儿。我们梳理了CARLA支持的传感器类型、蓝图ID的命名规则、核心属性配置,以及如何创建和挂载传感器。
说白了,传感器就是自动驾驶仿真的“感官”。你配置得越精细,采集到的数据就越真实,后续的算法训练效果也就越好。下一章我们会深入每种传感器的数据格式和回调函数处理,到时候再细聊。
记住一句话:传感器配置没有银弹,只有不断试错和调优。我在这个坑里爬过很多次,希望你能少走弯路。