Menerapkan navigasi proporsional sederhana untuk peluru kendali

8

Saya mencoba menerapkan bentuk navigasi proporsional yang paling sederhana , misal, rudal berputar ke arah bahwa bearing-to-targetnya berubah, dan begitu bearing-to-targetnya tidak berubah, ia berada di jalur intersep.

Jadi, saya memiliki rudal 2d yang bergerak dengan kecepatan konstan ke arah yang dihadapinya, yang dapat berubah dengan kecepatan konstan, dan setiap interval saya memperbarui rudal dengan sesuatu seperti:

Position += VectorProduct (Direction * Speed * TimePassed)

PreviousTargetBearing = TargetBearing
TargetBearing = AngleBetween(TargetPosition, Position)
TargetBearingDelta = TargetBearing - PreviousTargetBearing

If TargetBearingDelta > 0: MissileDirection += TurnRate * TimePassed
If TargetBearingDelta < 0: MissileDirection -= TurnRate * TimePassed

Masalahnya adalah, rudal selalu berosilasi di sekitar arah peluncurannya, karena begitu rudal berubah pertama kali, ini membalikkan tanda TargetBearingDelta, membuatnya kemudian berputar ke arah yang berlawanan, dan seterusnya ...

Apa cara paling sederhana untuk menyelesaikan masalah ini? Saya yakin saya melewatkan sesuatu yang sederhana.

Pertanyaan StackOverflow terkait: Bagaimana cara membuat "rudal intersep" untuk sebuah game?

Untuk mengulangi, saya tertarik secara khusus dalam menerapkan algoritma navigasi proporsional , bukan pada algoritma homing secara umum.


Pembaruan: Saya kira jawaban yang jelas adalah tidak memeriksa bantalan dan menyesuaikan judul setiap belokan, tetapi untuk bergantian di antara keduanya. Saya akan mencobanya.

e100
sumber

Jawaban:

1

Langkah 1) Hitung waktu untuk menargetkan jika menggunakan garis lurus

Langkah 2) Hitung di mana target akan berada dengan pos saat ini pada saat itu.

Langkah 3) Tetapkan judul rudal menjadi tempat itu.

Langkah 4) Perbarui seperlunya

Pada awalnya, ini tidak akan terlalu akurat, tetapi begitu jarak ditutup akan menjadi lebih akurat; karena waktu untuk melakukan perjalanan menjadi nol, titik target untuk rudal semakin dekat ke target.

Berikan pusaran itu. Cukup sederhana untuk diimplementasikan. Beri tahu saya cara kerjanya karena saya ingin meletakkan rudal rumahan dalam permainan saya dan ini adalah pikiran pertama saya.

Dan untuk bagian ini:

If TargetBearingDelta > 0: MissileDirection += TurnRate * TimePassed
If TargetBearingDelta < 0: MissileDirection -= TurnRate * TimePassed

Saya malah akan memiliki dua variabel missileDirection. Satu untuk apa itu sebenarnya, dan satu untuk apa yang seharusnya di masa depan. Kemudian, langkah misil menuju ke arah yang diinginkan dengan kecepatan belokannya. Jika tajuk yang diinginkan lebih besar dari tajuk saat ini, tambahkan laju belokan. Jika lebih kecil, kurangi. Jika Anda melewati, setel sama.

Azaral
sumber
Ini sepertinya tidak menggunakan metode navigasi proporsional?
e100
Tidak, tetapi seharusnya memiliki efek yang sama. Ini akan merencanakan jalur penyadapan antara rudal dan target. Tujuan navigasi adalah agar rudal mencegat target. Proses di atas harus melakukan itu. Anda ingin yang sederhana.
Azaral
Poin wajar, +1 untuk Anda
e100
Jika Anda mencobanya, beri tahu saya caranya. Ini adalah rencanaku untuk menembakkan rudal di permainanku; Saya hanya belum memprogram rudal.
Azaral
Saya telah menerapkan metode ini untuk saat ini dan berfungsi dengan baik. Saya rasa saya tidak bisa menerima jawaban ini karena tidak cukup dekat dengan apa yang ingin saya sampaikan, tetapi terima kasih banyak.
e100
4

Seperti yang dikatakan Nailer, Anda dapat membatasi perubahan dalam beberapa cara.

Lihat PID , cara yang bagus untuk membuat segalanya bergerak ke 'nilai' tertentu dengan cepat tetapi tanpa melakukan overshooting, itu mungkin memberi Anda beberapa ide.

Anda juga dapat memeriksa pertanyaan ini , sedikit ke bawah adalah penjelasan tentang 'kurva anjing', algoritma pelacak yang sangat akurat yang digunakan oleh anjing.

