본문 바로가기

Robotics : 로봇공학/Certificate : 자격증

3-3-4 로봇 액추에이터 제어기 펌웨어 설계

로봇 응용프로그램(robot application program)

응용프로그램은 운영 체제의 도움으로 실행되고 관리될 수 있는 프로그램이다. 응용프로 그램은 하드디스크 등의 외부 기억장치에 저장되어 있다가 메모리로 이동하여 실행되면 프로세서라고 불린다. 응용프로그램은 운영 체제를 구성하는 한 프로그램인 로더(loader)라는 프로그램 또는 기능에 의해 주기억장치로 이동되며 이후 MPU에 의해 실행되고 운영 체제에 의해서 관리된다.

 

<표 1> 저수준 언어와 고수준 언어의 비교

일반적으로 응용프로그램은 상위 또는 하위 수준의 언어로 작성될 수 있는데 현재에는 프로그래밍의 생산성을 위해 상위 언어를 사용하는 실정이다.
로봇에서의 응용프로그램 또한 일반 컴퓨터와 같이 미리 구성된 로봇의 기구적 하드웨어와 제어를 위한 컴퓨터 하드웨어를 바탕으로 운영 체제의 API(application programming interface)를 기반으로 작성되고 운영 체제의 관리 하에서 실행된다. 복잡한 로봇의 경우 앞서 언급한 로봇 미들웨어가 통상 사용되는데 이때 응용프로그램을 로봇 미들웨어의 API 를 사용한다.

 

[그림 1] 로봇 응용프로그램의 동작 흐름

로봇 응용프로그램은 일반 컴퓨터에서와 마찬가지로 CPU가 실행할 수 있는 머신코드의 집합인데, 개념적으로 로봇의 특정 동작 또는 처리를 위해 미들에어에서 제공하는 API를 호출하면, 운영 체제의 API들이 호출되어 이의 결과를 받는 구조로 되어 있고, 일반 컴퓨 터의 프로그래밍은 경우와 마찬가지로 아래의 컴파일 과정을 통하여 머신 코드를 생성할수 있다.

 

  • 오브젝트 코드(Object Code)

컴파일러와 어셈블러를 거쳐 생성된 머신코드의 집합을 오브젝트 코드(object code)라고하며 이들 코드가 저장된 파일을 오브젝트 파일이라고 한다. 오브젝트 파일은 링커라는 프로그램에 의해서 실제 바이너리 형태의 실행파일로 만들어지게 된다. 이와 같이 응용프로 그램이 CPU의 명령어로 구성된 바이너리 형태인 경우 CPU와 운영 체제 그리고 미들웨어가 달라지면 응용프로그램이 제대로 실행되지 않는다. 이와 같은 구조의 응용프로그램은 하위 계층 구조에 의존적인데 응용프로그램이 실행되는 하위 계층의 변화가 있는 경우 응용프로그램은 소스 프로그램을 다시 컴파일 해야 하므로 소스 코드 레벨에서의 호환성을 지원한다고 생각할 수 있다.

[그림 2] 고수준 언어의 기계어 번역 과정

 

  • 런타임 시스템(runtime system)

하위 계층의 변화가 있더라도 응용프로그램의 재컴파일 없이 수행될 수 있는 환경이 있는데 이를 런타임 시스템(runtime system) 또는 가상머신(virtual machine)이라고 한다. PC 및 스마트 기기에서도 런타임 시스템이 폭넓게 사용되고 있는데 자바(JAVA)와 닷넷(.Net) 이 대표적이며 인터넷 웹 환경에서 실행되는 프로그램들이 런타임 시스템만 올바르게 설치되어 있으면 운영 체제와 하드웨어의 종류에 관계없이 실행되게 하여 준다.

[그림 3] 런타임 시스템에서 응용프로그램의 실행

 

