본문 바로가기
Programming/Sensors

ROS 기본 정리

by OKOK 2017. 8. 7.

왜 로봇 소프트웨어 플랫폼을 써야 하는가?

프로그램의 재사용성입니다. 자신이 개발하고자 하는 부분에 집중하고 나머지 기능에 대해서는 관련 패키지를 내려받아서 사용할 수 있습니다. 마찬가지로 자신이 개발한 프로그램은 다른 이들이 사용할 수 있도록 공유할 수도 있습니다. 


통신 기반 프로그램입니다. 흔히, 하나의 서비스를 제고아기 위하여 센서나 액추에이터 단의 드라이브부터 센싱, 인식, 동작까지 하나의 프로그램을 작성하는 것이 많은데 로봇 소프트웨어의 재사용을 위해서는 이를 각각 처리 프로세서의 목적에 따라 작게 나누게 됩니다. 플롯폼마다 이를 컴포넌트화 혹은 노드 패키지화라고 합니다. 최소 실행 단위로 나뉜 프로그램은 나누어진 노드끼리 데이터를 주고받아야 하는데 플랫폼들은 이 데이터 통신에 대한 전반적인 사항을 모두 갖추고 있습니다. 


각 노드는 하드웨어 의존성을 떠나 네트워크에서 통신을 제공함으로써 네트워크 프로그래밍이 가능하게 되고 로보틱스에서 흔히 다루는 원격제어에서 매우 유용합니다. 또한, 최근 사물인터넷 개념과도 일치하여 사물인터넷 플랫폼 대신 사용할 수 있으며 최소 실행 단위로 나뉜 프로그램은 작은단위로 디버깅할 수 있어서 오류를 찾아낼 때도 매우 유용합니다.


개발 도구 지원입니다. ROS의 경우 디버깅 관련도구, 2차원픗롯과 3차원 시각화 도구를 제공함으로써 로봇 개발에 필요한 개발 도구를 직접 개발할 필요 없이 바로 사용할 수 있습니다. 또한, 요즘 주목받는 MS사의 키넥트 등으로 얻은 3차원 거리 정보는 점 군을 나타내는 포인트 클라우드 형태로 쉽게 변환하여 보여줍니다. 그 이외에도 실험에서 사용된 데이터는 녹화할 수 있으므로 언제든지 필요할 때 재생하여 실험할 떄의 상황을 그대로 재현할 수도 있습니다. 이처럼 로봇 개발에 꼭 필요한 소프트웨어 도구를 제공하여 개발 편의성을 극대화한 점이 중요한 원인 중의 하나 입니다.


생태계 조성입니다. 스마트폰 혁명은 안드로이드와 iOS 등 소프트웨어 플랫폼이 만든 생태계가 있기 때문이라고 합니다. 로봇 분야도 마찬가지 흐름으로 이어 가고 있습니다. 처음에는 각종 하드웨어 기술들이 넘쳐흘렀으나, 이를 통합해 줄 운영체제가 없었습니다. 



로봇 운영체제

로봇 소프트웨어 플랫폼


사람들 대부분은 불과 20년 전만하더라도 휴대전화가 지금처럼 필수품이 되리라고는 생각하지 못했습니다. 하지만 그 뒤로 휴대전화 시장은 급성장하였고 현재의 스마트폰에 이르렀습니다. 이제 스마트폰은 전화기라는 기능을 뛰어넘어 인터넷, SNS, 메시지, 게임, 음악 감상 등 다양한 기능으로 우리에게 없어서는 안 되는 필수품이 되었습니다. 


그 당시 휴대전화 제조회사들은 휴대전화별로 해당 하드웨어에 맞는 펌웨어를 개발하였습니다. 따라서 새 하드웨어가 개발되면 해당 일정에 맞추어 펌웨어 개발을 반복할 수밖에 없었습니다. 펌웨어는 컴퓨팅과 공학 분야에서 특정 하드웨어 장치에 포함된 소프트웨어로, 소프트웨어를 읽어 실행하거나, 수정되는 것도 가능한 장치를 뜻합니다. 펌웨어는 ROM이나 PROM에 저장되며, 하드웨어보다는 교환하기가 쉽지만, 소프트웨어보다는 어렵습니다. 


