4.3 프로세스 제어    [gdoc]

쉘에서는 프로세스를 작업(job)이라는 단위로 관리하는데 작업은 포그라운드 (foreground)백그라운드 (background) 두 가지 방식으로 동작한다. 포그라운드는 작업이 시작되고 종료되는 시점까지 다른 쉘 명령어를 수행할 수 없고 대기하는 방식을 말한다. 반면 백그라운드로 작업을 수행하면 동시에 다른 명령어들을 실행시킬 수 있다. 이렇게 동시에 여러 명령어들을 실행시키는 것을 멀티태스킹(multi-tasking)이라고 한다.


쉘에서 작업을  제어하기 위한 명령어들을 다음 표에 정리하였다. 아래 표에서 JID는 jobs 명령으로 확인할 수 있는 작업의 고유 번호이다.


문법

동작

비고

실행명령 &

실행명령을 백그라운드에서 수행한다.


ps

프로세스의 리스트(전 절 참조)


jobs

백그라운드 프로세스 리스트


CTRL-Z

포그라운드 작업을 일시 중지한 후 백그라운드로 밀어 넣는다.


CTRL-C

포그라운드 작업을 정지(종료)


%JID

백그라운드 프로세스는 고유번호(JID)가 매겨지는데 (fg, bg, kill 명령에서) 그것을 참조하기 위해서 번호 앞에 %를 붙인다.


fg %JID

백그라운드 작업을 포그라운드로 올린다.


bg %JID

일시 정지된 백그라운드 작업을 재시작


kill PID / %JID

kill -KILL PID / %JID

kill -STOP PID / %JID

kill -CONT OID / %JID

프로세스를 종료.

프로세스 강제  종료 (kill -9 PID)

백그라운드 프로세스 실행 일시 정지

정지된 백그라운드 프로세스 재시작




bg %JID

pkill CMD

명령어(CMD)로 실행된 프로세스 종료



어떤 명령을 처음부터 백그라운드로 실행하고자 한다면 끝에 ‘&’를 붙이면 된다.


pi@raspberrypi:~ $ sleep 100&

이렇게 하면 ‘sleep 100’ 명령은 즉시 백그라운드  실행 모드로 들어가고 쉘에서 다른 일을 처리할 수 있다.

jobs는 백그라운드 프로세스 리스트를 표시하는 명령어이다.


pi@raspberrypi:~ $ jobs
[1]-  Running                 sleep 100 &
[2]+  Running                 sleep 200 &

리스트의 맨 앞의 숫자가 작업의 고유 번호(JID)이고 그 다음 실행여부(Running/Stopped)가 표시되며 실행한 명령어가 이어서 나타난다.

포그라운드 작업은 ctrl+c를 누르면 대부분 종료된다. ctrl+c는 인터럽트 신호를 포그라운드 작업에 전달한다. 프로세스는 기본적으로 인터럽트 신호를 받으면 종료하도록 되어있다.


만약 포그라운드에서 어떤 작업을 수행중에 ctrl-z를 누르면 중지되고 쉘로 빠져나오게 된다. 이럴 때 jobs 명령어로 확인하면 Stopped 로 표시되고 이 작업을 백그라운드에서 재시작하려면 bg 명령을 내리면 된다.


pi@raspberrypi:~ $ sleep 200
^Z
[1]+  Stopped                 sleep 200
pi@raspberrypi:~ $ jobs
[1]+  Stopped                 sleep 200
pi@raspberrypi:~ $ bg %1
[1]+ sleep 200 &
pi@raspberrypi:~ $ jobs
[1]+  Running                 sleep 200 &
pi@raspberrypi:~ $ kill -STOP %1
[1]+  Stopped                 sleep 200

위에서 보듯이 정지된 백그라운드 프로세스를 백그라운드 상태에서 다시 시작하려면
‘kill -STOP %N’명령을 주면 된다.

프로세스를 정상적으로 종료하기 위해서는 ‘kill’ 명령을 이용하면 된다. 그리고 좀비 프로세스를 강제로 종료하기 위해서는 ‘kill -KILL’ 을 이용하면 된다.

