【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

相关推荐
User_芊芊君子12 小时前
CANN数学计算基石ops-math深度解析:高性能科学计算与AI模型加速的核心引擎
人工智能·深度学习·神经网络·ai
小白|12 小时前
CANN与联邦学习融合:构建隐私安全的分布式AI推理与训练系统
人工智能·机器学习·自动驾驶
艾莉丝努力练剑12 小时前
hixl vs NCCL:昇腾生态通信库的独特优势分析
运维·c++·人工智能·cann
梦帮科技12 小时前
Node.js配置生成器CLI工具开发实战
前端·人工智能·windows·前端框架·node.js·json
程序员泠零澪回家种桔子12 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构
Echo_NGC223712 小时前
【FFmpeg 使用指南】Part 3:码率控制策略与质量评估体系
人工智能·ffmpeg·视频·码率
Var_al12 小时前
抖小Unity WebGL分包命令行工具实践指南
unity·游戏引擎·webgl
纤纡.12 小时前
PyTorch 入门精讲:从框架选择到 MNIST 手写数字识别实战
人工智能·pytorch·python
大大大反派12 小时前
CANN 生态中的自动化部署引擎:深入 `mindx-sdk` 项目构建端到端 AI 应用
运维·人工智能·自动化
程序猿追12 小时前
深度解读 AIR (AI Runtime):揭秘 CANN 极致算力编排与调度的核心引擎
人工智能