1990년대 중순까지 펌웨어를 업데이트하는 일은 일반적으로 소켓 형태의 ROM 집적회로였던, 펌웨어를 포함하는 기억매체를 교체하는 일이 수반되었습니다. 플래시 메모리는 시스템으로부터 물리적으로 집적 회로를 제거하지 않고 펌웨어를 업데이트할 수 있게 해줍니다. 


현대의 시스템에 들어가는 대부분의 장치들은 저들만의 소프트웨어를 실행하는 특수 목적의 컴퓨터입니다. 이 장치들 가운데 일부는 장치 안에 있는 ROM 안에 소프트웨어를 저장합니다. 그러나, 여러 해에 걸쳐, 제조업체들은 호스트 시스템에서  펌웨어를 불러내는 것이 값이 싸면서도 유용연성이 있다는 사실을 알아 냈습니다. 그 결과, 현재의 많은 하드웨어는 호스트 컴퓨터가 필요한 펌웨어가 채워질 때까지 어떠한 방법으로도 기능을 할 수 없습니다. 


전자기기 등의 기본적인 제어 및 구동을 맡는 소프트웨어의 총칭입니다. ROM에 기록됩니다. 펌에어 역시 부품으로 취급하기도 하니다. 이게 없거나 잘못되면 대부분의 전자기기가 흔히 말하는 벽돌이 됩니다. 영상/음성을 모두 출력하는 멀티미디어 기기에서는 구조가 매우 복잡해지며, 그 탓에 예상하지 못했던 버그도 자주 튀어나옵니다. 일반적으로는 사용에 큰 문제가 없다면 그대로 방치되는 경우가 많으나, 인기 있는 기기에서는 이런 허점을 통해 해커들의 주도로 커스텀 펌웨어나 패치 등을 통해 다양한 홈브류를 구동할 수 있게 되는 경우도 있습니다. 


장치 드라이버/제어기 또는 디바이스 다리어브는 특정 하드웨어나 장치를 제어하기 위한 커널의 일부분으로 동작하는 프로그램입니다. 컴퓨터를 구성하는 다양한 입출력 장치마다 각각 장치드라이버가 프로그램 되어 커널에 통합되어 실행됩니다. 높은 수준의 컴퓨터 프로그램들이 컴퓨터 하드웨어 장치와 상호 작용하기 위해 만들어진 하나의 컴퓨터 프로그램입니다. 


드라이버는 흔히 컴퓨터 버스, 또는 하드웨어와 이어진 통신 하위 시스템을 통해 장치와 통신합니다. 요청하는 프로그램이 드라이버의 명령어를 호출하면, 드라이버는 장치에 명령어를 전달합니다. 장치가 드라이버에게 데이터를 되돌려 주면, 드라이버는 원래 요청한 프로그램의 명령어로 데이터를 다시 전달합니다. 드라이버는 하드웨어에 의존하며 특정한 운영 체제를 따릅니다. 


리버스 엔지니어링이란 장치 또는 시스템의 기술적인 원리를 그 구조 분석을 통해 발견하는 과정입니다. 이것은 종종 대상을 조각내서 분석하는 것을 포함합니다. 그리고 유지 보수를 위해, 또는 같은 기능을 하는 새 장치를 원본의 일부를 이용하지 않고 만들기 위해 대상의 세부적인 작동을 분석하는 것을 포함합니다. 


목적은 원본 생산의 절차에 관한 지식이 거의 없는 상태에서, 최종 제품을 가지고 디자인 결정과정을 추론하는 것입니다. 같은 기술이 레거시 소프트웨어 시스템을 응용하기 위해 현재 연구되고 있는데, 산업이나 국방이 아니고, 오류, 미완성, 접근 불가인 문서를 수정하기 위함입니다. 


이처럼휴대전화 개발이 하드웨어에 의존적이다 보니 발전 속도는 떨어지고 개발과 관리 비용만 늘었습니다. 그리고 해당 비용은 고스란히 소비자의 몫으로 돌아왔습니다. 이러한 문제점을 없애고자 안드로이드, iOS, 윈도우처럼 하드웨어에 독립적인 스마트폰 운영체제가 등장하였습니다. 이처럼 소프트웨어에 기초한 플랫폼의 등장은 하드웨어의 인터페이스를 통합하게 하였고, 하드웨어에 대해 잘 알지 못해도 관련 애플리케이션을 개발할 수 있게 하였습니다. 


