ROS 2.0 개발 환경 세팅

|

ROS 2.0을 기반으로 빌드 환경을 설정하는 방법입니다. 여기에서 원문을 볼 수 있으며, 저는 제 경험을 토대로 글을 작성했습니다.

Ament

ROS 1.0에서는 빌드 시스템으로 catkin을 이용했었는데, ROS 2.0에서는 ament를 이용합니다. ament를 사용하기 위해서는 먼저 빌드 환경을 설정해주어야 합니다.


필요한 프로그램 설치

만약 vcs 프로그램이 설치되어 있지 않다면 vcstool을 설치합니다.

다음 명령어를 이용해서 ‘vcstool’을 쉽게 설치할 수 있습니다.

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

$ sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116

$ sudo apt-get update

$ sudo apt-get install python3-vcstool

$ source /usr/share/vcstool-completion/vcs.bash


폴더 생성

아래 명령어를 이용해서 폴더 생성을 해줍니다.

$ mkdir -p ~/ros2_ws/src


소스 다운로드

$ cd ~/ros2_ws

$ wget https://raw.githubusercontent.com/ros2/ros2/master/ros2.repos

$ vcs import ~/ros2_ws/src < ros2.repos


빌드

$ src/ament/ament_tools/scripts/ament.py build --build-tests --symlink-install

꽤 오랜 시간이 걸리기 때문에 인내력을 갖고 기다려줍니다. 만약 중간에 응답이 없거나 타임아웃(Timeout)이 발생한 경우는 Ctrl + C키를 눌러서 종료한 다음 위 명령어를 다시 입력하면 작업을 이어서 진행합니다.

저 같은 경우는 중간에 너무 오래 걸려서 타임아웃 설정값을 바꿔야 하는 경우도 있었습니다.


설치

빌드가 다 끝나면 install 디렉토리에 결과물이 만들어집니다. 다음 명령어를 이용해서 설치를 해줍니다.

$ . install/local_setup.bash


샘플 코드 빌드 테스트

이제 ament를 이용해서 빌드가 잘 되는지 확인을 해야 합니다. 샘플 코드를 빌드해서 잘 되는지 확인합니다.

$ mkdir -p ~/ros2_overlay_ws/src

$ cd ~/ros2_overlay_ws/src

$ git clone https://github.com/ros2/examples.git

$ cd ~/ros2_overlay_ws

$ ament build

ROS 2.0 설치 방법

|

ROS 2.0을 설치하는 방법입니다. ROS 2.0 공식 페이지에서 더 자세히 볼 수 있으며, 여기서는 제 경험을 토대로 다시 정리했습니다.

ROS 2.0 설치

저는 Ubuntu 16.04 LTS에 ROS 2.0을 설치했습니다.

필요한 라이브러리 설치

다음 명령어를 이용해서 필요한 라이브러리들을 먼저 설치합니다.

$ sudo apt-get update && sudo apt-get install -q -y \
     libopencv-core2.4v5 \
     libhighgui2.4 \
     libopencv-imgproc2.4v5 \
     libasio-dev \
     libeigen3-dev \
     libtinyxml-dev \
     libtinyxml2-dev \
     libcurl4-openssl-dev \
     libqt5core5a \
     libqt5gui5 \
     libqt5opengl5 \
     libqt5widgets5 \
     libxaw7-dev \
     libgles2-mesa-dev \
     libglu1-mesa-dev \
     python3-pip \
     python3-setuptools \
     python3-yaml \
     wget \
     tree

$ sudo apt-get update && sudo apt-get install -q -y \
    libboost-thread-dev

$ sudo pip3 install argcomplete


ROS 2.0 바이너리 패키지 다운로드

다음 경로에서 ROS 2.0 최신 바이너리 패키지를 다운 받습니다.

저는 ‘ros2-ardent-package-linux-fastrtps-opensplice-x86_64.tar.bz2’ 파일을 다운받았습니다.

그런 다음 다음 명령어를 통해 압축 파일을 해제합니다.

$ mkdir -p ~/ros2_install

$ cd ~/ros2_install

$ tar xf ~/Downloads/ros2-package-linux-x86_64.tar.bz2


샘플 테스트

이제 잘 설치가 되었고 동작이 되는지 확인하기 위해서 터미널에서 다음 명령어를 실행해봅니다.

$ . ~/ros2_install/ros2-linux/setup.bash

$ ros2 run demo_nodes_cpp talker
$ . ~/ros2_install/ros2-linux/setup.bash

$ ros2 run demo_nodes_cpp listener


잘 동작이 되는 걸 확인했으면, .bashrc 파일 맨 끝에 아래 항목을 추가합니다.

. ~/ros2_install/ros2-linux/setup.bash

C++11 기반 클래스 멤버 함수 콜백(Callback)

|

함수 콜백 예제

Child.h

#ifndef FUNCTIONCALLBACK_CHILD_H
#define FUNCTIONCALLBACK_CHILD_H

#include <functional>

using namespace std;

class Child {
 public:
  Child() {}
  virtual ~Child() {}

 private:
  typedef function<void()> func1;
  typedef function<void(int, int)> func2;

  func1 handler1;
  func2 handler2;

 public:
  void setHandler1(func1 func) {
    handler1 = move(func);
  }

  void setHandler2(func2 func) {
    handler2 = move(func);
  }

  void exec() {
    handler1();
    handler2(100, 200);
  }
};

