当前位置: 首页 > article >正文

AirSim 无人机利用姿态文件获取图片

之前我们得到了随机姿态下无人机获得的不同场景图像,我们输出了无人机随机的姿态信息到poses.csv文件中,现在我们想要复现我们的结果,就要利用我们之前输出的姿态文件来获取图像。

无人机利用姿态文件获取图片的代码如下:

import airsim
import os
import csv
import numpy as np

# 连接到 AirSim 模拟器
client = airsim.MultirotorClient()
client.confirmConnection()

# 设置相机列表和图像保存的文件夹路径
camera_list = ["0", "1", "2", "3", "4"]
folder_path = "D:/airsimpy/screen"

# 读取位姿信息文件(CSV 格式)
poses_csv_file = open("D:/airsimpy/poses.csv", "r")
pos_reader = csv.DictReader(poses_csv_file)

# 循环读取位姿信息并保存图像
for i, row in enumerate(pos_reader):
    # 从 CSV 行中获取位姿信息(x, y, z, yaw, pitch, roll)
    x, y, z = float(row['x']), float(row['y']), float(row['z'])
    yaw, pitch, roll = float(row['yaw']), float(row['pitch']), float(row['roll'])

    # 创建目标位置和姿态对象
    pose = airsim.Pose(airsim.Vector3r(x, y, z), airsim.to_quaternion(pitch, roll, yaw))

    # 移动到目标位置
    client.simSetVehiclePose(pose, True)

    # 遍历相机列表,获取每个相机的图像
    for j, camera_name in enumerate(camera_list):
        responses = client.simGetImages([airsim.ImageRequest(camera_name, airsim.ImageType.Scene, False, False)])
        img_raw = responses[0]

        # 将字节流转换为 NumPy 数组(RGB 图像)
        img1d = np.frombuffer(img_raw.image_data_uint8, dtype=np.uint8)
        img_rgb = img1d.reshape(img_raw.height, img_raw.width, 3)

        # 生成图像文件名
        img_filename = "pose_{0}_x_{1:.2f}_y_{2:.2f}_z_{3:.2f}_yaw_{4:.2f}_pitch_{5:.2f}_roll_{6:.2f}_camera_{7}.png".format(
            i, x, y, z, yaw, pitch, roll, j)

        # 创建图像保存路径
        img_filepath = os.path.join(folder_path, img_filename)

        # 保存图像为 PNG 格式
        airsim.write_png(os.path.normpath(img_filepath), img_rgb)

# 输出完成信息
print("图像和位姿信息均已保存到文件夹:", folder_path)

整体流程为:

连接 AirSim 模拟器
读取 CSV 中的位姿信息
循环处理每一条位姿信息:读取并提取位姿数据
更新飞行器位置和姿态
获取并保存图像:获取相机图像
保存图像到指定文件夹

一、连接 AirSim 模拟器

# 连接到 AirSim 模拟器
client = airsim.MultirotorClient()
client.confirmConnection()

创建airsim.MultirotorClient()类对象client, 用于控制多旋翼无人机。

client.confirmConnection()确认AirSim通信连接。

二、初始化信息与读取位姿信息文件

1.设置相机列表和文件夹路径

camera_list = ["0", "1", "2", "3", "4"]
folder_path = "D:/airsimpy/screen"

camera_list,包含模拟器中五个相机的名称,编号从 "0" 到 "4",代表无人机前后左右上下不同的视角。

folder_path,用于设置图像保存的文件夹路径。

2.读取位姿信息的csv文件

poses_csv_file = open("D:/airsimpy/poses.csv", "r")
pos_reader = csv.DictReader(poses_csv_file)

以只读模式打开姿态文件.csv,返回一个文件对象赋给poses_csv_file。

通过 csv.DictReader 创建一个 CSV 文件的读取器 pos_reader,该读取器将每一行数据读取为一个字典。

例如,如果 CSV 文件的第一行是:

x,y,z,yaw,pitch,roll
1.0,2.0,3.0,0.1,0.2,0.3

那么在循环中每一行将返回一个字典,格式如下:

{'x': '1.0', 'y': '2.0', 'z': '3.0', 'yaw': '0.1', 'pitch': '0.2', 'roll': '0.3'}

三、循环读取位姿数据

for i, row in enumerate(pos_reader):
    # 获取位姿信息
    x, y, z = float(row['x']), float(row['y']), float(row['z'])
    yaw, pitch, roll = float(row['yaw']), float(row['pitch']), float(row['roll'])

    # 创建目标位置和姿态对象
    pose = airsim.Pose(airsim.Vector3r(x, y, z), airsim.to_quaternion(pitch, roll, yaw))
    # 移动到目标位置
    client.simSetVehiclePose(pose, True)

遍历 pos_reader 中的每一行数据,i 是当前行的索引(从 0 开始),row 是当前行的数据(一个字典)。

通过字典的键值对,获取到位置和姿态信息,创建airsim.Pose对象pose,Vector3r 表示位置,to_quaternion 将欧拉角(pitch, roll, yaw)转换为四元数,表示飞行器的姿态。