다양한 로봇 소프트웨어 플랫폼이 나오고 있지만, 어느 것이 더 좋다고 섣불리 말하기 어려운 게 사실입니다. 왜냐하면, 편리한 컴퓨넌트 추가 기능이나 통신 기능, 시각화, 시뮬레이터, 실시간성 등 저마다 독특한 기능을 제공하기 때문입니다. 우리는 소프트웨어 플랫폼 자체를 만드는 것이 아닌, 범용적인 로봇 소프트웨어 플랫폼에서 작동하는 응용 프로그램 개발 능력에 집중하면 좋을 듯 싶습니다.


커뮤니티의 활발성, 준비되어 있는 라이브러리, 확장성, 개발 편의성을 생각해 본다면 ROS만 한 것도 없어 보입니다. 로봇 소프트웨어 플랫폼을 이용하면 각기 다른 하드웨어로 이루어진 로봇이더라도 기본 기능만 갖춘다면 하드웨어에 대한 지식이 없어도 응용 프로개름을 작성할 수 있습니다. 이는 최신 스마트폰의 하드웨어 구성이나 세부 내역을 몰라도 애플리케이션을 작성할 수 있는 것과 마찬가지 입니다. 


ROS는 로봇 응용프로그램을 개발할 때 필요한 하드웨어 추상화, 하위 디바이스 제어, 로보틱스에서 많이 사용되는 센싱, 인식, 지도 작성, 모션 플래닝 등의 기능 구현, 프로세스 사이의 메시지 패싱, 패키지 관리, 개발 환경에 필요한 라이브러리와 다양한 개발/디버깅 도구를 제공한다는 것입니다. 즉, ROS는 로봇 응용프로그램을 개발하기 위한 운영체제와 비슷한 로봇 소프트웨어 플랫폼입니다. 


ROS는 메타 운영체제입니다. 애플리케이션과 분산 컴퓨팅 자원 간의 가상화 레이어로 분산 컴퓨팅 자원을 활용하여, 스케쥴링 및 로드, 감시, 에러 처리 등을 실행하는 시스템이라고 볼 수 있습니다. 리눅스의 한 배포판인 우분투와 같은 운영체제의 프로세스 관리 시스템, 파일 시스템, 유저 인터페이스, 프로그램 유틸 등을 사용하고 있습니다. 이에 추가로 다수의 이기종 하드웨어 간의 데이터 송수신, 스케쥴링, 에러 처리 등 로봇 으용프로그램에 필요한 필수 기능들을 라이브러리 형태로 제공하고 있습니다. 


ROS의 메세지는 하나의 운영체제에서도 지원하지만 서로 다른 운영체제, 하드웨어, 프로그램에서도 처리할 수 있어서 다양한 하드웨어가 사용되는 로봇 개발에는 매우 적합한 운영체제라고 할 수 있습니다. 처음에는 각종 하드웨어 기술들이 넘쳐흘렀으나, 이를 통합해 줄 운영체제가 없었습니다. 



ROS 용어 정리

ROS는 로봇 응용프로그램을 개발하기 위한 운영체제와 같은 로봇 소프트웨어 플랫폼입니다. ROS는 로봇 응용프로그램을 개발할 때 필요한 하드웨어 추상화, 하위 디바이스 제어, 로보틱스에서 많이 사용되는 센싱, 인식, 지도 작성, 모션 플래닝 등의 기능 구현, 프로세스 간의 메시지 파싱, 패키지 관리, 개발환경에 필요한 라이브러리와 다양한 개발 및 디버깅 도구를 제공합니다. 


마스터는 노드와 노드 사이의 연결과 메시지 통신을 위한 네임 서버와 같은 역할을 합니다. roscore 가 실행 명령어이며, 마스터를 실행하면 각 노드의 이름을 등록하고 필요에 따라 정보를 받을 수 있다. 마스터가 없이는 노드 간의 접속, 토픽과 서비스와 같은 메시지 통신을 할 수 없습니다. 


