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

打印 上一主题 下一主题

主题 1781|帖子 1781|积分 5343

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
无人机不同视角下收罗不同场景图片的代码如下:
  1. import airsim
  2. import os
  3. import numpy as np
  4. import pandas as pd
  5. #连接airsim模拟器
  6. client = airsim.MultirotorClient()
  7. client.confirmConnection()
  8. #获取图像路径
  9. folder_path="D:/airsimpy/screen"
  10. #保存位姿信息的空dataframe
  11. poses_df=pd.DataFrame(columns=['index','x','y','z','yaw','pitch','roll'])
  12. #设置随机采样的范围和数量
  13. num_samples=10
  14. x_min,x_max,y_min,y_max,z_min,z_max=-4,4,-4,4,-5,-2
  15. yaw_min,yaw_max,pitch_min,pitch_max,roll_min,roll_max=-90,90,-45,45,-45,45
  16. #相机列表
  17. camera_list=["0","1","2","3","4"]
  18. #随机采样并保存图像和位姿信息
  19. pose_list=[]
  20. for i in range(num_samples):
  21.     #随机生成目标位置,并设置姿态朝向
  22.     x=np.random.uniform(x_min,x_max)
  23.     y=np.random.uniform(y_min,y_max)
  24.     z=np.random.uniform(z_min,z_max)
  25.     yaw=np.random.uniform(yaw_min,yaw_max)
  26.     pitch=np.random.uniform(pitch_min,pitch_max)
  27.     roll=np.random.uniform(roll_min,roll_max)
  28.     pose=airsim.Pose(airsim.Vector3r(x,y,z),airsim.to_quaternion(pitch,roll,yaw))
  29.     pose_list.append({'index':i,
  30.                       'x':x,
  31.                       'y':y,
  32.                       'z':z,
  33.                       'yaw':yaw,
  34.                       'pitch':pitch,
  35.                       'roll':roll,})
  36.     #移动到目标位置
  37.     client.simSetVehiclePose(pose,True)
  38.     for j,camera_name in enumerate(camera_list):
  39.         #获取相机图片
  40.         responses=client.simGetImages([airsim.ImageRequest(camera_name,airsim.ImageType.Scene,False,False)])
  41.         img_raw=responses[0]
  42.         #将字节流转为PIL的image对象
  43.         img1d=np.frombuffer(img_raw.image_data_uint8,dtype=np.uint8)
  44.         img_rgb=img1d.reshape(img_raw.height,img_raw.width,3)
  45.         #保存PNG格式的图像
  46.         # 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)
  47.         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(
  48.             i, x, y, z, yaw, pitch, roll, j)
  49.         img_filepath = os.path.join(folder_path, img_filename)
  50.         print("File path:", os.path.normpath(img_filepath))
  51.         airsim.write_png(os.path.normpath(img_filepath), img_rgb)
  52. print("all pictures and poses are saved: ",folder_path)
  53. #将位姿信息保存到csv文件中
  54. poses_df=pd.DataFrame(pose_list)
  55. poses_df.to_csv(os.path.join(folder_path,"poses.csv"),index=False)
复制代码
团体流程为
毗连 AirSim 模拟器。
在指定范围内随机生成无人机的位置和姿态。
将无人机移动到目标位置。
使用多个相机拍摄图像,并生存为 PNG 文件。
生存无人机的位姿信息到 CSV 文件
一、毗连 AirSim 模拟器初始化

  1. # 连接 AirSim 模拟器
  2. client = airsim.MultirotorClient()
  3. client.confirmConnection()
复制代码
创建airsim.MultirotorClient()类对象client, 用于控制多旋翼无人机。
client.confirmConnection()确认AirSim通信毗连。
  1. # 获取图像保存路径
  2. folder_path = "D:/airsimpy/screen"
  3. # 保存位姿信息的空 DataFrame
  4. poses_df = pd.DataFrame(columns=['index', 'x', 'y', 'z', 'yaw', 'pitch', 'roll'])
