Drone nhắm mục tiêu


9

Hãy tưởng tượng một "máy bay không người lái" và một điểm mục tiêu trên mặt phẳng 2d. Có tám tham số:

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

(chúng tôi sẽ chỉ nói mục tiêu là đứng yên)

Công việc của máy bay không người lái là đến mục tiêu càng nhanh càng tốt, tuân theo mô-men xoắn cực đại và lực đẩy tối đa. Chỉ có hai cách để áp dụng mô-men xoắn, vì đây chỉ là trong mặt phẳng 2d. Lực đẩy bị hạn chế chỉ đi theo một hướng so với hướng của tàu và không thể nhắm mà không quay được máy bay không người lái. Bỏ qua bất kỳ sự kháng cự nào, bạn chỉ có thể giả vờ nó đang trôi nổi trong không gian bên ngoài 2d. Giả sử máy bay không người lái kiểm tra một phương trình tại khoảng thời gian t(có thể giống như mỗi 0,01 giây), cắm các tham số, và điều chỉnh mô-men xoắn và lực đẩy của nó cho phù hợp. Các phương trình cho lực đẩy và mô-men xoắn nên là gì?


3
Nếu lực đẩy chỉ có thể đi theo một hướng, bạn sẽ không bao giờ thay đổi hướng.
MichaelHouse

1
Tôi nên đã chỉ định rõ ràng hơn - bạn không thể gimbal lực đẩy, tức là lực đẩy chỉ có thể đi theo một hướng so với hướng của tàu. Bạn vẫn có thể xoay thủ công và thay đổi hướng lực đẩy.
Gus

2
Là câu hỏi này liên quan đến gật đầu?
Seth Battin

1
Sau đó, tôi nghĩ rằng tôi có thể đăng một giải pháp tốt cho bạn (một lát sau tối nay). :)
Seth Battin

1
Câu hỏi này cần một tiêu đề mô tả nhiều hơn, nhưng tôi không thể nghĩ ra một câu hỏi hay. Dừng lại?
Anko

Câu trả lời:


5

Trong bối cảnh câu hỏi của bạn, http://nodewar.com/ , có một vài cân nhắc cụ thể cho giải pháp của bạn:

  1. Bạn có tốc độ góc tối đa (thấp) và đủ mô-men xoắn cực đại để đạt được nó trong thời gian rất ngắn.
  2. Máy bay không người lái và mục tiêu của bạn đều có vận tốc và gia tốc bên ngoài không liên quan đến lực đẩy (trọng lực rất nhiều).
  3. Mục tiêu mong muốn của bạn thay đổi thường xuyên đến mức cố gắng nhắm hoàn hảo sẽ là một sự lãng phí. Bạn nên cố gắng để gần gũi, và sửa nó mọi khung hình.

Những phương pháp này là những gì tôi xác định để làm việc để đạt được gia tốc mong muốn.

Tăng tốc, không phải vận tốc

Bởi vì bạn đã có một vận tốc nhất định và mục tiêu của bạn đang di chuyển, bạn không cần lực đẩy về một điểm. Bạn cần lực đẩy để thay đổi vận tốc của bạn đến mức cần thiết. Điều này có nghĩa là tàu của bạn cần hướng không phải là nơi nó sẽ đi, mà theo hướng mà nó sẽ tăng tốc.

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

Hướng về phía bên phải

Bạn có một vectơ gia tốc, bây giờ bạn muốn áp dụng nó. Xác định khoảng cách bạn cần xoay. Tôi có thể đã sử dụng nhiều bước hơn yêu cầu ở đây, nhưng tọa độ quay làm tôi bối rối và tôi nghĩ rằng giá trị xoay vòng của tàu chưa được khai thác là một lỗi trong 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;
}

Một công thức đơn giản. Không có hại trong việc xoay mọi lúc, vì vậy đừng bận tâm áp dụng các giá trị mô-men xoắn một phần. Nếu bạn cần một sự điều chỉnh nhỏ về tốc độ góc, bạn có thể đưa ra quyết định này nhiều lần trong một giây.

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

Một công thức ít đơn giản hơn. Sẽ đến một điểm mà bạn không muốn tiếp tục rẽ, bởi vì cuối cùng bạn muốn dừng lại. May mắn thay, nắp tốc độ góc đó có nghĩa là bạn có thể nhanh chóng giảm tốc độ từ tốc độ góc tối đa xuống không. Bạn chỉ cần tính toán khi làm như vậy.

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

