Bagaimana cara menghitung belok menuju ke rudal?


14

Saya memiliki rudal yang ditembakkan dari kapal pada suatu sudut, rudal kemudian berputar ke arah sasaran dalam lengkungan dengan radius belokan yang diberikan. Bagaimana cara menentukan titik pada busur ketika saya harus mulai berputar sehingga rudal langsung menuju sasaran?

EDIT

Apa yang perlu saya lakukan sebelum meluncurkan rudal adalah menghitung dan menggambar jalur penerbangan. Jadi dalam contoh terlampir, kendaraan peluncuran memiliki heading 90 derajat dan target ada di belakangnya. Kedua rudal diluncurkan pada pos relatif -45deg atau +45 deg ke pos peluncuran kendaraan. Rudal awalnya berbelok ke target dengan radius belokan yang diketahui. Saya harus menghitung titik di mana belokan membawa rudal ke arah di mana ia akan berbalik untuk langsung menyerang target. Tentunya jika target berada di atau dekat 45 derajat maka tidak ada putaran awal misil langsung menuju sasaran.

Setelah rudal diluncurkan, peta juga akan menampilkan pelacakan rudal di jalur ini sebagai indikasi jalur terbangnya.

Apa yang saya lakukan adalah mengerjakan simulator yang meniru perangkat lunak operasional. Jadi saya harus menggambar jalur penerbangan yang dihitung sebelum saya membiarkan rudal diluncurkan.

Dua rudal ditujukan pada dua sasaran

Dalam contoh ini target berada di belakang kendaraan peluncuran tetapi jalur yang telah ditentukan dihitung.


1
Apakah pos dihitung sebelumnya atau apakah itu berubah selama lintasan? (Seperti misil pengarah?)
Jonathan Connell

1
Bukankah hanya ketika (x2-x1) ^ 2 + (y2-y1) ^ 2 = r ^ 2, di mana (x1, y1) adalah posisi rudal saat ini dan (x2, y2) adalah targetnya?
Bebek Komunis

Mungkin Anda harus membuat gambar dari apa yang Anda inginkan.
aaaaaaaaaaaa

3
Apakah ini masalah 2D atau 3D?
Steve H

Jika Anda mencari sesuatu seperti peluru kendali, Anda dapat melakukannya tanpa menggunakan trigonometri apa pun. Lihat pertanyaan ini
BlueRaja - Danny Pflughoeft

Jawaban:


9

Matematika saya mungkin sedikit salah, jadi saya sudah menggunakan jawabannya.

Saya berasumsi Anda ingin melakukan skenario homing terus menerus - di mana P1 rudal bepergian dengan kecepatan V1 terus-menerus mencoba untuk berbalik ke arah pemain P2; tetapi pada tingkat belokan terbatas.

  1. Tentukan vektor antara pemain dan rudal.

    V2 = P2 - P1
  2. Ubah mereka menjadi vektor satuan.

    V3 = UNIT(V1)
    V4 = UNIT(V2)
  3. Tentukan sudut antara vektor.

    a = ARCCOS(V3 * V4) (* indicating dot product)
  4. Batasi nilai sudut di antara mereka (ingat fungsi trigonometri Anda mungkin bekerja dengan radian, jadi coba 0,1 sebagai laju belokan).

    a = SIGN(a) * MINIMUM(ABS(a), MaximumTurningRate)
  5. Buat vektor gerakan baru.

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

EDIT: Ini tidak memiliki 'titik awal' karena ini lebih kuat (dan merupakan implementasi yang lebih mudah) untuk skenario homing yang berkelanjutan. Anda tidak perlu menemukan titik awal untuk lingkaran - cukup batasi kecepatan di mana rudal dapat mengubah arah dan sisanya terjadi karena hantu di mesin.


