AirSim 是一款基于虚幻引擎开发的开源模拟器,在无人机开发中,其摄像头数据采集功能至关重要。
支持多种摄像头类型
AirSim 支持多种常见摄像头类型,如场景摄像头(用于获取无人机视角下的彩色图像)、深度摄像头(可生成场景的深度信息,帮助无人机感知距离)以及鱼眼摄像头(提供更广阔的视野范围,适用于全景数据采集)。开发者能依据具体的开发需求,轻松在代码中选择并配置所需的摄像头类型。
灵活的数据采集配置
开发者可对摄像头参数进行精细设置,像图像分辨率(例如从低分辨率的 320x240 到高分辨率的 4K 甚至更高)、帧率(可根据任务需求调整,如对于实时性要求高的跟踪任务,可设置较高帧率)、视野角度等。同时,还能指定数据采集的频率,是按固定时间间隔采集,还是在特定事件触发时采集,这为不同的应用场景提供了极大的灵活性。
便捷的数据获取方式
在代码层面,通过 AirSim 提供的 API,开发者能以简单的函数调用获取摄像头数据。例如在 Python 环境中,使用 airsim.MultirotorClient 类的方法,先连接到 AirSim 模拟器,再通过相应指令获取摄像头图像数据。这些数据以常见的图像格式(如 PNG、JPEG 用于彩色图像,或特殊格式用于深度图像数据)返回,方便后续使用 OpenCV 等图像处理库进行分析和处理。
AirSim 平台中的无人机和无人车都默认放有 5 个相机,只是位置不同,本书主要介绍无人机上的相机。下表列出的是相机的位置和命名。旧版本的 AirSim 对相机的命名是使用的数字,目前 AirSim 兼容旧版本,所以使用数字也是可以的。
相机位置 | ID | 旧版本ID |
---|---|---|
前向中间 | "front_center" | "0" |
前向右边 | "front_right" | "1" |
前向左边 | "front_left" | "2" |
底部中间 | "bottom_center" | "3" |
后向中间 | "back_center" | "4" |
AirSim 中默认可以获得 8 种不同类型的图片,下表总结了这10中类型图片的名称、解释和调用方式。
图像类型 | 解释 | 调用方式 |
---|---|---|
Scene | 彩色图,普通场景的可见光图像 | airsim.ImageType.Scene |
DepthPlanar | 深度图,像素值表示到相机平面的欧氏距离(单位:米) | airsim.ImageType.DepthPlanar |
DepthPerspective | 深度图,像素值表示透视投影下到相机平面的距离(考虑投影变形) | airsim.ImageType.DepthPerspective |
DepthVis | 深度可视化图,0 米(黑色)-100 米(白色)渐变,直观显示距离远近 | airsim.ImageType.DepthVis |
DisparityNormalized | 归一化视差图,像素值为浮点数(范围 0-1),视差与深度成反比 | airsim.ImageType.DisparityNormalized |
Segmentation | 分割图,不同物体用唯一颜色标记(基于预设的物体 ID) | airsim.ImageType.Segmentation |
SurfaceNormals | 表面法线图,RGB 通道表示法向量的 XYZ 分量(用于三维重建和光照分析) | airsim.ImageType.SurfaceNormals |
Infrared | 红外图,基于物体温度或预设 ID 生成灰度图像(模拟热成像效果) | airsim.ImageType.Infrared |
!pip install opencv-python matplotlib
import sys
sys.path.append('../external-libraries')
import airsim
import math
import numpy as np
import time
import cv2
import matplotlib.pyplot as plt
# connect to the AirSim simulator
client = airsim.MultirotorClient()
client.confirmConnection()
# get control,允许api控制,默认是不允许的
client.enableApiControl(True)
# unlock,解锁,流程和真实飞行器一样
client.armDisarm(True)
client.takeoffAsync().join()
print("起飞-------------------------")
camera_name = '0' # 相机位置,前向中间摄像头
image_type = airsim.ImageType.Scene # 图片类型,彩色图airsim.ImageType.Scene, Infrared
for i in range(3):
response = client.simGetImage(camera_name, image_type, vehicle_name='') # simGetImage接口的调用方式如下
if response: # 二进制图片数据
# 转换成opencv图片格式
img_bgr = cv2.imdecode(np.array(bytearray(response), dtype='uint8'), cv2.IMREAD_UNCHANGED) # 从二进制图片数据中读
# 将BGR格式转换为RGB格式,因为matplotlib默认显示RGB图像
img_rgb = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2RGB)
# 在Jupyter Notebook中展示图片
plt.figure(figsize=(10, 6))
plt.imshow(img_rgb)
plt.axis('off')
plt.show()
time.sleep(1)
无人机视觉感知如下:
airsim 摄像头详细配置
定位配置文件
AirSim 的配置文件名为settings.json
,它通常位于 AirSim 项目的根目录下。如果是在虚幻引擎项目中集成 AirSim,该文件路径可能会有所不同,一般在项目的Content/Settings
文件夹中或者C:\Users{用户名}\Documents\AirSim下。找到这个文件后,你可以使用文本编辑器(如 Notepad++、Sublime Text 等)打开它。
配置文件结构与摄像头配置位置
settings.json
文件是一个 JSON 格式的文本文件,其结构包含多个部分,摄像头配置信息位于Vehicles
部分下。例如,假设你有一个名为Drone1
的无人机,其摄像头配置信息会在Vehicles
对象中的Drone1
对象下。文件结构大致如下:
{
"SettingsVersion": 1.2,
"SimMode": "Multirotor",
"Vehicles": {
"Drone1": {
"VehicleType": "SimpleFlight",
"X": 0, "Y": 0, "Z": -5,
"CameraDefaults": {
"CaptureSettings": []
},
"Cameras": {
"front_center": {}
}
}
}
}
在上述结构中,CameraDefaults
部分用于设置所有摄像头的默认参数,Cameras
部分则用于针对每个摄像头进行单独配置。
分辨率配置
要在配置文件中设置摄像头分辨率,在CaptureSettings
数组中添加相应的配置项。假设要将名为front_center
的摄像头分辨率设置为 1920x1080,可按如下方式修改:
{
"SettingsVersion": 1.2,
"SimMode": "Multirotor",
"Vehicles": {
"Drone1": {
"VehicleType": "SimpleFlight",
"X": 0, "Y": 0, "Z": -5,
"CameraDefaults": {
"CaptureSettings": [
{
"Width": 1920,
"Height": 1080,
"ImageType": 0,
"PixelFormat": "Uncompressed"
}
]
},
"Cameras": {
"front_center": {}
}
}
}
}
其中,Width
和Height
分别指定了图像的宽度和高度,ImageType
为 0 表示场景摄像头(对应airsim.ImageType.Scene
),PixelFormat
指定像素格式,这里使用Uncompressed
表示未压缩格式,能保证图像质量但数据量较大,也可根据需求选择其他格式如Compressed
(压缩格式,数据量小但可能有画质损失)。
帧率配置
帧率配置同样在CaptureSettings
中进行。若要将帧率设置为 25 帧每秒,修改如下:
{
"SettingsVersion": 1.2,
"SimMode": "Multirotor",
"Vehicles": {
"Drone1": {
"VehicleType": "SimpleFlight",
"X": 0, "Y": 0, "Z": -5,
"CameraDefaults": {
"CaptureSettings": [
{
"Width": 1920,
"Height": 1080,
"ImageType": 0,
"PixelFormat": "Uncompressed",
"Framerate": 25
}
]
},
"Cameras": {
"front_center": {}
}
}
}
}
添加Framerate
字段并设置其值为期望的帧率即可。
视野角度配置
对于视野角度(FOV)的设置,也在CaptureSettings
中完成。假设要将水平视野角度设置为 70 度,修改如下:
{
"SettingsVersion": 1.2,
"SimMode": "Multirotor",
"Vehicles": {
"Drone1": {
"VehicleType": "SimpleFlight",
"X": 0, "Y": 0, "Z": -5,
"CameraDefaults": {
"CaptureSettings": [
{
"Width": 1920,
"Height": 1080,
"ImageType": 0,
"PixelFormat": "Uncompressed",
"Framerate": 25,
"FOV_Degrees": 70
}
]
},
"Cameras": {
"front_center": {}
}
}
}
}
通过添加FOV_Degrees
字段并设置角度值来调整视野角度。
摄像头类型配置
配置文件中通过ImageType
字段来指定摄像头类型。例如,要将摄像头配置为深度摄像头(对应airsim.ImageType.DepthPlanner
),将ImageType
的值改为 2(深度摄像头在 AirSim 中的类型值为 2),修改如下:
{
"SettingsVersion": 1.2,
"SimMode": "Multirotor",
"Vehicles": {
"Drone1": {
"VehicleType": "SimpleFlight",
"X": 0, "Y": 0, "Z": -5,
"CameraDefaults": {
"CaptureSettings": [
{
"Width": 1920,
"Height": 1080,
"ImageType": 2,
"PixelFormat": "Uncompressed",
"Framerate": 25,
"FOV_Degrees": 70
}
]
},
"Cameras": {
"front_center": {}
}
}
}
}
若要配置鱼眼摄像头,除了设置ImageType
(假设鱼眼图像也用airsim.ImageType.Scene
对应的类型值 0),还可能需要额外配置一些鱼眼相关参数,如畸变系数等,这部分配置相对复杂,且可能因具体需求和 AirSim 版本略有不同。一般在Cameras
对象下的摄像头配置中添加相关参数,例如:
{
"SettingsVersion": 1.2,
"SimMode": "Multirotor",
"Vehicles": {
"Drone1": {
"VehicleType": "SimpleFlight",
"X": 0, "Y": 0, "Z": -5,
"CameraDefaults": {
"CaptureSettings": [
{
"Width": 1920,
"Height": 1080,
"ImageType": 0,
"PixelFormat": "Uncompressed",
"Framerate": 25,
"FOV_Degrees": 70
}
]
},
"Cameras": {
"front_center": {
"Fisheye": true,
"FisheyeDistortion": [0.1, 0.2, 0.3, 0.4] // 假设的畸变系数,具体依实际需求调整
}
}
}
}
}
项目资源
项目github:GitHub - maris205/airsim_agent
项目huggingface:dnagpt/airsim_agent · Hugging Face
网易云课堂:大模型驱动的智能无人机应用开发 - 网易云课堂