盛世宏图 发表于 2024-12-17 08:45:15

AirSim 无人机不同视角收罗不同场景的图片

无人机不同视角下收罗不同场景图片的代码如下:
import airsim
import os
import numpy as np
import pandas as pd
#连接airsim模拟器
client = airsim.MultirotorClient()
client.confirmConnection()

#获取图像路径
folder_path="D:/airsimpy/screen"

#保存位姿信息的空dataframe
poses_df=pd.DataFrame(columns=['index','x','y','z','yaw','pitch','roll'])

#设置随机采样的范围和数量
num_samples=10
x_min,x_max,y_min,y_max,z_min,z_max=-4,4,-4,4,-5,-2
yaw_min,yaw_max,pitch_min,pitch_max,roll_min,roll_max=-90,90,-45,45,-45,45

#相机列表
camera_list=["0","1","2","3","4"]

#随机采样并保存图像和位姿信息
pose_list=[]
for i in range(num_samples):
    #随机生成目标位置,并设置姿态朝向
    x=np.random.uniform(x_min,x_max)
    y=np.random.uniform(y_min,y_max)
    z=np.random.uniform(z_min,z_max)
    yaw=np.random.uniform(yaw_min,yaw_max)
    pitch=np.random.uniform(pitch_min,pitch_max)
    roll=np.random.uniform(roll_min,roll_max)
    pose=airsim.Pose(airsim.Vector3r(x,y,z),airsim.to_quaternion(pitch,roll,yaw))
    pose_list.append({'index':i,
                      'x':x,
                      'y':y,
                      'z':z,
                      'yaw':yaw,
                      'pitch':pitch,
                      'roll':roll,})
    #移动到目标位置
    client.simSetVehiclePose(pose,True)
    for j,camera_name in enumerate(camera_list):
      #获取相机图片
      responses=client.simGetImages()
      img_raw=responses
      #将字节流转为PIL的image对象
      img1d=np.frombuffer(img_raw.image_data_uint8,dtype=np.uint8)
      img_rgb=img1d.reshape(img_raw.height,img_raw.width,3)
      #保存PNG格式的图像
      # img_filename="pose_{0}_x_{1:.2f}_y_{2:.2f}_z_{3:.2f}_yaw_{4:.2f}_pitch_{5:.2f}_roll_{6:.2f}_camera_{4}".format(i, x, y, z, yaw, pitch, roll, j)
      img_filename = "pose_{0}_x_{1:.2f}_y_{2:.2f}_z_{3:.2f}_yaw_{4:.2f}_pitch_{5:.2f}_roll_{6:.2f}_camera_{4}.png".format(
            i, x, y, z, yaw, pitch, roll, j)

      img_filepath = os.path.join(folder_path, img_filename)
      print("File path:", os.path.normpath(img_filepath))
      airsim.write_png(os.path.normpath(img_filepath), img_rgb)
print("all pictures and poses are saved: ",folder_path)

#将位姿信息保存到csv文件中
poses_df=pd.DataFrame(pose_list)
poses_df.to_csv(os.path.join(folder_path,"poses.csv"),index=False) 团体流程为
毗连 AirSim 模拟器。
在指定范围内随机生成无人机的位置和姿态。
将无人机移动到目标位置。
使用多个相机拍摄图像,并生存为 PNG 文件。
生存无人机的位姿信息到 CSV 文件
一、毗连 AirSim 模拟器初始化

# 连接 AirSim 模拟器
client = airsim.MultirotorClient()
client.confirmConnection() 创建airsim.MultirotorClient()类对象client, 用于控制多旋翼无人机。
client.confirmConnection()确认AirSim通信毗连。
# 获取图像保存路径
folder_path = "D:/airsimpy/screen"

# 保存位姿信息的空 DataFrame
poses_df = pd.DataFrame(columns=['index', 'x', 'y', 'z', 'yaw', 'pitch', 'roll'])
设置生存路径和生存位姿信息的DataFrame,这是pandas的格式,包罗位置坐标 (x, y, z) 和姿态信息 (yaw, pitch, roll)。
DataFrame 是 Pandas 提供的二维数据结构。
二、随机采样设置

# 设置随机采样的范围和数量
num_samples = 10
x_min, x_max, y_min, y_max, z_min, z_max = -4, 4, -4, 4, -5, -2
yaw_min, yaw_max, pitch_min, pitch_max, roll_min, roll_max = -90, 90, -45, 45, -45, 45

# 相机列表
camera_list = ["0", "1", "2", "3", "4"]
num_samples: 指定采样的次数(共 10 次)
之后设置范围
x, y, z 范围,限定无人机的飞行坐标范围。
yaw, pitch, roll 范围,限定无人机的姿态角范围。
生成一个相机列表camera_list, 包含 5 个相机的索引,用于收罗图像。
三、随机采样、图像收罗与生存

1.随机生成位姿信息

pose_list = []
for i in range(num_samples):
    # 随机生成目标位置和姿态朝向
    x = np.random.uniform(x_min, x_max)
    y = np.random.uniform(y_min, y_max)
    z = np.random.uniform(z_min, z_max)
    yaw = np.random.uniform(yaw_min, yaw_max)
    pitch = np.random.uniform(pitch_min, pitch_max)
    roll = np.random.uniform(roll_min, roll_max)
    pose = airsim.Pose(airsim.Vector3r(x, y, z), airsim.to_quaternion(pitch, roll, yaw))
    pose_list.append({'index': i,
                      'x': x,
                      'y': y,
                      'z': z,
                      'yaw': yaw,
                      'pitch': pitch,
                      'roll': roll})
