AirSim 利用pygame绘制窗口并获取无人机FPV实时图像呈现

ops/2024/12/18 15:34:48/

利用pygame绘制窗口并获取无人机FPV实时图像呈现的代码如下:

python">import sys
import time
import airsim
import pygame
import cv2
import numpy as np# >------>>>  pygame settings   <<<------< #
pygame.init()# 创建 pygame 窗口
screen = pygame.display.set_mode((800, 144))
pygame.display.set_caption('screen')
screen.fill((0, 0, 0))# >------>>>  AirSim settings   <<<------< #
# 这里改为你要控制的无人机名称(settings文件里面设置的)
vehicle_name = "Drone"
AirSim_client = airsim.MultirotorClient()
AirSim_client.confirmConnection()
AirSim_client.enableApiControl(True, vehicle_name=vehicle_name)
AirSim_client.armDisarm(True, vehicle_name=vehicle_name)
AirSim_client.takeoffAsync(vehicle_name=vehicle_name).join()# 图像类型字典
image_types = {"scene": airsim.ImageType.Scene,"depth": airsim.ImageType.DepthVis,"seg": airsim.ImageType.Segmentation,"normals": airsim.ImageType.SurfaceNormals,"segmentation": airsim.ImageType.Segmentation,"disparity": airsim.ImageType.DisparityNormalized,"Infrared": airsim.ImageType.Infrared
}# 基础的控制速度(m/s)
vehicle_velocity = 2.0
# 设置临时加速比例
speedup_ratio = 10.0
# 用来设置临时加速
speedup_flag = False# 基础的偏航速率
vehicle_yaw_rate = 5.0# 主循环
while True:yaw_rate = 0.0velocity_x = 0.0velocity_y = 0.0velocity_z = 0.0# 小暂停,避免过度占用CPUtime.sleep(0.02)# 处理pygame事件for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()# 获取键盘输入状态scan_wrapper = pygame.key.get_pressed()# 按下空格键加速10倍if scan_wrapper[pygame.K_SPACE]:scale_ratio = speedup_ratioelse:scale_ratio = 1.0# 根据 'A' 和 'D' 按键来设置偏航速率变量if scan_wrapper[pygame.K_a] or scan_wrapper[pygame.K_d]:yaw_rate = (scan_wrapper[pygame.K_d] - scan_wrapper[pygame.K_a]) * scale_ratio * vehicle_yaw_rate# 根据 'UP' 和 'DOWN' 按键来设置pitch轴速度变量(NED坐标系,x为机头向前)if scan_wrapper[pygame.K_UP] or scan_wrapper[pygame.K_DOWN]:velocity_x = (scan_wrapper[pygame.K_UP] - scan_wrapper[pygame.K_DOWN]) * scale_ratio# 根据 'LEFT' 和 'RIGHT' 按键来设置roll轴速度变量(NED坐标系,y为正右方)if scan_wrapper[pygame.K_LEFT] or scan_wrapper[pygame.K_RIGHT]:velocity_y = -(scan_wrapper[pygame.K_LEFT] - scan_wrapper[pygame.K_RIGHT]) * scale_ratio# 根据 'W' 和 'S' 按键来设置z轴速度变量(NED坐标系,z轴向上为负)if scan_wrapper[pygame.K_w] or scan_wrapper[pygame.K_s]:velocity_z = -(scan_wrapper[pygame.K_w] - scan_wrapper[pygame.K_s]) * scale_ratio# 设置速度控制以及设置偏航控制AirSim_client.moveByVelocityBodyFrameAsync(vx=velocity_x, vy=velocity_y, vz=velocity_z, duration=1,yaw_mode=airsim.YawMode(True, yaw_or_rate=yaw_rate), vehicle_name=vehicle_name)# 获取场景图像temp_image1 = AirSim_client.simGetImage('0', image_types["scene"], vehicle_name=vehicle_name)image1 = cv2.imdecode(airsim.string_to_uint8_array(temp_image1), cv2.IMREAD_COLOR)cv2.imwrite('screen/visual1.png', image1)# 显示场景图像screen_image1 = pygame.image.load("screen/visual1.png")screen.blit(screen_image1, (0, 0))pygame.display.flip()# 获取红外图像temp_image2 = AirSim_client.simGetImage('0', image_types["Infrared"], vehicle_name=vehicle_name)image2 = cv2.imdecode(airsim.string_to_uint8_array(temp_image2), cv2.IMREAD_COLOR)cv2.imwrite('screen/visual2.png', image2)# 显示红外图像screen_image2 = pygame.image.load("screen/visual2.png")screen.blit(screen_image2, (272, 0))pygame.display.flip()# 获取分割图像temp_image3 = AirSim_client.simGetImage('0', image_types["segmentation"], vehicle_name=vehicle_name)image3 = cv2.imdecode(airsim.string_to_uint8_array(temp_image3), cv2.IMREAD_COLOR)cv2.imwrite('screen/visual3.png', image3)# 显示分割图像screen_image3 = pygame.image.load("screen/visual3.png")screen.blit(screen_image3, (544, 0))pygame.display.flip()# 如果按下 ESC 键退出程序if scan_wrapper[pygame.K_ESCAPE]:pygame.quit()sys.exit()

