自动驾驶—CARLA仿真(29)传感器(Sensors and data)

传感器使用详解

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和语义分割信息。
相关推荐
冬奇Lab42 分钟前
OpenClaw 源码精读(2):Channel & Routing——一条消息如何找到它的 Agent?
人工智能·开源·源码阅读
冬奇Lab43 分钟前
一天一个开源项目(第38篇):Claude Code Telegram - 用 Telegram 远程用 Claude Code,随时随地聊项目
人工智能·开源·资讯
格砸2 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
可观测性用观测云2 小时前
可观测性 4.0:教系统如何思考
人工智能
sunny8653 小时前
Claude Code 跨会话上下文恢复:从 8 次纠正到 0 次的工程实践
人工智能·开源·github
小笼包包仔3 小时前
OpenClaw 多Agent软件开发最佳实践指南
人工智能
smallyoung3 小时前
AgenticRAG:智能体驱动的检索增强生成
人工智能
_skyming_3 小时前
OpenCode 如何做到结果不做自动质量评估,为什么结果还不错?
人工智能
HXhlx3 小时前
CART决策树基本原理
算法·机器学习
南山安3 小时前
手写 Cursor 核心原理:从 Node.js 进程到智能 Agent
人工智能·agent·设计