复制代码
设置生存路径和生存位姿信息的DataFrame,这是pandas的格式,包罗位置坐标 (x, y, z) 和姿态信息 (yaw, pitch, roll)。
DataFrame 是 Pandas 提供的二维数据结构。
二、随机采样设置

  1. # 设置随机采样的范围和数量
  2. num_samples = 10
  3. x_min, x_max, y_min, y_max, z_min, z_max = -4, 4, -4, 4, -5, -2
  4. yaw_min, yaw_max, pitch_min, pitch_max, roll_min, roll_max = -90, 90, -45, 45, -45, 45
  5. # 相机列表
  6. camera_list = ["0", "1", "2", "3", "4"]
复制代码
num_samples: 指定采样的次数(共 10 次)
之后设置范围
x, y, z 范围,限定无人机的飞行坐标范围。
yaw, pitch, roll 范围,限定无人机的姿态角范围。
生成一个相机列表camera_list, 包含 5 个相机的索引,用于收罗图像。
三、随机采样、图像收罗与生存

1.随机生成位姿信息

  1. pose_list = []
  2. for i in range(num_samples):
  3.     # 随机生成目标位置和姿态朝向
  4.     x = np.random.uniform(x_min, x_max)
  5.     y = np.random.uniform(y_min, y_max)
  6.     z = np.random.uniform(z_min, z_max)
  7.     yaw = np.random.uniform(yaw_min, yaw_max)
  8.     pitch = np.random.uniform(pitch_min, pitch_max)
  9.     roll = np.random.uniform(roll_min, roll_max)
  10.     pose = airsim.Pose(airsim.Vector3r(x, y, z), airsim.to_quaternion(pitch, roll, yaw))
  11.     pose_list.append({'index': i,
  12.                       'x': x,
  13.                       'y': y,
  14.                       'z': z,
  15.                       'yaw': yaw,
  16.                       'pitch': pitch,
  17.                       'roll': roll})
复制代码
首先初始化一个空的列表pose_list,每次生成的位姿数据都会被存储为一个字典,并追加到 pose_list 中。
之后进入for循环,迭代生成随机样本。
  1. x = np.random.uniform(x_min, x_max)
  2. y = np.random.uniform(y_min, y_max)
  3. z = np.random.uniform(z_min, z_max)
  4. yaw=np.random.uniform(yaw_min,yaw_max)
  5. pitch=np.random.uniform(pitch_min,pitch_max)
  6. roll=np.random.uniform(roll_min,roll_max)
复制代码
在我们之前设定的范围内,随机生成了目标的位置和姿态朝向。
然后我们根据这些位置和姿态生成了airsim.Pose对象
  1. 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),用四元数表示朝向,传入三个欧拉角转为四元数。
  1. pose_list.append({'index': i,
  2.                   'x': x,
  3.                   'y': y,
  4.                   'z': z,
  5.                   'yaw': yaw,
  6.                   'pitch': pitch,
  7.                   'roll': roll})
复制代码
这行代码将每次生成的位置信息和姿态朝向存储为一个字典,使用append将字典添加到pose_list列表中,即列表的元素是一个字典。
2.移动无人机并收罗图像

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

  1. # 保存 PNG 格式的图像
  2. 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(
  3.     i, x, y, z, yaw, pitch, roll, j)
  4. img_filepath = os.path.join(folder_path, img_filename)
  5. print("File path:", os.path.normpath(img_filepath))
  6. 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 等变量添补到文件名中,如:

  1. os.path.join(folder_path, img_filename)
复制代码
将文件夹路径和文件名毗连起来,得到完整的图像文件路径,赋值给img_filepath。
  1. os.path.normpath(img_filepath)
复制代码
规范化文件路径,确保路径格式符合操纵系统的要求。
  1. airsim.write_png(os.path.normpath(img_filepath), img_rgb)
复制代码
调用 AirSim 的 write_png 函数,将 RGB 图像生存为 PNG 格式,生存到指定路径 img_filepath。
五、生存位姿

  1. #将位姿信息保存到csv文件中
  2. poses_df=pd.DataFrame(pose_list)
  3. 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 中的重要数据结构,它雷同于一个表格,可以或许方便地举行数据分析和操纵。
  1. 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企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表