ドローンターゲティング


9

「ドローン」と2D平面上のターゲットポイントを想像してください。8つのパラメーターがあります。

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

(ターゲットは静止しているとだけ言います)

ドローンの仕事は、最大トルクと最大推力に従って、できるだけ早く目標に到達することです。これは2D平面のみであるため、トルクを適用する方法は2つしかありません。推力は、機体の向きに対して一方向にのみ進むように制限されており、ドローンを回転させずに狙うことはできません。抵抗を無視して、2Dの宇宙空間に漂っているように見せかけることができます。ドローンが時間間隔t(おそらく0.01秒ごとなど)で方程式をチェックし、パラメータを接続して、それに応じてトルクと推力を調整するとします。推力とトルクの方程式はどうあるべきですか?


3
スラストが一方向にしか進まない場合、方向を変えることは決してありません。
MichaelHouse

1
もっと明確に指定する必要がありました。推力をジンバルすることはできません。つまり、推力は船体の方向に対して1方向にしか進むことができません。あなたはまだクラフトを回転させ、推力の方向を変えることができます。
Gus 2013

2
この質問はnodewarに関連していますか?
セスバティン2013

1
その後、私はあなたのための良い解決策を投稿できると思います(今夜少し遅く)。:)
セス・バティン

1
この質問にはもっと説明的なタイトルが必要ですが、良いタイトルは思いつきません。半減?
Anko

回答:


5

質問のコンテキストhttp://nodewar.com/に照らして、ソリューションにはいくつかの特定の考慮事項があります。

  1. (低い)最大角速度と、非常に短い時間でそれに到達するのに十分な最大トルクがあります。
  2. ドローンとターゲットには、推力とは関係のない速度と外部加速度があります(重力が豊富です)。
  3. 目的のターゲットは頻繁に変更されるため、完璧に狙うことは無駄です。近づいて、フレームごとに修正する必要があります。

これらの方法は、私が望ましい加速に到達するために働くと決めたものです。

速度ではなく加速

すでに一定の速度があり、ターゲットが動いているので、ポイントに向かって推力をかける必要はありません。速度を本来の速度に変更するには、推力が必要です。これは、船がどこに向かっているかではなく、加速する方向を向いている必要があることを意味します。

// 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)  
);

右向きのステアリング

加速度ベクトルがあるので、それを適用します。回転する必要がある距離を決定します。ここでは必要以上に多くのステップを使用した可能性がありますが、回転座標に混乱が生じ、キャップされていない船の回転値はとにかくAPIのバグだと思います。

// 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;
}

単純な式。常に回しても害はないので、部分的なトルク値を適用する手間をかけないでください。角速度の小さな補正が必要な場合は、とにかくこの決定を毎秒何回も行う必要があります。

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

それほど単純ではない式。最終的に停止したいので、方向転換を続けたくない点があります。幸いにも、その角速度の上限は、最大角速度からゼロまで急速に減速できることを意味します。計算する必要があるのは、いつ計算するかだけです。

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;
}

上記のコードを微調整してニーズに合わせた後、ターゲットに向けた角度に応じて、船をすばやく正確に回転させる必要があります。

ラミング速度

それで、いつ突き出すのですか?繰り返しになりますが、ターゲットやその他の要因が急速に変化すると、正確な解決策を解決することが非常に困難になります。しようとしないでください。

// 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;
  } 
}

部分的な推力が必要なケースでは、毎秒0から1の推力を何度も選択できるという事実を信頼できます。これにより、実際の値を変えることなく、効果的な部分推力が得られます。

幸運を!


ありがとう、これは大いに役立ちます。私はそれを少し変更する必要があると思います。あなたの種の名前は何ですか?
Gus 2013

私はそれらをはしごに押していません。彼らは攻撃する方法がありません。:)
セス・バティン

3

この全体の主題の明白な名前「モーションプランニング」を含むいくつかの良い答えを含む同様の質問:https :
//stackoverflow.com/questions/2560817/2d-trajectory-planning-of-a-spaceship-with-physics

プログラマーとして、user470365の提案の実用性が気に入っています。ただし、もっと厳密なアプローチを試してみます。ここでの提案では、最初に完全な計画を計算しますが、パラメーターが変更されている場合は、必要に応じて何度でも再評価できます。

計画

  1. 特定の方向dに向け、その方向を保持します。
  2. 一定の時間tになるまで待ってから、目標に到達するまで持続的に推力を行います。

細部

私はdtを見つけるための反復法を提案します:

  1. 推力がないと仮定して、ループと小さなタイムステップを使用して、ドローンの将来の軌道に沿ってトラバースします。

    • この未来の時点でのドローンの位置と速度について、持続的な推力によってドローンがターゲットに到達するような方向dを見つけます。これを行うには、0度から360度の間の多くの方向をサンプリングし、ドローンを最短の時間でターゲットに近づける方向を見つけます。
    • 現在からこの将来の時間までに、dに向ける十分な時間があるかどうかを確認してください。(回転は重要です。最後の説明を参照してください。)
    • 十分な時間があれば、検索は完了したので、このループを抜けます。
  2. これでdtが見つかりました。

  3. 回しDできるだけ早くとして(再び、以下の議論を参照のこと)。
  4. tまで待ってから、持続推力を開始します。
  5. ドローンは最終的にターゲットを攻撃する必要があります。

旋回

dに回転」と言うときは、「角速度をゼロにしながら、できるだけ速くdまで回転するような一連のトルクを実行する」という意味です。現在の方向、現在の角速度、および最大角加速度を含むこのための方程式はおそらく存在しますが、角度のラッピング動作によって複雑になります。


興味深いアプローチ。それで、その未来の時間の私たちの選択を支配するものは何ですか?それはそれが問題を持っていることを決定するための任意の手法のように思われるので、そこに反復も必要になるかもしれません。
Gus 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.