1
Mmm ... jika ingatanku, saya pikir Anda perlu melakukan cross-produk untuk mendapatkan arah sudut. Jika Anda hanya melakukan produk titik, Anda akan mengetahui besarnya sudut tetapi bukan arah (karena produk titik dapat memiliki V3 * V4 = V4 * V3, tampaknya tidak ada cara untuk mencatat perbedaan dalam orientasi). Jadi, lakukan produk titik, dan kemudian lakukan produk silang - memeriksa tanda koordinat Z - untuk menemukan orientasi.
ChrisE

@ Chris Contohnya adalah dalam 2D ​​(melihat 5.), sehingga orientasi asli dan besarnya sudut harus memadai.
Keeblebrox

Menghitung sudut antara benar, tapi saya tidak yakin apa maksud Anda dengan langkah 5 adalah ATAU apa yang dihasilkannya. Apakah langkah 5 misalkan menambahkan sudut a ke v3 karena saya tidak mengerti matematika.
dlots

@dlots langkah 5 seharusnya menambahkan 'sudut laju belok terbatas' baru ke vektor gerakan saat ini - pada dasarnya ia mengubah arah rudal.
Jonathan Dickinson

Apa yang ada SIGNdi langkah 4?
Daniel Kaplan

2

Saya berasumsi Anda ingin mengubah arah dengan mengubah pos peluncuran ke target, lalu terus lurus ke target (masalah yang lebih menyenangkan adalah mengenai target ketika berbalik!).

Saya harus berasumsi bahwa Anda dapat berbelok dengan radius belokan yang sama di semua arah (ini adalah penyederhanaan yang sulit dilihat dalam rudal nyata).

Solusi paling sederhana adalah dengan menggunakan tekukan 90 ° : file rudal hingga lintasannya membentuk sudut yang tepat dengan target. jika Anda berbelok tepat pada titik 90 ° Anda akan kehilangan target tepat oleh radius belokan, karena Anda harus memperhitungkan belokan itu sendiri. Solusinya adalah mulai memutar tepat "putar radius" meter (?) Sebelum mencapai titik 90 °, lalu belok membentuk busur (coba tebak) 90 ° untuk langsung menuju target Anda.

Solusi ini tidak selalu layak, misalnya ketika Anda tidak memiliki visibilitas di jalur 90 ° (bangunan atau hambatan lainnya).

Berita baiknya adalah solusinya bekerja untuk setiap sudut (bukan hanya mitos 90 °) triknya adalah dengan memperhitungkan ruang yang diperlukan untuk belok mulai belok sebelum.

Berapa sebelumnya? Inilah sebabnya mengapa 90 ° barang adalah solusi paling sederhana ...

Katakanlah Anda mencapai visibilitas atau sasaran sasaran terbaik ketika jalur tembak membentuk sudut θ ° maka Anda harus mengantisipasi belokan dengan:

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

... Di mana garis potong adalah kebalikan dari cosinus. Buktinya sepele dan diserahkan kepada pembaca.

Serius, rumusnya berasal dari konstruksi geometris sederhana.

Grafik titik balik

Garis hitam adalah jalur tembak, sedangkan garis hitam tipis adalah jalur yang sama bergerak menuju target dengan memutar unit_radius; sama untuk yang merah yang merupakan jalur target.

Panjang segmen hijau adalah turning_radius sehingga Anda akan melihat bahwa:

AB adalah garis singgung dari 90 ° - θ °

BC adalah garis potong.

Kedua garis hijau yang berasal dari titik belok ini memiliki panjang turning_radius dan tegak lurus terhadap dua jalur; artinya jari-jari belok benar dan busur bersinggungan dengan kedua jalur (sebagaimana seharusnya jika Anda berbelok di bawah kendala fisik).

Beri tahu saya jika Anda melihat beberapa kesalahan.

EDIT:

Gambar yang Anda diposting menunjukkan bahwa ada beberapa pilihan untuk path bahkan dengan shooter dan target tetap seperti yang Anda lihat di sini:

masukkan deskripsi gambar di sini

Setelah target dipilih, Anda dapat menerapkan apa yang saya katakan di atas dengan sudut yang tepat.


