P 제어만으로는 왜 아쉬울까
앞 장에서 우리는 목표 속도와 현재 속도를 비교하고, 그 차이인 오차에 비례해서 PWM 출력을 조정하는 방법을 살펴보았다. 이것이 바로 P 제어다. P는 Proportional, 즉 비례를 뜻한다.
오차 = 목표값 - 현재값
출력 = Kp × 오차목표 속도가 100이고 현재 속도가 80이라면 오차는 20이다. Kp가 2라면 보정 출력은 40이 된다. 오차가 크면 크게 밀어주고, 오차가 작으면 조금만 밀어준다. 아주 단순하지만 로봇 제어에서는 놀라울 만큼 강력하다.
하지만 실제 로봇은 수학 공식처럼 얌전히 움직이지 않는다. 바퀴에는 마찰이 있고, 바닥은 고르지 않으며, 배터리 전압은 조금씩 떨어진다. 모터도 좌우가 완전히 같지 않다. 그래서 P 제어만 사용하면 다음과 같은 일이 자주 생긴다.
목표값 근처까지 빠르게 가지만 딱 맞게 멈추지 못한다.
오차를 줄이려다 목표값을 지나쳐 다시 반대 방향으로 보정한다.
보정이 반복되면서 로봇이 좌우로 흔들리거나 속도가 출렁인다.
라인트레이서 로봇을 떠올려 보자. 검은 선이 센서 중앙보다 오른쪽에 있으면 로봇은 오른쪽으로 돌아야 한다. 그런데 너무 세게 돌면 선을 지나쳐 왼쪽으로 넘어간다. 그러면 다시 왼쪽으로 돌고, 또 지나치고, 다시 오른쪽으로 돈다. 멀리서 보면 로봇이 선을 따라가는 것이 아니라 선 위에서 뱀처럼 꿈틀거리는 것처럼 보인다.
P 제어는 반응을 빠르게 만든다. 그러나 Kp를 너무 크게 잡으면 로봇은 예민해지고, 작은 오차에도 과격하게 반응한다. 반대로 Kp가 너무 작으면 로봇은 부드럽지만 굼뜨다. 선을 벗어나도 천천히 돌아오고, 목표 속도에 도달하는 데 오래 걸린다.
이 아쉬움을 보완하기 위해 등장하는 것이 I 제어와 D 제어다. 세 가지를 합치면 우리가 흔히 말하는 PID 제어가 된다.
PID 출력 = P 출력 + I 출력 + D 출력PID는 어려운 마법 주문이 아니다. P는 지금 얼마나 틀렸는지 보고, I는 지금까지 얼마나 오래 틀렸는지 보고, D는 얼마나 빠르게 틀어지고 있는지 본다. 같은 오차를 보더라도 세 항이 바라보는 관점이 다르다.

