강좌 & 팁
안녕하세요.
오늘은 로봇소프트웨어의 구조에 대한 두번째 시간이네요.
본격적으로 로봇의 소프트웨어 인프라스트럭처에 대한 설명을 해보도록 하겠습니다.
저번에 말씀드렸듯이 보통 로봇의 소프트웨어를 기능적인 관점에서 분류를 해보면,
Mission planning
Behavior
Motion planning
Perception
으로 나눌 수 있다고 하였습니다. Behavior 이상의 더욱 지능적인 부분을 처리하는
고수준의 영역이 더 있을 수 도 있겠네요. 하지만 진정한 AI는 아직까지 나오지 않았죠.
보통은 위와 같이 기능적으로 분류를 많이 들 합니다.
자, 위와 같은 각 기능들을 하나의 컴퓨터에서 구현할 수 있을까요 ? 요즘 컴퓨터의
컴퓨팅 파워가 많이 향상되었다고는 하나 로봇 소프트웨어를 돌리다보면 아직까지
너무나 컴퓨팅 파워가 부족하다는 생각이 많이 듭니다. 실제로 위와 같은 기능들을
구현하기 위해서는 보통 여러 대의 (1대~10대) 컴퓨터가 사용됩니다. 실제로요...
예를 들어, Boss는 10대의 인털 듈얼 코어 컴퓨터를 사용합니다. 모션 플래닝이 2대의
컴퓨터를 사용하고, behavior 가 1대의 컴퓨터를 사용하고, 퍼셉션이 4-5대의 컴퓨터를
사용하여 알고리즘들을 돌리게 되어있습니다. 참 많이 사용되죠 ? 실제 컴퓨팅 파워를
보여드리겠습니다. 다음 그림을 보시죠.
여러 대의 컴퓨터를 사용하면 데이타의 sharing 에 많은 신경을 써야 하는데요, 유닉스의 inter-process communication
방법들을 사용하여 프로그래밍을 작성하게 됩니다. 그 뿐만 아니라 다양한 요소들을 신경써야 하는데요, 바로 그런
점들을 해결해 주는 부분이 소프트웨어 인프라스트럭처 라이브러리들이구요, 다음과 같은 컴포넌트들이 있습니다.
Task library
Configuration library
Data logging library
Process launching system
Operator interface
Inter-Process Communication
보통 이놈을 C 나 C++를 사용해서 구현을 합니다. Boss에서는 C++를 사용해서 구현을 하였죠.
Task library는 실제 프로세스의 구현을 감싸는 라이브러리이구여, 각 프로세스의 역할에 따라 1초에
몇번 실행되어야 하는지 보고 흐름을 제어해 주게 끔 해주고 몇가지 편의사항을 구현해 주고 있습니다.
Configuration library는 각 프로세스들에 필요한 설정사항들을 파싱하는 기능을 제공하고 있습니다.
많은 센서들을 핸들링해야 하고 각 알고리즘들의 파라미터를 저장하고 읽고 하는일이 너무나 많기
때문에 좋은 설정 기능은 필수라 하겠습니다. Boss에서는 Ruby를 사용합니다. 모든 설정파일을
루비 파일로 작성하고 실제 프로그램에서는 ruby c++ 인터페이스 평션을 사용하여 설정을 파싱하고
메인 프로그램들과 연결시켜주지요. 실제 개발 프로세스를 반복과정을 빠르게 해주는 기능이므로
아주 중요하다고 볼 수 있습니다.
Data logging 기능도 프로그램 개발 시에 운용시에 아주 중요하지요. 다들 아시다시피 리눅스 커널의
로깅 시스템이 아주 훌륭하게 구현되어 있는데, 그것과 비슷한 개념으로 로깅 라이브러리를 사용하여
편하게 프로그래밍을 할 수 있습니다.
Process launching system 은 실제 로봇에 각 프로세스들을 실행시켜주는 일꾼들입니다.
컴퓨터가 10대이고 각 컴퓨터에 어떤 프로세스들을 돌릴지 설정하고 실행하면 설정한데로
모든 프로세스들이 론칭되게 해주는 기능이죠. 그것을 구현하기 위해서 어떻게 했나면은,
각 컴퓨터마다 vassal 이라는 데몬을 돌리는 것입니다. 그리고 한대의 메인 컴퓨터에는
vassal과 king 데몬을 돌립니다. 그리고 king 데몬은 user interface 제어 프로그램에
(QT로 만든 Boss의 인터페이스 프로그램이 있음) 직접적으로 연결되어 vassal들에게
일을 시키는 일을 합니다.
Operator interface 가 바로 유저인터페이스 구요 Boss는 QT로 작성한 TROCS라는 프로그램이
있습니다. 이놈이 메인 콘솔이라고 보시면 됩니다. 모든 설정과 제어를 도맡아서 어떤 컴퓨터에서
어떤 태스크들을 돌릴지 설정한 파일데로 모든 일을 진행(king, vassal 데몬들과 함께)시키는
일을 합니다.
마지막으로 Inter-Process Communication (IPC) 이 있습니다. 여러 대의 컴퓨터에서
수십 개의 태스크들을 돌리므로 태스크들 사이에 필요한 데이타들을 공유해야 하는 메카니즘이
필요하게 됩니다. 아주 필수적인 기능이지요. 여러가지 방법론이 있는데, Boss에서는 anonymous
publish/subscribe 방법을 사용합니다. 카네기 멜론의 리드 시몬스라는 교수가 구현한 IPC라는
라이브러리가 상당히 유명한데요, 위와 같은 기능을 제공하여 실은 그랜드 챌린지에서는 IPC를
사용하였고, 어반 챌린지에서는 비슷한 기능을 가지고 좀더 신뢰적인 라이브러리를 새로 구현하여
사용하였더랬습니다. 그것이 바로 SimpleComm이라는 놈입니다. 기본적인 개념은 모든 데이타들을
통신을 통해서 공유한다는 아이디어 입니다. 핵심 개념은 데이타를 publish 하는 놈과 subscribe 하는
놈 사이에 투명성을 제공한다는 것입니다. 이것이 핵심이지요. Boss안에는 수많은 프로세스들이 여러
대의 컴퓨터에서 돌아가는데요, 센서들을 핸들링하는 태스크는 센서들을 읽어서 리얼 타임으로 통신
채널에 publish (뿌려대는 역할) 하는 일을 하구요, 실제 어떤 알고리즘을 구현하는 태스트는 그 데이타
패킷을 subscribe 하여 실제 일을 하고 그 결과를 다시 통신 채널로 publish 하면 되는 그런 방식입니다.
듣고 보니 그도 그럴듯 하죠 ?
이번에는 대형 모바일 로봇들에 들어가는 소프트웨어 인프라스트럭처에 대해서 아주 간략히
알아보았습니다. 저번에 소개한 ROS (Robot Operating System) 가 바로 이런 기능을 구현해
주는 아주 좋은 시스템입니다. 제가 소개한 기반 기능들이 필요하시다면 ROS를 사용하세요!
아주 좋은 놈입니다. 리눅스 같은 놈이죠. ㅎ
그럼 좋은 밤 되세요!