Posted by 살레시오
,

 지능형 로봇을 제어하는데 있어서 마이크로프로세서(microprocessor)나 소형 컴퓨터가 핵심적인 역할을 한다.

마이크로 프로세서

 로봇을 제어하는데 있어서 핵심적인 부품은 마이크로프로세서(microprocessor, 이후 uP로 표기함)이다. 마이크로(micro, 10^-6)라는 말은 매우 작다는 의미를 내포하며 프로세서는 ‘어떠한 일을 처리하는 장치‘라는 뜻으로서 이 두 단어의 합성이인 마이크로프로세서는 단어의 뜻으로만 보면 ’극소형의 처리장치‘정도로 해석될 수 있을 것이다. 좀 더 기술적인 설명은 작은 면적의 실리콘에 복잡한 전자회로를 집적시킨 것으로, 이 전자회로는 미세한 도선으로 연결된 수천 혹은 수백만 개의 콘덴서나 트랜지스터(transistor) 등으로 구성되어 있다.

 인텔이 발표한 최초의 uP는 1971년에 소개된 4004로 2300개의 트랜지스터를 가지고 있었으며 클럭속도는 108KHz이고 4bit 프로세서이다. 이 μP는 간단한 계산을 수행하는 계산기를 만드는데 사용이 되었으나 그 이후에 발전에 발전을 거듭하여 개인용 컴퓨터를 탄생시키는 등 우리의 생활을 광범위하게 바꾸는 계기가 되었다. 참고로 다음 그림에 내부 회로가 도시된 펜티엄4는 4천만 개 이상의 트랜지스터를 집적하였음을 보면 마이크로프로세서의 발전 속도를 짐작할 수 있다.

<참고 : 마이크로프로세서의 트랜지스터 집적 개수 >


<인텔의 4004>

<인텔 4004의 내부회로>

<인텔 펜티엄4의 내부 회로>


 로봇의 제어 장치에서 사용되는 프로세서는 환경 인식이나 상황을 판단하는 알고리듬을 구현하는 소프트웨어를 실행시켜서 센서의 신호를 읽어들이고 구동기로 구동 신호를 보내는 역할을 수행한다.

임베디드 시스템과 원보드 컴퓨터

 임베디드 시스템(embedded system)은 특정 기능을 수행하는 규모가 있는 전자적 시스템으로 구성되는 컴퓨터 시스템이다. 전자 하드웨어와 기계 부분을 포함하는 전체 장치의 일부로 내장되는 의미의 임베디드이며 오늘날 일상 생활에 쓰이는 많은 장치들을 제어하고 있다. 반면에 개인용 컴퓨터(PC)와 같은 범용 컴퓨터는 유연하게 설계되어 넓은 범위의 최종 사용자들의 요구 사항을 만족시킬 수 있다.

 임베디드 시스템에는 마이크로컨트롤러(microcontroller)나 DSP (digital signal processor) 등의 프로세서 코어가 장착될 수 있다. 마이크로컨트롤러는 규모가 작은 시스템에 사용하므로 보통 운영체제을 포함하지 않는 경향이 있다면, 임베디드는 좀 더 규모가 크기 때문에 운영 체제(윈도CE, 또는 리눅스)가 시스템에 포함된다. 이 운영체제 위에 특수한 기능만을 수행하도록 응용프로그램이 장착되어 동작하는 경향이있다. 예를 들어 같은 ARM이라도 마이크로컨트롤러는 한 칩에 메모리(플래쉬, RAM) 을 포함하고 기타 하드웨어(타이머, UART, SPI, ADC 등 필요에 따라 장착)를 포함한다. 여기서 메모리는 용량이 크지 않기 때문에 운영체제를 포함하기에는 한계가 있다. 그러나 임베디드 시스템에서는 하드웨어는 한 칩 내에 장착하지만, 칩 밖에 많은 용량의 메모리를 장착하고 PCB에서 연결하는 것이 일반적이다. 이것은 시스템이 크기 때문에 용량이 큰 메모리를 시스템에 장착할 필요성이 있기 때문이다.

