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 방식을 이용합니다.

Flask 모듈 사용하기

|

Flask 모듈

Flask 모듈은 웹 어플리케이션을 쉽게 만들 수 있는 여러 가지 기능들을 제공하는 마이크로 웹 프레임워크입니다. 다음과 같은 특징을 갖고 있습니다.

  • 개발용 서버와 디버거 내장
  • 단위 테스트 및 통합 테스트 지원
  • RESTful request 처리
  • Jinja2 템플릿 엔진 내장
  • Secure Cookie 지원
  • WSGI 1.0 호환
  • 유니코드 기반


Flask 설치

Flask는 pip 명령어를 이용해서 쉽게 설치할 수 있습니다.

$ pip install Flask


Hello, World 서버 만들기

from flask import Flask

app = Flask(__name__)

app.debug = True


@app.route('/')
def hello():
    return 'Hello, World'


if __name__ == '__main__':
    app.run()


URL 경로를 이용해서 함수 실행하기

아래와 같은 코드를 이용해서 URL 경로를 파라메터로 받을 수 있습니다.

@app.route('/hello/<name>')
def hello_to(name):
    return 'Hello, {}'.format(name)


URL 쿼리 가져오기

‘http://127.0.0.1:5000/query?x=100&y=200’ 와 같은 URL 속에 같이 포함되어 있는 쿼리값을 가져오는 코드는 다음과 같습니다.

from flask import Flask
from flask import request

app = Flask(__name__)

app.debug = True


@app.route('/')
def hello():
    return 'Hello'


@app.route('/hello/<name>')
def hello_to(name):
    return 'Hello, {}'.format(name)


@app.route('/query')
def get_query_params():
    x = request.args.get('x')
    y = request.args.get('y')

    return 'x = {}, y = {}'.format(x, y)


if __name__ == '__main__':
    app.run()

우분투(Ubuntu)에 D2Coding 폰트 설치

|

D2Coding 폰트 설치

D2Coding 폰트는 네이버에서 개발용 폰트로 무료로 배포하고 있는 폰트입니다. 그동안 다양한 폰트들을 사용해왔지만 지금은 D2Coding 폰트에 완전히 정착했습니다.

먼저 https://github.com/naver/d2codingfont에서 D2Coding 폰트 파일을 다운로드한 다음 압축을 풀어줍니다.

그리고 그 안에서 TTF 파일을 찾아서 더블 클릭해주시면 GUI 환경에서 편리하게 폰트를 설치할 수 있습니다.