마스터는 마스터에 접속하는 슬레이브들과의 접속 상태를 유지하지 않는 HTTP 기반의 프로토콜인 XMLRPC를 이용하여 슬레이브들과 통신합니다. 즉, 슬레이브인 노드들이 필요할 때만 접속하여 자신의 정보를 등록하거나 다른 노드의 정보를 요청하여 수신받을 수 있습니다.


ROS를 구동하면 마스터는 사용자가 정해 놓은 ROS_MASTER_URI 변수에 기재된 URI 주소와 포트를 가집니다. 사용자가 설정해 놓지 않았으면 URI 주소로 현재의 로컬 IP를 사용하고, 11311 포트를 이용합니다. 


노드는 ROS에서 최소 단위의 실행 프로세서를 가리키는 용어이니다. 하나의 실행 가능한 프로그램으로 생각하면 됩니다. ROS에서는 하나의 목적에 하나의 노드를 작성하길 권하며, 재사용이 쉽게 구성하여 만들도록 권합니다. 예를 들어, 모바일 로봇의 경우, 로봇을 구동하기 위하여 각 프로그램을 세분화시킵니다. 즉, 센서 드라이브, 센서 데이터를 이용한 변환, 장애물 판단, 모터 구동, 엔코더 입력, 내비게이션 등 세분화된 작은 노드들을 이용합니다. 


노드는 생성과 함께 마스터에 노드와 퍼블리셔, 서브스크라이버, 토픽, 서비스의 각 이름, 메시지 형태, URI 주소와 포트를 등록합니다. 이 정보들을 기반으로 각 노드는 노드끼리 토픽과 서비스를 이용하여 메시지를 주고받을 수 있습니다. 


패키지는 ROS를 구성하는 기본 단위로서 실행 가능한 노드를 포함합니다. ROS의 응용프로그램은 패키지 단위로 개발됩니다. 패키지는 최소한 하나 이상의 노드를 포함합니다.


메타패키지는 공통된 목적을 지닌 패키지들을 모아둔 패키지들의 집합을 말합니다. 


노드는 메시지를 통해 노드 간의 데이터를 주고 받는다. 메시지는 integer, floating point, boolean과 같은 변수 형태입니다. 또한, 메시지 안에서 메시지를 품고 있는 간단한 데이터 구조나 메시지들이 나열된 배열과 같은 구조도 사용할 수 있습니다. 메시지를 이용한 통신 방법으로는 TCPROS, UDPROS 방식 등이 있으며, 단방향 메시지 송수신 방식의 토픽과 양방향 메시지 요청/응답 방식의 서비스를 이용합니다. 


토픽은 이야깃거리입니다. 퍼블리셔 노드가 하나의 이야깃거리에 대해서 토픽이라는 이름으로 마스터에 등록한 후, 이야깃거리에 대한 이야기를 메시지 형태로 퍼블리시합니다. 이 이야깃거리를 수신받기를 원하는 서브스크라이버 노드는 마스터에 등록된 토픽의 이름에 해당하는 퍼블리셔 노드의 정보를 받습니다. 이 정보를 기반으로 서브스크라이버 노드는 퍼블리셔 노드와 직접 연결하여 메시지를 토픽으로 송수신하게 됩니다. 


서브스크라이브는 토픽의 내용에 해당하는 메시지 형태의 데이터를 수신하는 것을 말합니다. 서브스크라이버 노드는 서브스크라이브를 수행하기 위하여 토픽을 포함한 자신의 정보들을 마스터에 등록하고, 구독하고자 하는 토픽을 퍼블리시하는 퍼픕ㄹ리셔 노드의 정보를 마스터로부터 받습니다. 이 정보를 기반으로 서브스크라이버 노드는 퍼블리셔 노드와 직접 접속하여 메시지를 받습니다. 서브스크라이버는 하나의 노드에서 복수로 선언할 수 있습니다. 


서비스 퍼블리시와 서브스크라이브 개념의 토픽 방식은 비동기 방식이라 필요에 따라서 주어진 데이터를 전송하고 받기에 매우 훌륭한 방법입니다. 또한, 한 번의 접속으로 지속적인 메시지를 송수신하기 떄문에 지속해서 메시지를 발송해야 하는 센서 데이터에 적합하여 많이 사용됩니다. 서비스라는 이름으로 메시지 동기 방식을 제공합니다. 