P 제어: 지금의 오차에 즉시 반응하기
P 제어는 현재 오차를 바로 출력으로 바꾼다.
P 출력 = Kp × 현재 오차여기서 Kp는 비례 게인이라고 부른다. 게인은 쉽게 말해 민감도다. Kp가 크면 작은 오차에도 큰 출력을 내고, Kp가 작으면 같은 오차에도 작은 출력을 낸다.
모터 속도 제어에서는 목표 속도보다 현재 속도가 느리면 PWM을 올리고, 빠르면 PWM을 내린다. 라인트레이서에서는 라인이 중앙에서 벗어난 만큼 좌우 모터 속도 차이를 만든다. 위치 제어에서는 목표 위치에서 멀수록 더 강하게 이동한다.
P 제어의 장점은 명확하다. 구조가 단순하고 반응이 빠르다. 센서값만 안정적으로 들어온다면 아두이노나 ESP32에서도 부담 없이 실행할 수 있다. 그래서 실제 로봇을 처음 제어할 때는 대부분 P 제어부터 시작한다.
하지만 P 제어에는 대표적인 약점이 있다. 바로 정상상태 오차다. 정상상태 오차란 시간이 충분히 지나도 끝까지 남아 있는 작은 오차를 말한다.
예를 들어 목표 속도가 100인데 로봇이 95 근처에서 계속 머문다고 해 보자. 오차는 5다. 그런데 이 오차에 Kp를 곱한 출력이 모터 마찰을 이기기에는 부족할 수 있다. 그러면 로봇은 목표에 거의 도달한 것처럼 보이지만, 정확히 목표값에는 가지 못한다.
위치 제어에서도 비슷하다. 목표 위치까지 2cm 남았는데 P 출력이 너무 작아 바퀴가 움직이지 못하면 로봇은 그 자리에 멈춘다. 사람 눈에는 거의 도착한 것 같지만, 제어 입장에서는 아직 오차가 남아 있다.
물론 Kp를 키우면 이 문제를 어느 정도 줄일 수 있다. 하지만 너무 키우면 이번에는 진동과 오버슈트가 커진다. 오버슈트는 목표값을 지나쳐 버리는 현상이다. 목표 속도 100에 맞추려다 120까지 올라갔다가 다시 내려오는 식이다.
P 제어는 로봇을 깨우는 가속 페달과 같다. 너무 약하면 답답하고, 너무 세면 튀어나간다. 이제 필요한 것은 남은 작은 오차를 끈질기게 밀어주는 힘과, 너무 과격한 움직임을 잡아주는 브레이크다.
I 제어: 오래 남은 오차를 끝까지 밀어주기
I 제어의 I는 Integral, 즉 적분을 뜻한다. 적분이라는 말이 부담스럽다면 일단 누적이라고 생각하자. I 제어는 오차를 한 번만 보는 것이 아니라, 시간이 지나는 동안 계속 더한다.
오차 누적값 = 오차 누적값 + 현재 오차 × 제어 주기
I 출력 = Ki × 오차 누적값여기서 Ki는 적분 게인이다. I 제어는 작은 오차라도 오래 지속되면 점점 더 큰 출력으로 바꾼다. 그래서 P 제어만으로 남아 있던 정상상태 오차를 줄이는 데 효과적이다.
모터 속도 제어 예를 다시 보자. 목표 속도가 100인데 현재 속도가 계속 95에 머문다. 오차 5는 크지 않지만 계속 쌓인다. I 제어는 이 누적된 오차를 보고 PWM을 조금씩 더 올린다. 결국 마찰이나 부하 때문에 부족했던 출력을 보태 목표 속도에 더 가까이 가게 만든다.
언덕을 오르는 작은 바퀴 로봇도 좋은 예다. 평지에서는 PWM 120으로 목표 속도를 유지할 수 있었는데, 카펫이나 경사면에서는 같은 PWM으로 속도가 떨어진다. P 제어는 떨어진 만큼 보정하지만, 마찰이 계속 남아 있으면 목표 속도보다 약간 낮은 상태가 이어질 수 있다. 이때 I 제어가 부족분을 누적해서 더 밀어준다.
그렇다고 I 제어가 만능은 아니다. I 제어는 끈질기지만, 때로는 지나치게 집착한다. 오차가 오래 쌓인 상태에서 로봇이 갑자기 목표값에 도달해도, 누적값은 바로 사라지지 않는다. 이미 쌓인 I 출력이 계속 남아 로봇을 더 밀어버릴 수 있다. 그 결과 목표값을 지나치고, 다시 반대 방향 오차가 쌓이며, 움직임이 느리게 출렁일 수 있다.
이 현상을 적분 와인드업이라고 부른다. 와인드업은 태엽이 감기듯 누적값이 과하게 쌓이는 상황을 말한다. 예를 들어 모터 PWM은 최대 255까지만 낼 수 있는데, 오차가 크다고 해서 I 누적값이 끝없이 커지면 문제가 된다. 출력은 이미 한계에 걸렸는데 제어기 내부의 누적값만 계속 커진다. 나중에 목표값 근처에 도착해도 누적된 힘이 너무 커서 멈추지 못한다.
그래서 실제 로봇에서는 I 제어를 조심스럽게 사용해야 한다. 특히 작은 바퀴 로봇이나 라인트레이서처럼 반응이 빠른 장치에서는 Ki를 너무 크게 주면 로봇이 늦게 흔들리는 모습을 보인다. 처음에는 괜찮아 보이다가 몇 초 뒤부터 점점 출렁이는 식이다.
I 제어를 안전하게 쓰기 위한 기본 원칙은 간단하다. 먼저 P 제어로 대략 따라가게 만든 뒤, 끝까지 남는 작은 오차를 없앨 만큼만 I를 추가한다. I는 주연이 아니라 뒷심이다.
D 제어: 급격한 변화를 미리 잡아주기
D 제어의 D는 Derivative, 즉 미분을 뜻한다. 이것도 어렵게 생각할 필요는 없다. D 제어는 오차가 얼마나 빠르게 변하고 있는지를 본다.
오차 변화율 = (현재 오차 - 이전 오차) / 제어 주기
D 출력 = Kd × 오차 변화율여기서 Kd는 미분 게인이다. 오차가 천천히 변하면 D 출력은 작고, 오차가 갑자기 확 변하면 D 출력이 커진다. 쉽게 말해 D 제어는 로봇의 움직임이 너무 급해지는 순간을 감지해 완충 역할을 한다.
목표 위치로 이동하는 로봇을 생각해 보자. 로봇이 목표 지점에서 멀리 떨어져 있을 때는 빠르게 가도 괜찮다. 하지만 목표에 가까워지면 속도를 줄여야 한다. 그렇지 않으면 목표 지점을 지나쳐 버린다. D 제어는 오차가 빠르게 줄어드는 상황을 보고, 지금 너무 빠르게 접근하고 있다고 판단한다. 그리고 출력을 줄이는 방향으로 작용해 오버슈트를 줄인다.
라인트레이서에서도 D 제어는 유용하다. 선이 센서 중앙에서 살짝 벗어났는데 그 변화가 아주 빠르다면, 로봇이 곧 크게 벗어날 가능성이 있다. D 제어는 이 급격한 변화에 반응해 조향을 미리 다듬어준다. 잘 조정된 D 항은 로봇의 좌우 흔들림을 줄이고, 코너에서 덜 휘청이게 만든다.
다만 D 제어에는 약점이 있다. 센서 노이즈에 민감하다. 노이즈란 실제 움직임과 상관없이 센서값이 조금씩 튀는 현상이다. D 제어는 변화율을 보기 때문에, 센서값이 갑자기 튀면 그것을 실제 급격한 변화로 착각할 수 있다. 그러면 출력도 함께 튄다.
엔코더 속도값이 측정 주기마다 98, 101, 97, 102처럼 흔들릴 수 있다. 사람 눈에는 거의 100 근처로 안정된 값이지만, D 제어는 매번 변화가 있다고 판단한다. 그래서 D 항을 너무 크게 주면 모터가 잘게 떨리거나 PWM이 지저분하게 흔들릴 수 있다.
따라서 D 제어를 사용할 때는 센서값을 너무 짧은 주기로 거칠게 읽지 않도록 주의해야 한다. 필요하다면 이동 평균 같은 간단한 필터를 사용해 값을 부드럽게 만들 수 있다. 이동 평균은 최근 몇 개의 값을 평균 내어 순간적인 튐을 줄이는 방법이다.
D 제어는 브레이크와 충격 흡수 장치에 가깝다. 로봇이 목표를 향해 달릴 때 무작정 밀어붙이지 않게 하고, 목표 근처에서 부드럽게 잡아준다. 하지만 노이즈가 많은 로봇에 D를 크게 걸면, 브레이크가 아니라 떨림 발생기가 될 수도 있다.
PID 식을 로봇 코드로 바꾸기
PID 제어는 다음 흐름으로 실행된다. 센서로 현재값을 읽고, 목표값과 비교해 오차를 계산한다. 그다음 P, I, D 항을 각각 구해 더하고, 최종 출력을 모터 PWM이나 조향값으로 사용한다.
1. 현재값 읽기
2. 오차 계산
3. P 항 계산
4. I 항 계산
5. D 항 계산
6. 세 항을 더해 출력 계산
7. 출력 범위 제한
8. 모터나 서보에 적용
9. 다음 주기까지 기다리기아두이노나 ESP32에서 사용할 수 있는 기본 형태는 다음과 같다.
float target = 100.0;
float current = 0.0;
float Kp = 1.2;
float Ki = 0.05;
float Kd = 0.2;
float error = 0.0;
float prevError = 0.0;
float integral = 0.0;
unsigned long prevTime = 0;
void controlLoop() {
unsigned long now = millis();
float dt = (now - prevTime) / 1000.0;
if (dt <= 0.0) {
return;
}
current = readCurrentValue();
error = target - current;
integral += error * dt;
float derivative = (error - prevError) / dt;
float output = Kp * error + Ki * integral + Kd * derivative;
output = constrain(output, -255, 255);
applyOutput(output);
prevError = error;
prevTime = now;
}이 코드는 개념을 보여주기 위한 기본 골격이다. 실제 로봇에서는 readCurrentValue() 자리에 엔코더 속도, 라인 위치, 로봇 위치 같은 측정값을 넣는다. applyOutput(output) 자리에는 모터 PWM 설정, 좌우 모터 속도 차이 적용, 서보 각도 보정 같은 동작이 들어간다.
중요한 점은 dt, 즉 제어 주기다. PID는 시간에 따라 오차가 얼마나 쌓이고 얼마나 빠르게 변하는지 계산한다. 따라서 제어 루프가 들쭉날쭉하면 I와 D 계산도 흔들린다. 가능하면 일정한 간격으로 제어 루프를 실행하는 것이 좋다. 작은 바퀴 로봇의 속도 제어라면 10ms에서 50ms 정도의 주기로 시작해 볼 수 있다. 너무 빠르면 센서값이 거칠고, 너무 느리면 반응이 둔해진다.
또 하나 꼭 필요한 것이 출력 제한이다. PWM은 보통 0에서 255 사이이고, 방향까지 포함하면 -255에서 255처럼 표현할 수 있다. PID 계산 결과가 1000이 나오더라도 실제 모터에는 낼 수 없다. 그래서 constrain() 같은 함수로 출력 범위를 제한한다.
출력을 제한할 때 I 누적값도 함께 관리해야 한다. 출력이 이미 최대인데 integral이 계속 커지면 앞에서 말한 적분 와인드업이 생긴다. 간단한 방법은 integral 자체에도 제한을 거는 것이다.
integral += error * dt;
integral = constrain(integral, -300, 300);이 제한값은 로봇마다 다르다. 처음에는 보수적으로 작게 잡고, 실제 움직임을 보며 조정하는 것이 안전하다.
속도 제어에 PID 적용하기
가장 이해하기 쉬운 적용 대상은 엔코더 기반 모터 속도 제어다. 목표값은 원하는 바퀴 속도이고, 현재값은 엔코더로 계산한 실제 속도다. PID 출력은 PWM 보정값이 된다.
목표값: 바퀴 목표 속도
현재값: 엔코더로 측정한 바퀴 속도
오차: 목표 속도 - 현재 속도
출력: 모터 PWMP 항은 속도가 부족할 때 즉시 PWM을 올린다. 속도가 너무 높으면 PWM을 내린다. I 항은 바닥 마찰이나 배터리 전압 저하 때문에 계속 남는 속도 부족을 보정한다. D 항은 속도가 갑자기 변할 때 출력을 완화해 출렁임을 줄인다.
예를 들어 로봇이 목표 속도 120으로 달리도록 설정했다고 하자. 처음 출발할 때 현재 속도는 0이므로 오차가 크다. P 항이 큰 출력을 만들어 모터를 빠르게 돌린다. 시간이 지나 현재 속도가 110 근처까지 올라오면 오차가 작아져 P 출력도 줄어든다. 그런데 마찰 때문에 115 이상 올라가지 못한다면 I 항이 조금씩 쌓여 부족한 PWM을 더한다. 만약 속도가 갑자기 130까지 튀면 D 항이 변화율에 반응해 출력을 줄이는 데 도움을 준다.
좌우 바퀴를 따로 제어하면 로봇은 훨씬 똑바로 달릴 수 있다. 왼쪽 모터와 오른쪽 모터에 각각 PID를 두고 같은 목표 속도를 주면, 두 모터의 제조 편차나 마찰 차이를 자동으로 보정할 수 있다. 이때 두 바퀴의 PID 게인은 처음에는 같게 시작해도 되지만, 로봇이 한쪽으로 계속 치우치면 모터별 특성을 조금씩 다르게 조정할 수 있다.
다만 속도 제어에서는 D 항을 반드시 써야 하는 것은 아니다. 엔코더 속도값이 거칠게 흔들리는 경우에는 PI 제어만으로도 충분히 안정적일 때가 많다. 실제로 많은 소형 로봇에서는 속도 제어에 P 또는 PI를 먼저 사용하고, 필요할 때만 D를 추가한다.
라인트레이서에 PID 적용하기
라인트레이서에서 PID 제어의 목표는 선을 센서 중앙에 유지하는 것이다. 이때 목표값은 0으로 두는 경우가 많다. 현재값은 라인이 중앙에서 얼마나 벗어났는지를 나타내는 위치 오차다.
목표값: 0, 즉 라인이 센서 중앙에 있음
현재값: 라인의 치우침 정도
오차: 목표 중앙 - 현재 라인 위치
출력: 좌우 모터 속도 차이라인이 오른쪽으로 치우쳤다면 로봇은 오른쪽으로 돌아야 한다. 반대로 왼쪽으로 치우쳤다면 왼쪽으로 돌아야 한다. PID 출력은 조향값으로 사용한다.
왼쪽 모터 속도 = 기본 속도 - 조향값
오른쪽 모터 속도 = 기본 속도 + 조향값조향값의 부호는 센서 배열과 모터 배선 방향에 따라 달라질 수 있다. 로봇이 선에서 멀어지는 방향으로 돈다면 부호를 반대로 바꾸면 된다. 이것은 실패가 아니라 로봇이 우리에게 배선 방향을 알려주는 과정이다.
라인트레이서에서 P 항은 선을 따라가는 기본 힘이다. Kp가 너무 작으면 코너에서 늦게 반응해 선을 놓친다. Kp가 너무 크면 직선에서도 좌우로 흔들린다. D 항은 이 흔들림을 줄이는 데 특히 유용하다. 로봇이 선을 향해 너무 빠르게 꺾일 때 D 항이 조향을 완화해, 선을 지나쳐 반대편으로 튀는 현상을 줄인다.
I 항은 라인트레이서에서 조심해서 써야 한다. 센서 위치가 약간 틀어져 있거나 좌우 모터 힘이 달라서 계속 한쪽으로 치우치는 경우에는 I 항이 도움이 된다. 하지만 코너가 많은 트랙에서는 오차가 계속 바뀌기 때문에 I 누적값이 오히려 반응을 늦출 수 있다. 그래서 라인트레이서는 보통 PD 제어로도 좋은 결과를 얻는 경우가 많다.
라인트레이서 튜닝의 재미는 로봇의 성격이 눈에 보인다는 점이다. Kp가 낮은 로봇은 조심성은 많지만 길을 늦게 찾는다. Kp가 높은 로봇은 자신감 넘치게 달리지만 자주 휘청인다. Kd가 적당히 들어가면 마치 운전 실력이 좋아진 것처럼 코너를 매끄럽게 빠져나간다.
위치 제어에 PID 적용하기
위치 제어에서는 목표 위치까지 이동한 뒤 멈추는 것이 중요하다. 목표값은 원하는 위치나 이동거리이고, 현재값은 엔코더로 계산한 이동거리 또는 바퀴 회전량이다.
목표값: 이동해야 할 거리 또는 바퀴 목표 카운트
현재값: 엔코더로 측정한 현재 거리 또는 카운트
오차: 목표 위치 - 현재 위치
출력: 모터 속도 명령 또는 PWMP 제어만 사용하면 목표에서 멀 때는 빠르게 움직이고, 가까워질수록 출력이 줄어든다. 이 방식은 자연스럽게 감속하는 효과가 있다. 하지만 출력이 너무 작아지면 목표 바로 앞에서 멈출 수 있다. 이때 I 항이 남은 오차를 밀어주는 데 도움을 줄 수 있다.
반대로 로봇이 목표 지점을 자꾸 지나친다면 D 항이 필요할 수 있다. D 항은 목표에 빠르게 접근하는 상황에서 출력을 줄이는 방향으로 작용한다. 그래서 목표 근처에서 속도를 낮추고 오버슈트를 줄인다.
위치 제어에서 특히 중요한 것은 최소 출력이다. DC 모터는 PWM이 아주 작을 때 돌지 않는다. 예를 들어 PWM 20에서는 전류가 흐르지만 바퀴가 꿈쩍하지 않고, PWM 60부터 겨우 움직일 수 있다. 이 구간을 데드존이라고 부른다. 목표 근처에서 PID 출력이 데드존 아래로 떨어지면 로봇은 멈춰버린다.
이를 해결하는 방법은 여러 가지다. 가장 단순한 방법은 출력이 0이 아니면서 너무 작을 때 최소 PWM을 더해주는 것이다.
if (output > 0 && output < 60) {
output = 60;
}
if (output < 0 && output > -60) {
output = -60;
}다만 이 방법도 과하게 쓰면 목표 근처에서 덜컥거리며 움직일 수 있다. 그래서 위치 제어에서는 목표에 충분히 가까워지면 정지로 판단하는 허용 오차 범위를 둔다.
오차가 ±2cm 이내이면 도착으로 판단하고 모터 정지실제 로봇 제어는 완벽한 0을 만드는 게임이 아니다. 필요한 정확도 안에 안정적으로 들어오게 만드는 일이다. 장난감 자동차 로봇이 1m를 이동할 때 1mm 단위로 맞출 필요는 없다. 하지만 로봇팔이 작은 부품을 집어야 한다면 훨씬 더 정밀해야 한다. PID 튜닝은 항상 로봇의 목적과 함께 생각해야 한다.
안전한 PID 튜닝 순서
PID 튜닝은 처음부터 세 값을 동시에 만지는 순간 미궁에 빠지기 쉽다. 로봇이 흔들리면 Kp 때문인지, Ki 때문인지, Kd 때문인지 알 수 없기 때문이다. 그래서 실제 로봇에서는 단계를 나누어 조정한다.
첫 단계는 I와 D를 0으로 두고 P만 조정하는 것이다.
Ki = 0
Kd = 0
Kp만 조정Kp를 아주 작게 시작한다. 로봇이 거의 반응하지 않으면 조금씩 올린다. 목표값을 향해 눈에 띄게 따라가기 시작할 때까지 올리되, 심하게 진동하기 전에서 멈춘다. 이 단계의 목표는 완벽함이 아니라 로봇이 목표를 향해 제대로 반응하는지 확인하는 것이다.
두 번째 단계는 D를 추가해 흔들림을 줄이는 것이다. 특히 라인트레이서나 위치 제어처럼 오버슈트가 눈에 잘 보이는 경우에는 D 항이 큰 도움이 된다. Kd도 작은 값부터 시작한다. D를 올렸을 때 목표를 지나치는 정도가 줄고 움직임이 차분해지면 좋은 방향이다. 하지만 모터가 잘게 떨리거나 출력이 불안정하게 튄다면 D가 너무 크거나 센서값이 너무 거친 것이다.
세 번째 단계는 필요할 때만 I를 추가하는 것이다. P와 D로 움직임은 괜찮아졌는데 목표값에 항상 조금 못 미친다면 I를 넣는다. Ki는 매우 작게 시작해야 한다. I 항은 효과가 천천히 나타나기 때문에, 값을 바꾼 뒤 몇 초 정도 움직임을 지켜봐야 한다. 처음에는 좋아 보이다가 시간이 지나며 출렁이면 Ki가 큰 것이다.
튜닝할 때는 한 번에 하나의 값만 바꾸는 것이 좋다. 값을 바꾸기 전과 후의 움직임을 비교해야 원인을 알 수 있다. 또한 로봇을 손으로 들어 올린 상태에서 모터 방향을 먼저 확인하고, 바닥 테스트를 할 때는 낮은 속도부터 시작해야 한다. PID가 잘못 설정되면 로봇이 갑자기 튀어나갈 수 있다.
실전에서 사용할 수 있는 기본 절차를 정리하면 다음과 같다.
Ki와Kd를 0으로 두고Kp를 천천히 올린다.로봇이 목표를 따라가지만 흔들리기 시작하면
Kp를 조금 낮춘다.오버슈트나 좌우 흔들림이 크면
Kd를 조금씩 추가한다.목표값에 계속 약간 못 미치면
Ki를 아주 작게 추가한다.출력 제한, 적분 제한, 비상 정지 조건을 반드시 넣는다.
PID 튜닝은 계산만으로 끝나지 않는다. 로봇의 소리를 듣고, 바퀴의 떨림을 보고, 센서값 그래프를 확인하며 조금씩 다듬는 과정이다. 처음에는 답답하지만 어느 순간 로봇이 선 위에 착 달라붙거나 목표 속도를 안정적으로 유지하는 장면을 보게 된다. 그때 PID가 단순한 공식이 아니라 로봇의 운전 감각이라는 것을 느끼게 된다.
튜닝할 때 자주 만나는 증상
PID를 조정하다 보면 비슷한 문제가 반복해서 나타난다. 증상과 원인을 연결해 생각하면 훨씬 빠르게 해결할 수 있다.
로봇이 너무 느리게 반응한다면 Kp가 작을 가능성이 크다. 목표 속도를 바꿔도 천천히 따라오거나, 라인이 벗어났는데 한참 뒤에야 방향을 바꾼다면 P 항이 부족하다. 이때는 Kp를 조금씩 올린다.
로봇이 목표 근처에서 빠르게 덜덜 떨린다면 Kp가 너무 크거나 Kd가 센서 노이즈를 키우고 있을 수 있다. 먼저 Kp를 낮춰 보고, 그래도 고주파 떨림이 남으면 D 항을 줄이거나 센서값 필터링을 고려한다.
목표를 지나쳐 크게 출렁인다면 D 항이 부족하거나 P 항이 과한 경우가 많다. 위치 제어에서 목표 지점을 지나갔다가 다시 돌아오고, 또 지나가는 일이 반복된다면 Kd를 조금 추가하거나 Kp를 낮춘다.
목표값에 항상 조금 모자란다면 I 항이 필요할 수 있다. 속도 제어에서 목표가 100인데 94에서 96 사이에만 머문다면 Ki를 아주 작게 올려본다. 단, I를 올린 뒤 시간이 지나며 출렁임이 커지면 바로 줄여야 한다.
처음에는 괜찮다가 점점 불안정해진다면 I 누적이 과할 가능성이 있다. 이때는 Ki를 낮추고 integral 제한을 넣는다. 로봇이 막힌 벽을 향해 계속 전진하려는 상황처럼 목표를 달성할 수 없는 상태에서는 I 누적이 특히 위험하다. 장애물 감지나 비상 정지 조건이 필요한 이유다.
PID보다 먼저 확인해야 할 것들
PID 튜닝을 하다 보면 모든 문제를 게인 값으로 해결하려고 하게 된다. 하지만 로봇이 이상하게 움직이는 원인이 PID가 아닐 때도 많다. 제어 알고리즘을 의심하기 전에 하드웨어와 센서값을 먼저 확인해야 한다.
전원이 약하면 아무리 좋은 PID도 소용없다. 모터가 출발할 때 배터리 전압이 크게 떨어지면 보드가 리셋되거나 센서값이 튈 수 있다. 모터 전원과 보드 전원을 적절히 분리하고, GND를 공통으로 연결했는지 확인해야 한다.
엔코더 방향도 중요하다. 로봇이 앞으로 가는데 엔코더 값이 감소한다면 오차 계산이 반대로 될 수 있다. 목표보다 느린데 PWM을 올려야 하는 상황에서 오히려 줄이는 일이 생긴다. PID 튜닝 전에 현재값이 물리적인 움직임과 같은 방향으로 변하는지 반드시 확인하자.
제어 주기도 일정해야 한다. 어떤 때는 5ms마다, 어떤 때는 200ms마다 제어한다면 I와 D 계산이 크게 흔들린다. millis()나 타이머를 사용해 일정한 간격으로 제어 루프를 실행하는 습관을 들이는 것이 좋다.
센서값의 단위도 맞아야 한다. 목표 속도는 초당 펄스인데 현재 속도는 100ms당 펄스라면 오차가 엉뚱해진다. 위치 제어에서 목표는 cm인데 현재값은 엔코더 카운트라면 변환식이 필요하다. PID는 오차를 믿고 움직이므로, 오차 계산이 틀리면 제어도 틀린다.
마지막으로 기계 구조를 확인해야 한다. 바퀴가 헐겁거나, 프레임이 휘어 있거나, 센서가 흔들리면 PID가 계속 변하는 조건과 싸우게 된다. 좋은 제어는 좋은 하드웨어 위에서 훨씬 쉽게 만들어진다.
로봇에 맞는 PID를 찾는다는 것
PID 제어는 로봇 제작에서 가장 오래 사귀게 될 도구 중 하나다. 처음에는 Kp, Ki, Kd라는 세 글자가 낯설지만, 실제 움직임과 연결해 보면 의미가 분명해진다.
P는 지금 틀어진 만큼 바로 반응한다. I는 오래 남은 오차를 끝까지 없애려 한다. D는 너무 급하게 변하는 움직임을 진정시킨다. 이 세 가지가 균형을 이루면 로봇은 목표 속도를 안정적으로 유지하고, 선을 덜 흔들리며 따라가고, 목표 위치에 더 부드럽게 멈춘다.
완벽한 PID 값은 책상 위 계산만으로 나오지 않는다. 같은 코드라도 배터리, 모터, 바퀴, 바닥, 센서 위치가 바뀌면 다른 값이 필요하다. 그래서 PID 튜닝은 로봇과 대화하는 과정에 가깝다. 값을 조금 바꾸고, 움직임을 보고, 다시 조금 바꾼다. 로봇이 흔들리면 왜 흔들리는지 묻고, 목표에 못 미치면 무엇이 부족한지 살핀다.
이제 우리는 단순히 모터를 켜고 끄는 단계를 지나, 로봇이 스스로 오차를 줄이도록 만드는 방법을 배웠다. 다음 단계에서는 이 제어 감각을 위치 제어로 확장해 보자. 로봇이 얼마나 움직였는지 알고, 목표 지점에 가까워질수록 속도를 줄이며, 원하는 위치에 멈추게 만드는 일이 기다리고 있다.
이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.