☰
CarlaAir同步与异步模式详解:为什么数据采集必须用同步模式,以及如何避免仿真器冻结
2026/10/15 10:22:37 网站建设 项目流程

【免费下载链接】CarlaAir

CarlaAir: Fly Drones Inside a CARLA World!! A Unified Infrastructure for Air-Ground Embodied Intelligence

项目地址:https://gitcode.com/gh_mirrors/ca/CarlaAir
点击查看免费下载

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)

⚠️避坑三要点

  1. 开启同步前,先用world.get_settings()保存原始设置,finally里恢复;
  2. Traffic Manager 的set_synchronous_mode(True)别漏,否则 autopilot 车辆行为会与世界时钟脱节;
  3. 无人机(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

项目地址:https://gitcode.com/gh_mirrors/ca/CarlaAir
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询