Part 3:相机与传感器(RGB / 深度 / 分割 / LiDAR)
🎮 面向 AirSim / Python / C++ 的开发者
📷 全面解析 AirSim 支持的各类视觉与激光传感器
💡 含:配置、调用、数据格式、常见坑、同步与延迟处理
📋 本章目录
- [AirSim 视觉系统总览](#AirSim 视觉系统总览)
- [RGB 相机(Scene)](#RGB 相机(Scene))
- 深度相机(Depth)
- 语义分割相机(Segmentation)
- [红外 / 景深(Infrared / DepthPlanner)](#红外 / 景深(Infrared / DepthPlanner))
- [LiDAR 激光雷达](#LiDAR 激光雷达)
- 传感器数据同步、延迟、噪声与校准
- 最佳实践与常见错误
1. AirSim 视觉系统总览
AirSim 的图像传感器由 CameraComponent + Render Pipeline 驱动,所有相机的数据最终通过 API:
simGetImage()
simGetImages()
simGetCameraInfo()
simSetCameraPose()
返回为 压缩 PNG 或 原始浮点数组。
AirSim 支持的关键图像类型
| 图像类型 | API 枚举 | 数据格式 | 用途 |
|---|---|---|---|
| RGB(Scene) | ImageType.Scene |
PNG/Uncompressed | 训练检测/识别模型 |
| 深度(DepthPlanner / DepthPerspective) | ImageType.DepthPlanner |
float32 数组 | 深度学习、SLAM |
| 语义分割 | ImageType.Segmentation |
PNG,实例ID着色 | 分割训练标签 |
| 表面法线 | ImageType.SurfaceNormals |
float | 三维几何特征 |
| IR 红外 | ImageType.Infrared |
灰度 | 夜间视觉 |
| Lidar 点云 | LidarData | xyz + intensity | 三维重建、导航 |
2. RGB 相机(Scene)
最常用,也是训练视觉算法的核心输入
🎯 关键能力
- 输出高质量 PNG / raw
- 支持更换相机内参
- 支持外参调整(位姿)
- 支持多相机同步渲染
🎮 配置(settings.json)
jsonc
"Vehicles": {
"Drone1": {
"Cameras": {
"front_rgb": {
"CaptureSettings": [
{
"ImageType": 0, // Scene
"Width": 1280,
"Height": 720,
"FOV_Degrees": 90,
"AutoExposure": true
}
],
"X": 0, "Y": 0, "Z": 0,
"Pitch": 0, "Roll": 0, "Yaw": 0
}
}
}
}
📸 单帧抓取(Python)
python
responses = client.simGetImages([
airsim.ImageRequest("front_rgb", airsim.ImageType.Scene, pixels_as_float=False)
])
img = responses[0]
# 保存
airsim.write_file("rgb.png", img.image_data_uint8)
📌 小技巧:快速 NumPy 转换
python
import numpy as np
rgb = np.frombuffer(img.image_data_uint8, dtype=np.uint8)
rgb = rgb.reshape(img.height, img.width, 3)
3. 深度相机(Depth)
SLAM / 深度估计 / 规划 的必备输入。
AirSim 深度图分两类:
| 类型 | 枚举 | 特点 |
|---|---|---|
| DepthPlanner | ImageType.DepthPlanner |
线性深度(真实米) |
| DepthPerspective | ImageType.DepthPerspective |
受透视影响,适合相机模型训练 |
Python 示例:获取深度
python
resp = client.simGetImages([
airsim.ImageRequest("front_depth", airsim.ImageType.DepthPlanner, True)
])[0]
depth = np.array(resp.image_data_float, dtype=np.float32)
depth = depth.reshape(resp.height, resp.width)
⚠ 常见坑
- 深度返回值单位是 米
- 飞行器穿模时深度会瞬间 0
- HDR/阴影强烈的场景深度可能跳变
4. 语义分割(Segmentation)
AirSim 的强项之一:自带真值分割图,质量稳定
✨ 特性
- 每个 mesh 都可设置分类 ID
- 渲染出来的是 彩色语义图
- 可用于训练 PSPNet / DeepLab / YOLO-Seg
settings.json 配置
jsonc
"SegmentationSettings": {
"InitMethod": "None",
"OverrideExisting": false
}
设置分割 ID(Python)
python
client.simSetSegmentationObjectID("Ground.*", 20, True)
client.simSetSegmentationObjectID("Tree.*", 50, True)
读取分割图
python
resp = client.simGetImages([
airsim.ImageRequest("front", airsim.ImageType.Segmentation, False, False)
])[0]
airsim.write_file("seg.png", resp.image_data_uint8)
5. 红外 / 景深(Infrared)
夜视、多模态感知场景常用
IR 数据本质是灰度图,AirSim 通过 shader 模拟热成像(并非真实热模型)
python
resp = client.simGetImage("front_ir", airsim.ImageType.Infrared)
airsim.write_file("ir.png", resp)
6. LiDAR 激光雷达
多机器人导航 / 三维栅格 / SLAM 的核心传感器
AirSim 的 LiDAR 为基于 Unreal 的 射线追踪模拟。
settings.json 配置(核心参数)
jsonc
"Lidar1": {
"SensorType": 6,
"Enabled": true,
"NumberOfChannels": 16,
"PointsPerSecond": 50000,
"X": 0, "Y": 0, "Z": -1,
"VerticalFOVUpper": 10,
"VerticalFOVLower": -10,
"HorizontalRotationFrequency": 10,
"DrawDebugPoints": true
}
Python 获取点云
python
lidar = client.getLidarData("Lidar1")
pts = np.array(lidar.point_cloud, dtype=np.float32).reshape(-1, 3)
print("点云数量: ", pts.shape)
数据格式
point_cloud:[x1, y1, z1, x2, y2, z2, ...]- 单位:米
- 坐标系:AirSim NED(北-东-下)
7. 数据同步、延迟、噪声、校准
大规模仿真时必须解决的问题
⭐ 同步抓取多传感器
python
responses = client.simGetImages([
airsim.ImageRequest("front", airsim.ImageType.Scene),
airsim.ImageRequest("front", airsim.ImageType.DepthPlanner),
airsim.ImageRequest("front", airsim.ImageType.Segmentation)
])
AirSim 内部会统一渲染时间戳,理论上同步。
⭐ 传感器延迟
可在 settings.json 配置:
json
"CameraDefaults": { "Delay": 0.01 }
"Lidar1": { "SensorDelay": 0.005 }
⭐ 加噪声(训练更真实)
json
"NoiseSettings": {
"Enabled": true,
"ImageType": 0,
"RandNoise": 0.02
}
⭐ 内参与标定
可指定相机内参:
json
"Intrinsic": {
"FocalLength": 320,
"PrincipalPointX": 320,
"PrincipalPointY": 240
}
8. 最佳实践与常见错误
✔ 1. 用 simGetImages 批量获取
比单帧快 3--5 倍,保证同步。
✔ 2. 不要每帧写 PNG
I/O 代价巨大,建议缓存为 .npy。
✔ 3. 不要用 Scene 光照做 SLAM
光照会变,建议用 Depth/IR。
✔ 4. 使用 DrawDebugRay 可辅助调试 LiDAR
方便检查激光角度是否配置错。
✔ 5. 多场景训练时记得随机化天气
python
client.simEnableWeather(True)
client.simSetWeatherParameter(airsim.WeatherParameter.Rain, 0.7)
🎉祝你天天开心,我将更新更多有意思的内容,欢迎关注!
最后更新:2025年12月
作者:Echo