요새 인공지능이 유행이라던데...

바둑 잘 두는 알파고가 그래 인기가 좋다는 구만.
딥러닝이 유행이라는 구만.

한 10여년전에 ANN (Artificial Neural Network)을 구현해서 써본적이 있었는데 그 때는 '딥러닝'이라는 용어가 없었던 걸로 기억한다.
로봇 구동부의 백레시를 보상해 주기 위해 BPANN (Back Propagation ANN)을 구현하고 Rigid Body 물리엔진과 연동해서 시뮬레이션 해봤었는데 기가 막히게 학습도 되고 결과도 잘 나왔었다. 문제는 학습이 진행되는 동안 로봇에 무리가 가는 동작이 많아 시뮬레이션만 하고 직접 로봇에 적용 하지는 못했었다.
사람처럼 자빠지고 깨지고 하면서 에러가 역전파되어 학습이 되지만, 로봇은 사람처럼 자가치유 능력이 없어 학습 될 때까지 깨지고 부서지는거 고치느라 일 다본다.
실제 로봇 제어에는 못쓰겠네... 하고는 딱히 쓸 일이 없어서 그냥 잊고 지냈었다.

그렇게 잊고 지내다 최근 PID제어기로 쿵짝쿵짝 뭐 할게 있었는데, 처음에는 잘 되던게 시간이 갈 수록 시스템의 동역학 파라미터가 변하면서 (시변 시스템 이라고 하죠? 아마?) 제어 게인을 다시 튜닝해 줘야 하는 문제가 있어, 제어 게인을 자동으로 학습하면서 튜닝해 주기위해 오래전에 만들었던 BPANN 소스를 다시보게 되었다. 근 10년전에 내가 짜놓은 소스를 다시 보니 내가 왜 그렇게 짜놨는지 이해가 안된다. 인공지능을 다시 공부 해야 겠다.

우선 PID제어기의 제어 게인 (Kp, Ki, Kd)을 자동으로 학습 할 수있게 되는지 테스트를 해봤다. 인터넷에 돌아댕기는 ANN의 학습기능을 이용한 자동 PID 게인 튜닝, On-Line PID 튜닝등 논문 몇 개 뒤져보고, 옛날에 만들어 놓은거 다시 손좀 보고해서 간단하게 전기식 모터의 위치 서보제어 시뮬레이션에 BPANN을 적용 시켜 돌려 봤다.
전기모터의 동역학 파라미터 (직류저항, 코일 인덕턴스, 회전자모멘트 등등)와 기어의 동역학 파라미터들을 이용해 시뮬레이션 물리엔진 만들고, 거기에 PID 제어기 물리고, 학습을 위해 BPANN 연동 시키고 등등...


위 그래프가 간이 형태로 되는지 확인해본 결과다.
300W정도 되는 BLDC모터에 200:1기어를 달고 있는 시스템을 시뮬레이션 하고 거기에 PID제어기를 물린다음, BPANN을 연동 시켜 On-Line형태로 제어 게인을 스스로 학습하도록 만들었다. 빨간색이 10도와 0도 스텝 위치 명령이고 녹색이 모터가 추종한 위치 응답 곡선이다. 최초 스텝 명령에 대해 큰 오버슈트, 언더슈트가 있으나 계속 학습되면서 나아진다.
명령 추종이 될까 했는데 신기하게 위치제어가 가능한 게인 값들로 학습되었다.
BPANN적용하기 전 손으로 튜닝해 봤는데 시간도 많이 걸리고 상당히 지루한 작업이었다.

댓글 3개:

  1. 안녕하세요.

    저는 공조시험장치를 만드는 회사에 근무하는 직장인 (박정우)입니다.

    블로그에 올리신 글을 여러번 정독했습니다. 잘 읽었습니다.

    이렇게 댓글을 남기는 사연을 짧게 말씀드리겠습니다.

    저희 회사에서 만드는 공조시험장치는 에어콘 냉장고 등의 냉동능력을 측정하는데 사용하는 작은 방(한평남짓한 방? 콘테이너 박스?) 모양입니다. 장치의 내부 공기를 일정한 온도와 습도로 유지하는 것이 관건입니다.

    온습도 설정 및 유지를 위해 pid제어기를 사용해 공기를 냉각 가열하는 장비들을 제어합니다. 가동 시작할때 pid게인값을 한번 세팅해주고(auto 또는 계산을 하지 않고 감으로합니다. 감이 더 낫다네요.) 그상태로 운전합니다. 수십년 동안 이 방법을 사용해왔습니다.

    블로거님의 이 글을 읽고 나서. 저희 장치도 bpann을 도입하면 (온습도)설정조건 도달시간을 단축시키고 시험 중에 설정조건을 보다 정밀하게
    유지시키는 것이 가능하겠다는 생각을 하게 되었습니다.

    제가 우리 장치에 bpann을 적용해 보려고 이리저리 인공지능 책도 읽고 파이썬 공부도 하고 있습니다만. 독학을 하려하니 쉽지 않네요.

    혹시 이 글에서 말씀하신 논문이나 샘플 프로그램 소스 등등 참고할만한 자료를 알려주실 수 있는지 부탁말씀 드려봅니다.

    이 댓글을 남기고 블로거님의 글을 한번 더 정독해야겠습니다.

    좋은 글 포스팅해 주셔서 감사드립니다.

    (참고로 저는 기계공학 전공자이고 베이직이랑 파스칼 코딩 경험이 있습니다.
    저희 장치 운전 프로그램은 c#을 사용하는데 요즘 랩뷰로 전환중입니다. 저는 프로그래머는 아니고 담당직원이 따로 있습니다.)

    답글삭제
    답글
    1. 제가 위에서 언급한 결과물은 한 두가지 논문이나 몇 가지 예제 소스만으로 나온 것이 아니라서 꼭 찝어 뭐 보시면 됩니다라고 말씀드리기 힘들군요.

      BPANN관련 구현 코드는 구글링 해 보시면 수도 없이 쏟아져 나옵니다. C는 물론 C++, C#, JAVA등등 예제 코드 구하시는데 어려움은 없을 겁니다.
      다만, 구해진 코드를 이미 알고 있는 BPANN로직에 대입하여 이해하고 내것으로 만들어 직접 구현하고 검증하는데 시간소모가 좀 있을 겁니다.
      뭐, 잘 만들어진 라이브러리를 그냥 가져다 사용하신다면 시간 단축이 좀 될 가능성이 있을 수는 있겠군요.

      BPANN을 이용한 PID자동 튜닝도 역시 구글링 해보시면 참 많은 논문이 나올 겁니다. 라이센스 문제로 열람이 되지 않는 논문을 제외하고 텍스트를 읽을 수 있는 논문이나 문서는 무조건 다 읽어 보세요.
      논문에서 제시하는 내용에 오류도 있을 수 있으니, 걸러서 보세요.
      회사에서 저널 논문 열람이 가능하시다면 저널에 실린 논문을 우선 보시는 것을 추천합니다.

      시행착오를 겪다보면 원하시는 결과물이 나올 수 있을 겁니다.

      아, 그리고 인공지능이 만능은 아닙니다.
      수동 튜닝한 결과보다 BPANN에 의한 자동 튜닝이 더 좋다는 보장은 없습니다.

      삭제
  2. 귀한 시간. 귀한 글. 감사합니다.

    답글삭제