Harap dicatat bahwa ini bukan sistem pembaruan yang berkelanjutan. Karena homing memerlukan lebih banyak cpu (banyak), ini harus mempertimbangkan pendekatan yang tepat untuk target tetap atau jika seseorang ingin mengimplementasikan rudal "semi-bisu" tentu saja. Lintasan dapat dengan mudah dipisah-pisahkan lebih dari t membelah jalur dalam 3 subpath dan busur dapat diperkirakan dengan kurva Bezier.
FxIII

1

Saya akan menerapkan "perilaku kemudi" untuk rudal. Rudal memiliki: Kecepatan (angka), posisi (vektor), dan rotasi (arus). Pada setiap pembaruan di gim Anda / di setiap frame, rotasi rudal diubah sedikit (menuju target). Kemudian rudal itu bergerak maju sesuai dengan rotasi dan kecepatan arusnya.

Berfungsi untuk 2D dan 3D jelas, karena satu-satunya perbedaan adalah dimensi tambahan.

Kemungkinan lain adalah menghitung jalur rudal sebelum menerbangkannya. Mencari kurva bezier atau spline .


Masalah dengan menggunakan spline di sini adalah Anda harus terus memperbarui titik kontrol jika target bergerak. Algo steering sederhana di sini mungkin lebih murah secara komputasi.
ChrisE

Sebenarnya saya sedang mencoba untuk menghitung ulang jalan menuju target. Apa yang saya kerjakan adalah simulator untuk beberapa peralatan nyata dan saya mencoba untuk meniru perilaku peralatan nyata.
Tony

0

Saya merasa Anda menyelesaikan masalah yang salah di sini. Rudal dunia nyata tidak akan khawatir tentang ke mana harus berpaling, itu hanya akan berbalik sampai diarahkan ke sasarannya. Satu-satunya perhitungan yang melibatkan adalah kapan harus mulai mengembalikan kontrol ke netral karena rudal dunia nyata tidak dapat secara instan mengubah laju belokannya. Perhitungan itu hanya akan mengambil kecepatan udara yang ditunjukkan rudal sebagai nilai input dan saya pikir akan dihitung ulang.


2
Sebuah rudal dunia nyata terutama senjata kemudian memiliki sistem panduan inersia atau GPS atau keduanya di dalamnya sehingga mereka diprogram untuk pergi ke area pencarian dan mulai mencari target. Celakalah jika teman dekat. Pemrograman ini seharusnya memungkinkan Anda untuk mengirim rudal ke jalur yang menghindari pertemanan dan rintangan lain seperti daratan dan orang yang tidak bersalah.
Tony

0

Saya pikir algoritma paling sederhana hanya akan mengikuti dua aturan:

  1. Jika target saat ini lebih dekat ke rudal daripada diameter belok maka terus lurus. Ini menghindari rudal yang mengorbit target dekat daripada benar-benar sampai ke mereka.

  2. Kalau tidak berbalik ke arah target sampai Anda menunjuk itu.

Untuk menghitung titik di mana belokan berakhir dalam 2D:

  1. Pada titik di mana Anda ingin mulai berbelok, pusat lingkaran belok terletak pada arah tegak lurus terhadap pos saat ini pada jarak radius putar Anda. Perhatikan bahwa ada dua poin itu - Anda mungkin menginginkan yang paling dekat dengan target Anda. Hitung posisi itu dan sebut P.

  2. Anda sekarang dapat membuat segitiga siku-siku dengan sudut kanan pada garis singgung, dan dua titik yang diketahui - P dan tujuan Anda. Ini memungkinkan Anda menghitung jarak dari garis singgung ke titik target Anda dengan Pythagoras. Sebut saja D.

  3. Sekarang Anda perlu menghitung persimpangan lingkaran jari-jari D di tempat tujuan dengan lingkaran putar Anda. Anda akan mendapatkan dua solusi yang merupakan dua titik singgung pada lingkaran di mana rudal akan berhenti berputar (satu untuk setiap arah perjalanan mengelilingi lingkaran). Pilih titik yang ada di depan rudal - itulah jawaban Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.