런타임 시스템에서 실행되는 응용프로그램은 CPU에서 실행되는 머신모드가 아닌 가상머 신에서 실행되는 코드이다. 통상 CPU에 의존적인 코드를 바이너리라고 부르기 때문에 가상머신에서 실행되는 코드들은 바이트 코드라고 부른다.
런타임 시스템은 실제 로봇 시스템에서 폭넓게 적용 및 사용되고 있다. 그리고 하위 계층의 종류에 관계없이 응용프로그램의 동작 호환성을 보장하지만 런타임 시스템 또한 소프 트웨어이므로 런타임 시스템 자체는 운영 체제 및 미들웨어 그리고 하드웨어에 맞게 제작 되어야 한다.

 

  • 펌웨어(firmware) 

(1) 개념
펌웨어는 소프트웨어의 한 종류이지만 특정기기를 위한 기능만을 위한 프로그램이라고 할 수 있다. 
로봇의 응용프로그램은 로봇의 동작 및 작업을 정의하는 것으로, 로봇의 응용에 따라 사용자에 의하여 작성된 프로그램인데 로봇 미들웨어의 API를 이용하거나 런타임 시스템에서 지원하는 언어로 작성된다. 


앞서 설명한 소프트웨어의 구조와 다르게 간단한 로봇 또는 기기는 응용프로그램의 교체 없이 항상 같은 프로그램으로 동작하는데 이때는 운영 체제를 사용하지 않는 경우가 많다. 이와 같은 소프트웨어는 별도로 펌웨어로 구분될 수 있는데 흔히 운영 체제와 어플리케이션의 구분 없이 간단하게 동작하는 형태를 의미하며 보다 간단한 구조의 MCU 등에서의 프로그램은 펌웨어라고 할 수 있다.


(2) 실행 구조
펌웨어는 항상 같은 프로그램만 실행되는 것이므로 복잡한 운영 체제가 필요가 없거나 아예 운영 체제를 사용하지 않는 경우도 많다. 펌웨어는 비교적 같은 일을 하는 기기에서 동작하며 보통 MCU에서 동작하고 Flash나 ROM에 저장되어 있다가 바로 실행 되는 실행 구조를 가진다.
PC에서는 다양한 사용자에게 다양한 응용프로그램이 바뀌어가며 실행되거나 동시에 실행되지만, TV의 리모컨의 경우 항상 리모컨의 기능만 담당하는 프로그램이 실행된 다. 다시 말해 하나의 하드웨어에서 하나의 응용프로그램만이 실행된다는 것이다. 이와 같이 응용프로그램의 변동 없이 계속 같은 프로그램이 실행되는 경우 해당 프로그 램을 펌웨어라고 한다.

[그림 4] TV의 리모컨의 기능구현 펌웨어

 

임베디드 시스템 개요

임베디드 시스템이란 정해진 특정 기능을 수행하기 위해 하드웨어와 소프트웨어가 내장된 전자 제어 시스템을 말한다. 즉, 단순 회로만으로 구성된 장치가 아닌 마이크로프로세서가 내장되어 있고, 이러한 마이크로프로세서를 운용하여 원하는 작업을 수행 및 관리하는 프로그램이 포함된 시스템을 의미한다.
임베디드 시스템은 자동차, 우주, 항공, 군사, 의료장비와 공정 제어 등 산업용으로 시작하 여, 이제는 가전제품, 스마트폰 등으로 영역을 확대하여 우리 생활에 밀접하게 관련되어 있다. 특히, 스마트폰이나 인터넷 접속이 가능한 스마트 TV, 휴대가 간편한 Tablet PC, 원격 모니터링 기능을 갖는 보일러 등이 이미 시장의 주류가 되어 있다. 스마트폰이라는 작은 크기의 종합적인 무선 통신 전화기와 같은 새로운 형태의 제품이 출현하여 불과 2-3년 만에 휴대전화의 새로운 패러다임으로 발전하고 있다. 이미 마이크로프로세서 및 소프트 웨어가 탑재되지 않는 가전제품이 거의 없다는 점과 소프트웨어와 하드웨어 양쪽 측면에서 점점 많은 고기능을 요구하는 점을 감안하면 임베디드 시스템의 성장속도는 더 급격히 증가될 것으로 기대되고 있다.

 

