基于Python matplotlib的无人机追踪模拟仿真可视化

Matplotlib

Matplotlib 是一个 Python 的 2D 绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形

一、静态图形

首先假设飞机飞行在某一高度位置,飞行高度不会发生变化,这样就可以在二维平面内表示飞机的飞行轨迹,让我们先把飞机飞行的平面确立下来吧。
基于Python matplotlib的无人机追踪模拟仿真可视化_第1张图片
假定这就是飞机飞行的平面区域,在位置为 x ∈ [ 0 , 80 ] , y ∈ [ 0 , 40 ] x∈[0,80],y∈[0,40] x[0,80],y[0,40]的平面飞行,这里为表示完全,在 x , y x,y x,y坐标轴范围左右分别延伸 1 1 1。我们以飞机的初始坐标 ( 0 , 20 ) (0,20) (0,20)为例,向东方向输出一张静态的飞机飞行轨迹。
基于Python matplotlib的无人机追踪模拟仿真可视化_第2张图片
散点图用 ∗ * 符号表示,这样输出的就是五角星的散点图。

实现代码
import matplotlib.pyplot as plt

plane_xcoordinate = list(range(0, 84, 4))  # 起始0,终止84,步长为4
plane_ycoordinate = [20] * len(plane_xcoordinate)  # 保证对应数组一致

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.title('轨迹图')  # 图标题
plt.xlim(-1, 81)  # x轴范围(0,80)比范围稍微多出一丢丢
plt.ylim(-1, 41)  # y轴范围(0,40)比范围稍微多出一丢丢
plt.xlabel('$x/km$')  # x轴坐标轴标注
plt.ylabel('$y/km$')  # y轴坐标轴标注
plt.scatter(plane_xcoordinate, plane_ycoordinate, marker='*', s=40, cmap='b')
plt.show()

二、动态图

动态图就是静态图一帧一帧输出,需要用到 p l t . i o n ( ) plt.ion() plt.ion() p l t . s l e e p ( ) plt.sleep() plt.sleep()两个函数,这样才能出现如下的效果,关于函数的具体用法,请看 p l t . i o n ( ) plt.ion() plt.ion()

2.1 无人机直线飞行轨迹图

无人机在二维平面的起始位置为 ( 0 , 20 ) (0,20) (0,20),终点位置为 ( 80 , 20 ) (80,20) (80,20),飞机飞行速度为 5 k m / s 5km/s 5km/s
,每隔1s输出一帧图像。

基于Python matplotlib的无人机追踪模拟仿真可视化_第3张图片

代码实现
import matplotlib.pyplot as plt

x_scope = [0, 80]  # x范围
y_scope = [0, 40]  # y范围
plane_coordinate = [0, y_scope[1] / 2]  # 初始坐标(0,40)
plane_v = 5  # 飞机速度为5
t_ = 1  # 每隔1s输出一帧图像
plt.ion()
plt.title('轨迹图')  # 图标题
plt.xlabel('$x/km$')  # x轴坐标轴标注
plt.ylabel('$y/km$')  # y轴坐标轴标注
plt.xlim(-1, 81)  # x轴范围(0,80)比范围稍微多出一丢丢
plt.ylim(-1, 41)  # y轴范围(0,40)比范围稍微多出一丢丢
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
while plane_coordinate[0] <= x_scope[1]:
    list_xc = [plane_coordinate[0]]  # 点坐标转换为列表放入scatter函数中
    list_yc = [plane_coordinate[1]]
    plt.scatter(list_xc, list_yc, marker='*', s=40, c='b')
    plt.pause(1)
    plane_coordinate[0] = plane_coordinate[0] + plane_v * t_  # 飞机每隔1s下一时刻的x坐标位置
plt.ioff()
plt.show()

2.2 无人机追踪图

首先确定无人机追踪方式,其飞行速度方向朝向为要追击的无人机
基于Python matplotlib的无人机追踪模拟仿真可视化_第4张图片