前面的内容和pygame使用键盘控制无人机一致,大家可以查看之前的博客AirSim 使用Pygame鼠标键盘控制无人机-CSDN博客

主要不同点在这一块,即图像的获取与显示。

python"># 获取场景图像temp_image1 = AirSim_client.simGetImage('0', image_types["scene"], vehicle_name=vehicle_name)image1 = cv2.imdecode(airsim.string_to_uint8_array(temp_image1), cv2.IMREAD_COLOR)cv2.imwrite('screen/visual1.png', image1)# 显示场景图像screen_image1 = pygame.image.load("screen/visual1.png")screen.blit(screen_image1, (0, 0))pygame.display.flip()# 获取红外图像temp_image2 = AirSim_client.simGetImage('0', image_types["Infrared"], vehicle_name=vehicle_name)image2 = cv2.imdecode(airsim.string_to_uint8_array(temp_image2), cv2.IMREAD_COLOR)cv2.imwrite('screen/visual2.png', image2)# 显示红外图像screen_image2 = pygame.image.load("screen/visual2.png")screen.blit(screen_image2, (272, 0))pygame.display.flip()# 获取分割图像temp_image3 = AirSim_client.simGetImage('0', image_types["segmentation"], vehicle_name=vehicle_name)image3 = cv2.imdecode(airsim.string_to_uint8_array(temp_image3), cv2.IMREAD_COLOR)cv2.imwrite('screen/visual3.png', image3)# 显示分割图像screen_image3 = pygame.image.load("screen/visual3.png")screen.blit(screen_image3, (544, 0))pygame.display.flip()

我们通过键盘来移动无人机,不断的用无人机的前摄像头采集图像,再不断的显示。

采集图像与显示我们以场景图为例子:

python"># 获取场景图像temp_image1 = AirSim_client.simGetImage('0', image_types["scene"], vehicle_name=vehicle_name)image1 = cv2.imdecode(airsim.string_to_uint8_array(temp_image1), cv2.IMREAD_COLOR)cv2.imwrite('screen/visual1.png', image1)# 显示场景图像screen_image1 = pygame.image.load("screen/visual1.png")screen.blit(screen_image1, (0, 0))pygame.display.flip()

首先调用客户端AirSim_client的成员函数simGetImage来采集图片

python">temp_image1 = AirSim_client.simGetImage('0', image_types["scene"], vehicle_name=vehicle_name)

传入参数第一个为相机名称,0为前相机

第二个参数是采集图像的类别,我们传入我们之前图像类型字典中的scene的值,即采集airsim.ImageType.Scene类型图像。

第三个参数是无人机的名称。

然后调用cv2的imdecode方法,

python">image1 = cv2.imdecode(airsim.string_to_uint8_array(temp_image1), cv2.IMREAD_COLOR)

我们之前采集到的是字节流的数据,airsim.string_to_uint8_array(temp_image1) 将从 AirSim 获取的字节流(temp_image1)转换为 NumPy 数组(3通道的图像数组),cv2.IMREAD_COLOR 表示以彩色方式读取图像。