임베디드 리눅스
  • 운영 체제는 컴퓨터 시스템 계층 구조에서 하드웨어와 가장 가까운 쪽을 차지하는 소프 트웨어로서 시스템의 여러 자원(CPU, 메모리, 파일 시스템, 각종 입출력 장치, 네트워크) 을 관리하는 역할을 한다. 운영 체제의 도움으로 응용프로그램들은 임베디드 시스템 내의 자원을 공유하여 사용할 수 있으며 자신에게 할당된 자원을 보호 받게 된다.
  • 현재의 운영 체제는 용도에 따라 크게 두 가지 분류로 나누어 볼 수 있는데, 하나는 리눅스나 마이크로소프트 윈도우와 같이 서버나 개인용 컴퓨터에서 실행되는 응용프로그램들을 지원하는 것이고, 다른 하나는 실시간 운영 체제(RTOS)와 같이 우주, 항공 군사, 의료 장비 등과 같은 임베디드 시스템에서 엄격한 시간 제약성을 만족시켜야 하는 환경에 사용되기 위한 목적으로 만들어진 것이다.
  • 현재 가장 많이 사용되는 실시간 운영 체제로는 VxWorks를 비롯하여, pSOS, QNX, VRTX, nucleus, LynxOS, ChorusOS, QnX Neutrino, RTEMS, OS9, RealTime Linux 등이 있으며, 최근 스마트폰과 태블릿 열풍으로 인기 있는 운영 체제로는 APPLE의 iOS, GOOGLE의 android를 비롯하여 삼성의 Tizen 같은 것들이 있다.
  • 과거에는 많은 임베디드 시스템들이 운영 체제 없이 개발되었지만, 최근에는 대부분의 임베디드 시스템들이 어떤 형태든 운영 체제를 가지고 개발되고 있는 추세이다. 임베디드 시스템에서 운영 체제를 점점 더 많이 도입하는 중요한 이유는 좀 더 좋은 성능을 가진 복잡한 하드웨어가 사용되고 예전과는 비교할 수 없는 많은 소프트웨어 기능이 요구되기 때문이다.

 

시스템 소프트웨어 
  • 부트로더

펌웨어에서는 프로그램이 바뀌지 않더라도 앞서 설명한 로더를 가질 수 있는데 이때는 기기의 기능 보완을 위한 프로그램의 업그레이드 용도나 프로그램이 실행을 시작할 주기억 장치의 위치를 알려주는 등의 제한적 기능만이 사용된다. 이런 제한적 기능의 로더를 부트로더(boot loader)라고 한다.
임베디드 시스템에도 펌웨어를 가지고 있는데 PC가 처음 시작할 때 BIOS라는 프로그램이 항상 실행되며 이는 ROM에 저장되어 있다가 바로 실행된다. BIOS는 운영 체제가 실행되기 전에 최소한의 하드웨어 설정을 담당한다. 즉, PC도 펌웨어가 동작하고 이후 운영 체제가 실행된다.
부트로더는 타깃 장비를 초기화하고 임베디드 운영 체제로 부팅 할 수 있게 처음에 동작 하는 프로그램이다. 또 임베디드 장비에 처음 전원이 인가되었을 때 동작하는 작은 프로 그램이기도 하다. 부트로더는 운영 체제가 동작할 수 있도록 하드웨어를 초기화하고, 운영 체제 커널을 메모리로 적재시키는 역할을 수행한다.
오래된 시스템들에서 사용되었던 프로세서는 부팅 시작 시에 특정 번지에서 실행 코드를 읽어서 수행하도록 구성되어 있었다. 그래서 보통 시작 번지에는 명령어가 있는 실제 주소로 jump하는 코드가 들어 있었다. 그러나 최신 프로세서들은 프로세서 안에 적은 용량의 ROM과 RAM을 포함하고 있어서 초기 동작하는 프로그램을 프로세서 안에 포함하고 있다.

[그림 5] 임베디드 시스템의 부트로더 화면(안드로이드 폰)

 

  • 리눅스 커널 

(1) 커널의 개요
리눅스 커널은 리눅스 운영 체제를 이루는 가장 핵심적인 소프트웨어이다. 리눅스 커널이 곧 리눅스 운영 체제라고도 할 수 있다. 하지만 커널이 리눅스 전체라고는 볼 수없다. 커널은 “kernel”이란 단어 뜻에서도 유추할 수 있듯이 운영 체제에서 가장 중요한 부분을 담당하고 있기 때문에 커널=리눅스란 표현을 많이 사용되는 것이다.