调用client的函数simSetVehiclePose位姿控制,命令将飞行器移动到指定的位置和姿态。传入的第一个参数的airsim.Pose对象,第二个参数是bool值,指定是否进行平滑过渡(平滑移动)到目标位置和姿态,true为平滑过渡,false则直接跳转。

四、获取相机图像并保存

在当前姿态下,循环调用相机获取图像

    for j, camera_name in enumerate(camera_list):
        responses = client.simGetImages([airsim.ImageRequest(camera_name, airsim.ImageType.Scene, False, False)])
        img_raw = responses[0]

        # 将字节流转换为 NumPy 数组(RGB 图像)
        img1d = np.frombuffer(img_raw.image_data_uint8, dtype=np.uint8)
        img_rgb = img1d.reshape(img_raw.height, img_raw.width, 3)

        # 生成图像文件名
        img_filename = "pose_{0}_x_{1:.2f}_y_{2:.2f}_z_{3:.2f}_yaw_{4:.2f}_pitch_{5:.2f}_roll_{6:.2f}_camera_{7}.png".format(
            i, x, y, z, yaw, pitch, roll, j)

        # 创建图像保存路径
        img_filepath = os.path.join(folder_path, img_filename)

        # 保存图像为 PNG 格式
        airsim.write_png(os.path.normpath(img_filepath), img_rgb)

j是相机的索引,camera_name是相机的名称。

1.图像获取

调用client的simGetImages函数获取图像,传入参数为request列表,列表每一个元素也是一个列表,类型为airsim.ImageRequest,代表一张图像的获取设置,包含相机名称,图像类别,是否浮点数和是否压缩的列表。

responses = client.simGetImages([airsim.ImageRequest(camera_name, airsim.ImageType.Scene, False, False)])

最后两个参数设为false获取的图像是原始图像的字节数据。

img_raw = responses[0]将获取的图像字节数据赋值给img_raw变量。

2.格式转换

img1d = np.frombuffer(img_raw.image_data_uint8, dtype=np.uint8)
img_rgb = img1d.reshape(img_raw.height, img_raw.width, 3)

使用np.frombuffer将获取的字节流数据转为一个一维的numpy数组,数据类型为uint8。

再使用reshape方法,将这个一维数组转为三维的图像numpy数组,对应rgb三通道。numpy数组便于图像的处理。

3.图像保存

# 生成图像文件名
img_filename = "pose_{0}_x_{1:.2f}_y_{2:.2f}_z_{3:.2f}_yaw_{4:.2f}_pitch_{5:.2f}_roll_{6:.2f}_camera_{7}.png".format(
            i, x, y, z, yaw, pitch, roll, j)

# 创建图像保存路径
img_filepath = os.path.join(folder_path, img_filename)

# 保存图像为 PNG 格式
airsim.write_png(os.path.normpath(img_filepath), img_rgb)

img_filename 使用 format() 方法生成图像文件的文件名。文件名中包含了飞行器的位姿信息(x, y, z, yaw, pitch, roll)以及相机的索引 j,使得每张图像的文件名都是唯一的。

使用os.path.join函数将文件夹名和文件名合并,得到图像保存的完整路径。

airsim.write_png(os.path.normpath(img_filepath), img_rgb)

airsim.write_png() 将图像保存为 PNG 格式。os.path.normpath() 用于规范化文件路径,确保路径在不同操作系统中正确解析。保存的数据为img_rgb的三通道numpy数组。

print("图像和位姿信息均已保存到文件夹:", folder_path)

最后输出保存信息和文件夹路径。


http://www.kler.cn/a/442367.html

相关文章:

  • 换了城市ip属地会变吗?为什么换了城市IP属地不变
  • 【Rust自学】12.4. 重构 Pt.2:错误处理
  • VUE学习笔记4__安装开发者工具
  • 人工智能之深度学习-[1]-了解深度学习
  • TensorFlow深度学习实战(5)——神经网络性能优化技术详解
  • Cosmos:英伟达发布世界基础模型,为机器人及自动驾驶开发加速!
  • XML Schema 复合类型 - 混合内容
  • Nginx - 配置文件 Configuration 详解
  • 基于python对pdf文件进行加密等操作
  • LM芯片学习
  • openGauss 安装记录 lite 版本
  • 陪诊小程序搭建,打造一站式陪诊服务
  • 开源照片浏览工具Ralbum
  • 文献研读|基于像素语义层面图像重建的AI生成图像检测
  • 表单校验记录
  • Java并发编程框架之第三方库
  • eclipse 如何设置项目、不同类型文件的 utf8 编码
  • 如何与GPT更高效的问答
  • xxl-job 整合 Seatunnel 实现定时任务
  • Bootstrap Blazor中使用PuppeteerSharp对HTML截图
  • 【嵌入式——QT】QT多线程编程
  • Halcon中dots_image(Operator)算子原理及应用详解
  • JumpServer开源堡垒机搭建及使用
  • 基于yolov10的遥感影像目标检测系统,支持图像检测,视频检测和实时摄像检测功能(pytorch框架,python源码)
  • 计算机网络技术基础:3.计算机网络的拓扑结构
  • 从零开始学TiDB(5)Raft与Multi Raft