如何用AirSim生成深度学习训练数据?录制与API自定义日志完整指南
2026/9/18 18:59:32 网站建设 项目流程

如何用AirSim生成深度学习训练数据?录制与API自定义日志完整指南

【免费下载链接】AirSimOpen source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI & Research项目地址: https://gitcode.com/gh_mirrors/ai/AirSim

AirSim训练数据生成是微软开源自动驾驶/无人机模拟器 AirSim 最实用的能力之一:你既可以通过内置的一键录制功能(按 R 键或 API 控制)自动保存图像+位姿日志,也可以调用AirSim Python API自定义采集流程,把深度图、分割图、LiDAR 点云等任意传感器数据按自己想要的格式落盘,直接喂给 PyTorch / TensorFlow 做深度学习训练。本文完整讲清这两种数据生成方式 🚁。


一、两种数据生成方式:先搞清楚选哪种

方式适用场景控制方式输出格式
① 内置录制(Recording)快速批量收集"图像+位置/姿态"数据settings 配置 + R 键 /startRecording()airsim_rec.txt制表符日志 +images/图像文件夹
② API 自定义采集需要深度、分割、LiDAR、自定义命名/格式自己写 Python 脚本循环调用 API完全由你的代码决定

💡 新手建议:先用方式①跑通,需要更复杂的标签或传感器组合时再迁移到方式②。


二、方式①:配置AirSim录制参数,一键开始采集

2.1 录制功能在哪里配置

打开你项目的settings.json(通常在Unreal/Environments/Blocks/Blocks/settings.json),找到Recording配置节,完整说明见 docs/settings.md。核心参数速查:

  • Enabled:设为true时,模拟器一启动就自动开始录制,适合挂机跑长数据;
  • RecordInterval:相邻两帧图像的最小间隔(秒),控制数据密度;
  • RecordOnMove:设为true时,车辆位置和姿态没变化就不记录,避免堆积大量重复帧;
  • Folder:录制数据保存的父目录(需绝对路径),每次录制会按时间戳年-月-日-时-分-秒建子文件夹,不设置时默认存到Documents/AirSim
  • Cameras:指定采集哪些相机、哪种图像类型、是否压缩,甚至可以为多辆车分别指定不同相机。

2.2 为多辆车配置不同相机(深度学习常用配置)

Cameras是 JSON 数组,可以为每辆车指定不同的 ImageType。比如下面这段配置:Car1同时采集场景图(ImageType 0)和语义分割图(ImageType 5)Car2只采场景图——这对做目标检测/语义分割训练非常关键,分割图就是现成的像素级标签:

"Recording": { "Enabled": true, "RecordInterval": 0.1, "Folder": "/home/user/airsim_data", "Cameras": [ { "CameraName": "0", "ImageType": 0, "VehicleName": "Car1", "Compress": true }, { "CameraName": "0", "ImageType": 5, "VehicleName": "Car1", "Compress": true }, { "CameraName": "0", "ImageType": 0, "VehicleName": "Car2", "Compress": true } ] }

⚠️ 注意:Cameras留空数组[]表示只记录物理数据、不存图像;外部相机暂不支持录制。

2.3 开始与停止:R 键 + 三个录制API

  • 手动:模拟运行时按R键或点击右下角红色录制按钮即可开始/停止;
  • API:通过 PythonClient 客户端 在脚本中控制,详见 docs/apis.md:
import airsim client = airsim.MultirotorClient() client.confirmConnection() client.startRecording() # 开始录制(按settings里的参数执行) # ... 执行飞行/驾驶任务 ... client.isRecording() # 查询当前是否正在录制 client.stopRecording() # 停止录制

API 与 R 键是联动的:用 R 开启的录制可以用 API 停止,反之亦然,视口左上角还会弹出提示日志。

2.4 录出来的数据长什么样

每次录制生成一个时间戳文件夹,内含:

  • airsim_rec.txt:制表符分隔的日志。多旋翼记录车辆名 时间戳 POS_X POS_Y POS_Z Q_W Q_X Q_Y Q_Z 图像文件名;汽车额外包含油门、转向、刹车、档位、转速、车速等列;
  • images/:与日志逐行对应的图像文件(默认压缩 PNG)。

这个"日志行 ↔ 图像文件"一一对应的结构,天然就是训练集的格式,配合 LogViewer 还能可视化回放检查数据质量。


三、方式②:用API自定义采集,拿到深度、点云等任意数据

内置录制只保存 settings 里声明的内容。如果你的训练任务需要深度图(Ground Truth 距离标签)LiDAR 点云、自定义文件命名等,推荐直接用 API 循环采集。

3.1 核心套路:设置位姿 → 取图 → 存盘

以最常见的"随机位姿批量采图"为例(完整可运行的 C++ 参考实现见 Examples/DataCollection/DataCollectorSGM.h,它一次性采集左/右 RGB 图 + 深度图 + 视差图并自动建好训练目录结构):