지금부터 커널에서 수행하는 역할에 관하여 살펴보겠다. 커널은 시스템의 구동에 필요한 환경 설정과 수행되는 프로그램들을 스케줄링 하는 소프트웨어이다. 커널은 크게 마이크로 커널(micro kernel)과 모놀리틱 커널(monolithic) 로 나눌 수 있으며, 마이크로 커널은 커널이 가져야 하는 핵심적인 기능만을 구현한 최소 커널로써 나머지는 서비스 프로세스로 이루어진다. 모놀리틱 커널이란 커널 내부에 시스템 운영에 필요한 많은 서비스 루틴들을 포함한 구조를 가지고 있다. 이러한 모놀리틱 커널은 구현이 간단하며 시스템 자원을 보다 효율적으로 관리할 수 있는 장점을 가지고 있지만 다양한 환경의 시스템에 포팅하기 어렵고, 커널의 크기가 상대적 으로 커진다는 단점을 가진다. 하지만 마이크로 커널은 핵심 기능과 작은 서버 모듈로 나누어 설계되고, 최소 기능만을 커널 내부에 포함하므로 기능 확장 및 다른 시스템에 재사용이 쉬워진다. 반면, 서버에 메시지 전달 방식의 접근은 태스크 스위칭에 많은 오버헤드를 초래하며 자원의 효율적 이용도 낮아진다. Solaris, AIX, HP-UX, Linux등이 모놀리틱 커널을 사용하며 Mach OS, sunsoft, Digital UNIX등은 마이크로 커널을 사용 하고 있다.

[그림 6] 커널 종류

(2) 리눅스 커널의 기능
다음 그림과 같이 커널은 프로세스 관리, 메모리 관리, 파일 시스템 관리, 디바이스 관리, 네트워크 관리의 5개의 기능을 블록으로 구분할 수 있다.


(가) 프로세스 관리
리눅스 운영 체제에서는 시스템이 동작 이후에 최소한 하나 이상의 프로세스가 동작한다. 이 프로세스는 다른 말로 태스크라고도 하며, 주어진 일을 수행하는 기본 단위다. 커널은 프로세스 스케줄러를 이용하여 여러 프로세스가 동작할 수 있도록각 프로세스를 생성하고 제거하며, 외부 환경과 프로세스를 연결하고 관리한다.

출처: MCLAB(2016). mclab wikipedia. http://mclab.hufs.ac.kr/에서 2016. 9. 30. 검색. [그림 7] 리눅스 커널 구조

(나) 메모리 관리
시스템에서의 메모리는 프로세서와 마찬가지로 가장 핵심적이고, 중요하게 관리해야 하는 지원이다. 메모리를 관리하는 정책은 시스템 성능을 결정하는 중요한 요소 로, 각각의 프로세스가 독립적인 공간에서 수행할 수 있도록 가상 주소 공간을 제공한다. 이 가상 메모리 관리를 바탕으로 보조 기억 장치와 연동하여 물리적인 한계를 극복할 수 있는 기능을 제공한다.
(다) 파일 시스템 관리
리눅스 커널은 유닉스 시스템에서 사용하는 파일 시스템을 근간으로 설계되었다. 그래서 리눅스 커널에서 동작하는 응용프로그램은 시스템에 동작하는 모든 자원을 파일처럼 다룰 수 있도록 통일된 인터페이스를 제공한다. 또 리눅스 커널은 가상 파일 시스템(VFS)를 이용하여 현존하는 대부분의 파일 시스템 형식을 지원한다.
(라) 디바이스 제어
운영 체제에서 동작하는 응용프로그램의 결과는 하드웨어와 반드시 연결되어야 사용자가 인지할 수 있다. 메모리와 프로세서를 제외한다면 그 외의 동작은 반드시 하드웨어적인 처리를 수반한다. 하드웨어에 관련된 처리는 디바이스 드라이버에서 담당하며, 커널이 반드시 구현해야 하는 것 중 하나다. 리눅스 커널은 파일 시스템의 구조에 디바이스 드라이버를 연동하여 구현하며, 표준화된 형식으로 하드디스크 로부터 키보드, 이더넷과 같은 모든 주변 장치를 관리한다.

