Python 有预测导弹拦截

一种简单的有预测导弹拦截

  • 导弹将瞄准目标的正前方
  • 视频展示如下 

1 dt=001

2

  • 导弹实现的功能

    • 导弹瞄准目标的正前方
    • 导弹距离目标较远时,加速度较小
    • 导弹聚集目标较近时,加速度较大,以达到命中而不至于近身擦过的问题
      • 因此导弹会花很长的时间在初段追踪上,在末端的用时很短

导弹预测代码

#导弹自动追踪算法
#简单到超级的预测
import numpy as np
import matplotlib.pyplot as plt
import random

from matplotlib.animation import ArtistAnimation
class target():

    def __init__(self,loca=np.array([800.,1000.]),verb=np.array([25.,35.]),acce=np.array([5.,-10.]),dn=-1):
        self.loca = loca
        self.verb = verb
        self.acce = acce
        self.dn = dn

    def aim(self):
        self.verb += np.array([0,0.])
        self.acce += np.array([0,0.])

    def run(self):
        self.verb += dt * self.acce
        self.loca += dt * self.verb + 0.5 * self.acce * dt**2

class missile():
    global Target
    global dt
    def __init__(self,loca=np.array([0.,0.]),verb=np.array([0.,0.]),acce=np.array([0.,0.]),dn=-1):
        self.loca = loca
        self.verb = verb
        self.acce = acce
        self.dn = dn

    def aim(self,Target):
        acce_max = 4
        minlim = 30
        maxlim = 2000
        for tar in Target:
            if tar.dn == missile1.dn:
                ABS = sum((self.loca-tar.loca)**2) ** 0.5
                if ABS <= 1500:
                    acce_max *= 4
                if ABS <= 1000:
                    acce_max *= 6.5
                if ABS <= 500:
                    acce_max *= 8
                if ABS <= 200:
                    acce_max *= 10
                cosa,sina = (tar.loca-self.loca)/ABS
                self.acce = np.array([cosa,sina])*acce_max
                if sum((tar.loca - self.loca)**2) <= minlim**2:
                    print("strike!")
                    Target.remove(tar)
                    break
                if sum((tar.loca - self.loca)**2) >= maxlim**2:
                    print("miss!")
                    break 
                break
         

    def run(self):
        self.verb += dt * self.acce
        self.loca += dt * self.verb + 0.5 * self.acce * dt**2
    

def draw():
    global Target
    global Missile
    global time
    global Tx
    global Ty
    global Mx
    global My

    
    for i in Target:
        Tx.append(i.loca[0])
        Ty.append(i.loca[1])
    for i in Missile:
        Mx.append(i.loca[0])
        My.append(i.loca[1])
    
    plt.xlim(0,4000)
    plt.ylim(0,2000)
    plt.plot(Tx,Ty,linewidth=3,c="red",label="target")
    plt.plot(Mx,My,linewidth=3,c="green",label="missile")
    plt.legend()
    plt.title(str(round(time,2)))
    plt.pause(0.5)
    plt.cla()

if __name__ == "__main__":
    Tx = []
    Ty = []
    Mx = []
    My = []


    dt = 0.05
    time = 0
    target1 = target()
    Target = [target1]    
    missile1 = missile()
    Missile = [missile1]
    while Target:
        for i in Target:
            i.aim()
            i.run()
        for i in Missile:
            i.aim(Target)
            i.run()
        draw()
        time += dt
  • 这样的预测呢,不可能让人满意,只是记录一下我开始学着做导弹轨迹预测的问题
  • 真实的情景中呢,至少还有三四个点没有考虑到
    • 敌方目标的运动轨迹在大方向上是可以预测的
      • 导弹打击目标
      • 飞机飞行方向
    • 敌方目标的运动准确轨迹也是可以预测的
      • 弹道导弹在仅凭重力的运动情况下,是可以大致解算出导弹的轨迹
    • 导弹击中目标并不是像我们的程序一样,导弹与目标在一定的距离内就算命中
      • 这可能是日本人的防空白磷弹
      • 现实中的导弹要考虑 命中部位,攻击角度等很多因素
    • 敌方的目标也会机动
    • 我方导弹的侦测能力是有限的
  • 未来加油!
  • 在读文献!
  • 国庆间图一乐!

猜你喜欢

转载自blog.csdn.net/Chandler_river/article/details/127178140
今日推荐