马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
无人机不同视角下收罗不同场景图片的代码如下:
- 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([airsim.ImageRequest(camera_name,airsim.ImageType.Scene,False,False)])
- img_raw=responses[0]
- #将字节流转为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([airsim.ImageRequest(camera_name, airsim.ImageType.Scene, False, False)])
- img_raw = responses[0]
- # 将字节流转换为 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[0]将原始图像的字节数据赋值给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 等变量添补到文件名中,如:
- 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企服之家,中国第一个企服评测及商务社交产业平台。 |