【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

相关推荐
高洁011 小时前
循环神经网络讲解
人工智能·python·神经网络·机器学习·transformer
Sagittarius_A*1 小时前
深度学习预备知识:数据操作、线性代数与微积分基础
人工智能·深度学习·线性代数·ai
小猫挖掘机(绝版)1 小时前
在Ubuntu 20.04 部署DiffPhysDrone并在Airsim仿真完整流程
linux·ubuntu·自动驾驶·无人机·端到端
子午1 小时前
【中草药识别系统】Python+TensorFlow+Django+人工智能+深度学习+卷积神经网络算法
人工智能·python·深度学习
数据门徒1 小时前
《人工智能现代方法(第4版)》 第4章 复杂环境中的搜索 学习笔记
人工智能·算法
许泽宇的技术分享1 小时前
X-AnyLabeling深度解析:让AI标注像呼吸一样自然
人工智能
Hernon1 小时前
AI智能体 - 人机协同模式
人工智能·ai智能体·ai开发框架·ai智能体设计方法论
新智元1 小时前
库克告别苹果,「九子夺嫡」争夺 CEO 大战开始了
人工智能·openai
菜鸟‍1 小时前
【论文学习】SAMed-2: 选择性记忆增强的医学任意分割模型
人工智能·学习·算法