(마) 네트워크 관리
현대의 시스템은 반드시 네트워크 처리를 수반한다. 현존하는 운영 체제 중에는 네트워크 처리를 수행하지 않는 운영 체제도 있겠지만, 리눅스 커널은 네트워크를 필요로 하는 시스템에서 주로 개발되었기 때문에 가장 우수한 네트워크 관리 시스템을 갖추고 있다. 리눅스 커널은 네트워크 스택을 이용하여 응용프로그램과 네트워크 디바이스 드라이버를 연결하며, 매우 효율적인 네트워크 처리를 구현하고 있다. 또 리눅스 커널에서 동작하는 네트워크 시스템은 암호화와 보안 특성이 연계된 매우 견고한 시스템을 구성한다.

 

안드로이드(android)

안드로이드는 OS, middleware, key application을 포함하는 모바일기기의 S/W 집합체이다. 그리고 안드로이드 SDK는 안드로이드 플랫폼 상에서 자바 프로그래밍 언어를 이용하여 개발을 시작할 수 있도록 툴과 API를 제공하고 있다.

  • Android 특징 

(1) application framework: 컴포넌트의 재사용 및 대체를 가능하게 함.
(2) dalvik virtual machine: 모바일 디바이스를 위해 최적화 됨.
(3) integrated browser: open source webkit 엔진 기반 

(4) optimized graphics: 구글이 만든 2D 그래픽 라이브러리에 의해 강화 됨. open GL ES 1.0/2.0스펙을 기반으로 하는 3D 그래픽(하드웨어 가속은 선택사항) 

(5) SQLite: 정형화된 데이터 저장 공간을 위한 것.
(6) 미디어 지원: 일반적인 오디오, 비디오, 그리고 정지 이미지 포맷들을 지원 (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF) 

(7) GSM 지원(하드웨어 의존적) 

(8) Bluetooth, EDGE, 3G, WiFi 지원(하드웨어 의존적) 

(9) 카메라, GPS, 나침반과 가속도계 지원(하드웨어 의존적) 

(10) 풍부한 개발환경: 디바이스 에뮬레이터, 디버깅 도구, 메모리 및 성능 프로파일링, 그리고 eclipse IDE를 위한 플러그인을 포함함.

 

  • android 구조 

(1) applications
안드로이드는 이메일 클라이언트, SMS 프로그램, 달력, 지도, 브라우져, 전화번호부, 그리고 다룬 것들을 포함하는 핵심 응용프로그램을 탑재할 것이다. 모든 프로그램은 자바 프로그래밍 언어로 작성된다.

 

(2) application framework
개발자는 핵심 응용프로그램에서 사용된 것과 같은 프레임워크 API에 모두 접근 가능 하다. 응용프로그램 아키텍쳐는 컴포넌트 재사용을 손쉽게 할 수 있도록 디자인 되었 으며, 어떤 응용프로그램의 기능으로 제작하는 데 사용된다(단, 프레임워크의 보안 제약을 따라야 한다). 이 같은 메카니즘은 사용자에 의한 컴포넌트의 대체를 가능하게 한다. 아래에 나열된 모든 어플리케이션은 하나의 서비스와 시스템의 집합체이다.

출처: Wikipedia(2016). https://en.wikipedia.org/에서 2016. 9. 30. 검색. [그림 8] 안드로이드 구조


   (가) 풍부하고 확장성 있는 뷰 집합 : 리스트, grid, 텍스트 박스, 버튼, 심지어는 임베디드 가능한 웹 브라우저를 포함하는 어플리케이션을 제작하는 데 사용될 수 있음 

   (나) 컨텐트 제공자 : 어플리케이션이 다른 어플리케이션(전화번호부 같은)의 데이타에 접근하는 것이나 자신의 데이타 공유시키는 것을 가능하게 함 

   (다) 리소스 관리자 : 문자열, 그래픽, 레이아웃 파일과 같은 코드화되지 않는 자원에 대한 접근을 제공함 

   (라) 알림 관리자 : 모든 어플리케이션이 상태바에 어플리케이션이 만든 알림메시지를 표시하는 것을 가능케 함.
   (마) 액티비티 관리자 : 어플리케이션의 생명 주기를 관리하며, 일반적인 네비게이션 히스토리를 제공함

 

