Bir füzeye dönüş başlığını nasıl hesaplayabilirim?


14

Bir gemiden açılı olarak vurulan bir füzem var, füze daha sonra belirli bir dönüş yarıçapı ile bir yayda hedefe dönüyor. Füzenin doğrudan hedefe doğru gitmesi için dönmeye başlamamız gerektiğinde arktaki noktayı nasıl belirlerim?

DÜZENLE

Füzeleri başlatmadan önce yapmam gereken uçuş yollarını hesaplamak ve çizmektir. Ekteki örnekte fırlatma aracının 90 derece istikameti var ve hedefler onun arkasında. Her iki füze de fırlatma aracının başlığına -45 derecelik veya + 45 derecelik göreceli olarak fırlatıldı. Füzeler başlangıçta bilinen dönüş dönüş yarıçapıyla hedefe dönüyor. Sıranın füzeyi doğrudan hedefe saldırmak için döneceği istikamete götüreceği noktayı hesaplamalıyım. Açıkçası hedef 45 derece veya ona yakınsa, ilk dönüş olmazsa füze doğrudan hedef için gider.

Füze fırlatıldıktan sonra harita, uçuş hattının göstergesi olarak bu hattaki füze izlemesini de gösterecektir.

Yaptığım şey, operasyonel yazılımı taklit eden bir simülatör üzerinde çalışmak. Bu yüzden füzenin fırlatılmasına izin vermeden önce hesaplanan uçuş yolunu çizmem gerekiyor.

İki hedefe yönelik iki füze

Bu örnekte hedefler fırlatma aracının arkasındadır, ancak önceden hesaplanan yollar çizilir.


1
Başlık önceden hesaplanmış mı yoksa yörünge sırasında değişiyor mu? (homing füzesi gibi mi?)
Jonathan Connell

1
Sadece (x2-x1) ^ 2 + (y2-y1) ^ 2 = r ^ 2 olduğunda, (x1, y1) geçerli füze konumu ve (x2, y2) hedef olduğunda değil mi?
Komünist Ördek

Belki istediğini çizmelisin.
aaaaaaaaaaaa

3
Bu bir 2B veya 3B sorun mu?
Steve H

Hedef güdümlü füze gibi bir şey arıyorsanız, bunu herhangi bir trigonometri kullanmadan yapabilirsiniz. Bu soruya
BlueRaja - Danny Pflughoeft

Yanıtlar:


9

Benim matematiğim biraz yanlış olabilir, bu yüzden cevabı vikledim.

