【免费下载链接】CarlaAir
CarlaAir: Fly Drones Inside a CARLA World!! A Unified Infrastructure for Air-Ground Embodied Intelligence
CarlaAir 是一个整合 CARLA 与 AirSim 的空地一体仿真平台,支持车辆在街道行驶、无人机在楼宇间飞行,并采集 RGB/深度/语义等多模态传感器数据。对新手来说,最容易踩的坑就是同步模式(synchronous mode)与异步模式(asynchronous mode)的混淆:用错模式会导致采集数据帧对不齐,而退出脚本时忘记恢复设置,则会让整个仿真器卡死冻结。本文将讲透两者的区别、正确开启同步模式的步骤,以及一套"永不冻结"的收尾写法。
一、两种模式:CarlaAir 的默认行为与数据采集的区别
CarlaAir 基于 CARLA 引擎,仿真世界有两种时间推进方式:
| 对比项 | 异步模式(默认) | 同步模式 |
|---|---|---|
| 时间推进 | 仿真器自己按 GPU 帧率跑,步长不固定 | 由你的脚本调用world.tick()主动推进,固定步长 |
| 帧与时间 | 每帧耗时不同,时间不精确 | fixed_delta_seconds固定物理步长(如 1/30 秒) |
| 适用场景 | 键盘开车、手动操控无人机、实时探索 | 数据采集、演示回放、视频录制 |
| 传感器数据 | 多传感器帧号可能不一致 | 所有传感器数据带同一帧号,帧帧对齐 |
官方 FAQ 对这一点的总结很精炼:异步模式适合交互式操作,同步模式适合数据采集、演示回放和视频录制。
上图是一条无人机降落轨迹的采集与回放分析。可以看到每个时刻t1~t5都严格对应一个仿真帧——只有在同步模式下,"轨迹帧号 ↔ 传感器帧号 ↔ 时间戳"才能一一对应,后续做标注、评估、训练才可靠。而异步模式下,物理步长随渲染帧率漂移,采集出的数据时间戳是"抖动"的。
二、如何开启同步模式:四步完成配置
开启同步模式只需要改WorldSettings,但有一个容易漏掉的细节:Traffic Manager 也要跟着切到同步。完整步骤如下:
settings = world.get_settings() settings.synchronous_mode = True settings.fixed_delta_seconds = 1.0 / 30.0 # 30 Hz 固定物理步长 world.apply_settings(settings) tm = client.get_trafficmanager(8000) tm.set_synchronous_mode(True) # TM 必须与世界同步模式一致之后主循环里每帧手动调用world.tick()推进仿真,再收集各传感器的当帧数据。
项目里多个示例都是这样做的,可以直接对照阅读:
- 空地分屏演示:examples/air_ground_sync.py(世界同步)与 examples/air_ground_sync.py(Traffic Manager 同步)
- 车辆轨迹录制:examples/recording/record_vehicle.py
- 官方通用同步上下文管理器
CarlaSyncMode:PythonAPI/examples/synchronous_mode.py,它在with块内自动开启同步模式,退出时自动恢复原设置 - 导演回放模式:examples/recording/demo_director.py
💡
fixed_delta_seconds常用取值:1/30(30 Hz,兼顾流畅与精度)或1/20(20 Hz,轻量机器更稳)。录制轨迹类数据一般用 0.05s 步长即可。
三、仿真器冻结的根因与正确收尾方法
为什么脚本一退出,仿真器就"冻结"了?
因为开启同步模式后,仿真器会停止自主推进时间,被动等待客户端调用world.tick()。如果你的脚本退出时没有关掉同步模式,就没有人会再调用tick()了——世界就永远停在最后一帧,表现为画面冻结、键盘无法驾驶。这也是新手最高频的"事故"。
解决方法只有一个原则:进同步,必出同步。推荐用try/finally保证任何退出路径(正常结束、异常、Ctrl+C)都会恢复:
original_settings = world.get_settings() # ① 先保存原始设置 settings = world.get_settings() settings.synchronous_mode = True settings.fixed_delta_seconds = 0.05 world.apply_settings(settings) try: ... # 你的采集主循环 finally: world.apply_settings(original_settings) # ② 无论成功失败都恢复项目里的工具函数把这套逻辑封装成了现成工具,值得收藏:
- 一键恢复异步:examples/recording/trajectory_helpers.py 的
cleanup_world(..., restore_async=True) - 后台交通脚本的自我保护:examples/auto_traffic.py 在启动时会检测世界是否残留同步模式,发现就主动切回异步并打印警告——说明官方示例对"冻结残留"问题非常重视
同步模式还有个附带好处:场景可复现。同样的地图、天气与步长下,每次采集的数据序列一致,方便做对照实验和回归验证。上图中 Town01~Town10HD 在不同天气下的画面,都可以通过固定天气参数 + 同步模式稳定地批量复现采集。
四、实战建议:按任务选模式的决策清单
🚗用异步模式(默认,什么都不用改)
- 用 WASD 键盘开车、手动操控无人机等交互体验
- 快速验证脚本逻辑、调试传感器配置
- 长时间挂着后台交通流(配合 examples/auto_traffic.py)
📸用同步模式
- 采集多传感器对齐的数据集(相机、LiDAR、语义分割)
- 录制轨迹并回放(examples/recording/ 录制工具集全为同步模式)
- 导演模式拍 MP4 演示视频(examples/recording/demo_director.py)
⚠️避坑三要点
- 开启同步前,先用
world.get_settings()保存原始设置,finally里恢复; - Traffic Manager 的
set_synchronous_mode(True)别漏,否则 autopilot 车辆行为会与世界时钟脱节; - 无人机(AirSim 通道)的轨迹录制建议保持异步交互起飞、再录轨迹,官方脚本 examples/recording/record_drone.py 专门为此设计,避免同步模式下的操控卡死问题。
五、小结
一句话总结本文的 CarlaAir 同步/异步模式指南:
- 异步模式是默认模式,仿真器自驱动,适合交互探索;
- 同步模式由脚本驱动,固定
fixed_delta_seconds步长,是数据采集与视频录制的必备模式; - 冻结的唯一解法是
try/finally+ 恢复原始设置,Traffic Manager 同步开关要一并配置。
想进一步上手,可以从 CarlaAir_Release/guide/Quick-Start.md 的 10 分钟入门开始,遇到具体报错再查 CarlaAir_Release/guide/FAQ.md 的"同步 / 异步模式"章节。掌握这两类模式后,你就能在 CarlaAir 里稳定地产出帧帧对齐、可复现的空地一体仿真数据了。
【免费下载链接】CarlaAir
CarlaAir: Fly Drones Inside a CARLA World!! A Unified Infrastructure for Air-Ground Embodied Intelligence
相关推荐
UniRelight性能优化技巧:在NVIDIA A100上实现最快推理速度的7个方法
UniRelight性能优化技巧:在NVIDIA A100上实现最快推理速度的7个方法 UniRelight是一款先进的重照明框架,能够联合建模场景内在属性和光
Serverless Offline Lambda调用详解:同步与异步调用模式全掌握
Serverless Offline Lambda调用详解:同步与异步调用模式全掌握 Serverless Offline 是一个强大的本地开发工具,它能够模拟
开发工具云原生后端FlutterFire离线同步设计模式库:Firebase同步模式集合
FlutterFire离线同步设计模式库:Firebase同步模式集合 1. 离线同步核心价值与挑战 在移动应用开发中,网络不稳定或完全断网的场景普遍存在。Fl
后端移动开发
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考