📌 测试用例
PythonAPI/examples/sensor_synchronization.py
多传感器同步采集的底层实现示例,用于:
- 演示 CARLA 同步模式下多传感器数据对齐的原理
- 提供线程安全的传感器数据收集机制
- 验证所有传感器是否在每帧都成功返回数据
适用于理解 CARLA 同步机制、开发自定义传感器同步逻辑、调试传感器丢失问题。
World's frame:39070541Frame:39070541Sensor: lidar01 Frame:39070541Sensor: camera01 Frame:39070541Sensor: camera02 Frame:39070541Sensor: camera03 Frame:39070541Sensor: radar01 Frame:39070541Sensor: radar02 Frame:39070541Sensor: lidar02🔑 主要模块解析
1.同步模式配置(基础设置)
settings.fixed_delta_seconds=0.2# 5 FPS 仿真步长settings.synchronous_mode=Trueworld.apply_settings(settings)- 关键参数:
fixed_delta_seconds=0.2→ 每 200ms 推进一帧 - 同步模式:确保
world.tick()返回时所有传感器数据已就绪
⚠️ 注意:此脚本不处理传感器数据内容,仅验证数据到达。
2.传感器回调机制(核心设计)
defsensor_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.主循环同步逻辑(关键创新)
whileTrue:world.tick()# 推进仿真w_frame=world.get_snapshot().frame# 等待所有传感器数据for_inrange(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 同步机制的最小可行示例,特别适合需要深度定制传感器同步逻辑的高级应用场景。