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