태그 보관물: algorithm

algorithm

드론 타겟팅 목표 지점을

“드론”과 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 평면에만 있기 때문에 토크를 적용하는 방법은 두 가지뿐입니다. 추력은 선박의 방향과 관련하여 한 방향으로 만 이동하도록 제한되며 드론을 회전시키지 않고 조준 할 수 없습니다. 저항을 무시하고 2d 외부 공간에 떠있는 척 할 수 있습니다. 드론이 시간 간격으로 방정식을 확인하고 t(0.01 초마다) 매개 변수를 연결하고 그에 따라 토크와 추력을 조정 한다고 가정 해 봅시다 . 추력 및 토크 방정식은 무엇이어야합니까?



답변

질문의 맥락에 비추어 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;
}

덜 간단한 공식. 당신이 결국 멈추기를 원하기 때문에 계속 돌리고 싶지 않은 지점이 올 것입니다. 다행스럽게도, 각속도 캡은 최대 각속도에서 0으로 빠르게 감속 할 수 있음을 의미합니다. 그렇게 할 때만 계산하면됩니다.

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 사이의 추력을 선택할 수 있다는 사실에 의존 할 수 있습니다. 이것은 실제 값을 변경하지 않고 효과적인 부분 추력을 제공합니다.

행운을 빕니다!


답변

이 전체 주제의 명백한 이름 인 “모션 계획”을 포함한 몇 가지 좋은 대답이있는 비슷한 질문 :
/programming/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. 드론은 결국 목표물을 명중해야합니다.

선회

“turn to d ” 라고 말하면 , “각각의 속도를 0으로 유지하면서 가능한 한 빨리 d 로 회전하도록 일련의 토크를 수행하십시오 “. 현재 방향, 현재 각속도 및 최대 각가속도를 포함하는 방정식이있을 수 있지만 각도의 래핑 동작으로 인해 복잡합니다.


답변