无人机(固定翼、多旋翼)飞行数据获取(数据闪存日志、.Bin文件转.log文件、飞行数据处理与筛选)以及飞行轨迹可视化
·
1.飞行数据获取
通过数传或者USB线与飞控连接、也可以直接读取SD卡中的内容。
闪存日志下载过程可以看这篇文章的过程:(44 封私信) APM/Pixhawk飞行日志分析入门 - 知乎(注意:如果在下载的过程中发现文件都是1970/1/1 8:00:00开头的,一个原因是因为GPS没信号的问题、如果在GPS有信号的情况下仍然是这样,那么就需要更换个SD卡,亲测有效)。
此外,有些参数需要设置。Downloading and Analyzing Data Logs in Mission Planner — Dev documentation(包括:记录方式、什么时候开始记录、记录的文件大小、记录的速率等等)

下载完成之后得到的是.Bin文件,然后在数据缓存日志下的Pix4 .Bin转.log文件选项进行转换。

就可以得到下面这种形式的数据

将其复制到EXCEL中,然后在菜单栏中选择数据----->选择分列------>选择分割符号------>选择逗号。


然后就可以得到分布完整数据

选中第一列,点击开始菜单------>选择筛选------>点击第一行的下拉三角符号----->选择需要保留的数据即可。



在本文中,我保留的是GPS的纬度、经度以及高度数据。下面就是根据数据进行可视化
2.飞行轨迹可视化
首先看一下,可视化效果图




完整代码:
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import plotly.express as px
import plotly.graph_objects as go
import numpy as np
# 设置中文字体以避免显示为方框
plt.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示为方框的问题
def load_flight_data(file_path, lat_col=0, lon_col=1, alt_col=2):
"""
加载飞行数据Excel文件
默认情况下,第0列是纬度,第1列是经度,第2列是高度
"""
df = pd.read_excel(file_path)
# 根据列索引重命名列
df.columns.values[lat_col] = 'latitude'
df.columns.values[lon_col] = 'longitude'
df.columns.values[alt_col] = 'altitude'
# 重新创建DataFrame以确保列名正确
df = pd.DataFrame({
'latitude': df.iloc[:, lat_col],
'longitude': df.iloc[:, lon_col],
'altitude': df.iloc[:, alt_col]
})
return df
def visualize_flight_3d_scatter(df):
"""
创建3D散点图展示飞行轨迹
"""
fig = px.scatter_3d(df, x='longitude', y='latitude', z='altitude',
title='飞机飞行轨迹 3D 可视化',
labels={'longitude': '经度', 'latitude': '纬度', 'altitude': '高度'},
color='altitude', # 根据高度着色
size_max=5)
fig.show()
def visualize_flight_2d_path(df):
"""
创建2D路径图展示飞行轨迹
"""
plt.figure(figsize=(12, 8))
# 2D轨迹图
plt.subplot(2, 2, 1)
plt.plot(df['longitude'], df['latitude'], 'b-', linewidth=1)
plt.scatter(df['longitude'], df['latitude'], c=df['altitude'], cmap='viridis', s=10)
plt.colorbar(label='高度')
plt.xlabel('经度')
plt.ylabel('纬度')
plt.title('飞行轨迹平面图')
plt.grid(True)
# 高度变化图
plt.subplot(2, 2, 2)
plt.plot(df.index, df['altitude'], 'r-', linewidth=1)
plt.xlabel('时间点')
plt.ylabel('高度')
plt.title('高度变化图')
plt.grid(True)
# 经度-高度图
plt.subplot(2, 2, 3)
plt.plot(df['longitude'], df['altitude'], 'g-', linewidth=1)
plt.xlabel('经度')
plt.ylabel('高度')
plt.title('经度-高度关系图')
plt.grid(True)
# 纬度-高度图
plt.subplot(2, 2, 4)
plt.plot(df['latitude'], df['altitude'], 'm-', linewidth=1)
plt.xlabel('纬度')
plt.ylabel('高度')
plt.title('纬度-高度关系图')
plt.grid(True)
plt.tight_layout()
plt.show()
def create_interactive_3d_plot(df):
"""
创建交互式3D飞行轨迹图
"""
fig = go.Figure(data=go.Scatter3d(
x=df['longitude'],
y=df['latitude'],
z=df['altitude'],
mode='lines+markers',
line=dict(width=5, color='blue'),
marker=dict(size=4),
text=[f'经度: {lon}<br>纬度: {lat}<br>高度: {alt}'
for lon, lat, alt in zip(df['longitude'], df['latitude'], df['altitude'])],
hovertemplate='<b>%{text}</b><extra></extra>'
))
fig.update_layout(
title='交互式飞行轨迹 3D 图',
scene=dict(
xaxis_title='经度',
yaxis_title='纬度',
zaxis_title='高度'
),
width=800,
height=600
)
fig.show()
def create_3d_matplotlib_plot(df):
"""
使用matplotlib创建3D图
"""
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')
# 根据高度着色
scatter = ax.scatter(df['longitude'], df['latitude'], df['altitude'],
c=df['altitude'], cmap='viridis', s=20)
ax.plot(df['longitude'], df['latitude'], df['altitude'], alpha=0.6)
ax.set_xlabel('经度')
ax.set_ylabel('纬度')
ax.set_zlabel('高度')
ax.set_title('飞机飞行轨迹 3D 图 (Matplotlib)')
# 添加颜色条
plt.colorbar(scatter, ax=ax, shrink=0.5, aspect=20)
plt.show()
def main():
# 加载数据
file_path = r"C:\Users\Robot\Desktop\飞机实验数据\纬度经度高度.xlsx" # 替换为您的Excel文件路径
df = load_flight_data(file_path)
print("数据预览:")
print(df.head())
print(f"数据形状: {df.shape}")
print(f"数据统计信息:")
print(df.describe())
# 创建可视化
print("\n正在生成3D散点图...")
visualize_flight_3d_scatter(df)
print("\n正在生成2D路径图...")
visualize_flight_2d_path(df)
print("\n正在生成交互式3D图...")
create_interactive_3d_plot(df)
print("\n正在生成Matplotlib 3D图...")
create_3d_matplotlib_plot(df)
if __name__ == "__main__":
main()
所需环境:
pandas>=1.3.0
matplotlib>=3.4.0
plotly>=5.0.0
numpy>=1.21.0
openpyxl>=3.0.0
更多推荐

所有评论(0)