CAFE

◆ 기초강좌&제작기

[[고급강좌]][트레서]PID제어를 이용한 트레서 주행 알고리즘

작성자쎄리쎄리_고고|작성시간04.01.06|조회수5,135 목록 댓글 1
그동안 삽질들을 정리하면서 테스트 중입니다. 코드가 깔끔해지고 알고리즘이 잡히니깐 디버깅이 빠르고 속도도 올랐네요.. 트레서 코드를 보면 대부분 수백 라인이지만 결국 주행에서 무한루프 도는거는 몇십라인이 안되죠.. 그게 얼마나깔끄해 지는가가 포인트일듯합니다.

1. PID제어
일단 제어하면 수업들은 사람은 알겠지만 수학입니다.. 것두 고난이도 수학이죠. 어렵습니다.. 하지만 그 폼만 코딩에 적용할수가 있습니다. 이번에 사용하는 PID가 그것입니다. 폼만 그대로 유지하고 계수를 노가다로 잡습니다 ㅡㅡ;
PID를 풀이하자면 비례(P), 적분(I), 미분(D)을 이용한 제어입니다. 그리고 정점으로는 폼이 단순하고 코드화가 쉽죠.. 현재 대부분 트레서에 사용하는 알고리즘이 비례제어만 적용된듯하고 I,D사용은 거의 없는듯 하더군요.. 실제 PID적용을 보면
P , P+I, P+D 이렇게 사용합니다. 트레서에서는 P+D가 맞고 +I까지하면 안하는것보다 낮습니다. 이유는 I,D의 성질을 보면됩니다.

2.P
비례제어로 오차에 비례하는 출력을 가집니다. 즉 오차에 일정한 수를 곱하는거죠.. 현재 모든 트레서의 기본 개념입니다. 오차가 크면 출력도 크죠.. 오차가 작으면 출력도작고.. 오차가 없으면 출력이 없습니다. 그럼 출력이 없다니깐 트레서랑 안맞는다~~!! 라고 생각하실수 있지만... 적용되는 계를 생각하심 맞습니다.
트레서에서는 트레서 기본속도를 가지고 속도비를 출력으로 합니다. 즉 오차가 없다는것은 직선이고 이경우 두 바퀴의 속도는 갖죠.. ^^
원래 PID제어는 아날로그 제어이었습니다만 디지탈에도 적용이잘되죠. 비례제어의경우 전혀 문제없이 적용됩니다. 하지만 문제가 되는것은 미분,적분상수를 사용하는I,D이죠..
3.D
미분값을 사용하는 제어 입니다. 미분 개념을보면 단위변화량이죠.. 그래서 속도가 단위시간분에 변위입니다. 대체적으로 미분 적분시 단위량으로 시간을 사용합니다. 그결과 계가 다른 상수조합으로 단위가 생기죠.. 그런데 트레서에서는 단위가 되는게 시간이 아니가 스텝입니다. 단위시간으로 해두되지만 연산이 2중으로 들 소지가 있을듯하네요.. (아직 전 실험 안했습니다. ^^; 누구 하셨다면 올려주세요.. 참.. 디시모터일경우 다누이 시간으로햇 ㅓ연산이 해야된듯하네요.. 아직 디시를 안해서 ^^;) 하튼 D제어를 보면 err_dot * 미분상수 이렇게 출력이 나옵니다. 단독으로 사용하기보다 비례제어와 같이 사용합니다.
4 I
적분값을 사용합니다. 미분이 단위변화량이라면 적분은 오차 다 더하는것입니다. 그런데 트레서에 사용하기는 불안하죠.. 트레서의 경우 목표값이 항상 변하기때문에 특히 연속턴에서 반응이 느려서 이탈하는 경우가 생깁니다. 그래서 약간 변형을 주어 사용을 해야합니다. 이것만 사용하기보다 D제어와 같이 사용해야 효율적이됩니다.그리고 값이 크기때문에 제경우 롱형으로 선언해서 사용중입니다 ㅡㅡ;
5.PID사용
PID제어를 사용하기 위해서는 아주 신뢰도 높은 오차를 가지고 있어야 합니다. 그래서 제가 센서처리에 한참 머리굴린 이유기도 하구요.. 센서처리가 깔끔하게되어 오차만 확실하다면 무한루프에서 할 일이 적어지죠.. 제경우 PID코드 10줄미만만 돌아갑니다 ㅡㅡ^
제가 사용중인 코드입니다..

ex) D_out = delt_position_err * Kd;
D_out = D_out;
I_out = sum_position_err * Ki;
I_out = I_out/64;
//출력
operation_out = position_err + D_out + I_out + calibration_out;

speed_R = ( velocity * handle[mid - operation_out ] )>>8;
speed_L = ( velocity * handle[mid + operation_out ] )>>8;
이렇게 기본 폼만 돌아가고있죠.. 128에서 곱셈기가 지원되기때문에 이번에는 나누기를 많이 사용했는데 나누기는 한참 길다네요 ㅡㅡ; 하지만 아직 연산딸려 주행못하는 일은 없네요. ^^; 예전과 다른점은 변수 선언을 사인드로했다는거 입니다. 나누기를 피하기위해 언사인드를 사용하고 계수 설정을 위하 쉬프트 연산으로 마추었었거든요.. 하지만 사인드로하고 나누기 연산을 사용함으로써 코드짧아지고 디버깅 편해졌네요..

요약하자면
1. 센서처리가 최우선 - 실뢰도 90%이상
2. 폼에 그대로 적용
3. 계수설정을 위하여 노가다 : P->D->I 순으로 계수 잡으면 잘 됩니다.
이상... ^^
다음검색
현재 게시글 추가 기능 열기

댓글

댓글 리스트
  • 작성자김연섭 | 작성시간 04.01.06 ㅡㅡ저거 때문에 꼬부기 무지 잘간다는..ㅡㅡ..;;
댓글 전체보기
맨위로

카페 검색

카페 검색어 입력폼