传感器使用详解
carla.Sensor 类定义了一种特殊的参与者(actor),能够测量并流式传输数据。
-
这些数据是什么?
数据类型因传感器种类而异。所有传感器数据均继承自通用的
carla.SensorData类。 -
何时获取数据?
要么在每个仿真步(simulation step)获取,要么在特定事件触发时获取,具体取决于传感器类型。
-
如何获取数据?
每个传感器都提供一个
listen()方法,用于接收和处理数据。
尽管各类传感器存在差异,但它们的使用方式基本一致。
设置(Setting)
与所有其他参与者一样,首先需从蓝图库中查找传感器蓝图,并设置特定属性。这对传感器至关重要------其属性将直接影响所获得的结果。具体属性详见《传感器参考文档》。
以下示例设置了一个仪表盘高清摄像头:
python
# 查找传感器蓝图
blueprint = world.get_blueprint_library().find('sensor.camera.rgb')
# 修改蓝图属性:设置图像分辨率和视场角(FOV)
blueprint.set_attribute('image_size_x', '1920')
blueprint.set_attribute('image_size_y', '1080')
blueprint.set_attribute('fov', '110')
# 设置传感器两次捕获之间的间隔时间(秒)
blueprint.set_attribute('sensor_tick', '1.0')
生成(Spawning)
传感器可放置在地图任意位置。通常,它们会附着(attach)到某个父级参与者(如车辆)上,从而像真实安装在车辆上的传感器一样随仿真移动。
spawn_actor() 方法需要从蓝图库中选择的传感器蓝图和一个变换(transform)参数:
- 对于未附着 的传感器,该变换定义其在CARLA世界中的绝对位置。
- 对于附着 的传感器,该变换定义其相对于父级参与者坐标系的相对位置。
python
my_vehicle = world.spawn_actor(vehicle_blueprint, spawn_point)
transform = carla.Transform(carla.Location(x=0.8, z=1.7))
sensor = world.spawn_actor(sensor_blueprint, transform, attach_to=my_vehicle)
attachment_type 参数定义传感器运动如何受其父级参与者控制:
-
刚性附着(
carla.AttachmentType.Rigid) :传感器严格跟随父级参与者的位姿变化。这是摄像头、激光雷达等常规车载传感器最常用的方式,也是默认设置。
-
弹簧臂附着(
carla.AttachmentType.SpringArm) :运动经过平滑处理,避免突然加速或减速。推荐用于录制仿真视频,可使画面流畅,避免摄像机位置更新时出现"跳跃"。
-
幽灵弹簧臂附着(
carla.AttachmentType.SpringArmGhost) :与弹簧臂类似,但不进行碰撞检测,因此传感器可能穿过墙壁或其他几何体。
python
sensor = world.spawn_actor(
sensor_blueprint,
transform,
attach_to=my_vehicle,
attachment_type=carla.AttachmentType.SpringArm
)
监听(Listening)
每个传感器都有一个 listen() 方法,在每次获取数据时被调用。
该方法接收一个回调函数(callback)作为参数,通常是一个 lambda 函数,用于定义数据到达时应执行的操作。回调函数必须接受传感器数据作为输入参数。
python
# 每当摄像头生成新图像时,调用 do_something() 函数
sensor.listen(lambda data: do_something(data))
...
# 碰撞传感器:每次检测到碰撞时打印信息
def callback(event):
for actor_id in event:
vehicle = world_ref().get_actor(actor_id)
print('Vehicle too close: %s' % vehicle.type_id)
sensor02.listen(callback)
数据(Data)
大多数传感器数据对象都提供将信息保存到磁盘的方法,便于在其他环境中使用。
不同传感器的数据结构差异较大,详情请参阅《传感器参考文档》。但所有传感器数据都包含以下基本信息:
| 传感器数据属性 | 类型 | 描述 |
|---|---|---|
frame |
int |
测量发生时的帧号 |
timestamp |
double |
自仿真开始以来的模拟时间戳(单位:秒) |
transform |
carla.Transform |
测量时刻传感器在世界坐标系中的位姿 |
重要提示
is_listening():检查传感器是否已通过listen()注册了回调函数。stop():停止传感器监听。sensor_tick:蓝图属性,设置接收数据之间的仿真时间间隔。
传感器类型(Types of sensors)
摄像头(Cameras)
从自身视角拍摄世界画面。对于输出 carla.Image 的摄像头,可使用辅助类 carla.ColorConverter 将图像转换为不同信息表示形式。
数据获取频率:每一步仿真。
| 传感器 | 输出类型 | 概述 |
|---|---|---|
| RGB | carla.Image |
提供清晰的环境视觉,类似普通场景照片。 |
| 广角(Wide angle) | carla.Image |
支持广角、鱼眼、360度等非标准相机模型。 |
| 深度(Depth) | carla.Image |
以灰度图渲染视野内物体的深度信息。 |
| 光流(Optical Flow) | carla.Image |
渲染每个像素相对于摄像头的运动矢量。 |
| 语义分割(Semantic segmentation) | carla.Image |
根据物体标签,用特定颜色渲染视野内元素。 |
| 实例分割(Instance segmentation) | carla.Image |
在语义分割基础上,为每个独立物体分配唯一ID并着色。 |
| 动态视觉传感器(DVS) | carla.DVSEventArray |
异步输出亮度变化事件流,模拟类脑视觉传感器。 |
探测器(Detectors)
当所附着的物体触发特定事件时才返回数据。
数据获取时机:事件触发时。
| 传感器 | 输出类型 | 概述 |
|---|---|---|
| 碰撞(Collision) | carla.CollisionEvent |
检测其父级参与者与其他物体的碰撞。 |
| 车道入侵(Lane invasion) | carla.LaneInvasionEvent |
当父级参与者跨越车道线时触发。 |
| 障碍物(Obstacle) | carla.ObstacleDetectionEvent |
检测父级参与者前方可能存在的障碍物。 |
其他传感器(Other)
提供导航、物理量测量、场景2D/3D点云等功能。
数据获取频率:每个仿真步。
| 传感器 | 输出类型 | 概述 |
|---|---|---|
| GNSS | carla.GNSSMeasurement |
获取传感器的地理经纬度位置。 |
| IMU | carla.IMUMeasurement |
包含加速度计、陀螺仪和电子罗盘。 |
| 激光雷达(LIDAR) | carla.LidarMeasurement |
旋转式激光雷达,生成包含坐标和强度的4D点云,用于建模环境。 |
| 雷达(Radar) | carla.RadarMeasurement |
生成2D点图,表示视野内物体及其相对于传感器的运动。 |
| RSS | carla.RssResponse |
根据安全检查调整施加于车辆的控制指令。该传感器工作方式与其他传感器不同,有专门的RSS文档说明。 |
| 语义激光雷达(Semantic LIDAR) | carla.SemanticLidarMeasurement |
旋转式激光雷达,生成3D点云,并附加实例ID和语义分割信息。 |