'로그 > 전공' 카테고리의 다른 글
| 나의 언어 편력기 (0) | 2010/08/05 |
|---|---|
| 카테고리 이론 동영상 강좌 (0) | 2010/06/09 |
| SSH 터널링으로 사설망 리눅스 PC 접속하기 (1) | 2009/02/05 |
| 리눅스에서 소스 패키지 설치/제거하기 (4) | 2008/02/27 |
| 제어이론(control theory)에 대한 간단한 요약 (1) | 2007/11/26 |
| 재미있는 연구결과, 그리고 파이썬 놀이 (2) | 2007/02/28 |
| 나의 언어 편력기 (0) | 2010/08/05 |
|---|---|
| 카테고리 이론 동영상 강좌 (0) | 2010/06/09 |
| SSH 터널링으로 사설망 리눅스 PC 접속하기 (1) | 2009/02/05 |
| 리눅스에서 소스 패키지 설치/제거하기 (4) | 2008/02/27 |
| 제어이론(control theory)에 대한 간단한 요약 (1) | 2007/11/26 |
| 재미있는 연구결과, 그리고 파이썬 놀이 (2) | 2007/02/28 |
| 나의 언어 편력기 (0) | 2010/08/05 |
|---|---|
| 카테고리 이론 동영상 강좌 (0) | 2010/06/09 |
| SSH 터널링으로 사설망 리눅스 PC 접속하기 (1) | 2009/02/05 |
| 리눅스에서 소스 패키지 설치/제거하기 (4) | 2008/02/27 |
| 제어이론(control theory)에 대한 간단한 요약 (1) | 2007/11/26 |
| 재미있는 연구결과, 그리고 파이썬 놀이 (2) | 2007/02/28 |
ssh -R 3030:localhost:22 kanie@147.46.101.102plink -L 4040:localhost:3030 kanie@147.46.101.102| 나의 언어 편력기 (0) | 2010/08/05 |
|---|---|
| 카테고리 이론 동영상 강좌 (0) | 2010/06/09 |
| SSH 터널링으로 사설망 리눅스 PC 접속하기 (1) | 2009/02/05 |
| 리눅스에서 소스 패키지 설치/제거하기 (4) | 2008/02/27 |
| 제어이론(control theory)에 대한 간단한 요약 (1) | 2007/11/26 |
| 재미있는 연구결과, 그리고 파이썬 놀이 (2) | 2007/02/28 |
요즘 (2000년대 후반) 나오는 리눅스 배포판들은 패키지 관리를 깔끔하게 해주기 때문에 원하는 프로그램을 마우스 클릭 한두번으로 설치하고 사용할 수 있지만, 그게 여의치 않은 경우가 있죠. 예를 들면 원하는 프로그램이 패키지 목록에 없을 때라던가, 아니면 관리자 권한이 없어 프로그램을 마음대로 설치할 수 없는 경우요. 그럴 때는 소스를 직접 다운받아서 설치하고, 제거해야 합니다.
리눅스 사용자들은 아마 다 알고 계시겠지만, 그래도 저같은 리눅스 초보에게는 tar.gz로 묶인 소스코드 뭉치를 던져주고 알아서 설치를 하라고 하면 머리가 아파오지요. 우리 모르는 사람들끼리 서로서로 설치/제거법을 알아보아요.
예를 들어 설명해봅시다. 저는 요즘 하는 일 때문에 ImageMagick이라는 라이브러리가 필요합니다. 학교에서 사용하는 서버는 우분투 리눅스 5.10인데, 우분투의 친절한 패키지 관리자를 통해 ImageMagick 을 설치할 수는 있긴 하지만... 버전이 6.2.xx 네요. 제게 필요한 버전은 6.3 이상이므로, 6.3 버전 소스 코드를 다운받아 직접 설치하기로 했습니다.
만약 우분투를 쓰고 계시다면, 그리고 소스 코드 컴파일을 한번도 해본 적이 없다면, (혹은 컴파일이란 게 뭔지 모르신다면) 컴파일과 설치를 위한 기본 도구들을 먼저 설치해야 합니다. 설치는 간단합니다. 시냅틱 패키지 관리자나, sudo aptitude를 이용해서 build-essential 패키지를 설치하세요.
대부분의 다른 리눅스 배포판들은 gcc / make / ld 등의 도구들이 다 깔려 있습니다. 다음으로 진행합시다.
구글로 검색해서 ImageMagick의 홈페이지를 찾았습니다. 다운로드 페이지를 잘 읽어보고 원하는 소스 코드를 다운받습니다. 저의 경우 주소는 ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz 이렇게 되네요.
웹 브라우저로 검색해서 다운받는다면 다운받는 것은 쉽습니다. 그러나 리눅스 GUI에 직접 접근할 수 없고, 커맨드라인만 사용할 수 있는 환경이라면, wget을 사용하면 됩니다. wget은 대부분의 리눅스 배포판에 기본으로 깔려 있으므로, wget [웹 주소] 이렇게만 치면 됩니다.
wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick.tar.gz
소스 코드를 다운받았습니다. 압축파일 이름은 ImageMagick.tar.gz 네요. 이제 다운받은 압축파일을 풀어봅시다.
리눅스 환경에서 대부분의 압축 파일은 확장자가 tar.gz로 되어 있습니다. 만약 GUI를 사용할 수 있는 환경이라면 그냥 압축파일 관리자를 이용해 새 디렉토리에 압축을 푸시고, 아니라면 tar를 이용해 압축을 풀어 봅시다. tar -xzvf [파일 이름] 이라고 치면 됩니다.
tar -xzvf ImageMagick.tar.gz
여기서부터가 까다롭습니다. 소스 패키지 설치는 GUI로는 진행할 수 없기 때문에, 먼저 리눅스 터미널을 열어야 합니다. 열었으면, 압축을 푼 디렉토리로 가봅시다. ImageMagick-6.3.9 라는 디렉토리가 생겼네요.
cd ImageMagick-6.3.9
일반적으로 소스 패키지 설치는 configure / make / make install 의 3단계로 이루어집니다. configure는 설치 전에 여러가지 옵션을 지정해주고 컴파일 환경을 검사하는 단계입니다. configure 옵션은 프로그램마다 조금씩 다르므로, 설치 전에 먼저 README나 INSTALL 같은 설치문서를 읽어보는 것을 추천합니다. (문서가 주로 영어로 되어 있다는 것은 참 슬픈 일입니다.) 여기서 설치 옵션 부분을 읽어보고 나에게 필요한 옵션이 있다면 적어둡니다.
configure는 내게 필요한 도구가 다 있는지, 라이브러리는 다 있는지 같은 것들을 체크해주고 빌드 환경을 만들어주는 스크립트입니다.
설치할 때 옵션을 주지 않으면 기본으로 /usr/local/bin 이나 /usr/local/lib 밑에 설치하는데, 이 디렉토리들은 관리자 권한이 없이는 접근할 수 없습니다. 이 경우에는 --prefix 옵션을 주어 설치 디렉토리를 바꿔야 합니다. 저는 저의 홈 디렉토리 밑에 imagemagick이라는 디렉토리를 만들어 그 곳에 설치하기로 했습니다. (이 경우 홈 디렉토리를 ~ 기호로 축약하는 것은 보통 에러를 일으킵니다. 루트 디렉토리부터 절대경로를 다 써주어야 합니다.)
./configure --prefix=/home/kanie/imagemagick
그 외 다른 옵션들도 넣어 보았습니다.
./configure --prefix=/home/kanie/imagemagick --disable-static --with-modules --without-perl --with-x=no
이렇게 하면 이제 컴파일 준비가 완료됩니다.
보통은 빌더 환경이 잘 갖추어져 있지 않다는 것을 의미합니다. 필요한 프로그램이나 라이브러리가 없는 경우가 대부분이므로, 빌드 문서를 잘 읽어보시고 필요한 프로그램이나 라이브러리를 설치해 주세요.
make distclean이라고 치면 configure 설정을 모두 제거해줍니다. 그리고 configure 부터 다시 시작하시면 됩니다.
make distclean
make는 미리 정해진 스크립트를 따라 소스 코드를 컴파일해주는 도구입니다. configure를 마쳤다면 make를 쳐서 컴파일합니다.
make
make가 실패하는 경우는 보통 컴파일 에러입니다. 이때는 컴파일 에러를 해결한 후 처음부터 다시 컴파일하는 것을 추천합니다. make clean 하면 컴파일이 취소되고, make를 치면 다시 컴파일할 수 있습니다.
make clean
컴파일이 완료되면 make install 을 치면 설치가 완료됩니다.
make install
설치한 후에 압축파일을 풀었던 디렉토리는 지우지 않는 것을 추천합니다. 나중에 설치 제거할 때 필요하니까요.
설치 제거를 하려면 make를 했던 디렉토리로 돌아와 다음과 같이 치면 됩니다.
make uninstall
| 카테고리 이론 동영상 강좌 (0) | 2010/06/09 |
|---|---|
| SSH 터널링으로 사설망 리눅스 PC 접속하기 (1) | 2009/02/05 |
| 리눅스에서 소스 패키지 설치/제거하기 (4) | 2008/02/27 |
| 제어이론(control theory)에 대한 간단한 요약 (1) | 2007/11/26 |
| 재미있는 연구결과, 그리고 파이썬 놀이 (2) | 2007/02/28 |
| image morphing 과제 (0) | 2006/04/17 |
언제나처럼, 스스로를 이해시켜서 나중에 써먹기 위해 쓴 글입니다. (기계과나 전기과에서 배우는 내용인 듯 한데... 논문 읽다보면 종종 튀어나와서...) 사용된 근거의 정확성이나 이론적 무결성은 보장하지 않습니다. 이 분야에 대해 정말 써먹을 수 있는 지식이 필요하신 분은 신뢰할만한 textbook을 참고하세요.
제어이론은, 굉장히 여러가지 요소를 가진 예측하기 힘든 시스템을(미쿡말로는 dynamic system이라고 합니다.) 1. 의도한 대로, 2. 안정적으로 움직이게 하기 위한 공학이론입니다.
단도직입적으로, 운전자가 직접 운전하지 않고 컴퓨터가 알아서 운전하는 자동차가 있다고 생각해 봅시다. 운전자는 직접 핸들을 잡고 엑셀을 밟아 자동차를 운전하는 것이 아니라, 사용자가 원하는 속도를 입력하면 그 속도를 유지하며 달리게 됩니다. 운전자가 자동차에게 "시속 60km로 달려라" 하고 명령을 내렸다고 합시다. 자동차의 속력에는 많은 요소가 작용하지만, 엔진의 스로틀(엔진에 연료를 분사하는 비율을 조절하는 밸브 정도로 이해하시면 됩니다)이 가장 큰 역할을 할 겁니다. 예를 들어 스로틀이 연료를 초당 50mg의 비율로 분사하면 자동차의 속도가 60km/h가 되는 걸로 실험실에서 대충 계산이 나왔다고 합시다.
그러면 자동차를 원하는 속도로 달리게 하고 싶을 때 생각할 수 있는 가장 간단한 방법은, 운전자가 원하는 속도 60km/h를 입력하면(외부입력) 사전에 계산된 어떤 방정식을 통해서(컨트롤러) 그에 맞는 스로틀의 비율인 초당 50mg으로 자동차를 제어(출력)하는 겁니다. 이렇게 외부입력만을 받는 가장 간단한 시스템을 feed-forward controller라고 합니다.
그러면 그냥 스로틀을 초당 50mg으로 고정시키면 자동차의 속력이 정확히 60km/h가 나오느냐... 그건 아닙니다. 오르막길에서는 엔진의 힘이 같더라도 속도가 느려질 것이고, 내리막길에서는 더 빨라질 거구요, 비포장도로에서는 또 느려질 거고, 고속도로에서는 좀더 빨라질 겁니다. 그 밖에도 공기저항이라든지, 도로가 비에 젖어서 마찰력이 적다던지 하는 수많은 상황이 발생할 수 있는데, feed-forward controller는 이런 종류의 외부 상황 변화에 대해 반응할 방법이 전혀 없다는 것이 단점이죠.
그러면 좀더 똘똘한 컨트롤러를 생각해봅시다. 사용자가 원하는 속도 60km/h를 입력하면, 스로틀을 초당 50mg으로 일단 맞춰놓고 달려봅니다. 그런데 오르막길에다 도로 상황도 별로 좋지 않아서 속도가 40km/h 정도밖에 안 나오네요. 그러면 스로틀을 조금씩 더 열어 더 빠른 속도를 냅니다. 그러면 점점 속도가 올라 60km/h가 되겠죠. 그러면 그 상태로 스로틀을 유지하는 거죠. 어 그런데 길이 내리막으로 바뀌었군요. 속도가 빨라집니다. 그러면 더 빨라진 속도를 입력으로 받은 컨트롤러는 다시 서서히 스로틀을 닫아 속도를 줄입니다. 그러면 다시 60km/h에서 속도가 안정되겠죠.
이렇게 자동차의 속도(출력)를 다시 컨트롤러(복잡한 톱니바퀴로 스로틀을 제어하는 기계일 수도 있고, 아니면 자동차에 탑재된 조그만 컴퓨터일 수도 있겠죠.)에게 입력으로 주어 (피드백, 우리말로는 되먹임) 컨트롤러가 스로틀(출력)을 더 늘리거나 줄일 수 있도록 한다면, 자동차의 속도를 외부 환경에 큰 영향을 받지 않도록 안정적으로 제어할 수 있습니다. 이런 간단한 되먹임 시스템을 피드백 컨트롤러라고 합니다.
피드백 컨트롤은 사실 모든 생물이 자기 자신을 제어할 때 사용하는 테크닉이기도 하고, 엔지니어들이 오래 전부터 사용해온 테크닉이기도 합니다. 그럼 제어이론(control theory)이라는 거창한 이름이 붙은 이유는 뭐냐... 이 피드백 시스템을 수학적으로 잘 모델링하려는 거죠. 피드백 시스템을 보다 안정적으로 유지하며, 갑작스런 외부 요인으로 시스템이 요동을 쳐도 다시 원래 상태를 회복할 수 있도록 (영어로는 robust하다고 합니다.) 하는 안전한 컨트롤러를 설계하는 것이 제어이론의 목표입니다.
피드백 시스템중에 (비교적) 이론적으로 간단하고 실제로 제일 많이 응용되는 것은 PID 컨트롤러라고 합니다. 이 PID 컨트롤러에 초점을 맞춰 설명을 해보죠.
PID 컨트롤러에게는 입력(자동차 예제로 설명하면 사용자가 원하는 속도 60km/h) r(t)이 주어집니다. 그냥 고정된 값 r이 아니라 r(t)인 이유는 이 값이 시간 t에 따라 변할 수 있기 때문이죠. 이 값을 입력으로 받은 컨트롤러는 시스템을 제어(이 경우 자동차 스로틀을 바꾸겠죠)하고, 거기에 따라서 시스템의 전체 출력(자동차의 속도) y(t)가 변할 겁니다. 이 시스템을 완벽하게 컨트롤한다면 r(t)와 y(t)는 같은 값이 되겠지만, 실제로 그렇지는 않을 거고 약간의 차이가 존재하겠죠. 이 차이를 e(t) = r(t) - y(t) 라고 합시다.
PID 컨트롤러는 이 e(t) 값에 어떤 상수를 곱하고(Proportional : 비율이라는 뜻이죠) 적분(Integral)을 하고 미분(Derivative)을 한 값을 컨트롤러에게 다시 되먹여서 시스템을 제어한다고 해서 PID 컨트롤러라 부릅니다. 만약에 여기서 적분값 I를 쓰지 않는다면 PD 컨트롤러, D를 쓰지 않는다면 PI 컨트롤러, 그냥 결과값에 상수만 곱해서 되먹인다면 P 컨트롤러가 됩니다.
수식으로 쓰면,
이런 식이 됩니다. 여기서 Kp, Ki, Kd는 각각 적당한 상수가 되겠죠.
이때 컨트롤러는 구동장치(actuator : 시스템을 실제로 작동시키는 장치. 우리의 예제에서는 스로틀이 되겠죠)를 u만큼 움직여서 시스템을 조절하는데, PID 컨트롤러의 경우 이 u 값이 u = P + I + D 가 되는 것이죠.
P, I, D의 계수 Kp와 Ki, Kd는 각각 시스템의 안정성에 일정한 영향을 미칩니다.
Kp는 이 경우 시스템이 오차 e에 얼마나 빠른 속도로 반응하는가를 결정합니다. 자동차 예제에서, 극단적으로 Kp가 0이라면 컨트롤러는 전혀 시스템에 반응하지 않고, 따라서 자동차는 전진하지 않겠죠. 반대로 Kp가 매우 크다면? 정지상태에서 사용자가 60km/h라는 값을 입력했을 때 급가속하여 순식간에 60km/h에 가까워질 겁니다. 그러나 안정적으로 60km/h를 유지하지 못하고 상하로 요동이 심해집니다.
Ki는 안정상태에 들어선 시스템이 미세한 오차를 얼마나 빨리 제거하는가를 결정합니다. Ki가 0인 시스템은 안정 상태에서도 정확히 입력값에 다가서지 않고 지속해서 요동칩니다. 그러나 반대로 Ki가 너무 크면 Kp의 경우와 마찬가지로 시스템이 불안정해지죠
Kd는 시스템이 얼마나 빨리 안정상태에 들어서는가를 결정합니다. Kd가 큰 시스템은 금방 요동을 멈추고 안정 상태에 들어섭니다. 반면에 Kd가 너무 크면 입력값에 도달하는 속도가 느려지죠.
이런 시스템의 안정성에 대해 자세히 논하려면 라플라스 이론이라는 것을 알아야 하는데, 공학수학을 대충 배워서 -_- 라플라스 이론에 대해서는 자세히 모르는고로 이 부분은 스킵하겠습니다.
어려워 보이지만, 사실 PID 컨트롤러는 의외로 주변 곳곳에서 발견됩니다. 위에서 예로 든 자동차의 속도조절장치는 물론이고, 하드 디스크의 헤드 제어, 파워 서플라이의 전압 조절, 정교한 전자식 지진계 같은 곳에도 쓰입니다. 같은 이론을 스프링과 지렛대를 이용한 기계장치에까지 적용하면 포크레인 같은 대형 건설장비에 사용되는 제어 시스템도 일종의 PID 컨트롤러입니다.
위 내용의 대부분은 영문 wikipedia를 적당히 편집한 결과입니다. 따라서 자동적으로 이 문서는 GFDL 라이선스를 따릅니다. 이 내용을 가져가서 재배포하실 때는 반드시 이 문서가 GFDL 라이선스를 따른다는 것을 명시하셔야 하며, 이 내용을 수정/변경하실 때는 그 결과물 또한 GFDL 라이선스를 따라야 합니다.
이 글은 스프링노트에서 작성되었습니다.
| SSH 터널링으로 사설망 리눅스 PC 접속하기 (1) | 2009/02/05 |
|---|---|
| 리눅스에서 소스 패키지 설치/제거하기 (4) | 2008/02/27 |
| 제어이론(control theory)에 대한 간단한 요약 (1) | 2007/11/26 |
| 재미있는 연구결과, 그리고 파이썬 놀이 (2) | 2007/02/28 |
| image morphing 과제 (0) | 2006/04/17 |
| 스도쿠 (7) | 2005/06/08 |
파이썬 코드
| 리눅스에서 소스 패키지 설치/제거하기 (4) | 2008/02/27 |
|---|---|
| 제어이론(control theory)에 대한 간단한 요약 (1) | 2007/11/26 |
| 재미있는 연구결과, 그리고 파이썬 놀이 (2) | 2007/02/28 |
| image morphing 과제 (0) | 2006/04/17 |
| 스도쿠 (7) | 2005/06/08 |
| 한글 인코딩 scheme 간단 정리 (5) | 2005/03/31 |
| 리눅스에서 소스 패키지 설치/제거하기 (4) | 2008/02/27 |
|---|---|
| 제어이론(control theory)에 대한 간단한 요약 (1) | 2007/11/26 |
| 재미있는 연구결과, 그리고 파이썬 놀이 (2) | 2007/02/28 |
| image morphing 과제 (0) | 2006/04/17 |
| 스도쿠 (7) | 2005/06/08 |
| 한글 인코딩 scheme 간단 정리 (5) | 2005/03/31 |
| 리눅스에서 소스 패키지 설치/제거하기 (4) | 2008/02/27 |
|---|---|
| 제어이론(control theory)에 대한 간단한 요약 (1) | 2007/11/26 |
| 재미있는 연구결과, 그리고 파이썬 놀이 (2) | 2007/02/28 |
| image morphing 과제 (0) | 2006/04/17 |
| 스도쿠 (7) | 2005/06/08 |
| 한글 인코딩 scheme 간단 정리 (5) | 2005/03/31 |
| 리눅스에서 소스 패키지 설치/제거하기 (4) | 2008/02/27 |
|---|---|
| 제어이론(control theory)에 대한 간단한 요약 (1) | 2007/11/26 |
| 재미있는 연구결과, 그리고 파이썬 놀이 (2) | 2007/02/28 |
| image morphing 과제 (0) | 2006/04/17 |
| 스도쿠 (7) | 2005/06/08 |
| 한글 인코딩 scheme 간단 정리 (5) | 2005/03/31 |