测试用例
PythonAPI/examples/visualize_multiple_sensors.py
carla_vis_multiple_sensors
这是一个 多传感器同步可视化示例 ,用于在 单个 Pygame 窗口中以网格布局同时显示多个传感器数据,包括:
- 多视角 RGB 摄像头(前、后、左、右)
- 3D LiDAR 点云(投影为 2D 图像)
- 语义 LiDAR(Semantic LiDAR)
适用于传感器融合、感知系统调试等场景。
🔑 主要模块解析
1. DisplayManager:统一显示管理器
- 功能:创建 Pygame 主窗口,并管理传感器子画面的布局。
- 核心特性 :
- 支持 网格布局 (如
[2, 3]表示 2 行 3 列) - 自动计算每个传感器画面的 尺寸 和 偏移位置
- 提供
render()方法统一刷新所有传感器画面 - 封装 Pygame 初始化与销毁逻辑
- 支持 网格布局 (如
- 关键方法 :
get_display_size():返回每个子画面的宽高get_display_offset(gridPos):根据网格位置[row, col]计算像素偏移
✅ 实现了 "一个窗口,多传感器视图" 的核心架构。
2. SensorManager:传感器抽象与数据处理
-
功能:封装各类传感器的生成、数据回调与渲染逻辑。
-
支持的传感器类型:
类型 CARLA 蓝图 数据处理方式 RGBCamerasensor.camera.rgb转为 NumPy → BGR → Pygame Surface LiDARsensor.lidar.ray_cast将 3D 点云 正交投影到 2D 平面,绘制为白点图 SemanticLiDARsensor.lidar.ray_cast_semantic同上,但含语义标签(本例未着色) Radarsensor.other.radar接收数据但未渲染(仅计时) -
关键机制:
- 自动匹配分辨率 :根据
DisplayManager的子画面尺寸设置传感器image_size_x/y - 异步监听 :通过
sensor.listen(callback)注册回调函数 - 性能统计 :记录每帧数据处理耗时(
time_processing)
- 自动匹配分辨率 :根据
✅ 实现了 传感器类型解耦 ,新增传感器只需扩展
init_sensor()和对应save_*_image方法。
3. 传感器配置与布局(核心演示部分)
在 run_simulation() 中定义了 6 个传感器 ,布局为 2 行 × 3 列:
网格位置 [row, col] |
传感器类型 | 安装位姿 |
|---|---|---|
[0, 0] |
RGBCamera | 左侧(yaw = -90°) |
[0, 1] |
RGBCamera | 正前方(yaw = 0°) |
[0, 2] |
RGBCamera | 右侧(yaw = +90°) |
[1, 1] |
RGBCamera | 后方(yaw = 180°) |
[1, 0] |
LiDAR | 车顶中心(64 线,100m 范围) |
[1, 2] |
SemanticLiDAR | 车顶中心(64 线,100m 范围) |
- 所有传感器均 附着于同一辆自动驾驶车辆(Dodge Charger 2020)
- 车辆启用
set_autopilot(True),在地图中自主行驶
💡 注释明确提示:修改
grid_size和SensorManager实例即可自定义布局与传感器数量(见 lines 290--308)。
4. 仿真控制模式
- 同步模式(默认) :
- 启用
synchronous_mode - 固定时间步长
0.05s(20 FPS) - 使用
world.tick()精确控制仿真推进
- 启用
- 异步模式(可选) :
- 使用
world.wait_for_tick()被动等待
- 使用
✅ 保证传感器数据与仿真状态严格同步,避免时间错位。
5. 主循环与交互
-
渲染循环 :
pythondisplay_manager.render() # 绘制所有传感器画面 -
退出控制 :
- 按
ESC或Q键退出 - 关闭窗口退出
- 按
✅ 总结
该脚本是 CARLA 多传感器可视化 的标准范例,展示了:
- 如何在单窗口中网格化布局多个传感器视图
- 如何抽象不同传感器的数据处理流程
- 如何实现同步/异步仿真下的稳定渲染
适用于开发者快速搭建感知系统调试界面,或用于教学演示多传感器协同工作效果。