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