【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

相关推荐
To_OC12 小时前
大模型蒸馏是啥?说白了就是大厨带徒弟的学问
人工智能·llm·agent
新手来了@click12 小时前
JAVA+AI 简化开发操作|文章被 AI Agent 技术社区收录分享
人工智能
GuWenyue12 小时前
Cursor黑盒拆解!1套LangChain.js手写Mini编程Agent,自动生成React项目,效率提升60%
前端·数据库·人工智能
GuWenyue12 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
老云讲算力市场13 小时前
WAIC首日观察:国产算力与机器人加速落地,奇点算力迎来产业新机遇
人工智能·科技
糖果店的幽灵13 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
小林ixn13 小时前
大模型随机说话的秘密:Temperature 和 Top K 深度解析,LangChain 实战调优
人工智能·langchain
ALINX技术博客13 小时前
ALINX 亮相 2026 WAIC 世界人工智能大会,展示 AI 视觉 FPGA+GPU 异构计算与电子后视镜解决方案
人工智能·ai·fpga·世界人工智能大会·电子后视镜
程序员老猫14 小时前
当 AI 能写 80% 的代码时,后端工程师的核心价值还剩什么?
人工智能
想会飞的蒲公英14 小时前
计算机怎样读取中文文本:编码、清洗与标准化
人工智能·python·自然语言处理