Sau khi điều chỉnh mã ở trên cho phù hợp với nhu cầu của bạn, tàu của bạn sẽ nhanh chóng và chính xác xoay theo bất kỳ góc nào bạn đưa ra để nhắm mục tiêu.

Tốc độ tăng tốc

Vậy, khi nào cần đẩy? Một lần nữa, sự thay đổi nhanh chóng của mục tiêu và các yếu tố khác tạo ra khó khăn lớn trong việc giải quyết một giải pháp chính xác. Đừng cố gắng.

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

Đối với những trường hợp bạn cần lực đẩy một phần, bạn có thể một lần nữa dựa vào thực tế là bạn có thể chọn lực đẩy từ 0 đến 1 nhiều lần trong một giây. Điều này cung cấp cho bạn một lực đẩy một phần hiệu quả mà không thay đổi giá trị thực tế.

Chúc may mắn!


Tuyệt vời, cảm ơn, điều này giúp rất nhiều. Tôi sẽ phải sửa đổi nó một chút tôi nghĩ. Tên loài của bạn là gì?
Gus

Tôi đã không đẩy họ lên thang. Họ không có phương pháp để tấn công. :)
Seth Battin

3

Một câu hỏi tương tự, với một số câu trả lời hay, bao gồm tên rõ ràng của toàn bộ chủ đề này, "lập kế hoạch chuyển động":
/programming/2560817/2d-trajectiony-planning-of-a-spaceship-with-physics

Là một lập trình viên, tôi thích tính thực tế của đề xuất của user470365. Tuy nhiên, tôi sẽ đâm sau một cách tiếp cận khắt khe hơn. Đề xuất của tôi ở đây tính toán một kế hoạch đầy đủ khi bắt đầu, nhưng tôi cho rằng bạn có thể đánh giá lại thường xuyên như mong muốn nếu các tham số đang thay đổi.

Kế hoạch

  1. Quay sang một hướng nhất định, d và giữ hướng đó.
  2. Đợi cho đến một thời điểm nhất định, t , sau đó làm một, duy trì lực đẩy cho đến khi đạt được mục tiêu.

Chi tiết

Tôi đề nghị các phương pháp lặp để tìm dt :

  1. Giả sử không có lực đẩy, di chuyển dọc theo quỹ đạo tương lai của máy bay bằng cách sử dụng một vòng lặp và dấu thời gian nhỏ:

    • Đối với vị trí và vận tốc của máy bay không người lái trong thời gian tới, hãy tìm hướng, d , sao cho lực đẩy được duy trì sẽ đưa máy bay đến mục tiêu. Thực hiện việc này bằng cách lấy mẫu nhiều hướng trong khoảng từ 0 đến 360 độ và tìm ra hướng đi sẽ đưa máy bay đến gần mục tiêu trong thời gian ngắn nhất.
    • Kiểm tra xem liệu chúng ta có đủ thời gian từ bây giờ đến thời điểm này trong tương lai để chuyển sang d . (Biến là không tầm thường. Xem thảo luận ở cuối.)
    • Nếu chúng ta có đủ thời gian, thì việc tìm kiếm của chúng ta đã hoàn tất, vì vậy hãy thoát ra khỏi vòng lặp này.
  2. Bây giờ chúng tôi đã tìm thấy dt .

  3. Chuyển sang d càng nhanh càng tốt (một lần nữa, xem thảo luận bên dưới).
  4. Đợi đến khi t , sau đó bắt đầu lực đẩy duy trì.
  5. Máy bay không người lái cuối cùng sẽ đạt được mục tiêu.

Quay

Khi tôi nói "biến thành d ", tôi thực sự có ý, "thực hiện một chuỗi các điểm xoắn sao cho chúng ta xoay đến d càng nhanh càng tốt trong khi cũng đưa vận tốc góc về 0". Có lẽ có một phương trình cho điều này liên quan đến hướng hiện tại, tốc độ góc hiện tại và gia tốc góc tối đa, nhưng nó phức tạp bởi hành vi quấn các góc.


Cách tiếp cận thú vị. Vì vậy, những gì chi phối sự lựa chọn của chúng ta trong thời gian tương lai? Có vẻ như bất kỳ kỹ thuật nào để xác định nó có vấn đề của nó, vì vậy việc lặp lại cũng có thể cần thiết.
Gus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.