#endif //FUNCTIONCALLBACK_CHILD_H


parent.h

#ifndef FUNCTIONCALLBACK_PARENT_H
#define FUNCTIONCALLBACK_PARENT_H

#include "Child.h"

#include <iostream>
#include <functional>

using namespace std;

class Parent {
 public:
  Parent() {}
  virtual ~Parent() {}

  void hello() {
    cout << "Hello" << endl;
  }

  void sum(int a, int b) {
    cout << a << " + " << b << " = " + (a + b) << endl;
  }

  void test() {
    Child child;

    child.setHandler1(bind(&Parent::hello, this));
    child.setHandler2(bind(&Parent::sum, this, placeholders::_1, placeholders::_2));
    child.exec();
  }
};

#endif //FUNCTIONCALLBACK_PARENT_H


main.cc

#include "Parent.h"

int main() {

  Parent obj;
  obj.test();

  return 0;
}

ROS 2.0 소개

|

ROS 2.0 Ardent Apalone 버전이 2017년 12월 8일에 공개되었습니다. 그동안 알파 버전부터 베타3 버전까지 배포되었으나, 이번에 공개한 Ardent Apalone은 최초의 non-beta 버전입니다.


ROS 2.0이 나오게 된 배경

ROS는 로봇 계열에서 가장 많이 사용되던 운영체제였습니다. 하지만, ROS는 아래와 같은 문제점 또는 특징을 갖고 있었습니다.

ROS 1.0의 특징

  • 단일 로봇(Single Robot) 지원
  • 워크스테이션 급의 컴퓨팅 리소스 필요
  • 리얼타임(Real-time) 요구사항 미지원
  • 아주 훌륭한 네트워크 연결 상태 필요(유선이거나 아주 높은 대역폭의 무선 필요)
  • 주로 연구 기관, 아카데미 등에서 사용


새로운 요구 사항 등장

  • 멀티 로봇 지원 : 기존 ROS의 경우 일부분을 수정하여 복수의 로봇을 제어할 수는 있었지만 일반적인 접근 방식은 아니었습니다. 오늘날에는 복수의 로봇을 동시에 제어하는 시나리오가 많이 생겼습니다.
  • Small Embeded Platform : OS가 탑재되지 않은 마이크로 컨트롤러(Micro Controller)와 같은 작은 플랫폼과도 ROS와 연동시키고 싶은 경우가 생겼습니다.
  • 리얼타임(Real-Time) 시스템 : 프로세스간, 기계간 통신을 ROS를 통해 실시간으로 제어할 수 있어야 합니다.
  • 네트워크 조건 완화 : 기존에는 너무 이상적인 네트워크 환경을 요구했지만 앞으로는 상태가 나쁜 WiFi 상황도 고려해야 합니다.


새로운 기술 적용

아래와 같은 새로운 기술들이 적용되었습니다.

  • Zeroconf
  • Protocol Buffers
  • ZeroMQ (and the other MQs)
  • Redis
  • WebSockets
  • DDS (Data Distribution Service)


OS 지원

ROS 2.0은 다음과 같은 OS를 지원합니다.

  • Ubuntu 16.04 LTS (Xenial)
  • Mac OS X 10.12 (Sierra)
  • Windows 10

ROS 소개

|

여기서는 먼저 ROS 1.0 에 대한 설명을 하도록 하겠습니다.

ROS

ROS(Robot Operating System)는 로봇용 운영 체제입니다. 일반 OS에서 제공하는 하드웨어 추상화나 저수준 기기 제어, 그 외 일반적으로 많이 사용되는 기능 함수들을 제공하고 있습니다. 또한, 여러 프로세스간 메세지 전달, 패키지 관리 및 개발에 필요한 다양한 라이브러리들을 제공하고 있습니다.


ROS는 메타 운영 체제(Meta-Operating System)

메타 운영 체제라는 용어는 딱히 정의되어 있는 용어는 아닙니다. ROS는 일반적인 운영 체제들과는 달리 그 자체만으로 동작하는 것이 아니라 Windows, Linux, MacOS 등의 일반적인 운영 체제 위에서 동작하는 프레임워크(Framework)라고 할 수 있습니다. 하지만, 운영 체제들이 제공하는 프로세스 관리, 파일 시스템, 유저 인터페이스, 스케줄링, 에러 처리 등의 기능을 제공하고 있습니다. 그래서 ROS를 메타 운영 체제라고 부르고 있습니다.


ROS는 분산 프레임워크

ROS의 핵심은 노드(Node)간의 메시지 통신입니다. 노드는 각각의 프로세스들을 의미하며, 목적에 따라 세분화된 최소 단위의 실행 프로그램입니다. ROS는 노드간 메시지 전달을 쉽게 할 수 있도록 지원하고 있습니다.

각 노드간 메시지는 발행/구독(Publish/Subscribe) 형태로 전달되며, 토픽(Topic)이라는 주제하에 메시지가 전달됩니다. 그리고 각 노드들의 정보를 관리하는 마스터(Master)가 존재하며 각 노드들은 마스터를 통해 다른 노드들을 발견하거나 연결할 수 있게 됩니다. 마스터는 roscore라는 명령어로 실행하는 데몬 서비스 형태이며 XMLRPC 방식으로 서버를 구동합니다. 마스터와 노드간의 통신은 XMLRPC 방식으로 이루어지며, 각 노드간 통신은 TCPROS라고 부르는 TCP/IP 방식을 이용합니다.