在上图中,蓝色飞机为逃跑机,红色飞机为追击机,红色飞机的速度朝向角度为 α \alpha α
α = ∣ a t a n y r − y b x r − x b ∣ \alpha=|atan\frac{y_r-y_b}{x_r-x_b}| α=atanxrxbyryb
红色飞机下一时刻的坐标动态的变化公式为:
{ x r = x 0 − v r t c o s α y r = y 0 − v r t s i n α \left\{\begin{array}{l} x_r=x_0-v_rtcos\alpha \\ y_r=y_0-v_rtsin\alpha \end{array}\right. {xr=x0vrtcosαyr=y0vrtsinα

假设红色飞机的速度为 6 k m / s 6km/s 6km/s,蓝色飞机的速度为 4 k m / s 4km/s 4km/s
基于Python matplotlib的无人机追踪模拟仿真可视化_第5张图片

代码实现
import matplotlib.pyplot as plt
import math


def flee(A, v_A):  # 经过t时间改变A的坐标 A逃跑
    A[0] = A[0] + v_A * t_  # 飞机每隔1s下一时刻的x坐标位置


def followrealtime_coordinate(A, B, v_B):  # 经过t时间改变B的坐标 B追A
    tanα = abs((A[1] - B[1]) / (A[0] - B[0]))
    α = math.atan(tanα)
    if B[1] > A[1] and B[0] > A[0]:  # 追击机在逃跑机右上方
        B[1] = B[1] - v_B * t_ * math.sin(α)
        B[0] = B[0] - v_B * t_ * math.cos(α)
    elif B[1] < A[1] and B[0] > A[0]:  # 追击机在逃跑机右下方
        B[1] = B[1] + v_B * t_ * math.sin(α)
        B[0] = B[0] - v_B * t_ * math.cos(α)
    elif B[1] > A[1] and B[0] < A[0]:  # 追击机在逃跑机左上方
        B[1] = B[1] - v_B * t_ * math.sin(α)
        B[0] = B[0] + v_B * t_ * math.cos(α)
    else:  # 追击机在逃跑机左下方
        B[1] = B[1] + v_B * t_ * math.sin(α)
        B[0] = B[0] + v_B * t_ * math.cos(α)


x_scope = [0, 80]  # x范围
y_scope = [0, 40]  # y范围

plane_coordinateA = [x_scope[1] / 3, y_scope[1] / 2]  # A初始坐标(80/3,20)
plane_coordinateB = [0, 0]  # A初始坐标(0,0)
planeA_v = 4  # 飞机速度为4km/s
planeB_v = 6  # 飞机速度为6km/s
t_ = 0.5  # 每隔0.5s输出一帧图像

plt.ion()
plt.title('轨迹图')  # 图标题
plt.xlabel('$x/km$')  # x轴坐标轴标注
plt.ylabel('$y/km$')  # y轴坐标轴标注
plt.xlim(-1, 81)  # x轴范围(0,80)比范围稍微多出一丢丢
plt.ylim(-1, 41)  # y轴范围(0,40)比范围稍微多出一丢丢
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
while plane_coordinateA[0] <= x_scope[1]:
    # 下面三句代码输出逃跑无人机A的散点图
    list_xc = [plane_coordinateA[0]]  # 点坐标转换为列表放入scatter函数中
    list_yc = [plane_coordinateA[1]]  # 点坐标转换为列表放入scatter函数中
    plt.scatter(list_xc, list_yc, marker='*', s=40, c='b')
    # 下面三句代码输出追踪无人机B的散点图
    list_xc = [plane_coordinateB[0]]  # 点坐标转换为列表放入scatter函数中
    list_yc = [plane_coordinateB[1]]  # 点坐标转换为列表放入scatter函数中
    plt.scatter(list_xc, list_yc, marker='*', s=40, c='r')

    plt.pause(1)  # 输出一帧停顿1s
    flee(plane_coordinateA, planeA_v)  # A机沿直线逃跑
    followrealtime_coordinate(plane_coordinateA, plane_coordinateB, planeB_v)  # B通过调转机头方向追击A机

plt.ioff()
plt.show()

你可能感兴趣的:(Python程序设计,无人机,动态matplotlib)