라즈베리파이 (raspberry pi)

 라즈베리 파이(Raspberry Pi)는 영국의 라즈베리 파이 재단이 학교에서 기초 컴퓨터 과학 교육을 증진시키기 위해 만든 싱글 보드 컴퓨터이다. 라즈베리 파이는 그래픽 성능이 뛰어나면서도 가격은 저렴하다는(세금을 포함하지 않은 모델 A의 경우 25달러, 모델 B의 경우 35달러) 특징을 갖고 있다.


 라즈베리 파이는 브로드컴사의 BCM2835 단일칩시스템(SoC, System on Chip)을 사용하며, 이 칩에는 ARM1176JZF-S700 MHz 프로세서, 비디오코어 IV GPU와 256 메가바이트 램이 들어 있다. 라즈베리 파이는 HDD나 SDD를 내장하고 있지 않으며, SD카드를 외부 기억장치로 사용한다. 라즈베리 재단은 컴퓨터 교육 증진을 위해 2가지 모델을 내놨으며, 각각 25달러와 35달러로 책정되었다. 2012년 2월 29일 재단은 35달러짜리 모델의 주문을 받기 시작하였다. 또한 라즈베리 파이 재단측에서는 라즈베리 파이에 포팅한 데비안과 아키리눅스, QtonPi등의 리눅스 배포판을 제공하고 있다. 또한 재단측에서는 라즈베리 파이의 주 프로그래밍 언어인 파이썬(python)에 BBC 베이직, C언어, 펄등을 지원할 수 있는 툴들을 제공하고 있다.

<라즈베리파이의 구조>

아두이노 (arduino)

 아두이노(Arduino)는 오픈소스를 기반으로 한 단일 보드 마이크로 컨트롤러이다. AVR을 기반으로 한 보드로 이루어져 있고 좀 더 최근에는 Cortex-M3를 이용한 제품(Arduino Due)과 인텔 Quark프로세서 기반의 갈릴레오보드도 시판되고 있다. 소프트웨어 개발을 위한 통합 환경(IDE)이 제공되며 사용자가 프로그램하기 쉽게 라이브러리가 잘 마련되어 있다. 아두이노는 다수의 스위치나 센서로부터 값을 받아들여, LED나 모터와 같은 외부 전자 장치들을 통제함으로써 환경과 상호작용이 가능한 물건을 만들어낼 수 있다. 또한 플래시, 프로세싱, Max/MSP와 같은 소프트웨어를 연동할 수 있다.

 아두이노의 가장 큰 장점은 마이크로컨트롤러를 쉽게 동작시킬 수 있다는 것이다. 일반적으로 AVR 프로그래밍이 WinAVR로 컴파일하여, ISP장치를 통해 업로드를 해야하는 등 번거로운 과정을 거쳐야하는데 비해, 아두이노는 컴파일된 펌웨어를 USB를 통해 업로드를 쉽게 할 수 있다. 또한 아두이노는 다른 모듈에 비해 비교적 저렴하고, 윈도를 비롯해 맥OS X, 리눅스와 같은 여러 OS를 모두 지원한다. 아두이노 보드의 회로도가 CCL에 따라 공개되어 있으므로, 누구나 직접 보드를 직접 만들고 수정할 수 있다.


 아두이노가 인기를 끌면서 이를 비즈니스에 활용하는 기업들도 늘어나고 있다. 장난감 회사 레고는 자사의 로봇 장난감과 아두이노를 활용한 로봇 교육 프로그램을 학생과 성인을 대상으로 북미 지역에서 운영하고 있다. 자동차회사 포드는 아두이노를 이용해 차량용 하드웨어와 소프트웨어를 만들어 차량과 상호작용을 할 수 있는 오픈XC라는 프로그램을 선보이기도 했다. 또한 비교적 구조가 간단한 로봇시스템의 제어 보드로도 사용할 수 있다.

<아두이노 보드들>