首先初始化一个空的列表pose_list,每次生成的位姿数据都会被存储为一个字典,并追加到 pose_list 中。
之后进入for循环,迭代生成随机样本。
x = np.random.uniform(x_min, x_max)
y = np.random.uniform(y_min, y_max)
z = np.random.uniform(z_min, z_max)
yaw=np.random.uniform(yaw_min,yaw_max)
pitch=np.random.uniform(pitch_min,pitch_max)
roll=np.random.uniform(roll_min,roll_max) 在我们之前设定的范围内,随机生成了目标的位置和姿态朝向。
然后我们根据这些位置和姿态生成了airsim.Pose对象
pose=airsim.Pose(airsim.Vector3r(x,y,z),airsim.to_quaternion(pitch,roll,yaw)) airsim.Pose(position, orientation)的构造函数要传入位置朝向两个参数。
位置使用airsim.Vector3r(x,y,z)用于表示一个 三维坐标向量,即物体的位置。
朝向使用airsim.to_quaternion(pitch,roll,yaw),用四元数表示朝向,传入三个欧拉角转为四元数。
pose_list.append({'index': i,
                  'x': x,
                  'y': y,
                  'z': z,
                  'yaw': yaw,
                  'pitch': pitch,
                  'roll': roll})
这行代码将每次生成的位置信息和姿态朝向存储为一个字典,使用append将字典添加到pose_list列表中,即列表的元素是一个字典。
2.移动无人机并收罗图像

    # 移动到目标位置
    client.simSetVehiclePose(pose, True)
    for j, camera_name in enumerate(camera_list):
      # 获取相机图片
      responses = client.simGetImages()
      img_raw = responses

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

      # 保存 PNG 格式的图像
      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)
      print("File path:", os.path.normpath(img_filepath))
      airsim.write_png(os.path.normpath(img_filepath), img_rgb)
client.simSetVehiclePose(pose, True)将无人机移动到指定位置,第一个参数是我们之宿世成的pose,代表无人机的位置和姿态,第二个参数 True 表示该位置和姿态更新会 立即生效,即该指令会同步执行。
for j, camera_name in enumerate(camera_list): 之后遍历相机列表,j 是相机的索引,camera_name 是相机的名称。
使用client.simGetImages()方法获得图像,传入参数为request列表,每个元素是包含对相机名称,图像类别,是否浮点数和是否压缩的列表。
 img_raw = responses将原始图像的字节数据赋值给img_raw。
# 将字节流转换为 RGB 图像
img1d = np.frombuffer(img_raw.image_data_uint8, dtype=np.uint8)
img_rgb = img1d.reshape(img_raw.height, img_raw.width, 3)
这里首先使用frombuffer函数,将原始字节数据转为numpy的一维元素,传入的是原始的图像字节数据,以 uint8 范例存储img_raw.image_data_uint8,转换后的范例为uint8。
再使用reshape将一维的数据转为三维的图像numpy数组,分别对应RGB。
四、生存图像

# 保存 PNG 格式的图像
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)
print("File path:", os.path.normpath(img_filepath))
airsim.write_png(os.path.normpath(img_filepath), img_rgb)
首先设置了生存文件的名称:{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) 是将 i, x, y, z, yaw, pitch, roll, 和 j 等变量添补到文件名中,如:
https://i-blog.csdnimg.cn/direct/48268f9334374498a62cffb690735361.png
os.path.join(folder_path, img_filename) 将文件夹路径和文件名毗连起来,得到完整的图像文件路径,赋值给img_filepath。
os.path.normpath(img_filepath) 规范化文件路径,确保路径格式符合操纵系统的要求。
airsim.write_png(os.path.normpath(img_filepath), img_rgb) 调用 AirSim 的 write_png 函数,将 RGB 图像生存为 PNG 格式,生存到指定路径 img_filepath。
五、生存位姿

#将位姿信息保存到csv文件中
poses_df=pd.DataFrame(pose_list)
poses_df.to_csv(os.path.join(folder_path,"poses.csv"),index=False) pose_list包含了我们的位置和姿态信息,列表中每一个元素是一个字典。
pd.DataFrame(pose_list):将 pose_list 转换为一个 Pandas DataFrame。DataFrame 是 Pandas 中的重要数据结构,它雷同于一个表格,可以或许方便地举行数据分析和操纵。
poses_df.to_csv(os.path.join(folder_path, "poses.csv"), index=False)
os.path.join(folder_path, "poses.csv"):这行代码生成了生存 CSV 文件的完整路径。folder_path 是你盼望生存 CSV 文件的目次路径,"poses.csv" 是文件名,os.path.join 将这两个部分合并成一个完整的文件路径。
poses_df.to_csv():这是 Pandas 中的一个函数,将 DataFrame 对象生存为 CSV 文件。参数 index=False 表示不将 DataFrame 的索引写入 CSV 文件,因为通常我们不需要生存 DataFrame 的索引列。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: AirSim 无人机不同视角收罗不同场景的图片