Engee 文档
Notebook

无人机仪器读数可视化

本示例实现了可视化算法 无人机传感器记录的飞行数据。

本演示的目的是展示数据可视化的不同可能性,包括基于时间的数据可视化。 数据可视化的不同可能性,包括基于时间的数据可视化。

我们先从 CSV 文件读取记录的数据。

In [ ]:
using CSV

# Читаем данные из файла data.csv
df_read = CSV.read("$(@__DIR__)/data_drone.csv", DataFrame)

# Проверка первых строк
first(df_read, 5)
Out[0]:
5×3 DataFrame
RowВремяВысотаУгол
Int64Float64Float64
100.0-4.0
213.0-5.0
325.0-3.0
438.0-3.0
5410.0-3.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]:
No description has been provided for this image

现在让我们进入数据可视化循环本身。它可以有条件地分为三个部分。

  1. 高度显示。在每个时间点,都会以红点的形式绘制高度图。 轴约束条件设置为显示当前时间 ±10 秒周围的区域。 图头显示当前高度值和一个向上/向下箭头,取决于高度是上升还是下降。 2.俯仰角图。俯仰图显示无人机相对于地平线的偏转角度。 cosdsind 函数用于绘制俯仰线。 页眉包含以度为单位的俯仰角值。 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
[ Info: Saved animation to /user/start/examples/image_processing/dron/tmp.gif
Out[0]:
No description has been provided for this image

结论

根据 GIF 的结果,我们可以发现 我们可以得到一个相当翔实的数据表示 随着时间的推移。这种方法 尤其是在描述真实物理对象的行为时。