서비스 서버는 요청을 입력으로 받고, 응답을 출력으로 하는 서비스 메시지 통신의 서버 역할을 말합니다. 

 

캐킨은 ROS의 빌드 시스템을 말합니다. ROS의 빌드 시스템은 기본적으로 CMake를 이용하고 있어서 패키지폴더에 CMakeLists.txt 라는 파일에 빌드 환경을 기술하고 있습니다. ROS에서는 CMake를 ROS에 맞게 수정하여 ROS에 특화된 캐킨 빌드 시스템을 만들었습니다. 캐킨은 ROS Fuerte 버전부터 알파테스트를 시작하여 Groovy에서 코어 패키지들이 캐킨으로 전환되었으며, Hydro 버전에서 안정화되었습니다. 


ROS빌드는 catkin 빌드 시스템 이전에 사용되었던 빌드 시스템이고 지금까지도 일부 사용하는 사용자들이 있기는 하지만 이는 버전의 호환성을 위해 남겨둔 것이지 공식적으로 추천하지 않습니다. 


roscore 는 ROS 마스터를 구동하는 명령어 입니다. 같은 네트워크라면 다른 컴퓨터에서 실행해도 됩니다. 단, 멀티 roscore를 지원하는 특수한 경우를 제외하고는 roscore는 같은 네트워크에서 하나만 구동됩니다. ROS를 구동하면 사용자가 정해놓은 ROS_MASTER_URI 변수에 기재된 URI 주소와 포트를 가집니다. 


파라미터는 노드에서 사용되는 파라미터를 말합니다. 흔히 윈도우 프로그램에서 *.ini 설정 파일과 같다고 생각하면 됩니다. 파라미터는 디폴트로 설정 값들이 지정되어 있고, 필요에 따라 외부에서 읽거나 쓸 수 있습니다. 


rosrun은 ROS의 기본 실행 명령어입니다. 패키지에서 하나의 노드를 실행하는 데 사용됩니다. 노드가 사용하는 URI 주소와 포트는 현재 노드가 실행 중인 컴퓨터에 저장된 ROS_HOSTNAME라는 환경 변숫값을 URI 주소로 사용하며, 포트는 임의의 고윳값으로 설정됩니다. 


roslaunch rosrun이 하나의 노드를 실행하는 명령어라면 roslaunch는 여러 노드를 실행하는 개념입니다. 이 명령어를 통해 하나나 그 이상의 정해진 노드를 실행시킬 수 있습니다. 그 밖의 기능으로 노드를 실행할 때 패키지의 파라미터나 노드 이름 변경, 노드 네임스페이스 설정, ROS_ROOT 및 ROS_PACKAGE_PATH 설정, 환경 변수 설정 등 많은 옵션을 갖춘 노드 실행에 특화된 ROS 명령어입니다. 


roslaunch는 *.launch라는 파일을 사용하여 실행 노드에 대한 설정을 해주는데 이는 XML에 기반을 두고 있으며, XML 태그 형태의 옵션을 제공합니다. 


ROS에서 주고 받는 메시지의 데이터를 저장할 수 있는데 이때 사용되는 파일 포맷을 bag라고 하며 확자앚로 .bag를 사용합니다. ROS에서는 이 bag를 이용하여 메시지를 저장하고 필요할 때 이를 재상하여 이전 상황을 그대로 재현할 수 있습니다. 


이름 노드, 파라미터, 토픽, 서비스에는 모두 이름이 있습니다. 이 이름을 마스터에 등록하고, 각 노드의파라미터, 토픽, 서비스를 사용할 떄 이름을 기반으로 상호 동작하게 되어있습니다. 이름은 실행할 떄 변경할 수 있기 때문에 매우 유연하고, 같은 노드, 파라미터,토픽, 서비스라고 하여도 다른 이름으로 중복하여 사용할 수 있습니다. 이러한 이름의 사용으로 ROS는 큰 규모의 프로젝트, 복잡한 구조의 시스템에도 적합합니다. 


CMakeLists.txt

ROS의 빌드 시스템인 캐킨은 기본적으로 CMake를 이용하고 있어서 패키지 폴더에 CMakeLists.txt 라는 파일에 빌드 환경을 기술하고 있습니다.