(3) libraries

안드로이드는 안드로이드 시스템에서 다양하게 사용되는 C/C++ 라이브러리들을 포함 하며, 안드로이드 application framework를 통해 개발자들은 이런 사항을 알 수 있다.

 

   (가) System C library 

   : 임베디드 리눅스 기반의 디바이스를 위해서 튜닝된 표준 C 시스템 라이브러리의 BSD 상속 구현체(libc) 

   (나) Media Libraries 

   : PacketVideo의 OpenCORE기반이며, 인기 있는 오디오 및 비디오 포맷, MPEG4, H.264, MP3, AAC, AMR, JPG, PNG를 포함하는 정적 이미지 파일의 재생 및 녹화를 지원함.
   (다) Surface Manager : 디스플레이 서브 시스템 및 다수의 응용프로그램의 2D, 3D 그래픽 레이어

   (라) LibWebCore : 안드로이드 브라우저와 임베딩 가능한 웹 뷰와 같은 최신 웹 브라우저 엔진

   (마) SGL : 2D 그래픽 원

   (바) 3D libraries

   : OpenGL ES 1.0/2.0 API들을 기반으로 하며, 하드웨어 3D 가속 또는 최적화된 3D S/W 래스터라이저를 사용함.

   (사) FreeType 

   : 비트맵 또는 벡터 폰트 렌더링 (아) SQLite : 모든 응용프로그램에서 사용 가능한, 강력하며 경량화 된 관계형 데이 터베이스 엔진

 

(4) android runtime
안드로이드는 Java 프로그래밍 언어의 핵심 라이브러리에서 사용 가능한 대부분의 기능들을 포함하는 핵심 라이브러리들을 포함한다. 모든 안드로이드 응용프로그램은 Dalvik 가상 머신내의 자신의 인스턴스를 가지고, 자신의 프로세스 내에서 동작한다. Dalvik은 기기가 다수의 버추얼 머신에서 효율적으로 실행될 수 있도록 제작되었으며, 최소의 메모리 영역에 최적화된 Dalvik Executable(.dex) 포맷 파일을 실행시킨다. 버추얼 머신은 레지스터 기반이며, 자바 컴파일러로 컴파일된 클래스들을 "dk"툴을 이용하여 .dex 포맷으로 변경한 클래스들을 실행한다. Dalvik 버추얼 머신은 스레딩과 저수준 메모리 관리와 같은 리눅스 커널 기능을 사용한다.


(5) linux kernel
안드로이드는 보안, 메모리 관리, 프로세스 관리, 네트워크 스택, 드라이버 모델과 같은 리눅스 버전 2.6의 핵심 시스템 서비스를 이용하며, 커널은 하드웨어와 소프트웨어간 추상 계층으로 동작한다.

 

 

수행 내용 / 로봇 액추에이터 제어기 펌웨어 설계하기

 

UART 통신 프로그램을 작성한다.

액추에이터를 제어하기 위해서는 embedded 모듈과 MCU-CORE가 uart을 하며 미리 정해진 패킷으로 통신을 해야 한다. 그래서 이번 장에서는 uart통신의 기본 개념 및 간단한 통신 프로그램을 작성해 보도록 한다.

 

servo motor 제어를 수행한다.

이번 장에서는 앞에서 배운 uart통신을 응용하여 servo motor를 제어 해본다. HBE-RoboEX-Brain에는 2개의 Servo 모터가 있다. 하단에 아래쪽에 연결된 모터는 좌우 방향 전환을 담당하고 위쪽에 연결된 모터는 위 애래 방향의 전환을 담당한다. 먼저 servo motor 구조에 대해 알아보고 servo motor를 동작시키기 위한 uart 패킷을 학습하고 프로 그램을 작성해 실행 시켜보도록 한다.