Valmond
sumber
Saya dapat melihat bahwa saya memerlukan beberapa bentuk loop kontrol umpan balik teredam begitu rudal melacak target, tetapi saya pikir saya memiliki masalah awal yang lebih sederhana karena rudal hanya berosilasi pada arah peluncuran awal. Hanya untuk menekankan, saya pasti ingin menggunakan algoritma navigasi proporsional.
e100
Meskipun PID adalah instrumen yang bagus, sulit untuk menyesuaikan .. tetapi begitu tiga parameter (jika satu membutuhkan tiga) ditemukan, Anda memiliki solusi untuk mekanisme spesifik itu. +1 dari sisi saya.
teodron
terima kasih teodron ;-) @ e100: jika Anda ingin membuat rudal menjadi "lurus ke depan" ketika perhitungan dilakukan dan targetnya bergerak stabil, lihat contoh 'kurva anjing' karena tidak hanya itu. Jika tidak, 'TurnRate' Anda sama dengan 'P' (IIRC) dalam PID, Anda dapat menghitungnya dengan cepat, katakan 10% dari perbedaan dan bukan nilai tetap. Jika Anda 2 ° tentunya Anda tidak perlu perubahan yang sama seperti jika Anda 20 °.
Valmond
1

Menurut pendapat saya, akan ada metode lain yang melibatkan dua vektor, satu untuk arah untuk memukul rudal, dan yang lain adalah untuk dirinya sendiri lerping (atau mengatakan transisi arahnya untuk mencocokkan dengan vektor pertama).

Dengan cara ini, kita dapat menghasilkan waktu jeda yang memungkinkan rudal mengubah arahnya dengan lancar sesuai dengan perubahan pada vektor pertama. Saya percaya ini akan menghilangkan masalah dalam "tanda" operasi matematika.

PS. Poin utamanya adalah kita menggunakan vektor misle sendiri ke vektor arah (untuk memukul) terkait dengan sedikit jeda waktu.

haxpor
sumber
Perhatikan bahwa walaupun pendekatan ini dapat menghasilkan hasil, ini akan memberikan rudal waktu belokan konstan (bukan kecepatan belokan konstan ) - kecuali jika Anda menghitung ulang laju interpolasi setiap frame berdasarkan jarak belokan yang belum ditempuh untuk menghasilkan kecepatan belokan konstan.
doppelgreener
Saya perlu mencari "lerping"!
e100
1

Navigasi porportional mudah diterapkan dalam game.

Contoh implementasi dalam game adalah:

Akselerasi yang Dibutuhkan = LOS * LOS_Rate * NC + APN_bias

LOS = Vector3 (TargetPosition) - Vector3 (MissilePosition)

NC = Pengganda Konstan Navigasi (tergantung pada laju frame dijalankan)

APN_bias = LOS_Rate / delta_T * (NC / 2)

LOS_Rate = LOS Rotation Rate adalah tingkat perubahan sudut pandang di antara rudal dan target. Ini diukur dengan merekam rudal dan vektor target memposisikan setiap frame di delta_T, dan mengurangi masing-masing untuk mendapatkan perbedaan. Delta_T adalah referensi waktu (yaitu frame rate) di mana misil pengarah Anda berjalan dalam gim.

Untuk mendapatkan LOS_Rate, mintalah loop panduan rudal Anda lakukan hal berikut di setiap frame (delta_T):

// New LOS rate

LOS_Delta = Vector3( LOS ) - Vector3( LOS_previous_frame ) 

LOS_Rate = LOS_Delta.Vector3Length()

// Update LOS before we finish

LOS_previous_frame = Vector3( LOS )

Anda dapat menemukan informasi lebih lanjut tentang bagaimana kami menerapkan PN untuk Dunia dalam permainan Konflik di URL berikut di bawah ini. Semoga Anda menemukan ini bermanfaat.

http://www.moddb.com/mods/wicmw/features/flint-lead-pursuit-guidance-principles

http://download.wicmwmod.com/Fun_Mod/presentations/FLINT%20Jul%202012.pdf

-blahdy

James
sumber
0

Tidak bisakah Anda membatasi laju belokan sehingga tidak pernah bisa melewati TargetBearing dalam satu bingkai?

Jika belokan akan membuat rudal melewatinya dari bantalan target Anda cukup mengatur bantalan baru sama dengan bantalan target.

Apakah itu masuk akal?

Nailer
sumber
Tidak, kurasa tidak. Idenya tidak mengubah rudal menuju TargetBearing, tetapi berbalik ke arah yang TargetBearing berubah.
e100
Baik. Saya kira saya salah paham.
Nailer