python">cv2.imwrite('screen/visual1.png', image1)

然后将图像保存到文件中,传入保存路径和三维图像数组。

python">screen_image1 = pygame.image.load("screen/visual1.png")

然后调用pygame的image.load()方法,加载图像文件,传入我们之前保存的图像路径。

之后显示图像

python">screen.blit(screen_image1, (0, 0))
pygame.display.flip()

screen.blit(screen_image1, (0, 0)) 将图像 screen_image1 绘制到 pygame 窗口上。(0, 0) 是绘制图像的左上角位置,表示图像会被绘制在窗口的最左上角。

pygame.display.flip() 更新显示的窗口,将图像显示在屏幕上。


http://www.ppmy.cn/ops/142950.html

相关文章

es 3期 第16节-运用启发式特性引导用户查询

#### 1.Elasticsearch是数据库&#xff0c;不是普通的Java应用程序&#xff0c;传统数据库需要的硬件资源同样需要&#xff0c;提升性能最有效的就是升级硬件。 #### 2.Elasticsearch是文档型数据库&#xff0c;不是关系型数据库&#xff0c;不具备严格的ACID事务特性&#xff…

机器学习-正则化技术

文章目录 拟合正则化正则项L1 正则化&#xff08;Lasso&#xff09;L2 正则化&#xff08;Ridge&#xff09; 多元线性回归的正则化回归形式代码 拟合 过拟合&#xff1a;参数&#xff08;特征&#xff09;过多&#xff08;理解为考虑很多因素)或者说过多专注于原来的训练数据…

智慧公交指挥中枢,数据可视化 BI 驾驶舱

随着智慧城市的蓬勃发展&#xff0c;公共交通作为城市运营的核心枢纽&#xff0c;正朝着智能化和数据驱动的方向演进。通过整合 CAN 总线技术(Controller Area Network&#xff0c;控制器局域网总线)、车载智能终端、大数据分析及处理等尖端技术&#xff0c;构建的公交“大脑”…

每天40分玩转Django:简介和环境搭建

Django简介和环境搭建 一、课程概述 学习项目具体内容预计用时Django概念Django框架介绍、MVC/MTV模式、Django特点60分钟环境搭建Python安装、pip配置、Django安装、IDE选择45分钟创建项目项目结构、基本配置、运行测试75分钟实战练习创建个人博客项目框架60分钟 二、Djang…

期末复习-计算机网络应用题

目录 1 、简述具有五层协议体系结构的各层的主要功能&#xff1f; 2 、简述计算机网络协议分层能带来哪些好处&#xff1f; 3 、奈氏准则与香农公式在数据通信中的意义是什么&#xff1f; 4 、为什么局域网采用广播通信方式而广域网不采用呢&#xff1f; 5 、 以太网交换机…

Python TXT文件按条件批量删除行工具

Python TXT文本文件批量删除行工具 1.简介&#xff1a; 一个由Python编写的可根据TXT文件按条件批量删除行工具&#xff0c;资源及文件已打包成exe文件&#xff0c;源码也已经分享给大家&#xff0c;喜欢的话可以点个关注哦&#xff01; 功能&#xff1a; 批量删除行含关键字…

如何在NGINX中实现基于IP的访问控制(IP黑白名单)?

大家好&#xff0c;我是锋哥。今天分享关于【如何在NGINX中实现基于IP的访问控制&#xff08;IP黑白名单&#xff09;&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何在NGINX中实现基于IP的访问控制&#xff08;IP黑白名单&#xff09;&#xff1f; 1000道 互联网大…

智慧养老系统源码医院陪诊代办买药就医陪护上门护理小程序

市场前景 随着中国社会老龄化的不断加剧&#xff0c;老年人口比例的增加使得他们对医疗和陪护服务的需求日益突出。老年人在就医过程中往往需要更多的帮助和陪伴&#xff0c;而智慧养老陪诊护理系统能够为他们提供便捷、高效的就医辅助服务&#xff0c;满足他们的实际需求。此…