2. 相机传感器
相机传感器,说白了就是自动驾驶仿真系统的「眼睛」。在CARLA里,相机不是简单的拍照工具,而是能输出多种数据流的传感器。我个人习惯把相机分成三类:RGB、深度、语义分割。每种都有自己的脾气,配置不对,数据就废了。
核心要点:相机传感器的配置核心在于三个东西——分辨率、视场角(FOV)、以及数据输出类型。这三个参数决定了你能看到什么、看得多清楚、以及数据怎么用。
2.1 RGB相机配置
RGB相机是最直观的。它输出的是彩色图像,跟普通摄像头拍出来的差不多。我在项目中遇到过一个问题:一开始用默认配置,结果图像偏暗,车道线都看不清。后来才发现是曝光参数没调。
配置RGB相机,你需要关注这几个参数:
- image_size_x / image_size_y:图像宽高。我建议至少用800x600,太低的话远处目标根本看不清。
- fov:视场角。默认90度,但如果你做变道场景,我习惯用110度,视野更宽。
- sensor_tick:采集频率。0.05秒就是20FPS,够用了。
- lens_circle_falloff:镜头边缘衰减。这个我踩过坑,默认值会导致图像四周发暗,建议调小。
# RGB相机配置示例
rgb_bp = blueprint_library.find('sensor.camera.rgb')
rgb_bp.set_attribute('image_size_x', '800')
rgb_bp.set_attribute('image_size_y', '600')
rgb_bp.set_attribute('fov', '110')
rgb_bp.set_attribute('sensor_tick', '0.05')
rgb_bp.set_attribute('lens_circle_falloff', '0.1')
小技巧:如果你发现RGB图像颜色偏蓝或偏黄,可以调整white_balance_temperature参数。我一般设到5600K,接近自然光。
2.2 深度相机配置
深度相机输出的是每个像素到物体的距离。说白了,就是一张灰度图,越亮的地方越近,越暗的地方越远。嗯,这里要注意:深度数据不是给人看的,是给算法吃的。
配置深度相机,核心参数跟RGB差不多,但有一个关键区别——数据范围。
- fov:建议跟RGB保持一致,否则数据融合时会出问题。我曾经吃过这个亏,RGB和深度图的FOV不一致,标定搞了三天。
- range:最大探测距离。默认100米,但如果你做高速场景,我建议设到200米。
- lens_circle_falloff:这个在深度相机里影响不大,但建议保持默认。
# 深度相机配置示例
depth_bp = blueprint_library.find('sensor.camera.depth')
depth_bp.set_attribute('image_size_x', '800')
depth_bp.set_attribute('image_size_y', '600')
depth_bp.set_attribute('fov', '110')
depth_bp.set_attribute('range', '200')
避坑指南:我曾经把深度相机的range设得太小,结果远处车辆直接显示为黑色,算法以为那里是空地,差点撞上。记住:深度图里黑色不代表没有物体,而是代表「超出范围」。
2.3 语义分割相机配置
语义分割相机,说白了就是给图像里的每个像素打标签。路面是路面,车辆是车辆,行人是行人。这个在训练感知模型时特别有用。
配置上,语义分割相机跟RGB几乎一样。但有一个坑——标签映射表。CARLA默认有23个类别,但你可能只需要其中几个。
- image_size_x / image_size_y:建议跟RGB一致,方便做像素级对齐。
- fov:同样建议保持一致。
- sensor_tick:这个可以设低一点,0.1秒就够了,因为语义分割数据变化没那么快。
# 语义分割相机配置示例
semantic_bp = blueprint_library.find('sensor.camera.semantic_segmentation')
semantic_bp.set_attribute('image_size_x', '800')
semantic_bp.set_attribute('image_size_y', '600')
semantic_bp.set_attribute('fov', '110')
semantic_bp.set_attribute('sensor_tick', '0.1')
小技巧:语义分割图默认是伪彩色,但你可以通过CityScapesPalette转换成标准格式。我习惯在录制时直接保存原始标签值,而不是彩色图,这样后期处理更灵活。
2.4 相机属性详解
相机属性,说白了就是一堆可以调的旋钮。我整理了一个表格,方便你对照着调:
| 属性名 | 类型 | 默认值 | 我的推荐值 | 说明 |
|---|---|---|---|---|
| image_size_x | int | 800 | 800-1920 | 图像宽度,越大越清晰,但性能开销也大 |
| image_size_y | int | 600 | 600-1080 | 图像高度,建议保持16:9比例 |
| fov | float | 90.0 | 90-120 | 视场角,越大视野越宽,但边缘畸变越严重 |
| sensor_tick | float | 0.0 | 0.05-0.1 | 采集间隔(秒),0.05=20FPS |
| lens_circle_falloff | float | 5.0 | 0.5-2.0 | 镜头边缘衰减,值越小边缘越亮 |
| lens_k | float | -1.0 | 0.0 | 径向畸变系数,模拟鱼眼效果 |
| white_balance_temperature | float | 4000 | 5600 | 白平衡色温,值越高越偏蓝 |
| range | float | 100.0 | 100-200 | 深度相机最大探测距离(米) |
为什么会推荐这些值?你想想看,如果你做的是城区低速场景,FOV 90度就够了。但如果你做的是高速变道,FOV 110度能让你看到侧后方的车辆。我在做匝道汇入场景时,就吃过FOV太窄的亏,侧方车辆完全看不到。
重要提醒:所有相机的image_size_x和image_size_y必须保持一致,否则后期做多模态融合时,你会哭的。我建议统一设为800x600,性能和数据质量比较平衡。
2.5 相机传感器知识体系
下面这张图,是我梳理的相机传感器配置核心逻辑。你一看就明白了:
嗯,这张图其实就讲了一件事:三种相机共享基础属性,但各有各的独门绝技。你配置的时候,先把共同属性统一设好,再单独调各自的特有参数。这样不容易乱。
我的习惯:我会先配好RGB相机,然后把它的参数直接复制给深度和语义分割相机,只改blueprint类型。这样能保证三个相机的视野完全一致,后期做数据融合时省很多事。
最后说一句:相机配置看似简单,但细节决定成败。我见过太多人因为FOV不一致、分辨率不匹配,导致录出来的数据根本没法用。你想想看,花几个小时跑仿真,结果数据是废的,多亏啊。