Drone hedefleme


9

Bir 2 d düzleminde bir "drone" ve bir hedef nokta düşünün. Sekiz parametre vardır:

P = my position
Q = target position
V = my velocity
I = my moment of inertia
w = my angular velocity
s = my angular position
T = max thrust
U = max torque

(sadece hedefin sabit olduğunu söyleyeceğiz)

Drone'nun işi hedefe olabildiğince hızlı ulaşmak, maksimum tork ve maksimum itişe uymaktır. Torku uygulamanın sadece iki yolu vardır, çünkü bu sadece 2d düzlemindedir. İtme, zanaatın yönüne göre sadece bir yönde ilerlemekle sınırlıdır ve uçağı döndürmeden hedeflenemez. Herhangi bir direnci ihmal edin, 2d uzayda yüzüyormuş gibi davranabilirsiniz. Drone'nun zaman aralığında bir denklemi kontrol ettiğini t(belki her 0,01 saniyede bir gibi), parametreleri taktığını ve torkunu ve itişini buna göre ayarladığını varsayalım . İtme ve tork denklemleri ne olmalıdır?


3
Eğer itme sadece bir yönde gidebiliyorsa, asla yön değiştirmeyeceksiniz.
MichaelHouse

1
Daha açık bir şekilde belirtmeliydim - itme kuvvetini ayarlayamazsınız, yani itme, zanaatın yönüne göre sadece bir yönde gidebilir. Yine de aracı döndürebilir ve itme yönünü değiştirebilirsiniz.
Gus

2
Bu soru nodewar ile ilgili mi?
Seth Battin

1
O zaman senin için iyi bir çözüm gönderebileceğimi düşünüyorum (bu gece biraz sonra). :)
Seth Battin

1
Bu sorunun daha açıklayıcı bir başlığa ihtiyacı var, ama iyi bir soru düşünemiyorum. Halp?
Anko

Yanıtlar:


5

Sorunuzun bağlamı ( http://nodewar.com/) ışığında, çözümünüz için birkaç özel husus vardır:

  1. (Düşük) bir maksimum açısal hıza ve çok kısa sürede ulaşmak için yeterli maksimum torka sahipsiniz.
  2. Drone ve hedefinizin her biri, itme ile ilişkili olmayan hız ve dış ivmeye sahiptir (yerçekimi bolluğu).
  3. İstediğiniz hedef o kadar sık ​​değişir ki, mükemmel bir şekilde nişan almayı denemek israf olacaktır. Yaklaşmaya ve her kareyi düzeltmeye çalışmalısınız.

Bu yöntemler, istenen bir ivmeye ulaşmak için çalışmaya karar verdim.

Hız değil, hızlanma

Zaten belirli bir hıza sahip olduğunuz ve hedefiniz hareket ettiği için bir noktaya doğru itmeye ihtiyacınız yok. Hızınızı olması gereken şeye değiştirmek için itmeye ihtiyacınız var. Bu, geminizin gittiği yere değil, hızlanacağı yöne bakması gerektiği anlamına gelir.

// My target velocity is for maintaining a circular orbit.  Yours may differ.
// Earlier, I calculated total gravity and the perpendicular direction.
// You may wish to subtract gravity from your total, rather than match it.
var targetVel = o.lib.vec.times(lateralDir, targetVelMag);

var targetAccel = lv.sum(
  o.lib.vec.diff(targetVel, o.me.vel), 
  o.lib.vec.times(gravity, 1 / o.me.mass)  
);

Doğru istikamete yönlendirme

Bir hızlanma vektörünüz var, şimdi uygulamak istiyorsunuz. Ne kadar döndürmeniz gerektiğini belirleyin. Muhtemelen burada gerekenden daha fazla adım kullandım, ancak dönme koordinatları beni şaşırtıyor ve bence kapaksız gemi dönüş değeri zaten API'de bir hata.

// convert acceleration to an angle
var polar = o.lib.vec.toPolar(targetAccel);
var traj = polar[1];

// constrain the angle to +/-2PI, because the ship's rotation is not limited 
// by default
var fixed_rot = o.lib.ang.rescale(o.me.rot);

// limit the correction to be +/-1PI
var traj_correction = traj - fixed_rot;
if (traj_correction > (Math.PI)){
  traj_correction = (2 * Math.PI) - traj_correction;
} else if (traj_correction < (-1 * Math.PI)){
  traj_correction = (2 * Math.PI) + traj_correction;
}

Basit bir formül. Her zaman dönmenin bir zararı yoktur, bu nedenle kısmi tork değerlerini uygulamaktan çekinmeyin. Açısal hızda küçük bir düzeltmeye ihtiyacınız varsa, bu belirlemeyi yine de saniyede birçok kez yapabilirsiniz.

if (traj_correction > 0){
  torque = 1;
} else if (traj_correction < 0){
  torque = -1;
}

Daha az basit bir formül. Dönmeye devam etmek istemediğiniz bir nokta gelecek, çünkü sonunda durmak istiyorsunuz. Neyse ki, bu açısal hız sınırı, maksimum açısal hızdan sıfıra hızla yavaşlayabileceğiniz anlamına gelir. Sadece ne zaman yapacağınızı hesaplamanız gerekir.

var max_a_accel = c.MAX_TORQUE / o.me.m_i;
var a_deccel_time = Math.abs(o.me.a_vel) / max_a_accel;
// the same math as linear acceleration, now in angles.
var stopping_angle = 0.5 * max_a_accel * a_deccel_time * a_deccel_time;


if (stopping_angle >= Math.abs(traj_correction)){
  // slowdown required.  Reverse torque
  torque *= -1;
}

Yukarıdaki kodu ihtiyaçlarınıza göre ayarladıktan sonra, geminiz hızlı ve hassas bir şekilde hedefe verdiğiniz açıya dönmelidir.

Çakma hızı

Peki, ne zaman itmeli? Yine, hedefin ve diğer faktörlerin hızlı değişimi, kesin bir çözümü çözmede büyük zorluk yaratır. Denemeyin.

// if the heading is close to the final value, thrust.
if (Math.abs(traj_correction ) < 0.02) {  // about 1 degree
  if (true 
      // some logical test, in case you don't want to accelerate past
      // a maximum speed, or some such.  Not required for your stated purpose.
     ){
    thrust = 1;
  } 
}

Kısmi itme gerektiren durumlarda, yine saniyede birçok kez 0 ile 1 itme arasında seçim yapabileceğinize güvenebilirsiniz. Bu, gerçek değeri değiştirmeden etkili bir kısmi itme sağlar.

İyi şanslar!


Harika, teşekkürler, bu çok yardımcı oluyor. Sanırım biraz değiştirmem gerekecek. Türünüzün adı ne?
Gus

Onları merdivenden itmedim. Saldırmak için bir yöntemleri yok. :)
Seth Battin