import airsim, cv2, numpy as np client = airsim.MultirotorClient() client.confirmConnection() reqs = [ airsim.ImageRequest("front", airsim.ImageType.Scene, False, False), airsim.ImageRequest("front", airsim.ImageType.DepthPlanar, True, False), ] for i in range(1000): # 1) 随机摆一个位姿(也可用你自己的轨迹生成器) pose = client.getVehiclePose().kinematics_estimated client.simSetVehiclePose(pose, True) client.simWaitForKey(' ') if False else client.simSleep(0.5) # 2) 一次RPC同时取RGB+深度 resp = client.simGetImages(reqs) # 3) 按训练集格式落盘 cv2.imwrite(f"data/{i:06d}.png", np.frombuffer(resp[0].image_data_uint8, np.uint8).reshape(resp[0].height, resp[0].width, 4)[..., :3]) # 深度数据(浮点)建议存pfm格式,避免0-255量化损失 airsim.write_pfm_image(f"data/depth_{i:06d}.pfm", np.frombuffer(resp[1].image_data_float, np.float32).reshape(resp[1].height, resp[1].width))

几个关键技巧:

  • 一次simGetImages传多个请求,比多次调用省 RPC 开销;
  • 深度图用DepthPlanar+pixels_as_float=True拿到浮点距离,再存成 PFM 格式(AirSim 自带 读写工具),不要用 PNG 存深度,否则会量化成 0–255 丢失精度;
  • 采集前检查simGetCollisionInfo(),撞上就换位姿重采(参考 DataCollectorSGM 的做法);
  • 需要 LiDAR 点云的话,调用simGetLidarData()即可,效果如下:

3.2 现成的采集示例脚本

仓库里有一批可直接改造的 Python 示例,都在 PythonClient 目录下:

示例用途
PythonClient/computer_vision/cv_capture.py批量采集多种类型相机图像
PythonClient/computer_vision/ground_truth.py采集 Ground Truth 数据
PythonClient/multirotor/survey.py无人机航拍式巡线采图
PythonClient/imitation_learning/cook_data.py模仿学习驾驶数据采集+训练全流程
PythonClient/reinforcement_learning/DQN 强化学习完整环境封装


四、进阶:修改录制日志,加入GPS/IMU等自定义字段

默认录制的字段太少?AirSim 允许你从源码级扩展airsim_rec.txt的每一行内容,方法见 docs/modify_recording_data.md:

  1. 核心方法是PawnSimApi::getRecordFileLine,汽车已在 CarPawnSimApi.cpp 中覆写追加了油门/刹车等字段;
  2. 给多旋翼加字段(如 GPS 经纬度、气压计、IMU 加速度),只需在 MultirotorPawnSimApi.cpp 里覆写同名方法,在表头和数据行末尾追加vehicle_api_->getBarometerData("")getImuData("")等 API 的返回值即可;
  3. 改完需要从源码重新编译(可参考 docs/build_linux.md)。

五、批量采集的效率优化清单 🚀

  • 关掉主画面渲染:把 settings 中ViewMode设为"NoDisplay",冻结主屏渲染但录制/API 采集照常工作,省 GPU 资源、还能提升采集 FPS;
  • RecordOnMove: true:静止不录帧,显著减少无效数据;
  • Compress: true:图像存压缩 PNG;只有深度等浮点数据才用PixelsAsFloat+ PFM;
  • TimeOfDay开启动态光照(见 docs/settings.md),一次跑完就能拿到不同时段光照的训练样本,增强模型鲁棒性;
  • 多车并行Cameras配置里用VehicleName区分车辆,一套场景同时采集多辆车的视角;
  • 数据质检:采集结束后用 LogViewer 打开airsim_rec.txt回放,快速排查丢帧、撞机异常等坏样本。


常见问题(FAQ)

Q1:录制的图像是逐帧对齐的吗?是。airsim_rec.txt每行末尾的ImageFile列直接指向对应图像,时间戳精确到采样时刻,可严格对齐。

Q2:能同时采 RGB、分割、深度三种图吗?内置录制可以:在Cameras数组里为同一CameraName添加多条不同ImageType的记录即可;用 API 方式则把多个ImageRequest放进同一次simGetImages调用。

Q3:深度图为什么推荐 PFM 而不是 PNG?PNG 像素只有 0–255 整数量程,深度值会被压缩失真;PFM 以浮点存储像素,是保存深度/视差 Ground Truth 的标准格式。

Q4:想要真机-仿真联合训练数据怎么办?可以用 MavLinkTest 录制真实无人机的操纵日志,再用 Playback 功能 在 AirSim 中重放同样的动作,对比生成仿真数据集。


📌小结:快速收集"图像+位姿"就用Recording 配置 +startRecording()API;需要深度、点云、自定义格式就用API 循环自定义采集(参考 DataCollectorSGM.h);日志字段不够就改getRecordFileLine。掌握这三层递进,AirSim 就能成为你的深度学习数据工厂 ⚙️。

【免费下载链接】AirSimOpen source simulator for autonomous vehicles built on Unreal Engine / Unity, from Microsoft AI & Research项目地址: https://gitcode.com/gh_mirrors/ai/AirSim

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

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

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

立即咨询