지능형 로봇의 예 - 다윈OP, 오픈 휴머노이드 시스템

 근래에는 소프트웨어 뿐만 아니라 하드웨어도 그 구조가 개방되어 일반인들이 쉽게 수정, 제작할 수 있는 추세가 형성되고 있는데 아두이노가 대표적인 예라 할 수 있다.  휴머노이드 분야에서도 그러한 추세를 타고 기계 구조와 사용 소프트웨어가 개방된 플랫폼이 있는데 바로 다윈OP이다. 로보티즈사와 버지니아텍의 홍원서 교수팀이 공동으로 개발하였다. 로보티즈사의 고성능 서보모터가 사용되었으며 PC와 제어보드가 각 관절을 구성하는 모터와 비전시스템을 제어하도록 설계되어 있다. 2족 보행 기능을 물론이고 공을 쫓아간다든지 특정한 모양을 인식하여 정해진 동작을 수행하는 기능을 가지고 있다. 이 로봇의 설계도면이나 구동 소프트웨어는 개방되어 있으며 다른 사람들이 수정/보완할 수 있도록 하고 있다.

<오픈소스 로봇 플랫폼인 다윈OP의 구조: 가슴 부분에 컴퓨터가 내장되어 있다.>

< 비젼 시스템이 내장되어 공을 쫓아 가거나 특정한 모양을 인식하는 기능이 내장되었다>


학습(learning) 과 자율 제어

 로봇에게 여러 번의 교육을 통해 행동을 학습시킨 후 기록된 행동 순서를 따라하도록 하는 기술을 의미한다. 반면에 자율 제어란 비젼시스템이나 센서를 통해서 주변의 환경을 인식한 후 스스로 반응 행동을 결정해 나가도록 하는 기술을 말한다.



Posted by 살레시오
,

  이전 포스트에서 말한 바와 같이 일반적인 아두이노 우노와 모터쉴드(R3)를 사용하여 모터를 구동해 보기로 하였다. 이 로봇에 포함된 모터가 6V/2A 의 모터라 BA6208이나 LM1630 같은 IC등은 구동 전류를 충분히 내지 못해서 모터의 토크가 약해진다. 모터 한 개당 BA6208 두 개를 병렬로 연결하여 제어해 보았으나 크게 성능이 향상되지는 않았다. 모터쉴드에 대한 설명은 아래 포스트를 참조하면 된다.


    - 아두이노 모터 쉴드 R3


다음 사진은 모터 쉴드에 DC모터 전원선을 연결한 것이다. 밑에 아두이노 우노가 있고 모터 쉴드를 얹어서 모터에 연결하였고 전원은 1.5V AA건전지 6개(9V)를 사용한다.



첫 번째 실험으로 2초 동안 전진하고 2초 동안 후진하기를 무한 반복하는 간단한 예제이다. 프로그램 소스는 다음과 같다. 실험할 때 한가지 주의할 점은 반드시 외부전원(건전지나 변압기)를 보드에 연결하여야 한다는 것이다 USB만으로 모터를 구동시키려다가 PC보드가 손상될 수도 있다.




소스 코드:

───────────────────────────────

    #define PWM_RIGHT 3

    #define DIR_RIGHT 12

    #define BRAKE_RIGHT 9

    #define PWM_LEFT 11

    #define DIR_LEFT 13

    #define BRAKE_LEFT 8


    void setup() {

        pinMode(PWM_LEFT, OUTPUT);

        pinMode(DIR_LEFT, OUTPUT);

        pinMode(BRAKE_LEFT, OUTPUT);

        pinMode(PWM_RIGHT, OUTPUT);

        pinMode(DIR_RIGHT, OUTPUT);

        pinMode(BRAKE_RIGHT, OUTPUT);

        analogWrite(PWM_LEFT,0);

        analogWrite(PWM_RIGHT,0);

    }


    void loop() {

        digitalWrite(DIR_LEFT, LOW);

        digitalWrite(DIR_RIGHT,LOW);

        analogWrite(PWM_LEFT, 255);

        analogWrite(PWM_RIGHT, 255);

        delay(2000);


        digitalWrite(DIR_LEFT, HIGH);

        digitalWrite(DIR_RIGHT, HIGH);

        analogWrite(PWM_LEFT, 255);

        analogWrite(PWM_RIGHT, 255);

        delay(2000);

    }

───────────────────────────────

[#00079]


Posted by 살레시오
,