3

Bu konunun görünen adı da dahil olmak üzere bazı iyi cevapları olan benzer bir soru, "hareket planlama":
/programming/2560817/2d-trajectory-planning-of-a-spaceship-with-physics

Bir programcı olarak user470365'in önerisinin pratikliğini seviyorum. Ancak, daha titiz bir yaklaşımla bıçaklayacağım. Buradaki önerim başlangıçta tam bir plan hesaplıyor, ancak parametrelerin değişmesi durumunda istediğiniz sıklıkta yeniden değerlendirebileceğinizi düşünüyorum.

Plan

  1. Belirli bir yöne çevirin, d ve bu yönü tutun.
  2. Belirli bir süre kadar bekleyin t , sonra birini hedef kadar sürekli itme ulaşılır.

ayrıntılar

Ben bulmak için iteratif yöntemler önermek d ve t:

  1. İtme olmadığını varsayarak, bir döngü ve küçük bir zaman çizelgesi kullanarak drone'nun gelecekteki yörüngesinde ilerleyin:

    • Drone'nun bu gelecek zamanda konumu ve hızı için yönünü bulun, d, böylece sürekli bir itme uçağı hedefe getirecektir. Bunu 0 ila 360 derece arasında çok sayıda yön örnekleyerek ve drone'yu en kısa sürede hedefe yaklaştıracak olanı bularak yapın.
    • Şimdiki zaman ile bu gelecek zaman arasında yeterli zamanımız olup olmadığını kontrol edin. d'. (Tornalama önemsiz değildir. Sonunda tartışmaya bakınız.)
    • Yeterli zamanımız varsa, aramamız tamamlandı, bu yüzden bu döngüden çıkın.
  2. Şimdi d ve t'yi.

  3. Şuraya dön: d çabuk mümkün olduğunca (yine aşağıdaki tartışmaya bakınız).
  4. T kadar bekleyin , ardından sürekli itişe başlayın.
  5. Drone sonunda hedefe çarpmalıdır.

döndürme

"D'ye dön" dediğimde , gerçekten, " açısal hızı sıfıra getirirken, mümkün olduğunca çabuk d' ye döneceğimiz bir dizi tork yapın" diyorum . Muhtemelen bunun için mevcut yönü, mevcut açısal hızı ve maksimum açısal ivmeyi içeren bir denklem vardır, ancak açıların kaydırma davranışıyla karmaşıktır.


İlginç bir yaklaşım. Peki gelecekteki zaman seçimimizi yöneten nedir? Sorunlarının olduğunu belirlemek için herhangi bir teknik gibi görünüyor, bu yüzden de yineleme gerekli olabilir.
Gus
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.