【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

相关推荐
阿坤带你走近大数据12 小时前
如何解决农业数据的碎片化问题
大数据·人工智能·rag·大模型应用
Modeler·X12 小时前
关系型与非关系型数据库终极对决
数据库·人工智能
颜淡慕潇13 小时前
动态代理赋能:高效爬取沃尔玛海量商品信息与AI分析实战
人工智能·后端
LOnghas121113 小时前
长须鲸目标检测_YOLO13-C3k2-OREPA改进方案实战
人工智能·目标检测·计算机视觉
Hcoco_me13 小时前
大模型面试题75:讲解一下GRPO的数据回放
人工智能·深度学习·算法·机器学习·vllm
赫尔·普莱蒂科萨·帕塔13 小时前
“共享”机器人
人工智能·机器人·agi
duyinbi751713 小时前
改进YOLO13模型:C3k2与PPA优化在油田工人安全装备检测与行为识别中的应用
人工智能·安全·目标跟踪
明洞日记14 小时前
【CUDA手册002】CUDA 基础执行模型:写出第一个正确的 Kernel
c++·图像处理·算法·ai·图形渲染·gpu·cuda
Duang007_14 小时前
【LeetCodeHot100 超详细Agent启发版本】两数之和 (Two Sum)
java·人工智能·python
Ydwlcloud14 小时前
AWS 2026折扣活动深度解析:寻找最大优惠的智慧路径
大数据·服务器·人工智能·云计算·aws