PID 제어기는 feedback 제어기의 형태를 가지고 있음.
제어 대상에 의해 정해지는 입력(Input)을 측정하여 이를 목표로 하는 설정 값(setpoint)와 비교하여 오차(error)를 계산.
이 오차 값을 이용하여 제어에 필요한 제어 값(Output)을 계산.
이 제어 값은 다시 제어하고자 하는 대상의 Input으로 사용되는 구조
MV : Maniputlated Variable(제어 값)
다음 3가지가 Controller에 들어가서 모터가 제어된다.
PID 제어기는 250Hz로 각도를 구하고, 500Hz로 각속도를 구함.
이중 PID 제어기가 쓰임
error에 따라 output을 바꾼다.
를 변경함에 따라 제어기는 변화에 크게 또는 작게 반응할 수 있음
값이 크면 제어기는 더 빨리 Setpoint에 도달하지만, 시스템은 Setpoint 근처에서 진동하며 불안정한 상태.
값이 작으며 제어기는 더 늦게 Setpoint에 도달하지마, 몇 번 진동후 setpoint 아래에서 일정한 오차를 가지며 안정한 상태.
오차에 가까울수록 Output이 작기 때문에,
시스템이 Setpoint에 닿는데 필요한 충분한 힘을 Output에 공급하지 못함.
현재 오차뿐마 아니라, 누적 오차에 따라 출력을 보고 바꿀 수 있어야 함. 적분 항은 시간에 걸친 오차의 합. 오차가 클 경우 적분 항에 의해 시간이 지나면서 오차의 합이 쌓이며 출력은 빠르게 변해 오차를 제거.
P term에서 낮은 의 응답곡선에 적분 항을 더해 얻은 PI 응답 곡선
값이 크며 시스템은 더 빨리 Setpoint에 도달함. 파형의 상승부가 크지마 불안정한 상태로 남지 앟음.
가 중간 값이며 더 늦게 Setpoint에 도착하지만, 시스템이 적은 진동으로 훨씬 빠르게 안정.
가 최적 값이며 아주 늦게 Setpoint에 도착하지만, 거의 진동 없이 Setpoint에 도착해 안정.
미분항으로써, 오차 변화율을 계산하고 그 결과를 출력에 더함.
만약 오차의 변화가 크지 않다면 미분 항의 값은 작으며 출력에 영향을 크게 미치지 않음. 그러나 오차가 갑작스레 크게 변하면 시스템의 진동을 피하기 위해 미분 항의 값은 커짐.
PID 제어기에서 결정해야 하는 매개변수 이다.
이는 증폭 값 혹은 Gain이라고 하며, 수학적, 실험적-경험적 방법을 통해 계산하는 것을 튜닝
경험적으로 PID 제어기를 조절하는 방법
Control Type | |||
---|---|---|---|
P | - | - | |
PI | - | ||
PID |
적절한 , 를 어떻게 구할까?
1. : 시스템의 출력 값이 수렴하는 구간. 원하는 값 X
2. 로 증가: 시스템 출력이 점차 발산함. 원하는 값 X
3. 로 감소: 시스템 출력이 일정하게 진동. 우리가 원하는 ,
Error = Setpoint - Input
PTerm = Kp * Error
ITerm += Ki * Error * dt
적분항은 Ki
에서 현재 오차와 센서입력 주기 값을 곱해 더해줌. 미세값 반복으로 더하기
dError = Error - prevError
DTerm = Kd * (dError / dt)
미분항(DTerm)을 구하기 위해서는 오차의 변화율이 필요.
오차 변화(dError)는 현재 오차(Error)에서 이전 오차(prevError)를 뺀 값에 센서 입력 주기 값을 나눔.
Output = PTerm + ITerm + DTerm
1. 검은 선은 Setpoint. 두번 Setpoint 값을 변경했다. 예를 들어, 드론을 이동하기 위해 사용자가 Roll 값을 변경하는 상황.
2. Output 값(드론 모터속도)이 급격하게 변하는 부분이 발생하는 것을 볼 수 있다. 이것은 드론의 모터 속도를 갑자기 높이거나 낮추는 결과로 연결. 불안정한 상태
3. Error(SetInput-Input) 미분항의 값이 급격하게 커지거나 작아지는 부분이 발생.
갑작스러운 Setpoint 값 변경은 갑작스런 Error 변화를 유도하고, 그 결과 미분항의 값이 극대화됨. 미분항의 영향으로 갑작스러운 Output 변화를 초래.
드론이 수평을 유지하기 위해서 Setpoint=0. 드론이 수평을 잘 유지하고 있다면 현재 Input=0도.
드론이 약간 기울어져 Input=-0.04라고 가정. Error 0-(-0.04) == 0.04도. 이전 Error 값을 0.08도라고 가정. dError 0.04-0.08 ==-0.04. 센서 입력 주기는 4ms라고 할때 dError = -10.사용자가 Roll 각도를 변경. Setpoint=3라고 가정. 현재 드론은 수평 상태에 가까워 Input=-0.04라고 가정. Error (3-(-0.04) == 3.04가 됨. 이전 Error 값을 0.08도라고 가정. dError 3.04-0.08 == 2.96이 됨. 센서 입력주기 4ms라고 할때 dError = 740
이 때 dterm이 강해져 output이 달라져 드론이 극도로 불안정한 상태
드론에서 Setpoint가 변하는 상황은 배에서 방향을 변경하는 상황. 현재 진행 방향을 기준으로 우측으로 45도 변경은 Setpoint 변경 목표값 변경을 의미하며 내부적인 의도에 의해 발생.
이 때는 P항이 그 역할을 함. 미분항의 경우는 갑작스런 외력의 변화에 저항하기 위해 사용. Setpoint의 변화는 내부적인 의도를 나타내며, 갑작스런 외력의 변화에 저항하기 위해 필요한 미분항에 적용될 수 없음
dInput = Input - prevInput
// dError = Error - prevError
DTerm = - Kd * (dInput/dt)
// DTerm = Kd * (dError / dt)
이어야 하므로,
오차변화율에서 Setpoint가 변하는 경우를 빼면, Error의 미분은 부호가 바뀐 Input의 미분과 같아짐.
이렇게 하면 Setpoint의 변화가 Output 결과에 영향을 주지 못함.
angle_error = target_angle - current_angle
PTerm = Kp * angle_error
ITerm += Ki * angle_error * dt
dAngle = current_angle - previous_angle
Dterm = - Kd * (dAngle / dt)
balancing_force = PTerm + ITerm + DTerm
여기서 dAngle/dt
는 각도 변화율 즉, 자이로 센서를 구할 수 있는 각속도이다.
Dterm = -Kd * gyRate
여기서 Kp
, Ki
, Kd
값은 각도나 회전속도를 증폭 또는 감소시켜 모터의 출력으로 연결.