无人机仪器读数可视化
本示例实现了可视化算法
无人机传感器记录的飞行数据。
本演示的目的是展示数据可视化的不同可能性,包括基于时间的数据可视化。
数据可视化的不同可能性,包括基于时间的数据可视化。
我们先从 CSV 文件读取记录的数据。
In [ ]:
using CSV
# Читаем данные из файла data.csv
df_read = CSV.read("$(@__DIR__)/data_drone.csv", DataFrame)
# Проверка первых строк
first(df_read, 5)
Out[0]:
我们可以看到,表格包含 3 个字段,即时间计数、高度值和无人机相对于地平线的倾斜角度。
In [ ]:
max_idx = 350;
t = df_read.Время[1:max_idx]
heights = df_read.Высота[1:max_idx]
angles = df_read.Угол[1:max_idx]
H = plot(t, heights, title="Высота")
A = plot(t, angles, title="Угол наклона")
plot(H, A, layout=(2, 1), legend=false)
Out[0]:
根据传感器数值的可视化。
我们可以看到,无人机在绕着某种地平线飞行的过程中,逐渐增加高度和
并改变俯仰角,因为它在绕着某种障碍物飞行。
障碍物。我们还可以看到
这很可能是
无人机在有风的条件下飞行。
接下来,让我们声明无需在循环中更新的静态变量。
In [ ]:
max_y_h = maximum(heights)+10
# Уравнение единичной окружности
θ = range(0, 2π, length=100)
x_circle = cos.(θ)
y_circle = sin.(θ)
x = [-1, 1]
using Images
# Загрузка изображения дрона
drone_img = load("$(@__DIR__)/drone.jpg")
Out[0]:
现在让我们进入数据可视化循环本身。它可以有条件地分为三个部分。
- 高度显示。在每个时间点,都会以红点的形式绘制高度图。
轴约束条件设置为显示当前时间 ±10 秒周围的区域。
图头显示当前高度值和一个向上/向下箭头,取决于高度是上升还是下降。
2.俯仰角图。俯仰图显示无人机相对于地平线的偏转角度。
cosd 和 sind 函数用于绘制俯仰线。
页眉包含以度为单位的俯仰角值。
3.无人机图像旋转和可视化,无人机图像旋转一定角度(俯仰角值 + 90 度)。
channelview 功能将图像转换为便于进一步处理的视图。
使用掩码去除黑色像素。
最后,将所有三幅图像合并为一帧,形成 GIF 帧。
In [ ]:
@gif for i in 1:length(t)
ti = t[i]
ai = angles[i]
hi = heights[i]
# Высота
h_plt = scatter([ti], [hi],
markershape=:circle, markersize=15, markercolor=:red, framestyle=:box,
xlims = (ti-10, ti+10), ylims = (0, max_y_h),
legend=false, grid=false,
title="Высота: $hi m $((i == 1 || heights[i] > heights[i-1]) ? "↑" : "↓")")
# Тангаж
tang = plot([x_circle, (cosd(-ai) .* x)], [y_circle, (sind(-ai) .* x)],
linewidth=3, color=:black, framestyle=:none,
title="Отклонение: $(ai)°")
# Дрон
sx,sy = size(drone_img) .÷ 3;
mini_drone = imresize( drone_img, sx, sy );
rotated_array = channelview(Gray.(imrotate(mini_drone, π*(ai+90)/ 180, fillvalue=oneunit(eltype(mini_drone)), axes(mini_drone))));
dron = plot(framestyle=:none, grid=false, title = "Время: $(t[i])sec")
# Отображаем повернутое изображение дрона
heatmap!(
1:size(rotated_array, 2), 1:size(rotated_array, 1),
permutedims(rotated_array, (2, 1)),
colorbar=false, c=:grays
)
Tng_Dr = plot(dron, tang, layout = grid(2, 1, heights=[0.8, 0.2]))
grup = plot(Tng_Dr, h_plt, layout= grid(1, 2, width = [0.75, 0.25]), legend=false)
end
Out[0]:
结论
根据 GIF 的结果,我们可以发现
我们可以得到一个相当翔实的数据表示
随着时间的推移。这种方法
尤其是在描述真实物理对象的行为时。