📌 测试用例
PythonAPI/examples/sensor_synchronization.py
多传感器同步采集的底层实现示例,用于:
- 演示 CARLA 同步模式下多传感器数据对齐的原理
- 提供线程安全的传感器数据收集机制
- 验证所有传感器是否在每帧都成功返回数据
适用于 理解 CARLA 同步机制、开发自定义传感器同步逻辑、调试传感器丢失问题。
bash
World's frame: 39070541
Frame: 39070541 Sensor: lidar01
Frame: 39070541 Sensor: camera01
Frame: 39070541 Sensor: camera02
Frame: 39070541 Sensor: camera03
Frame: 39070541 Sensor: radar01
Frame: 39070541 Sensor: radar02
Frame: 39070541 Sensor: lidar02
🔑 主要模块解析
1. 同步模式配置(基础设置)
python
settings.fixed_delta_seconds = 0.2 # 5 FPS 仿真步长
settings.synchronous_mode = True
world.apply_settings(settings)
- 关键参数 :
fixed_delta_seconds=0.2→ 每 200ms 推进一帧 - 同步模式 :确保
world.tick()返回时所有传感器数据已就绪
⚠️ 注意:此脚本不处理传感器数据内容,仅验证数据到达。
2. 传感器回调机制(核心设计)
python
def sensor_callback(sensor_data, sensor_queue, sensor_name):
sensor_queue.put((sensor_data.frame, sensor_name))
- 轻量级回调 :仅将
(帧号, 传感器名)入队,不处理原始数据 - 线程安全 :使用
queue.Queue()确保多传感器并发写入安全 - 可扩展性 :注释中提示可直接入队原始数据(
sensor_data)
✅ 这是 生产级传感器管理的最佳实践:回调函数应尽量轻量。
3. 传感器部署(多样化配置)
| 传感器类型 | 数量 | 配置差异 |
|---|---|---|
| RGB 摄像头 | 3 | 默认配置(无位置/朝向设置) |
| LiDAR | 2 | 不同点云密度: - lidar01: 100K 点/秒 - lidar02: 1M 点/秒 |
| Radar | 2 | 默认配置 |
💡 设计意图 :
通过不同配置的传感器验证同步机制的鲁棒性(高负载 LiDAR 可能延迟)。
4. 主循环同步逻辑(关键创新)
python
while True:
world.tick() # 推进仿真
w_frame = world.get_snapshot().frame
# 等待所有传感器数据
for _ in range(len(sensor_list)):
s_frame = sensor_queue.get(True, 1.0) # 阻塞等待 1 秒
print("Frame: %d Sensor: %s" % (s_frame[0], s_frame[1]))
- 严格同步 :每帧必须收到 7 个传感器 的数据
- 超时处理:若 1 秒内未收齐,打印警告(可升级为报错)
- 帧号验证 :通过
sensor_data.frame确保数据属于当前仿真帧
⚠️ 重要限制 :
假设所有传感器每帧都触发(实际中雷达/LiDAR 可能因性能跳帧)。
❗ 与高级同步方案(PythonAPI/examples/synchronous_mode.py)的区别
| 特性 | 本脚本 | CarlaSyncMode 上下文管理器 |
|---|---|---|
| 数据处理 | 仅验证到达 | 可直接获取原始数据 |
| 易用性 | 需手动管理队列 | 封装为 with 语句 |
| 灵活性 | 适合底层调试 | 适合应用开发 |
| 错误处理 | 手动捕获 Empty |
自动帧对齐断言 |
💡 定位差异 :
本脚本是 同步机制的教学示例 ,而
CarlaSyncMode是 工程化封装。
✅ 总结
该脚本是 CARLA 多传感器同步原理的底层演示,展示了:
- 如何 通过队列实现线程安全的数据收集
- 如何 验证多传感器数据的帧级对齐
- 如何 处理传感器数据丢失的边界情况
💡 核心价值 :
为开发者提供了 理解 CARLA 同步机制的最小可行示例 ,特别适合需要 深度定制传感器同步逻辑 的高级应用场景。