【AirSim 教程指南】Part 3:相机与传感器(RGB / 深度 / 分割 / LiDAR)

Part 3:相机与传感器(RGB / 深度 / 分割 / LiDAR)

🎮 面向 AirSim / Python / C++ 的开发者

📷 全面解析 AirSim 支持的各类视觉与激光传感器

💡 含:配置、调用、数据格式、常见坑、同步与延迟处理


📋 本章目录

  1. [AirSim 视觉系统总览](#AirSim 视觉系统总览)
  2. [RGB 相机(Scene)](#RGB 相机(Scene))
  3. 深度相机(Depth)
  4. 语义分割相机(Segmentation)
  5. [红外 / 景深(Infrared / DepthPlanner)](#红外 / 景深(Infrared / DepthPlanner))
  6. [LiDAR 激光雷达](#LiDAR 激光雷达)
  7. 传感器数据同步、延迟、噪声与校准
  8. 最佳实践与常见错误


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

相关推荐
快乐非自愿1 天前
RAG夺命10连问,你能抗住第几问?
人工智能·面试·程序员
千匠网络1 天前
破局出海壁垒,千匠网络新能源汽车跨境出海解决方案
人工智能
马丁聊GEO1 天前
解码AI用户心智,筑牢可信GEO根基——悠易科技深度参与《中国AI用户态度与行为研究报告(2026)》发布会
人工智能·科技
nap-joker1 天前
Fusion - Mamba用于跨模态目标检测
人工智能·目标检测·计算机视觉·fusion-mamba·可见光-红外成像融合·远距离/伪目标问题
一只幸运猫.1 天前
2026Java 后端面试完整版|八股简答 + AI 大模型集成技术(最新趋势)
人工智能·面试·职场和发展
Promise微笑1 天前
2026年国产替代油介损测试仪:油介损全场景解决方案与技术演进
大数据·网络·人工智能
深海鱼在掘金1 天前
深入浅出 LangChain —— 第三章:模型抽象层
人工智能·langchain·agent
生信碱移1 天前
PACells:这个方法可以鉴定疾病/预后相关的重要细胞亚群,作者提供的代码流程可以学习起来了,甚至兼容转录组与 ATAC 两种数据类型!
人工智能·学习·算法·机器学习·数据挖掘·数据分析·r语言
workflower1 天前
具身智能行业应用-生活服务业
大数据·人工智能·机器人·动态规划·生活
GitCode官方1 天前
基于昇腾 MindSpeed LLM 玩转 DeepSeekV4-Flash 模型的预训练复现部署
人工智能·开源·atomgit