Sürekli hedef arama senaryosunu yapmak istediğinizi varsayıyorum - V1 hızında hareket eden füze P1'in sürekli olarak P2 oyuncusuna dönmeye çalıştığı; ancak sınırlı bir dönüş hızında.

  1. Oyuncu ve füze arasındaki vektörü belirleyin.

    V2 = P2 - P1
  2. Bunları birim vektörlere dönüştürün.

    V3 = UNIT(V1)
    V4 = UNIT(V2)
  3. Vektörler arasındaki açıyı belirleyin.

    a = ARCCOS(V3 * V4) (* indicating dot product)
  4. Aralarındaki açının değerini sınırlayın (trig fonksiyonlarınızın muhtemelen radyanlarla çalıştığını unutmayın, bu nedenle dönüş oranı olarak 0,1'i deneyin).

    a = SIGN(a) * MINIMUM(ABS(a), MaximumTurningRate)
  5. Yeni hareket vektörünü oluşturun.

    V1 = UNIT(V3.x + SIN(a), V4.y + COS(a)) * MissileSpeed

DÜZENLEME: Sürekli olarak hedef arama senaryosu için daha sağlam (ve daha kolay bir uygulama) olduğu için bunun 'başlangıç ​​noktası' yoktur. Bir daire için bir başlangıç ​​noktası bulmanıza gerek yoktur - sadece füzenin yönünü değiştirme hızını sınırlayın ve gerisi makinedeki hayalet nedeniyle gerçekleşir.


1
Mmm ... eğer bellek işe yarıyorsa, açının yönünü elde etmek için bir çapraz ürün yapmanız gerektiğini düşünüyorum. Sadece bir nokta ürünü yaparsanız, açının büyüklüğünü bilirsiniz, ancak yönü bilmezsiniz (nokta ürünleri V3 * V4 = V4 * V3'e sahip olabileceğinden, yönelimdeki farkı not etmenin bir yolu yok gibi görünüyor). Bu nedenle, nokta ürününü yapın ve ardından yönlendirmeyi bulmak için Z koordinatının işaretini kontrol eden bir çapraz ürün yapın.
ChrisE

@ChrisE Örnek 2B'dir (5.'ye bakar), bu nedenle orijinal yönlendirme ve açı büyüklüğü yeterli olmalıdır.
Keeblebrox

Arasındaki açıyı hesaplamak doğrudur, ancak 5. adımla belirtilen niyetinizin VEYA ne ürettiğinden emin değilim. Adım 5 v3'e a açısını eklediğimizi varsayalım çünkü matematiği anlamıyorum.
dlots

@ dlots adımı 5'in mevcut hareket vektörüne yeni 'sınırlı dönüş hızı açısını' eklemesi beklenir - temel olarak füzenin yönünü değiştirir.
Jonathan Dickinson

SIGN4. adımda neler var ?
Daniel Kaplan

2

Başlama hedefini hedef başlığa değiştirerek yönü değiştirmek istediğinizi varsayalım ve doğrudan hedefe devam edin (dönerken hedefe ulaşmak daha eğlenceli bir sorun olmalı!).

Her yöne aynı dönüş yarıçapı ile dönebildiğinizi varsaymalıyım (bu gerçek füzelerde görülmesi zor bir sadeliktir).

En basit çözüm 90 ° bükülmeyi kullanmaktır : füze, yörüngesi hedefle dik bir açı oluşturana kadar. tam olarak 90 ° noktada dönerseniz, hedefi tam olarak dönüş yarıçapı ile özleyeceksiniz, çünkü dönüşün kendisini dikkate almalısınız. Çözüm, 90 ° noktasına ulaşmadan önce tam olarak "dönüş yarıçapı" metreleri (?) Çevirmeye başlamak, sonra doğrudan hedefinize gitmek için 90 ° 'lik bir yay oluşturmaya çalışmaktır.

Bu çözüm her zaman mümkün değildir, örneğin 90 ° yol üzerinde görünürlük olmadığında (binalar veya diğer engeller).

İyi haber, çözümün her açıdan (sadece efsanevi 90 ° değil) işe yaramasıdır, hile daha önce dönmeye başlamak için gereken alanı dikkate almaktır.

Daha önce ne kadar? Bu yüzden 90 ° 'lik şeyler en basit çözümdür ...

Atış yolu θ ° bir açı oluşturduğunda görünürlüğe veya en iyi hedef başlığına ulaştığınızı varsayalım, o zaman dönüşü tahmin etmelisiniz:

(sec(90° - θ°) + tan(90° - θ°)) * turning_radius

... burada sekant kosinüsün tersidir. Kanıt önemsizdir ve okuyucuya bırakılmıştır.

Cidden, formül basit bir geometrik yapıdan geliyor.

Dönüm noktası grafiği

Siyah çizgi ateşleme yoludur, ince siyah çizgi ise_birim birimleri döndürülerek hedefe doğru hareket ettirilir; hedef yol olan kırmızı olanlar için de aynı şey geçerli.

Yeşil segmentlerin uzunluğu dönüyor, bu yüzden şunu görmelisiniz:

AB 90 ° - θ ° tanjantıdır

M.Ö. sekanttır.

Dönüm noktasından gelen her iki yeşil çizgi de uzun dönüyor ve iki yola dik; yani dönüş yarıçapı doğrudur ve ark her iki yola da teğettir (fiziksel kısıtlamalar altında bir dönüş yaparsanız olması gerektiği gibi).

Bir hata görürseniz bana bildirin.

DÜZENLE:

Gönderilen çizim, burada görebileceğiniz gibi sabit atıcı ve hedefle bile yol için birden fazla seçenek olduğunu gösterir:

resim açıklamasını buraya girin

Hedef seçildikten sonra, yukarıda söylediğim şeyi uygun açılarla uygulayabilirsiniz.


Bunun sürekli bir güncelleme sistemi olmadığını lütfen unutmayın. Hedef arama daha fazla işlemci (çok) gerektirdiğinden, bu sabit hedefler için veya bir "yarı aptal" füze uygulamak istiyorsa doğru yaklaşım olarak düşünülmelidir. Yörünge, yolu 3 alt-yolda bölmek üzerinden basitçe parametrelendirilebilir ve ark, Bezier eğrisi ile yaklaşık olarak tahmin edilebilir.
FxIII

1

Füze için bir "yönlendirme davranışı" uyguluyorum. Füze şunları içerir: Bir hız (bir sayı), bir konum (bir vektör) ve bir (mevcut) dönüş. Oyununuzdaki / her karedeki her güncellemede, füzenin dönüşü biraz değiştirilir (hedefe doğru). Daha sonra füze mevcut dönüşüne ve akım hızına göre ileri hareket ettirilir.

Tek fark ek bir boyut olduğu için 2D ve 3D için açıkça çalışıyor.

Başka bir olasılık, füzenin şiddetli yoldan önce yolunu hesaplamak olacaktır. Yukarı bak Bezier eğrileri veya spline .


Burada spline kullanmayla ilgili sorun, hedef hareket ederse kontrol noktalarını sürekli olarak güncellemeniz gerekmesidir. Burada basit bir direksiyon algo hesaplamalı olarak daha ucuz olabilir.
ChrisE

Aslında hedefe giden yolu önceden hesaplamaya çalışıyorum. Çalıştığım şey bazı gerçek ekipman için bir simülatör ve gerçek ekipmanın davranışını taklit etmeye çalışıyorum.
Tony

0

Burada yanlış problemi çözdüğünüzü hissediyorum. Gerçek dünyadaki bir füze nereye döneceğinden endişe etmeyecek, hedefine işaret edene kadar dönecek. İlgili tek hesaplama, gerçek dünya füzesi dönüş hızını anında değiştiremediği için kontrolleri nötr hale getirmeye ne zaman başlayacağıdır. Bu hesaplama sadece füzenin belirtilen hava hızını bir giriş değeri olarak alacaktır ve bence önceden hesaplanmış olurdu.


2
Gerçek bir dünya füzesi, özellikle sonraki silahlar atalet yönlendirme sistemleri veya GPS veya her ikisinde birden vardır, böylece bir arama alanına gitmek ve bir hedef aramaya başlamak için programlanırlar. Vay canına yakın bir dostu ise betide. Programlamanın, füzeyi dostluklardan ve kara kütleleri ve masum seyirciler gibi diğer engellerden kaçınan bir yola göndermenizi sağlaması bekleniyor.
Tony

0

En basit algoritmanın sadece iki kuralı izleyeceğini düşünüyorum:

  1. Mevcut hedef füzeye dönüş çapından daha yakınsa, düz devam edin. Bu, gerçek hedeflere ulaşmak yerine yakın hedeflerin etrafında dönen füzeyi önler.

  2. Aksi takdirde, işaret edene kadar hedefe doğru dönün.

Dönüşün 2B'de bittiği noktayı hesaplamak için:

  1. Dönüşe başlamak istediğiniz noktada, dönüş çemberinin merkezi, dönüş yarıçapınızın bir mesafesindeki mevcut istikamete dik bir yönde bulunur. Bu noktalardan ikisinin olduğunu unutmayın - muhtemelen hedefinize en yakın olanı istiyorsunuz. Bu konumu hesaplayın ve P olarak adlandırın.

  2. Artık tanjantta dik açıya sahip dik açılı bir üçgen ve bilinen iki nokta - P ve hedefiniz oluşturabilirsiniz. Bu, Pisagor ile teğetten hedef noktanıza olan mesafeyi hesaplamanızı sağlar. D olarak adlandırın.

  3. Şimdi hedefinizdeki dönüş yarıçapınızla D yarıçapı D dairesinin kesişimini hesaplamanız gerekir . Füzenin dönmeyi durduracağı dairenin iki teğet noktası olan iki çözüm elde edeceksiniz (dairenin etrafındaki her seyahat yönü için bir tane). Füzenin önündeki noktayı seç - bu senin cevabın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.