大模型驱动的智能无人机应用开发3:无人机视觉感知

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": {}
            }
        }
    }
}

其中,WidthHeight分别指定了图像的宽度和高度,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

网易云课堂:大模型驱动的智能无人机应用开发 - 网易云课堂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值