탄도미사일

탄도 미사일 개발

유도가능한 탄도미사일을 개발할때 일반적으로 속도 가속도 거리 등 단순한 연산에 의해서 강제적으로 거리를 맞추려고 하려는 경향이 있다. 하지만 이런식으로는 조금만 수치나 상황이 변하면 매번 다시 공식을 만들어야하지만 딱히 아름답지는 않다. 이럴때는 PID Control 수식을 사용하면 쉽게 처리가된다.

// PID 초기값
 switch (mathtype)
 {
     case 1: { _kP = 5.0f; _kD = 4.0f; _kI = 0.97f;  } break;
     case 2: { _kP = 5.0f; _kD = 3.0f;               } break;
     case 3: { _kP = 5.0f;                                 } break;
 }

 // PID, PD, D 연산
 switch(mathtype)
 {
     case 1:
         {
             // PID
             _intE += _previous_error;
             _current_error = (_target_curpos - _obj.transform.position);
             _dE = _current_error - _previous_error;
             _sForce = _kP * (_current_error) + _kD * (_dE) + _kI * (_intE);
             _previous_error = _current_error;
         }
         break;
     case 2:
         {
             //PD
             _current_error = _target_curpos - _obj.transform.position;
             _dE = _current_error - _previous_error;
             _sForce = _kP * (_current_error) + _kD * (_dE);
             _previous_error = _current_error;
         }
         break;
     case 3:
         {
             //P
             _desired_velocity = (Vector3.Normalize(_target_curpos - _obj.transform.position)) * _maxSpeed;
             _current_error = (_desired_velocity - _current_velocity);
             _sForce = (_current_error) * _kP;
         }
         break;
 }
 
 // velocity
 _current_velocity = (_sForce * _time);

 // position
 _obj.transform.Translate(_current_velocity);